目前正在使用Masm学习汇编语言。这是我班上的作业。
我必须使用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寄存器的行中开始出错。它只是说它是一个"无效的指令操作数"。根据我的理解,它告诉我"那不是它的工作原理"。我尝试研究但没有任何意义。
感谢任何花时间解释的人。
答案 0 :(得分:1)
指令的操作数必须具有相同的类型。尺寸。您无法将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
的最不重要的WORD称为BX
寄存器(EAX-> AX,EBX-> BX,ECX-> CX,EDX-> DX):
mov wSum, bx