Я работаю с книгой по языку ассемблера Ричарда Детмера.
В первой главе говорится:
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.
Флаг переноса - это 0-й бит регистра EFL
.
Предположим, мы хотим выполнить 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
Я не понимаю, как это могло быть.
Любая помощь будет оценена по достоинству.
sbc
(подпрограмма с переносом) вместоsbb
x86 (подпрограмма с заимствованием). - person Peter Cordes   schedule 16.11.2017