1. ホーム
  2. assembly

[解決済み] Lc3分割のしくみ

2022-02-05 17:24:22

質問

Iveは引き算による除算がどのように機能するかを理解しようとしたが、それを明確にするオンラインリソースがない。また、サブルーチンの構文がどのように見えるかの良い例も必要です。

どのように解決するのですか?

LC3では、2つの方法で割り算に取り組むことができます。もし引き算で割り算をする例を探しているなら、この投稿を見てください。

2進数で右ビットシフトするには?

でも、減算方式でなくてもいいなら、左へ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