Из того, что я понимаю, al может влиять только на последний байт в eax ...
Это правильно.
Но результат отрицательный ...
Теперь все усложняется.
Как и большинство процессоров, x86 не различает guish между целыми числами без знака и целыми числами со знаком «два дополнения».
Это означает, что 0xaa
может означать 170 или (-86), и задача программиста или компилятора интерпретировать значение (если 0xaa
означает 170 или -86).
Это возможно, если учитываются только младшие биты вычисления. Пример:
0 + 170 = 0x000000AA
0 + (-86) = 0xFFFFFFAA
или:
0 - 170 = 0xFFFFFF56
0 - (-86) = 0x00000056
В обоих вышеприведенных результатах 8 младших битов равны.
Таким образом, для инструкции, которая будет изменять только младший бит 8 бит, не имеет значения, если 0xaa
означает 170 или (-86).
Инструкция SUB
x86 запишет младшие 8 битов результата в регистр и "выбросит" верхнюю 24 бита.
ЦПУ устанавливает 4 бита в регистре «флагов» для передачи дополнительной информации об этих 24 битах в программу.
, если результат будет просто 0x00
Некоторые процессоры поддерживают инструкции, которые работают следующим образом: результат вычитания равен 0, если «правильный» результат будет отрицательным.
Однако такие процессоры обычно имеют два разных SUB
Инструкция: одна, которая вычисляет как инструкция SUB
для x86, а другая инструкция, которая насытит результат до 0.