汇编x86-64设置子指令的进位标志

时间:2017-11-16 15:28:48

标签: assembly x86-64 carryflag

我正在通过Richard Detmer's Assembly Language book

第一章陈述:

A borrow occurs in the subtraction a - b when b is larger than a as unsigned numbers. Computer hardware can detect a borrow in subtraction by looking at whether a carry occurred in the corresponding addition. If there is no carry in the addition, then there is a borrow in the subtraction. If there is a carry in the addition, then there is no borrow in the subtraction.

进位标志是EFL寄存器的第0位。

假设我们想要执行195D - 618D = -423D作为减法运算。有借用,因此不应设置进位标志。

以下asm代码编译并运行,但在sub rax, 618之后,确实设置了进位标志。

相应的加法是00C3h + FD96h,这不涉及进位,因为最后的成对加法是0 + F而没有进位,因此,没有进行最后的成对加成。

 .DATA
number  QWORD   195
sum     QWORD   ?

.CODE
main    PROC
        mov     rax, number     ; 195 to RAX
        sub     rax, 618        ; subtract 618
             ;at this point, however, the carry flag is indeed set to 1. Why is this?
        mov     sum, rax        ; sum to memory

        mov     rax, 0          ; return code
        ret                     ; exit to operating system

main    ENDP

END

我不清楚这是怎么回事。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

首先要了解有无符号整数运算(其中溢出由进位标志指示)和有符号整数运算(其中溢出由溢出标志指示)。

相同的加法和减法指令用于无符号和有符号整数运算。唯一的区别是您之后测试的标志以及您如何解释结果(例如-0x0000423D或0xFFFFBDC3)。

借位也由进位标志表示。这意味着只要发生​​无符号整数溢出就会发生借位。对于0x0000195D - 0x0000618D,存在无符号整数溢出(无符号整数不能为负),因此将设置进位标志(但没有有符号整数溢出,因此不会设置溢出标志) 。结果将是0xFFFFBDC3或-0x0000423D,具体取决于结果是应该签名还是无符号。