Как я могу реализовать подпрограмму PRINT на ассемблере lc3?

Привет, я новичок в ассемблере 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

person user3040046    schedule 27.11.2013    source источник
comment
Что вы пробовали? Покажите нам, какие усилия вы приложили к вопросу, прежде чем сбрасывать его сюда. У вас есть конкретный вопрос или вы просто хотите, чтобы мы сделали вашу домашнюю работу за вас? Кроме того, LOL при принадлежности к вашему учителю.   -  person Xavi López    schedule 28.11.2013
comment
Я не хочу, чтобы кто-то что-то делал для меня, как я уже сказал, я новичок в ассемблере lc3, и я просто хочу, чтобы кто-нибудь помог мне в любой из тех подпрограмм, которые я публикую. Если я публикую всю домашнюю работу, это потому, что я не хочу никаких сомнений от вас. Я просто прошу распечатать конкретные или, если нет, любые другие подпрограммы, чтобы получить представление о том, как выполнять эту подпрограмму, я бы сделал все остальное. Спасибо   -  person user3040046    schedule 28.11.2013


Ответы (1)


Я думаю, что команда «Печать» должна быть PUTS. Это напечатает содержимое памяти, начиная с R0 и заканчивая нулевым терминатором (я думаю).

person user3054804    schedule 01.12.2013