Как разделить на ассемблере, используя сложение? - PullRequest
0 голосов
/ 18 апреля 2019

На уроке компьютерной инженерии в средней школе нам дали задание, в котором мы должны разделить 2 числа на ассемблере, используя процесс сложения.

В игрушечной архитектуре, для которой мы программируем, нет инструкции деления. Машина имеет 2 дополнения дополнения и побитовые операции И / ИЛИ / XOR, но не вычитание напрямую: https://www.csie.ntu.edu.tw/~r03944025/intro2015/files/hw/appendix_c

(Примечание редактора: в учебнике не определен язык ассемблера, только коды операций и операнды машинного кода для этой машины загрузки / хранения с шестнадцатью 8-битными регистрами и условной инструкцией перехода по нулевому значению.)

1 Ответ

1 голос
/ 18 апреля 2019

Поскольку я не хочу делать твою школьную домашнюю работу, я дам только несколько советов:

Как разделить ... используя сложение?

Это не быстрый метод, но вы можете сделать следующее:

; Calculate C = A / B
Set C to 0
As long as A >= B:
    Increment C by 1
    Subtract B from A

Если A и B могут быть отрицательными, выполните следующие действия:

Set D to 0
If A is negative:
    Set D to 1
    Negate A
If B is negative:
    Xor D with 1
    Negate B
Perform C = A / B (see above)
If D != 0:
    Negate C

Игрушечная архитектура ... имеет 2 дополнения дополнения и побитовые операции И / ИЛИ / XOR ...

... и инструкция условного перехода, которая переходит, если два регистра равны, а также операция поворота.

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

Однако для двух делений 0x30 / 0x10 = 3 и 0x20 / 0x10 = 2 бит 0 всех входов равен 0, но в одном случае бит 0 на выходе равен 1, а в другом случае бит 0 на выходе равен 0.

но не вычитание напрямую

Некоторые подсказки о некоторых операциях, которые ваш ЦП не имеет:

  • Инвертировать все биты числа можно с помощью операции XOR.
  • Пожалуйста, помните, как отрицать число в дополнении к двум.
  • Если вы можете отрицать число и добавлять числа, вы также должны иметь возможность вычитать числа.
  • Пожалуйста, помните, как узнать, отрицательно ли число дополнения до двух.
  • Если вы работаете только с числами в диапазоне 0 ... 127, проверка «A Обратите внимание, что это тот случай, когда вы разрешаете отрицательные входы!
  • Если вы работаете со всем диапазоном 0 ... 255, проверить «A Если бит 7 равен «1» в A, но «0» в B, то A Если бит 7 равен «0» в A, но «1» в B, то A Если бит 7 имеет одинаковые значения в A и B (либо оба бита равны «0», либо оба бита равны «1»), проверка «(A-B) отрицательна» может быть сделана
...