Assembly 使用LC-3的16位字反转
我正在做一项作业,我将以二进制输入,并将其相反的内容存储在另一个地址中。我一直在使用一个4位字,直到我能够把逻辑写下来,然后在一切正常后,我可以将它扩展为一个16位字 例如:1010101001011==>1101001010010101 以下是我迄今为止的方法: 字:1010 口罩:0001 结果:万 1) 1010& 0001-这两者加在一起Assembly 使用LC-3的16位字反转,assembly,bit-shift,lc3,Assembly,Bit Shift,Lc3,我正在做一项作业,我将以二进制输入,并将其相反的内容存储在另一个地址中。我一直在使用一个4位字,直到我能够把逻辑写下来,然后在一切正常后,我可以将它扩展为一个16位字 例如:1010101001011==>1101001010010101 以下是我迄今为止的方法: 字:1010 口罩:0001 结果:万 1) 1010& 0001-这两者加在一起 result is: 0000 (我只希望能够将结果中最低有效位存储为最高有效位) 2) 1010& 0010-增加我的掩码,并将其与我的单词一
result is: 0000
(我只希望能够将结果中最低有效位存储为最高有效位)
2) 1010&
0010-增加我的掩码,并将其与我的单词一起and
结果是:0010
现在我将取2的位,并将其存储在结果寄存器中4的位置
这就是我遇到的问题,试图提出逻辑来隔离一个位,然后将其存储在另一个位置
如有任何提示或建议,将不胜感激 假设您指的是最小LC-3,它没有移位或除法指令:
- “添加”可用于向左移动遮罩
- “添加”可用于将结果向左移动
- 您可以测试掩码和输入的AND是否为零
- 向左移动后,使用测试结果向结果添加0或1
uint16_t reverse16 (uint16_t input)
{
uint16_t result = 0u;
uint16_t mask = 1u;
int i;
for (i= 0; i < 16; i++)
{
result = result + result;
if (0u != (input & mask))
{
result += 1u;
}
mask = mask + mask;
}
return result;
}
uint16\u t反向16(uint16\u t输入)
{
uint16\u t结果=0u;
uint16_t掩码=1u;
int i;
对于(i=0;i<16;i++)
{
结果=结果+结果;
如果(0u!=(输入和掩码))
{
结果+=1u;
}
面具=面具+面具;
}
返回结果;
}
该网站有很多有趣的方法来解决这个和其他位级别的问题。以下是C语言中的逻辑,用于实现16位字的位反转(简单易懂):
uint16_t w = 0xb2e3; // our 16 bit word
uint16_t mask0 = 0x0001; // mask for LS bit
uint16_t mask1 = 0x8000; // mask for MS bit
uint16_t shift = 15; // distance between high and low bit positions
for (int b = 0; b < 8; ++b) // for each pair of low/high bits
{
uint16_t b0 = w & mask0; // get low bit
uint16_t b1 = w & mask1; // get high bit
w &= ~(mask0 | mask1); // clear low/high bit in word
b0 <<= shift; // swap bit positions
b1 >>= shift;
w |= (b0 | b1); // insert swapped bits back into word
mask0 <<= 1; // update masks for next pair of bits
mask1 >>= 1;
shift -= 2; // update distance for next pair of bits
}
printf("%#x\n", w); // w should now contain 0xc74d
uint16\u t w=0xb2e3;//我们的16位字
uint16\u t mask0=0x0001;//LS位掩码
uint16_t mask1=0x8000;//MS位掩码
uint16\u t shift=15;//高位和低位位置之间的距离
for(int b=0;b<8;++b)//每对低位/高位
{
uint16\u t b0=w&mask0;//获取低位
uint16\u t b1=w&mask1;//获取高位
w&=~(mask0 | mask1);//清除字中的低位/高位
b0=移位;
w |=(b0 | b1);//将交换位插回字中
mask0=1;
shift-=2;//更新下一对位的距离
}
printf(“%#x\n”,w);//w现在应该包含0xc74d
测试代码:
将上述循环转换为LC3应该相当简单,尽管合成
|
,
可能具有挑战性,因为指令集非常有限。您想对16位字进行完全的位反转吗?您可能应该给出一个输入/输出示例来明确这一点,例如1011001011100011
=>110001110101001
,如果我理解正确的话?是的,您是正确的。我将使用一个掩码在单词中移动,并使用and函数查看一个孤立的位位置。我正在苦苦挣扎的是想出一个逻辑,或者想出一种方法将其存储到我的结果寄存器中。我需要弄清楚如何从我用掩码和我的字并将其存储到我的结果寄存器的结果中,在特定位置发送一个位:bit0->bit15,bit1->bit14,等等。非常感谢您花时间查找并为我提供有用的信息。我一直在研究分支以及它们是如何工作的。如果我错了,请纠正我,但我认为这是可行的。例如:和R3、R2、R1(在此处插入新行)BRz#1 BRp#2现在第一个BR语句将查看前一行的结果,如果为false,则将移动到下一行?或者我必须拆分分支语句吗?这里有一个很好的例子说明了如何实现for循环:-它使用BRzp
作为循环测试分支。对于只进行8次上述迭代的情况,您可能可以做一些更简单的事情。