在汇编中反转数组 (masm)
Reversing an Array in Assembly (masm)
我试图在程序集中反转数组,但我无法成功地这样做。该程序适用于双字,但现在不适用于单词。我使用 visual studio 调试器检查了它。最后的结果是 98,78,10,00,36 是错误的。我的密码是
.386
.model flat,stdcall
ExitProcess PROTO,dwExitCode:DWORD
.data
intarray WORD 10h,20h,36h,78h,98h
.code
main PROC
mov esi,OFFSET intarray
mov edi,OFFSET intarray
add edi,SIZEOF intarray
sub edi,TYPE intarray
mov ecx,LENGTHOF intarray/2
L1:
mov eax,[ESI]
mov ebx,[EDI]
mov [EDI],eax
mov[ESI],ebx
add esi,TYPE intarray
sub edi,TYPE intarray
loop L1
invoke ExitProcess,0
main ENDP
END main
您正在移动 DWORDS(4 个字节)。一个字是2个字节。
您应该通过将代码更改为类似以下内容来获得正确的结果:
mov ax,[ESI]
mov bx,[EDI]
mov [EDI],ax
mov [ESI],bx
或者少用一条指令和一个寄存器:
mov ax,[ESI]
xchg ax,[EDI]
mov [ESI],ax
我试图在程序集中反转数组,但我无法成功地这样做。该程序适用于双字,但现在不适用于单词。我使用 visual studio 调试器检查了它。最后的结果是 98,78,10,00,36 是错误的。我的密码是
.386
.model flat,stdcall
ExitProcess PROTO,dwExitCode:DWORD
.data
intarray WORD 10h,20h,36h,78h,98h
.code
main PROC
mov esi,OFFSET intarray
mov edi,OFFSET intarray
add edi,SIZEOF intarray
sub edi,TYPE intarray
mov ecx,LENGTHOF intarray/2
L1:
mov eax,[ESI]
mov ebx,[EDI]
mov [EDI],eax
mov[ESI],ebx
add esi,TYPE intarray
sub edi,TYPE intarray
loop L1
invoke ExitProcess,0
main ENDP
END main
您正在移动 DWORDS(4 个字节)。一个字是2个字节。
您应该通过将代码更改为类似以下内容来获得正确的结果:
mov ax,[ESI]
mov bx,[EDI]
mov [EDI],ax
mov [ESI],bx
或者少用一条指令和一个寄存器:
mov ax,[ESI]
xchg ax,[EDI]
mov [ESI],ax