我正在使用YASM汇编程序。
如果我有一个这样声明的变量
segment .bss
number resb 100然后我像这样做一个逻辑上的右移
shr byte [number], 8如果例如123被存储在那里,使得内存看起来像这样的0x333231,那么我期望结果是0x3332,但结果是0x333200。如果我将数据存储在寄存器中,这个问题就不会发生,谁能解释一下为什么会发生这种情况,以及如何修复它(我想使用内存而不是寄存器)。
发布于 2021-09-20 22:20:29
例如123的
被存储在其中,使得存储器看起来像这样0x333231
看到值0x333231,我敢断定number的内存保存着ASCII表示的数字。
31 32 33 00 00 00 ... 00因此,向右移位8位将移出最低的数字。您不需要shr指令就可以做到这一点。只需复制内存:
mov edi, number
lea esi, [edi+1]
mov ecx, 99
cld
rep movsb
mov [edi], cl ; CL=0上面的代码对整个100字节的缓冲区做了什么,下面的代码只对前4个字节做了什么。
mov eax, [number]
shr eax, 8
mov [number], eax或
shr dword [number], 8如果我们将100字节的数字看作一个位串,我们可以将它的内容向下移位8以外的计数:
mov ebx, number
mov eax, [ebx]
More:
mov edx, [ebx+4]
shrd eax, edx, 4 ; Shift count [0-31]
mov [ebx], eax
add ebx, 4
mov eax, edx
cmp ebx, number+96
jb More
shr eax, 4 ; Shift count [0-31]
mov [ebx], eaxhttps://stackoverflow.com/questions/69261038
复制相似问题