我对如何使用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
答案 0 :(得分:2)
当您向AL
添加一个数字并且存在溢出时,您得到的是AL
中结果的低8位,并且进位标志已设置。如果您将进位标志加AL寄存器视为9位数量,则它是您要查找的总和。 (并且9位数量足以表示260.)
指令" ADC"代表"添加随身携带",如果您已将AH
设置为零,(可能是MOVZX
?),您可以执行ADC AH,0
将进位标记添加到AH
,然后AX
将包含您的结果。
你去了,这不仅仅是一个暗示,它实际上是解决方案。
答案 1 :(得分:1)
ax
由ah
和al
组成。
movzx
为mov
,“零扩展”,可用于将较短的值复制到较大的目的地。
movzx ah,0
不合法,它将8b常量移动到8b寄存器中,无需扩展(mov ah,0
就足够了。)
movzx ax,BYTE 20
将零扩展8位常数20,并将其存储到16位ax
寄存器中。
这相当于mov al,20 mov ah,0
或mov 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汇编程序的任何内容。然而你正在尝试编写代码?首先进入一些讲座,只需几周时间就可以多次重读一些好的书或讲义,然后一切都会变得更有意义。目前很难回答你的问题而没有通过课堂上的内容。