【问题标题】:How can I implement the PRINT subroutine in lc3 assembly language?如何在 lc3 汇编语言中实现 PRINT 子例程?
【发布时间】:2013-11-27 03:45:44
【问题描述】:

您好,我是 lc3 汇编语言的初学者,我有这个任务:

我需要实现下面显示的打印、右移和移位子例程,任何这些子例程的任何帮助都将不胜感激:(不完整的代码在最后)

所有子程序也必须保存/恢复所有工作寄存器,包括 R7

这里给出了 LSHR 算法:http://users.cis.fiu.edu/~pestaina/RightShift.pdf。 通过实现逻辑右移算法来完成 RSHIFT 子例程 要测试 RSHIFT,请将 MAIN 中的 JSR SHIFT 指令暂时替换为 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

【问题讨论】:

  • What have you tried?向我们展示您在将问题倾倒在这里之前为这个问题付出了哪些努力。您是否有具体问题,或者您只是希望我们为您做作业?另外,你的老师在getting owned 大声笑。
  • 我不希望任何人为我做任何事情,正如我之前所说的,我是 lc3 汇编语言的初学者,我只是希望有人在我发布的任何子例程中帮助我。如果我发布整个作业是因为我不想让你怀疑。我只是要求打印特定的或如果没有,对于任何其他子例程,以便了解如何执行该子例程,其余的我会做。谢谢

标签: assembly subroutine bit-shift lc3


【解决方案1】:

我认为“打印”命令应该是 PUTS。这将打印内存的内容,从 R0 开始并以空终止符结束(我认为)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多