使用MOVZX在汇编中使用寄存器8位AL来添加整数20,30,50和160

时间:2016-09-11 21:05:48

标签: assembly x86 masm irvine32

我对如何使用8位寄存器AL找到整数之和感到困惑?任何提示都会很棒。谢谢。

TITLE Add              (AddSub.asm)

; This program adds and subtracts 32-bit integers.
;Problem 1 Add 20, 30, 50,160  al  hint move ax,0 to start
; Last update: 2/1/02

TITLE Add               (AddSub.asm)

INCLUDE Irvine32.inc

.code
main PROC

    mov al,20d      
    add al,30d      
    add al,50d      
    add al,160d 
    call DumpRegs

    call writedec 
    exit
main ENDP
END main

2 个答案:

答案 0 :(得分:2)

当您向AL添加一个数字并且存在溢出时,您得到的是AL中结果的低8位,并且进位标志已设置。如果您将进位标志加AL寄存器视为9位数量,则它是您要查找的总和。 (并且9位数量足以表示260.)

指令" ADC"代表"添加随身携带",如果您已将AH设置为零,(可能是MOVZX?),您可以执行ADC AH,0将进位标记添加到AH,然后AX将包含您的结果。

你去了,这不仅仅是一个暗示,它实际上是解决方案。

答案 1 :(得分:1)

axahal组成。

movzxmov,“零扩展”,可用于将较短的值复制到较大的目的地。

movzx ah,0不合法,它将8b常量移动到8b寄存器中,无需扩展(mov ah,0就足够了。)

movzx ax,BYTE 20将零扩展8位常数20,并将其存储到16位ax寄存器中。

这相当于mov al,20 mov ah,0mov ax,WORD 20(或几千种其他变体如何将字节值20加载到al并将零加载到ah,其中一种是常见的是使用xor ah,ah)。

初始化完整ax后,您可以将add al,#i更改为16b变体add ax,#i,或者将两个8b添加说明中的相同内容组成add al,#i(设置为CF = Carry标志,当结果溢出时8b)adc ah,0(将CF添加到啊)。

尝试将此应用于迈克的答案,如果你还在迷路,那就获得一些好的书/辅导/讲座。

你怎么能问一些类似的东西“所以唯一可能的寄存器是AX和EAX?”?这意味着您没有阅读(或理解)有关x86汇编程序的任何内容。然而你正在尝试编写代码?首先进入一些讲座,只需几周时间就可以多次重读一些好的书或讲义,然后一切都会变得更有意义。目前很难回答你的问题而没有通过课堂上的内容。