正确求和数组
Summing arrays correctly
我正在使用 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
我猜您想将 arrA
的每个项目添加到其对应的 arrB
项目并将其存储到 arrC
的对应项目。所以
add eax, [edi] ; Add current arrA element to eax
错了。您必须 "reinitialise" 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
我还改进了@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
我正在使用 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
我猜您想将 arrA
的每个项目添加到其对应的 arrB
项目并将其存储到 arrC
的对应项目。所以
add eax, [edi] ; Add current arrA element to eax
错了。您必须 "reinitialise" 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
我还改进了@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