您将如何使用lc3 /汇编代码将存储的Hex值转换为二进制等效值?

问题描述 投票:1回答:2

这些值存储在.BLKW对象中,并使用LDR R0,R1,0 - ADD R1,R1,1(以增加.BLKW地址)加载到LOOP中。问题是如何将存储的HEX值转换为二进制值,然后以16位二进制格式输出到CONSOLE的转换。任何想法将不胜感激!我已经考虑过ANDing值,但我不确定如何去做。

assembly binary hex lc3
2个回答
1
投票

你已经完成了循环。但是,一个小错误。 我们知道当我们使用OUT进行打印时,它会将R0中的值打印到控制台。因此,我们打印的数字(R0中的数字)应始终为0或1.因此,我们正在处理的十六进制值应存储在其他寄存器中,如R2。因此,代码“LDR R0,R1,0”变为“LDR R2,R1,0”。

现在,对于每个单词(.BLKW中的地址),您必须将其转换为二进制,一次打印一位。

你可以做16次AND操作。通过ANDing R2和1000 0000 0000 0000的数字检查[16](最左边的位)是否为1。如果结果不是0,那么你知道最左边的位是1,所以打印1如果结果为0,则表示它必须为零,因此请打印0.然后将AND与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”

返回循环的开头。

结果应该是你需要的。


0
投票

我不知道lc3,但假设移位指令反映了进位标志中的最后一个移出位,你可以

  • 在一个小端架构上,将值左移1,如果设置了进位,则在输出流中输入“1”,否则输入“0”
  • 在大端架构上,将值向右移动,并在进位设置时输入字符“1”,否则输入“0”。

如果移位指令没有移入进位标志,则可以先测试最高或最低有效位(分别为小或大端拱),并根据结果将“1”或“0”输出到输出流,然后转移 - 效果是一样的。

对于“流”,我指的是任何可以想象的输出介质,无论是(字符串)变量还是内存中的其他缓冲区或真实文件。

很抱歉,我无法为您提供相关系统的可用源代码。

问候,玩得开心......

© www.soinside.com 2019 - 2024. All rights reserved.