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

Add integers 20, 30, 50 and 160 using register 8-bitAL in assembly using MOVZX

我很困惑如何使用 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

当你在AL中加一个数出现溢出时,得到的是AL中结果的低8位,Carry Flag置位。如果您将进位标志加上 AL 寄存器视为一个 9 位数量,那么它就是您要查找的总和。 (而且 9 位数量足以表示 260。)

指令 "ADC" 代表 "Add with Carry",所以如果您已经将 AH 设置为零,(也许 MOVZX?)您可以 ADC AH,0 这实际上会将进位标志添加到 AH 中,然后 AX 将包含您的结果。

好了,这不仅仅是一个提示,它实际上是解决方案。

axahal组成。

movzxmov 和 "zero extended",可用于将较短的值复制到较大的目标。

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 指令组合成 add al,#i (设置的CF=进位标志,当结果确实溢出8b)adc ah,0(加CF啊)

尝试将此应用到 Mike 的答案中,如果您仍然迷路,请得到一些好东西 book/tutorial/lecture。

你怎么能问出"So the only possible registers are AX and EAX?"这样的问题?这意味着您没有阅读(或理解)有关 x86 汇编程序的任何内容。但是您已经在尝试编写代码了吗?首先深入研究一些讲座,只需几周时间就可以将一些好书或讲义重读几次,然后一切都会变得更有意义。目前,如果不查看 class.

中的内容,很难回答您的问题