Как заставить эту программу LC3 размножаться вместо этого? - PullRequest
0 голосов
/ 23 апреля 2020

Пытался научиться умножению в LC3, но у меня возникли проблемы с изменением моей старой программы, которая просто предназначалась для добавления сумм. Как бы я go изменил эту программу для умножения на 2 заданных входа? Код:

.ORIG x3000 ; begin at x3000

; input two numbers

IN ;input an integer character (ascii) {TRAP 23}

LD R3, HEXN30 ;subtract x30 to get integer

ADD R0, R0, R3

ADD R1, R0, x0 ;move the first integer to register 1

IN ;input another integer {TRAP 23}

ADD R0, R0, R3 ;convert it to an integer

; add the numbers

ADD R2, R0, R1 ;add the two integers

; print the results

LEA R0, MESG ;load the address of the message string

PUTS ;"PUTS" outputs a string {TRAP 22}

  ADD R0, R2, x0 ;move the sum to R0, to be output

  LD R3, HEX30 ;add 30 to integer to get integer character

  ADD R0, R0, R3

  OUT ;display the sum {TRAP 21}

     ; stop

HALT ;{TRAP 25}

; data

 MESG .STRINGZ "The sum of those two numbers is: "

 HEXN30 .FILL xFFD0 ; -30 HEX

 HEX30 .FILL x0030 ; 30 HEX

.END```

1 Ответ

2 голосов
/ 23 апреля 2020

Самый простой подход к умножению на L C -3 - это повторяющееся сложение. Так что продолжайте суммировать множитель и уменьшать множитель; итерация останавливается, когда множитель потребляется (т. е. ноль).

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

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

...