Язык ассемблера: cbw

Я не уверен, что на самом деле делает команда cbw. У меня есть фрагмент кода:

mov  ax,0FF0h
cbw
idiv ah

Как меняется значение топора после cbw?


person raphnguyen    schedule 01.11.2011    source источник
comment
Найдите его в любой копии справочного руководства Intel или AMD по ISA: felixcloutier.com/ x86 / CBW: CWDE: CDQE.html. См. Также Когда и почему мы подписываем расширение и используем cdq с mul / div?, а также Что делает cltq в сборке? для таблицы эквивалентов cbw / cwde / cwd / и т. д. в терминах movsx для синтаксиса Intel и AT&T.   -  person Peter Cordes    schedule 20.03.2019
comment
Деление на AH после расширения знака на AX исключительно странно. Он будет ошибкой для неотрицательного AL (потому что AH = 0), или он будет делиться на -1 для отрицательного AL. (Снова ошибка с #DE для AL = 80h, потому что -128 / -1 = +128 переполняет 8-битный AL.) Это похоже на наихудшую и наиболее неэффективную попытку взять абсолютное значение AL.   -  person Peter Cordes    schedule 20.03.2019
comment
@PeterCordes cbw, cwde, cdqe все три используют один и тот же код операции. Так как же процессор выбирает al->ax, ax->eax, eax->rax? То же самое для триплета cwd, cdq, cqo.   -  person Sourav Kannantha B    schedule 17.07.2021
comment
@SouravKannanthaB: префиксы, точно такие же, как и для других 16/32/64-битных кодов операций. Вы даже можете увидеть полный машинный код, включая префиксы для всех этих инструкций, в моем ответе, который я уже указывал в своем первом комментарии, Что делает cltq в сборке ?. Подробнее о префиксах см. Есть ли размер операнда по умолчанию в архитектуре x86-64 (AMD64)?   -  person Peter Cordes    schedule 17.07.2021


Ответы (1)


Знак инструкции cbw расширяет байт в слово. В этом случае он возьмет знаковый бит AL (который оказывается равным 1) и скопирует его в каждый бит AH.

Это означает, что два дополнительных значения AX будут одинаковыми, но двоичное представление будет другим.

Значение AX после инструкции cbw будет FFF0h (16-битное значение -16, точно так же, как AL изначально было 8-битным -16)

person anonymous coward    schedule 01.11.2011
comment
Спасибо. Я понимаю ваше объяснение того, что знаковый бит AL равен 1, поскольку он отрицательный, но меня немного смущает, почему AL изначально 8-битный -1. Разве изначально не AL -16 (с битом знака, равным 1)? - person raphnguyen; 01.11.2011
comment
Последний ноль в 0FF0h был проигнорирован. AX должен стать 0FFF0h после CBW. - person Alexey Frunze; 01.11.2011