2017-03-26 7 views
1

私はMASM &アーバイン32ビットアセンブリを使用していますが、配列A、B、Cがあり、配列Aの各項目[i]を配列で加算してA + B = 、例えば配列C.アレイを正しく集計する

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

をBと書いて、私はポインタで動作するようにしようとしましたが、私は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

私はあなたがarrBのその対応項目にarrAの各項目を追加するとarrCの対応項目にそれを保存したいと思います。したがって

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

が間違っています。あなたはアイテムでEAXを「再初期化」する必要があります。

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

あなたはarrCへの第三のポインタを必要としています。今すぐarrCの最初の項目に結果を繰り返し格納します。私は EBXを第3のポインタとして選択しました。

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'のパラメータを準備します。 http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fdumpmem.htmを見てください。 – rkhb

0

また、私は答えたもの@rkhb改善してきたので、今ではarrBに対応するARRAを追加実行するだけでなく、それはキャリーフラグで動作します。ですから、多倍精度加算演算を実行する場合は、数値を配列として表示し、キャリーフラグを使用する必要があります。それが必要とされるので、もし

は、インターネット上でその上に多くの情報を見つけることができませんでした、ここにある:それは今、これらの2つの配列のすべての要素を合計し、そしてので


.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 
関連する問題