从寄存器中获取六位

时间:2017-04-12 22:21:10

标签: assembly x86

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

我不确定我是怎么做的。我可以将一个字符拉入al但不确定如何只访问最重要的6位然后取最低有效位2并将其连接到下一个4的最重要字符。

86 英特尔语法 32位汇编

1 个答案:

答案 0 :(得分: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