Привет, я новичок в ассемблере lc3, и у меня есть это задание:
Мне нужно реализовать подпрограммы печати, сдвига вправо и сдвига, показанные ниже, любая помощь любой из этих подпрограмм будет оценена: (неполный код приведен ниже в конце)
Также все подпрограммы должны сохранять/восстанавливать все рабочие регистры, включая R7.
Алгоритм LSHR приведен здесь: http://users.cis.fiu.edu/~pestaina/RightShift.pdf. Завершите подпрограмму RSHIFT, реализуя алгоритм логического сдвига вправо. Чтобы протестировать RSHIFT, временно замените инструкцию JSR SHIFT в MAIN на JSR RSHIFT. Теперь программа должна отобразить исходные данные и данные со сдвигом вправо шесть раз.
Выполните подпрограмму SHIFT. Данные, которые нужно сместить, передаются в R0; значение в R1 указывает на тип переключения следующим образом: LSHL LSHR ASHL ASHR CSHL CSHR 0 1 2 3 4 5 .. 0000 .. 0001 .. 0010 .. 0011 .. 0100 ..0101 Подсказка: направление смещения всегда описывается в R1[0]; арифметические сдвиги обозначаются R1[1]; круговые сдвиги обозначаются R1[2]. Подсказка: все сдвиги влево могут быть реализованы как небольшие вариации логического сдвига влево, LSHL. LSHL можно сделать, просто добавив данные сами к себе. Подсказка: все сдвиги вправо могут быть реализованы как вариации логического сдвига вправо, уже реализованного в вашей подпрограмме RSHIFT.
Вот тривиальный алгоритм печати:
do 16 times
{
output ( Reg[15] ? ‘1’ : ‘0’ );
ShiftLeft( Reg );
}
и это программа, которую мне нужно выполнить
.ORIG x3000
MAIN
LEA R3, DATA ;R3 - Pointer to 1st Test Datum
TEST
LDR R2, R3, #0 ;R2 - Get next Test Datum
BRZ EXIT ; Exit if 0
AND R1, R1, #0 ;R1 - Shift Type initially 0
LEA R5, CAPS ;R5 - Pointer to 1st Caption
NEXT
AND R0, R5, #-1 ;R5 - Display Caption LSHL, etc.
TRAP x22
LD R0, CR_LF
TRAP x21
ADD R0, R2, #0 ; Display Original Datum
JSR PRINT
LD R0, CR_LF
TRAP x21
ADD R0, R2, #0 ; Shift Original Datum
JSR SHIFT ;R0 - Shifted Datum
JSR PRINT ; Display Shifted Datum
LD R0, CR_LF
TRAP x21
ADD R5, R5, #5 ;R5 - Locate next Caption
ADD R1, R1, #1 ;R1 - Sequence to next Shift Type
ADD R4, R1, #-5 ; Test Shift Type
BRNZ NEXT ; Exit if > 5
ADD R3, R3, #1 ;R3 - Locate next Test Datum
BRNZP TEST ; Repeat
EXIT
TRAP x25 ; Halt
;Variables
DATA .FILL x9875 ;Test Datum
.FILL x0000 ;Sentinel
CR_LF .FILL x000A ;New-Line \n
CAPS .STRINGZ "LSHL" ;Captions
.STRINGZ "LSHR"
.STRINGZ "ASHL"
.STRINGZ "ASHR"
.STRINGZ "CSHL"
.STRINGZ "CSHR"
;====================================================================
PRINT ;Display content of R0 in binary
RET
;====================================================================
SHIFT ;Universal Shift Subroutine
; R0 - Datum to be Shifted
; R1 - Shift Type: 000(0) - LSHL - Logical Left
; 001(1) - LSHR - Logical Right
; 010(2) - ASHL - Arithmetic Left
; 011(3) - ASHR - Arithmetic Right
; 100(4) - CSHL - Circular Left
; 101(5) - CSHR - Circular Right
RET
;====================================================================
RSHIFT ;Perform a Logical Shift Right on R0
;Shifted result returned in R0
RET
;====================================================================
.END