这些值存储在 .BLKW 对象中,并通过 LDR R0,R1,0 - ADD R1,R1,1 加载到 LOOP 中(以增加 .BLKW 地址)。问题是如何将存储的 HEX 值转换为二进制值,然后以 16 位二进制格式将转换输出到 CONSOLE。任何想法将不胜感激!我已经考虑过 ANDing 值,但不确定如何去做。
2 回答
你已经把循环搞定了。然而,一个小错误。
我们知道,当我们使用 OUT 进行打印时,它会将 R0 中的值打印到控制台。因此,我们正在打印的数字(R0 中的数字)应该始终为 0 或 1。因此,我们正在处理的十六进制值应该存储在其他一些寄存器中,例如 R2。因此,代码“LDR R0, R1, 0”变为“LDR R2, R1, 0”。
现在,对于每个单词(也就是 .BLKW 中的地址),您必须将其转换为二进制,一次打印一位。
你可以做 16 次 AND 操作。通过将 R2 与 1000 0000 0000 0000 的数字进行与运算来检查 [16](最左边的位)是否为 1。如果结果不是 0,那么您知道最左边的位是 1,所以打印 1 . 如果结果是 0,你知道它一定是 0,所以打印 0。然后将 R2 与 0100 0000 0000 0000 以相同的方式检查第二位,依此类推。
然而,这只是一团糟。最好的方法是使用循环。
将其中一个寄存器 - 比如说 R3 设置为 1000 0000 0000 0000。我们将在一分钟内使用它。
让我们使用 R5 作为我们的哨兵,也就是“计数器”,告诉我们何时处理完所有 16 位数字。我们将 R5 设置为 16,然后每次通过循环时从 R5 中减去 1,当我们达到 0 时,我们将退出循环。
现在,将什么放入循环中。
对于每次迭代,AND R2 和 R3,并将结果存储在一些未使用的寄存器中,如 R4。如果结果为零,我们知道 R2 的最左边位为零,所以打印 0。如果结果为负(因为 1000 0000 0000 0000 是 2 的补数,因此为负数),我们知道最左边的位是a 1,所以打印 1。
然后在 R2 中进行左移。这是通过将 R2 添加到自身并通过以下方式存储它来实现的:“ADD R2, R2, R2”。
通过以下方式减少我们在 R5 中的计数器:“ADD R5, R5, #-1”
返回到循环的开头。
结果应该是你需要的。
我对lc3一无所知,但假设移位指令反映了进位标志中最后一个移出的位,你可以
- 在小端架构上,将值左移 1,如果设置了进位,则将“1”放入输出流,否则为“0”
- 在大端架构上,将值右移,并在进位设置时输入字符“1”,否则输入“0”到输出。
如果移位指令不移入进位标志,您可以先测试最高或最低有效位(分别用于小端或大端拱),并根据结果将“1”或“0”放入输出流,然后转移——效果是一样的。
“流”是指任何可以想象的输出介质,无论是(字符串)变量还是内存中的其他缓冲区或真实文件。
抱歉,我无法为您提供相关系统的可用源代码。
问候,并玩得开心...