【问题标题】:Print contents of register to console in LC3 Assembly在 LC3 汇编中将寄存器的内容打印到控制台
【发布时间】:2015-10-28 20:46:42
【问题描述】:

假设我有一个值(例如 1234)加载到 R0 中。如何将此值打印到控制台?

【问题讨论】:

  • 查阅您正在使用的模拟器/模拟器的手册,看看是否有任何例程可以调用来打印整数。否则,看看是否有任何例程来打印字符串。在这种情况下,您必须先将整数转换为字符串。
  • 我可以使用 PUTS 打印一个以存储在 R0 中的值开始的字符串。在那种情况下,如何将我的值转换为字符串?

标签: assembly lc3


【解决方案1】:

我假设您想将一个数字打印到控制台,但如果有的话,您会得到随机字符。

当 LC3 试图将您的号码解释为 ASCII 字符时,就会发生这种情况。示例:ASCII 中的数字 8 是退格字符。

要使您的程序正常运行,您需要将 48(十进制)x30(十六进制) 添加到您的号码中,然后才能将其打印到控制台。

.ORIG x3000
  AND R0, R0, #0    ; Clear R0
  LD R0, NUM        ; load our number into R0
  LD R2, ASCII      ; load the ascii offset into R2
  ADD R0, R0, R2    
  OUT
HALT                ; Trap x25

NUM   .fill  x02    ; Our Number to print
ASCII .fill  x30    ; Our ASCII offset
.END

在您的示例中,您希望打印出一个字符数组,例如 1234。其概念非常相似,但我们需要使用指针和 for 循环。

.ORIG x3000
  AND R0, R0, #0    ; Clear R0
  AND R1, R1, #0    ; Clear R1
  AND R3, R3, #0    ; Clear R3
  LEA R0, NUM       ; pointer [mem]NUM
  ADD R1, R1, R0    ; Store the pointer address of R0 into R1
  LD R2, ASCII      ; load the ascii offset into R2

FOR_LOOP
  LDR R4, R1, #0    ; load the contents of mem address of R1 into R4
  BRz END_LOOP
  ADD R4, R4, R2    ; Add our number to the ASCII offset
  STR R4, R1, #0    ; Store the new value in R4 into [mem] address R1
  ADD R1, R1, #1    ; move our memory pointer down one
  BRnzp FOR_LOOP    ; loop again until we get an x00 char
END_LOOP

  PUTs              ; print our string starting from [mem]address in R0
HALT                ; Trap x25

ASCII .fill  x30    ; Our ASCII offset
NUM   .fill  x01    ; Our Number to print
      .fill  x02     
      .fill  x03
      .fill  x04
.END

【讨论】:

  • 这仅在您使用未打包的 BCD 存储您的号码时才有效。如果您在单个寄存器(或字节内存位置)中有一个像 123 这样的二进制整数,这将无济于事。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
相关资源
最近更新 更多