Почему не работают операции Shift и Rotate на тренажере 8086? - PullRequest
1 голос
/ 03 апреля 2019

Я занимался кодированием на 8086 тренажере. По какой-то причине операции SHR,SHL,SAL,SAR,ROL,ROR на нем не работают. если я напишу заявление типа

MOV AX,16
SHR AX,2

он застрянет в строке SHR AX,2, как если бы была какая-то синтаксическая ошибка. аналогично случаю других операций сдвига и поворота.

единственный способ заставить его работать - использовать регистр CL .

когда я изменил код на

MOV AX,16
MOV CL,2
SHR AX,CL

оно выполнено, но значение AX должно было быть 4, вместо этого 5.

также для этого кода

  MOV AX,32
  MOV CL,2
  SHR AX,CL

Значение в AX было 12, но предполагалось, что оно будет 8.

что здесь происходит? Я что-то не так делаю?

ПРИМЕЧАНИЕ : пожалуйста, не говорите мне использовать DIV & MUL вместо операции сдвига, потому что это становится очень сложным при использовании в больших программах.

Ответы [ 3 ]

1 голос
/ 21 июля 2019

он застрянет в строке SHR AX,2, как если бы была какая-то синтаксическая ошибка. аналогично случаю других операций сдвига и поворота.

Как указано в справочнике по инструкциям NASM, SHR с операндом с немедленным подсчетом сдвигов - это команда 186+. Поскольку вы, кажется, используете emu8086, он не поддерживается вашим ассемблером и целевой машиной.

См. https://ulukai.org/ecm/insref.htm#insSHL

8086 имеет только коды операций машинного кода для сдвигов на cl и сдвигов на неявные 1. Запись shr ax,1 собирается в инструкцию без немедленных действий, только код операции для сдвига на неявное число 1.

Другие подсчеты не поддерживаются, потому что кодирование недоступно до 186.

Вы можете сдвинуться на 2, используя shr дважды, или для большего подсчета на mov cl, 7 / shr ax, cl. (Для большого счета, например 8, он может быть быстрее до mov al, ah / mov ah,0 на реальном 8086, где каждый счет смены занимает дополнительный цикл.)

0 голосов
/ 05 апреля 2019

когда выполняется операция, подобная MOV AX,16, значение представляется внутри как 0000 0000 0001 0110.таким образом, содержимое AX регистра теперь равно 0000 0000 0001 0110.

, поэтому, когда операция сдвига SHR AX,CL выполнена, где CL равно 2, тогда значение в AX станет 0000 0000 0000 0101, что5.

Вот почему

MOV AX,16 MOV CL,2 SHR AX,CL

дал 5 после операции сдвига.

0 голосов
/ 03 апреля 2019

Что касается второй части вашего вопроса, как только вы получили его для сборки и получили 16 >> 2 = 5, когда ожидали 4:

Это потому, что ваш ассемблер обрабатывает все числа как HEX (база 16).

Если у вас есть 16 гекс, это двоичный код 0001 0110, то вы сдвинетесь 2 раза, получите
0000 0101, а это 5,
0 = 8, 1= 4, 0=2, 1=1

0x16 >> 2 = 5

, поэтому вам нужно указать 16-значное десятичное число
или работать с шестнадцатеричным основанием

0x16 = 22. Если вы хотите десятичное 16, это 10 в шестнадцатеричном.

...