我正在通过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
我不清楚这是怎么回事。
任何帮助将不胜感激。
答案 0 :(得分:4)
首先要了解有无符号整数运算(其中溢出由进位标志指示)和有符号整数运算(其中溢出由溢出标志指示)。
相同的加法和减法指令用于无符号和有符号整数运算。唯一的区别是您之后测试的标志以及您如何解释结果(例如-0x0000423D或0xFFFFBDC3)。
借位也由进位标志表示。这意味着只要发生无符号整数溢出就会发生借位。对于0x0000195D - 0x0000618D
,存在无符号整数溢出(无符号整数不能为负),因此将设置进位标志(但没有有符号整数溢出,因此不会设置溢出标志) 。结果将是0xFFFFBDC3或-0x0000423D,具体取决于结果是应该签名还是无符号。