【问题标题】:Bitwise operations, assembly按位运算,汇编
【发布时间】:2013-02-19 13:05:02
【问题描述】:

我的任务是更改位位置

开始第 7 位 |位6 |位5 |位4 |位3 |位2 |位1 |位0

最终位3' |位2' |位7 |位6 |位1 |位0 |位5' |位4'

使用按位和移位/滚动指令。

我不知道如何以不同于移动和滚动的方式移动它们。我应该只使用一个还是多个寄存器来做到这一点?

【问题讨论】:

  • 那是什么处理器?如何做到这一点很大程度上取决于可用的指令。在programming.sirrida.de/calcperm.php 填写此内容建议将这些位移动到四组,每组两个,这是有道理的,我自己也会这样做。
  • ldi r16, $F0 ; 将值 F0 赋予 r16。然后我使用了“lsl”、“lsr”等命令。
  • 该方法非常简单。取一个 2 位块,将其移动到正确的位置。通过 AND 将所有其他位清零。然后 OR 与先前处理的块的块。这样做 4 次。是的,您需要几个寄存器——一个用于处理当前块,另一个用于累积结果,另一个用于源。我不知道你的系统组装,但这是一般的方法。
  • 如何取2bit chunk?我需要 4 个寄存器吗?
  • 不是爱特梅尔,伙计们。从概念上讲是的,但这会产生异常缓慢的代码。这是一个 8 位微控制器,只有 1 位移位/滚动。

标签: assembly bit-manipulation avr atmega


【解决方案1】:

使用 shift 和 rol,你应该可以用两个寄存器来做,在进程中浪费了原来的。

通过进位将 A 右移复制最左边的位到进位。 通过进位将 B 右移 复制 该位到寄存器 B 并将 LSB 移到进位。

按顺序

1 - ROR A,A,1     // A = _7654321, --> carry = '0'
2 - ROR B,B,1     // B = 0_______, --> carry = 'x' / don't care
3 - ROR A,A,1     // A = x_765432, --> carry = '1'
4 - ROR B,B,1     // B = 10______, --> carry = 'x' / don't care
// this has copied two bits from A to B while shifting both

5 - ROR B,B,1     // B = x10_____,
6 - ROR B,B,1     // B = xx10____,

repeat steps 1-4 again for B to contain bits '3 2 _ _ 1 0 _ _'

(这是解决方案的一半)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 2013-05-15
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多