Куда переполняются регистры AL и AX? - PullRequest
3 голосов
/ 03 октября 2019

Скажите, пожалуйста, каков будет результат следующего ассемблерного (псевдо) кода?
Мы установили все биты регистра EAX в 0, поэтому, в свою очередь, у нас также есть AH, ALи AX как 0. Но когда я вычту младший бит AL, мы возьмем дополнение к двум и добавим, давая нам связку 1 с, а затем 0.

XOR eax, eax
SUB al 0x01

Таким образом, мой вопрос заключается в том, что при выполнении кода выше, просто AL будет заполнен 1 с, или он также перенесет в AX и EAX.

1 Ответ

5 голосов
/ 03 октября 2019

Вывод из add / sub переходит в CF, флаг переноса в EFLAGS.

Операндом sub al, 1 является AL, а не EAX. На старшие 24 бита EAX не может повлиять инструкция с размером 8-битного операнда.

Если вы хотите перевернуть весь EAX на все, вам понадобитсяиспользовать sub eax, 1. (или not eax, или dec eax). sub al, 1 - это другая инструкция, и отличие состоит в том, что она влияет только на AL (и EFLAGS), а не на любые биты вне AL. .

Нет. В дополнении 2 -1 представлено числом со всеми установленными битами. Например, в 8-битном это 0xFF, в 32-битном это 0xFFFFFFFF. Если бит 0 находится внизу, он будет означать, что -2.

будет просто заполнен единицами AL или будет также переноситься в AX и EAX.

Просто АЛ. Вы могли бы просто попробовать это сами (а затем попросить объяснить результат, если вы все еще были озадачены).

...