【问题标题】:Getting six bits from a register从寄存器中获取六位
【发布时间】:2017-04-12 22:21:10
【问题描述】:

我需要做一些 base 64 编码。我有一个包含字符消息的数组(0 - 255,所以只有 8 位字符)。对于 64 位编码的 6 位编码方面,我需要以某种方式只提取 6 位。然后我需要访问我在第一个字符和下一个字符的下四个上没有使用的两位。

我不知道该怎么做。我可以将一个字符拉入 al 但不确定如何仅访问最高有效 6 位,然后获取最低有效 2 位并将其连接到下一个字符的下 4 个最高有效位。

x86 英特尔语法 32位汇编

【问题讨论】:

  • 掩蔽和移动将是开始的好地方。
  • 忘掉汇编和 x86 开始吧,要么使用 C 或 Python 或你最喜欢的高级语言,要么只用铅笔和纸,理清掩码和移位算法,然后实现它就是一件简单的事情使用任何语言(x86 汇编等)。
  • 你为什么不使用一些已经完成的例程,你的努力有什么意义?如果你想学习这个,那么答案应该很简单,如果你想要性能,你可以在互联网上搜索已经完成的解决方案(虽然我第一次看到的谷歌链接看起来不像 那个 快,看起来像来自 80486 年龄)。

标签: assembly x86


【解决方案1】:

我可以将一个字符拉入 al,但不确定如何只访问最重要的 6 位

只需将AL 向右移动 2 位:

mov  al, [esi]
shr  al, 2

然后取最低有效 2 位并将其连接到下一个字符的下 4 个最高有效位。

首先确保重新加载AL 寄存器中的第一个字符。
然后带入AH 寄存器中的第二个字符。
现在将组合寄存器 AX 向右旋转 2 位。
最后将这 6 个高位向下移动到 AL 以获得 6 位结果:

mov  ax, [esi]        ;Reloads 1st char in AL, puts 2nd char in AH
ror  ax, 2            ;Puts the desired 6 bits in the top of AX
shr  ax, 10           ;Move it to AL

如果打算以这种方式继续,那么这是增加字符串指针的好地方:

inc  esi

对于第三个字符,您需要与第二个字符相似(但不一样!)的代码。

mov  ax, [esi]        ;Reloads 2nd char in AL, puts 3rd char in AH
rol  ax, 2            ;Puts the desired 6 bits in the bottom of AX
and  al, 63           ;Keep 6 bits

但是对于第四个字符,这又很容易。只需阅读它并屏蔽掉不需要的 2 个 topbits:

inc  esi
mov  al, [esi]
and  al, 63

ESI 上的最后一个增量,您已设置为仅来自 3 个字节的另外 4 个字符:

inc  esi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多