使用 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
将包含您的结果。
好了,这不仅仅是一个提示,它实际上是解决方案。
ax
由ah
和al
组成。
movzx
是 mov
和 "zero extended",可用于将较短的值复制到较大的目标。
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 指令组合成 add al,#i
(设置的CF=进位标志,当结果确实溢出8b)adc ah,0
(加CF啊)
尝试将此应用到 Mike 的答案中,如果您仍然迷路,请得到一些好东西 book/tutorial/lecture。
你怎么能问出"So the only possible registers are AX and EAX?"这样的问题?这意味着您没有阅读(或理解)有关 x86 汇编程序的任何内容。但是您已经在尝试编写代码了吗?首先深入研究一些讲座,只需几周时间就可以将一些好书或讲义重读几次,然后一切都会变得更有意义。目前,如果不查看 class.
中的内容,很难回答您的问题
我很困惑如何使用 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
将包含您的结果。
好了,这不仅仅是一个提示,它实际上是解决方案。
ax
由ah
和al
组成。
movzx
是 mov
和 "zero extended",可用于将较短的值复制到较大的目标。
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 指令组合成 add al,#i
(设置的CF=进位标志,当结果确实溢出8b)adc ah,0
(加CF啊)
尝试将此应用到 Mike 的答案中,如果您仍然迷路,请得到一些好东西 book/tutorial/lecture。
你怎么能问出"So the only possible registers are AX and EAX?"这样的问题?这意味着您没有阅读(或理解)有关 x86 汇编程序的任何内容。但是您已经在尝试编写代码了吗?首先深入研究一些讲座,只需几周时间就可以将一些好书或讲义重读几次,然后一切都会变得更有意义。目前,如果不查看 class.
中的内容,很难回答您的问题