我在Visual Studio中使用以下代码:
mov ax,7ff0h
add ax,10h ; AX = 8000h PL = 1 ZR = 0 CY = 0 OV = 1
add ah,1 ; AX = 8100h PL = 1 ZR = 0 CY = 0 OV = 0
add ax,2 ; AL = 02h PL = 1 ZR = 0 CY = 0 OV = 0
我发现当我向ax寄存器添加10h时,我得到一个溢出标志。我很确定这是因为8000h = 32768d超出了有符号整数的界限。
然而,当谈到将1d(01h)添加到ah寄存器时,我发现ax = 8100h,相当于33024d,但没有抛出溢出标志。我有点困惑,只是想知道为什么会这样。任何人都可以解释溢出和进位标志如何在这种情况下工作以及为什么第二个操作不会抛出溢出标志?
答案 0 :(得分:0)
第二条指令的AH起始值为0x80,当作为带符号的8位二进制补码处理时,转换为十进制数-128。向此处添加1会产生0x81,即-127。您已添加1到-128并获得-127。没有溢出。