Сравнение флага переноса, когда устанавливается флаг переноса? - PullRequest
0 голосов
/ 11 сентября 2018

У ассемблера есть этот код:

sub$0x22,%eax # %eax = %eax - 22
cmp$0x7,%eax  # %eax > 7 then jump *this is where I have trouble*
ja some address # jump if C = 1 or Z = 1

Моя цель - не совершать прыжок. Я пробовал случаи, когда% eax = 30, 14, 28, 16, 0, 22 * ​​1004 *

Вопрос: Я не понимаю, почему c = 0 и z = 0 во всех случаях, которые я пробовал.

1 Ответ

0 голосов
/ 11 сентября 2018

0x22, что составляет 34 десятичных знака, больше, чем все эти выборочные значения eax (при условии, что они десятичные).Таким образом, результат вычитания является отрицательным.Но «отрицательное» целое число - это просто целое число, где старший значащий бит равен 1, и его также можно интерпретировать как большое число без знака.означает концептуально, а не фактическую логику на флагах.( см. Этот ответ ) Вы можете думать о ja как о беззнаковом сравнении.Таким образом, эти отрицательные числа выглядят как действительно большие числа, которые больше 7. Если вы вместо этого использовали инструкцию jg, она должна вести себя больше, чем вы ожидаете.Это можно рассматривать как подписанное сравнение.

...