装配 - 使用零填充移动不同的数据大小

时间:2017-05-10 04:21:25

标签: assembly masm cpu-registers irvine32

目前正在使用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寄存器的行中开始出错。它只是说它是一个"无效的指令操作数"。根据我的理解,它告诉我"那不是它的工作原理"。我尝试研究但没有任何意义。

感谢任何花时间解释的人。

1 个答案:

答案 0 :(得分:1)

指令的操作数必须具有相同的类型。尺寸。您无法将BYTE变量移动到DWORD寄存器。用于此目的的特殊说明是MOVZXMOVSX,它们适当地转换较小的操作数。以这种方式存储(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