首页 > 解决方案 > YASM逻辑右移归零内存?

问题描述

我正在使用 YASM 汇编程序。

如果我有一个这样声明的变量

segment .bss
 number resb 100

我像这样执行逻辑右移

shr byte [number], 8

如果例如 123 存储在其中,因此内存看起来像这样的 0x333231,那么我希望结果是 0x3332,但结果是 0x333200。如果我将数据存储在寄存器中,则不会发生此问题,谁能向我解释为什么会发生这种情况以及如何解决它(我想使用内存而不是寄存器)。

标签: assemblyx86yasm

解决方案


例如 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], eax

推荐阅读