2017-03-26 46 views
1

我正在使用MASM & Irvine 32位程序集,并且我有数组A,B,C和堆叠执行A + B = C,将数组A的每个[i]项与数组B和写入阵列C正确地求和数组

例如,

arrA 1, 2, 4, 1 
+ 
arrB 2, 1, 1, 3 
= 
arrC 3, 3, 5, 4 

我试图用指针来工作,但我有00,00,00,0F输出。

不关注StrHex_MY程序,它在输出数组上测试。

代码:


.586 
.model flat, stdcall 
ExitProcess PROTO, dwExitCode:DWORD 

include \Irvine\Irvine32.inc 
includelib \Irvine\kernel32.lib 
includelib \Irvine\user32.lib 
include module.inc 

.data 
    CaptionGreet BYTE "Test me", 0 

    arrA DWORD 1, 2, 4, 1 
    arrB DWORD 2, 1, 1, 3 
    arrC DWORD 0, 0, 0, 0 

    toOut DB 64 dup(?) 

.code 

main PROC 

    mov edi, OFFSET arrA ; Address of arrA 
    mov esi, OFFSET arrB ; Address of arrB 

    mov eax, 0 ; Register with result 

    mov ecx, LENGTHOF arrA ; Lenght of arrays 

    L1: 
     add eax, [edi] ; Add current arrA element to eax 
     add eax, [esi] ; Add current arrB element to eax 

     add edi, TYPE arrA ; Move pointer to the next arrA element 
     add esi, TYPE arrB ; Move pointer to the next arrB element 

     mov arrC, eax ; Move current eax value to arrC 

     loop L1 

    ; Converting result to HEX toOut. Don't pay attention to this part 
    ; ---- 
    push OFFSET toOut 
    push OFFSET arrC 
    push 256 
    call StrHex_MY 
    ; --- 

    ; Output result 
    INVOKE MessageBoxA, 0, ADDR toOut, ADDR CaptionGreet, 0 
    INVOKE ExitProcess,0 

main ENDP 
END main 

+0

所以它输出0F,现在我堆栈访问每个arrC元素并用arrA + arrB当前元素的总和重写它。 – NLis

回答

0

我想你想的arrA每个项目增加的arrB其对应的项目,将其存储到arrC对应的项目。所以

add eax, [edi] ; Add current arrA element to eax 

是错误的。你必须“重新初始化” EAX与项目:

mov eax, [edi] ; Copy current arrA element to eax 

您需要第三个指针ARRC。现在您将结果重复存储到arrC的第一项。我选择EBX作为第三指针。

INCLUDE Irvine32.inc 

.data 
    CaptionGreet BYTE "Test me", 0 

    arrA DWORD 1, 2, 4, 1 
    arrB DWORD 2, 1, 1, 3 
    arrC DWORD 0, 0, 0, 0 

    toOut DB 64 dup(?) 

.code 

main PROC 

    mov edi, OFFSET arrA ; Address of arrA 
    mov esi, OFFSET arrB ; Address of arrB 
    mov ebx, Offset arrC ; Address of arrC 

    mov eax, 0    ; Register with result 

    mov ecx, LENGTHOF arrA ; Length of arrays 

    L1: 
     mov eax, [edi]  ; Copy current arrA element to eax 
     add eax, [esi]  ; Add current arrB element to eax 

     add edi, TYPE arrA ; Move pointer to the next arrA element 
     add esi, TYPE arrB ; Move pointer to the next arrB element 

     mov [ebx], eax  ; Move current eax value to current arrC element 
     add ebx, TYPE arrC ; Move pointer to the next arrC element 

     loop L1 

    mov esi, OFFSET arrC 
    mov ecx, 4 
    mov ebx, 4 
    call DumpMem 


    INVOKE ExitProcess,0 

main ENDP 

END main 
+0

谢谢! 我想知道为什么它完美的工作,即使没有 'mov esi,OFFSET arrC,mov ecx,4,mov ebx,4'代码。 你能解释一下为什么我们需要它吗? – NLis

+0

该块准备'DumpMem'的参数,Irvine库的函数用于转储数组。看看http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fdumpmem.htm – rkhb

0

我也改进了@rkhb的回答,所以现在它不仅执行arrA添加到相应的arrB,但它也可以与进位标志一起使用。因此,如果我们想要执行多精度加法操作,我们需要将数字作为数组呈现并使用进位标志。

没有找到很多在互联网上就可以了信息,因此如果需要的话,那就是:

,因为它概括这两个阵列中的所有元素

.586 
.model flat, stdcall 
ExitProcess PROTO, dwExitCode:DWORD 

include \Irvine\Irvine32.inc 
includelib \Irvine\kernel32.lib 
includelib \Irvine\user32.lib 
include module.inc 

.data 
    CaptionGreet BYTE "Last >> Last 
    arrA DWORD 80010001h, 80020001h, 80030001h 
    arrB DWORD 80000001h, 80000001h, 80000001h 
    arrC DWORD 0, 0, 0 

    toOut DB 64 dup(?) 

.code 

main PROC 

    mov edi, OFFSET arrA ; Address of arrA 
    mov esi, OFFSET arrB ; Address of arrB 
    mov ebx, Offset arrC ; Address of arrC 

    mov eax, 0    ; Register with result 
    pushad 
    clc ; Make Carry flag zero 

    mov ecx, LENGTHOF arrA ; Length of arrays 

    L1: 
     pushfd ; Restore Carry flag 
     mov eax, [edi]  ; Copy current arrA element to eax 
     popfd 
     adc eax, [esi]  ; Add current arrB element to eax, if Carry flag is non-zero, it is also added 
     pushfd ; Push Carry flag to FLAGS register 

     add edi, TYPE arrA ; Move pointer to the next arrA element 
     add esi, TYPE arrB ; Move pointer to the next arrB element 

     mov [ebx], eax  ; Move current eax value to current arrC element 
     add ebx, TYPE arrC ; Move pointer to the next arrC element 
     popfd 
     loop L1 

    ; Convert result to HEX toOut 
    push OFFSET toOut 
    push OFFSET arrC 
    push 480 
    call StrHex_MY 

    ; Output result 
    INVOKE MessageBoxA, 0, ADDR toOut, ADDR CaptionGreet, 0 
    INVOKE ExitProcess,0 

main ENDP 
END main