我目前正在学习x86汇编语言。
我有以下代码
.386
.MODEL FLAT, STDCALL
.STACK 4096
ExitProcess PROTO, dwExitCode: DWORD
.CODE
main PROC
MOV AX, 7FF0h
ADD AL, 10h
invoke ExitProcess, 0
main ENDP
END main
在我将10h
移至AL
之前,AX
包含值0x7FF0
将10h
移至AL
后,我希望AX
值为0x8000
,而AX
中的值为{{1} }}。
为什么在最右边的字节(最低有效字节)中将0x7F00
添加到0x10
并没有将0xF0
传递到第二个最右边的字节?换句话说,如何将1
添加到0x10
并不会导致0x7FF0
?
我的猜测是因为当我添加0x8000
时,我添加0x10
到0x10
(AL
添加时包含AL
),因此添加0xF0
到0x10
会产生0xF0
,但不会保留结转的0x100
。
我的假设是否正确?
答案 0 :(得分:7)
代码将0x10添加到AL,而不是AX,导致AL = 0xF0 + 0x10 = 0x00。更改代码以将0x10添加到AX(而不是AL)。你也可以使用|添加AL,010H | ADC AH,000H |
答案 1 :(得分:2)
你可以这样做得更好(正如另一个答案所示):
MOV AX, 7FF0h
ADD AX, 0010h
但是你想要实现的目标(我假设)是这样的:
MOV AX, 7FF0h
ADD AL, 10h
ADC AH, 00h ; propagate carry to higher BYTE
这是 bigint 数学的基础构建,因为您可以将任意数量的字节加在一起。首先是 LSW add
以及其他所有 MSW 以及adc
的其他信息,请参阅相关信息:
答案 2 :(得分:1)
没有英特尔文档说添加会影响CF,所以你的执行将“保留”在那里。