как CF (флаг переноса) устанавливается в соответствии с вычислением t = ab, где a и b - целые числа без знака - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в x64-64, просто вопрос, как настраивается CF? Я читал учебник, в котором говорится:

CF: Флаг переноса используется, когда самая последняя операция генерирует перенос самого старшего бита. Используется для обнаружения переполнения для беззнаковых операций.

У меня есть два вопроса:

Q1 - предположим, мы использовали одну из инструкций добавления для выполнения эквивалента C присвоение t = a + b, где переменные a, b и t являются целыми числами (только 3 бита для простоты), поэтому для 011 (a) + 101 (b) = 1000 = 000, поскольку у нас есть бит выполнения 1 в четвертом di git, поэтому флаг CF будет установлен на 1, правильно ли я понимаю?

Q2 - если мое понимание в Q1 верно, и предположим, что мы использовали одну из подинструкций для выполнения эквивалента присваивания C t = ab, где a, b и t - беззнаковые целые числа, поскольку a, b беззнаковые, мы фактически не можем сделать a+(-b), и я не понимаю, как мы можем сделать 011 (a) - 101 (b) переносом самого старшего бита?

1 Ответ

2 голосов
/ 11 июля 2020

Флаг переноса часто называют «заимствовать» при выполнении вычитания. После вычитания он устанавливает, если 1 должна быть заимствована из следующего бита (или была бы заимствована, если бы вы использовали метод вычитания в начальной школе). Флаг заимствования похож на -1 в этой позиции бита:

  011     -1 211
- 101  ->  - 101
-----      -----
           B 110
  

Вы можете получить тот же результат, добавив ноль к аргументам, и тогда перенос или заимствование будет старшим битом результата. :

 0011 - 0101 = 0011 + (-0101) = 0011 + 1011 = 1110
...