将0x10添加到0x7FF0不会导致0x8000,而是获得0x7F00

时间:2017-08-25 00:55:40

标签: assembly x86 masm

我目前正在学习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

enter image description here

10h移至AL后,我希望AX值为0x8000,而AX中的值为{{1} }}。

enter image description here

为什么在最右边的字节(最低有效字节)中将0x7F00添加到0x10并没有将0xF0传递到第二个最右边的字节?换句话说,如何将1添加到0x10并不会导致0x7FF0

我的猜测是因为当我添加0x8000时,我添加0x100x10AL添加时包含AL),因此添加0xF00x10会产生0xF0,但不会保留结转的0x100

我的假设是否正确?

3 个答案:

答案 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,所以你的执行将“保留”在那里。