使用LC-3进行16位字反转

时间:2012-10-28 21:08:19

标签: assembly bit-shift lc3

我正在进行分配,我将在二进制文件中输入,并将其反向存储在另一个地址中。我正在使用4位字,直到我能够将逻辑降低,然后在一切正常工作后将其扩展为16位字。

例如:1010100101001011 ==> 1101001010010101

到目前为止,这是我的方法:

字:1010 面具:0001 结果:0000

1)1010&      0001 - 和这一起

 result is: 0000 

(我希望只能将最低有效位存储为我的结果中最重要的位置)

2)1010&    0010 - 增加我的面具,并将它与我的单词“和”结合起来

结果是:0010

现在我会把这个位置放在2位,然后将它存储在我的结果寄存器的4位。

这就是我遇到的问题,试图找出隔离一位然后将其存储在另一个位置的逻辑。

任何提示或建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

假设你的意思是最小的LC-3,它没有移位或除法指令:

  • ADD可用于向左移动面具
  • ADD可用于移动结果
  • 您可以测试掩码的AND和输入是否为零
  • 使用测试结果将左移左后的结果添加0或1

这是一个C演绎

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;
}

bithacks网站有很多有趣的方法可以解决这个问题和其他比特级问题。

答案 1 :(得分:0)

这是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

测试代码:http://ideone.com/GgbzHw

将上述循环转换为LC3应该是相当简单的,尽管在给定非常有限的指令集的情况下,合成|<<>>可能具有挑战性。