装配 - 移动零填充以适应不同的数据大小
Assembly - Move with Zero Fill for Different Data Sizes
目前正在使用 Masm 学习汇编语言。这是我 class.
中的作业
我必须使用 32 位寄存器(EAX 和 EBX)进行某些计算。我必须处理 BYTE、WORD 和 DWORD 变量。并不复杂。我真的不明白为什么在组装当前代码时会出现这么多错误:
INCLUDE Irvine32.inc
.data
; (declare variables)
bNum01 BYTE 64
bNum02 BYTE 32
bNum03 BYTE 16
bSum BYTE ?
bDiff BYTE ?
bResult BYTE ?
wNum01 WORD 64
wNum02 WORD 32
wNum03 WORD 16
wSum WORD ?
wDiff WORD ?
wResult WORD ?
dwNum01 DWORD 64
dwNum02 DWORD 32
dwNum03 DWORD 16
dwSum DWORD ?
dwDiff DWORD ?
dwResult DWORD ?
dwTotal DWORD ?
.code
main PROC
; (insert executable instructions)
movzx eax,bNum01
add eax,bNum02
add eax,bNum03
movzx bSum,eax
movzx eax,bNum02
add eax,bNum03
sub eax,bNum01
movzx bDiff,eax
movzx eax,bSum
add eax,bDiff
movzx bResult,eax
mov esi,OFFSET bSum
mov ecx,LENGTHOF bSum
mov ebx,TYPE bSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET bDiff
mov ecx,LENGTHOF bDiff
mov ebx,TYPE bDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET bResult
mov ecx,LENGTHOF bResult
mov ebx,TYPE bResult
call DumpMem ; call Dump Memory for selected offset value
; WORD main processing
movzx ebx,wNum01
add ebx,wNum02
add ebx,wNum03
movzx wSum,ebx
movzx ebx,wNum02
add ebx,wNum03
sub ebx,wNum01
movzx wDiff,ebx
movzx ebx,wSum
add ebx,wDiff
movzx wResult,ebx
mov esi,OFFSET wSum
mov ecx,LENGTHOF wSum
mov ebx,TYPE wSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET wDiff
mov ecx,LENGTHOF wDiff
mov ebx,TYPE wDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET wResult
mov ecx,LENGTHOF wResult
mov ebx,TYPE wResult
call DumpMem ; call Dump Memory for selected offset value
; DWORD main processing
mov eax,0
mov eax,dwNum01
add eax,dwNum02
add eax,dwNum03
mov dwSum,eax
mov eax,0
mov eax,dwNum02
add eax,dwNum03
sub eax,dwNum01
mov dwDiff,eax
mov eax,0
mov eax,dwSum
add eax,dwDiff
mov dwResult,eax
mov esi,OFFSET dwSum
mov ecx,LENGTHOF dwSum
mov ebx,TYPE dwSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET dwDiff
mov ecx,LENGTHOF dwDiff
mov ebx,TYPE dwDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET dwResult
mov ecx,LENGTHOF dwResult
mov ebx,TYPE dwResult
call DumpMem ; call Dump Memory for selected offset value
; Main side for Dwtotal
mov eax,0
movzx eax,bSum
add ebx,wSum
add eax,dwSum
mov dwTotal,eax
mov esi,OFFSET dwTotal
mov ecx,LENGTHOF dwTotal
mov ebx,TYPE dwTotal
call DumpMem ; call Dump Memory for selected offset value
exit
main ENDP
; (additional procedures)
END main
错误始于我在使用 MOVZX 将 Bnum01 的值移动到 EAX 寄存器后将 bNum02 添加到 EAX 寄存器的行。它只是说它是一个 "invalid instruction operands"。据我了解,它告诉我 "That's not how it works"。我尝试进行研究,但没有任何意义。
感谢所有花时间解释的人。
指令的操作数必须具有相同的类型。尺寸。您不能将 BYTE
变量移动到 DWORD
寄存器。用于该目的的特殊指令是 MOVZX
和 MOVSX
,它们将较小的操作数适当地转换。以这种方式存储 (movzx bSum,eax
) 是不可能的,但您可以使用 EAX
的最低有效字节 - AL
寄存器:
movzx eax,bNum01
movzx ebx,bNum02
add eax, ebx
movzx ebx,bNum03
add eax, ebx
mov bSum, al
EBX
的最低有效字被称为BX
寄存器(EAX->AX,EBX->BX,ECX->CX,EDX->DX):
mov wSum, bx
目前正在使用 Masm 学习汇编语言。这是我 class.
中的作业我必须使用 32 位寄存器(EAX 和 EBX)进行某些计算。我必须处理 BYTE、WORD 和 DWORD 变量。并不复杂。我真的不明白为什么在组装当前代码时会出现这么多错误:
INCLUDE Irvine32.inc
.data
; (declare variables)
bNum01 BYTE 64
bNum02 BYTE 32
bNum03 BYTE 16
bSum BYTE ?
bDiff BYTE ?
bResult BYTE ?
wNum01 WORD 64
wNum02 WORD 32
wNum03 WORD 16
wSum WORD ?
wDiff WORD ?
wResult WORD ?
dwNum01 DWORD 64
dwNum02 DWORD 32
dwNum03 DWORD 16
dwSum DWORD ?
dwDiff DWORD ?
dwResult DWORD ?
dwTotal DWORD ?
.code
main PROC
; (insert executable instructions)
movzx eax,bNum01
add eax,bNum02
add eax,bNum03
movzx bSum,eax
movzx eax,bNum02
add eax,bNum03
sub eax,bNum01
movzx bDiff,eax
movzx eax,bSum
add eax,bDiff
movzx bResult,eax
mov esi,OFFSET bSum
mov ecx,LENGTHOF bSum
mov ebx,TYPE bSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET bDiff
mov ecx,LENGTHOF bDiff
mov ebx,TYPE bDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET bResult
mov ecx,LENGTHOF bResult
mov ebx,TYPE bResult
call DumpMem ; call Dump Memory for selected offset value
; WORD main processing
movzx ebx,wNum01
add ebx,wNum02
add ebx,wNum03
movzx wSum,ebx
movzx ebx,wNum02
add ebx,wNum03
sub ebx,wNum01
movzx wDiff,ebx
movzx ebx,wSum
add ebx,wDiff
movzx wResult,ebx
mov esi,OFFSET wSum
mov ecx,LENGTHOF wSum
mov ebx,TYPE wSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET wDiff
mov ecx,LENGTHOF wDiff
mov ebx,TYPE wDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET wResult
mov ecx,LENGTHOF wResult
mov ebx,TYPE wResult
call DumpMem ; call Dump Memory for selected offset value
; DWORD main processing
mov eax,0
mov eax,dwNum01
add eax,dwNum02
add eax,dwNum03
mov dwSum,eax
mov eax,0
mov eax,dwNum02
add eax,dwNum03
sub eax,dwNum01
mov dwDiff,eax
mov eax,0
mov eax,dwSum
add eax,dwDiff
mov dwResult,eax
mov esi,OFFSET dwSum
mov ecx,LENGTHOF dwSum
mov ebx,TYPE dwSum
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET dwDiff
mov ecx,LENGTHOF dwDiff
mov ebx,TYPE dwDiff
call DumpMem ; call Dump Memory for selected offset value
mov esi,OFFSET dwResult
mov ecx,LENGTHOF dwResult
mov ebx,TYPE dwResult
call DumpMem ; call Dump Memory for selected offset value
; Main side for Dwtotal
mov eax,0
movzx eax,bSum
add ebx,wSum
add eax,dwSum
mov dwTotal,eax
mov esi,OFFSET dwTotal
mov ecx,LENGTHOF dwTotal
mov ebx,TYPE dwTotal
call DumpMem ; call Dump Memory for selected offset value
exit
main ENDP
; (additional procedures)
END main
错误始于我在使用 MOVZX 将 Bnum01 的值移动到 EAX 寄存器后将 bNum02 添加到 EAX 寄存器的行。它只是说它是一个 "invalid instruction operands"。据我了解,它告诉我 "That's not how it works"。我尝试进行研究,但没有任何意义。
感谢所有花时间解释的人。
指令的操作数必须具有相同的类型。尺寸。您不能将 BYTE
变量移动到 DWORD
寄存器。用于该目的的特殊指令是 MOVZX
和 MOVSX
,它们将较小的操作数适当地转换。以这种方式存储 (movzx bSum,eax
) 是不可能的,但您可以使用 EAX
的最低有效字节 - AL
寄存器:
movzx eax,bNum01
movzx ebx,bNum02
add eax, ebx
movzx ebx,bNum03
add eax, ebx
mov bSum, al
EBX
的最低有效字被称为BX
寄存器(EAX->AX,EBX->BX,ECX->CX,EDX->DX):
mov wSum, bx