Как работает деление Lc3

Я пытался понять, как работает деление на вычитание, но в Интернете нет ресурсов, которые проясняют это. Также мне нужен хороший пример того, как подпрограммы должны выглядеть с точки зрения синтаксиса.


person David Veloso    schedule 16.12.2015    source источник
comment
Каков ваш (конкретный) вопрос?   -  person MikeCAT    schedule 16.12.2015
comment
Деление повторным вычитанием довольно просто. Просто подумайте: несколько раз вычтите делитель и посчитайте, сколько раз вы зациклились. Так же, как умножение путем сложения в цикле.   -  person Peter Cordes    schedule 17.12.2015
comment
Эта часть, как я понимаю, это оставшаяся часть, где я рисую пробел   -  person David Veloso    schedule 17.12.2015


Ответы (2)


Есть два подхода к делению в LC3. Если вы ищете пример того, как выполнить деление через вычитание, взгляните на этот пост:

Как сделать битовый сдвиг прямо в двоичном формате

Но если вам не нужно использовать метод вычитания, я бы рекомендовал делать 15-битные сдвиги влево. Он более эффективен, потому что требует меньше времени на выполнение, и на его скорость не влияет число, которое мы хотим сдвинуть.


В приведенном ниже коде показано, как предварительно сформировать битовый сдвиг вправо, используя 15-битный сдвиг влево:

.ORIG x3000
LD R0, VALUE

SHIFT_RIGHT
    AND R2, R2, #0              ; Clear R2, used as the loop counter

    SR_LOOP
        ADD R3, R2, #-15        ; check to see how many times we've looped
        BRzp SR_END             ; If R2 - 15 = 0 then exit

        LD R3, BIT_15           ; load BIT_15 into R3
        AND R3, R3, R0          ; check to see if we'll have a carry
        BRz #3                  ; If no carry, skip the next 3 lines
        ADD R0, R0, R0          ; bit shift left once
        ADD R0, R0, #1          ; add 1 for the carry
        BRnzp #1                ; skip the next line of code
        ADD R0, R0, R0          ; bit shift left

        ADD R2, R2, #1          ; increment our loop counter
        BRnzp SR_LOOP           ; start the loop over again
    SR_END

    ST R0, ANSWER               ; we've finished looping 15 times, store R0
    HALT

BIT_15      .FILL   b1000000000000000
VALUE       .FILL   x3BBC       ; some random number we want to bit shift right
ANSWER      .BLKW   1

.END
person Chris M    schedule 18.12.2015

Возьмем пример: 23/8, который, как мы ожидаем, вернет 2 остатка 7.

Set NUM=23 and DIVISOR=8, initializing DIVIDEND=0 and REMAINDER=0
Loop as long as NUM > DIVISOR:
   NUM = NUM - DIVISOR decreases the overall number
   DIVIDEND = DIVIDEND + 1 because we've discovered that it fits once more

В конце ОСТАТОК = ЧИСЛО, потому что это число, из которого больше нельзя вычесть другой ДЕЛИТЕЛЬ, когда цикл завершается.

Итак, давайте пройдемся по итерации за раз:

0) NUM=23, DIVIDEND=0
1) (23 > 8, continue) NUM=23-8=15, DIVIDEND=0+1=1
2) (15 > 8, continue) NUM=15-8=7, DIVIDEND=1+1=2
3) (8 < 7, stop)

Окончательные ответы, REMAINDER=NUM=7, DIVIDEND=2

person aqua    schedule 13.01.2016