2017-03-26 2 views
1

나는 MASM & 어바인 32 비트 어셈블리를 사용하고 있으며 배열 A, B, C를 가지고 있으며 배열 A의 각 [i] 항목을 합산하여 A + B = C를 수행 할 때 누적됩니다. 배열 예를 들어 C.정확하게 배열 합산

에 B와 쓰기,

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

난 당신이 arrB의 자사 특파원 항목에 arrA의 각 항목을 추가하고 arrC의 대응 항목에 저장할 것 같아요. 따라서

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

이 잘못되었습니다. 당신은 항목과 EAX "을 재 초기화"해야 :

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

당신은 ARRC에 세 번째 포인터가 필요합니다. 지금은 결과를 arrC의 첫 번째 항목에 반복적으로 저장합니다. 제 3의 포인터로 EBX을 선택했습니다. 나는 또한 응답 한 것을 @rkhb

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

이 블록은 어레이를 덤프하기위한 Irvine의 라이브러리 함수 인'DumpMem'에 대한 매개 변수를 준비합니다. http://programming.msjc.edu/asm/help/index.html?page=source%2Firvinelib%2Fdumpmem.htm을 확인하십시오. – rkhb

0

을 개선했습니다, 그래서 지금 만 arrB 상응하는 ARRA를 추가하지 수행하지만, 또한 캐리 플래그와 함께 작동합니다. 따라서 다중 정밀도 가산 연산을 수행하려면 숫자를 배열로 표현하고 캐리 플래그로 작업해야합니다.

이 필요하다, 그래서 만약 여기있다, 인터넷에서 많은 정보를 찾지 못하셨습니까 : 그것은 두 배열의 모든 요소를 ​​요약하기 때문에


.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