我需要做一些base 64编码。我有一个数组,其中包含一个字符消息(0 - 255,所以只有8位字符)。对于64位编码的6位编码方面,我需要以某种方式仅拉出6位。然后我需要访问我在第一个字符和下一个字符的下四个字符上使用的两个位。
我不确定我是怎么做的。我可以将一个字符拉入al但不确定如何只访问最重要的6位然后取最低有效位2并将其连接到下一个4的最重要字符。
86 英特尔语法 32位汇编
答案 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