Сдвиг двоичной строки вправо на машинном коде / языке ассемблера

Я понимаю, что выполнение 15 сдвигов влево будет сдвигать двоичную последовательность вправо на единицу. Однако после установки начальных значений регистра, если регистр 1 равен 1; программы дают правильное решение. Все, что больше хранится в регистре 1, приводит к тому, что программа дает неправильные решения. Я работаю с LC-3; вот мой код файла bin:

0011000000000000        ; Orig
0010000011111111        ; R0 <- mem[x3100]
0010001011111111        ; R1 <- mem[x3101]
0101010010100000        ; R2 <- R2 AND #0
0001001001100000        ; R1 <- R1 + #0
0000010000001101        ; BRz R1
0001010010101111        ; R2 <- R2+15
0000010000001001        ; BRz R2
0001000000100000        ; R0 = R0 + #0
0000100000000011        ; BRn
0001000000000000        ; R0 <- R0+R0
0001010010111111        ; R2--
0000111111111010        ; BRnzp PCOffset
0001000000000000        ; R0 <- R0 + R0
0001000000000001        ; R0 <- R0 + #1
0001010010111111        ; R2--
0000111 111110110       ; BRnzp PCOffset
0001001001111111        ; R1--
0000 111 111110001      ; BRnzp PCOffset
0011 000 011101111      ; St R0 -> mem[x3102]
1111000000100101        ; Halt

1 ответ

Нашел строку кода, которая доставляет вам неприятности

0001000000000001        ; R0 <- R0 + #1

это не добавляет 1 к R0, это фактически добавляет R1 к R0.

0001000000000001        ; R0 <- R0 + R1

Вам нужно заменить эту строку на:

0001000000100001        ; R0 <- R0 + #1

Вы пропускаете бит немедленного добавления [5].

Другие вопросы по тегам