首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >YASM逻辑右移位清零内存?

YASM逻辑右移位清零内存?
EN

Stack Overflow用户
提问于 2021-09-20 21:28:54
回答 1查看 41关注 0票数 0

我正在使用YASM汇编程序。

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

代码语言:javascript
复制
segment .bss
 number resb 100

然后我像这样做一个逻辑上的右移

代码语言:javascript
复制
shr byte [number], 8

如果例如123被存储在那里,使得内存看起来像这样的0x333231,那么我期望结果是0x3332,但结果是0x333200。如果我将数据存储在寄存器中,这个问题就不会发生,谁能解释一下为什么会发生这种情况,以及如何修复它(我想使用内存而不是寄存器)。

EN

回答 1

Stack Overflow用户

发布于 2021-09-20 22:20:29

例如123的

被存储在其中,使得存储器看起来像这样0x333231

看到值0x333231,我敢断定number的内存保存着ASCII表示的数字。

代码语言:javascript
复制
31 32 33 00 00 00 ... 00

因此,向右移位8位将移出最低的数字。您不需要shr指令就可以做到这一点。只需复制内存:

代码语言:javascript
复制
mov  edi, number
lea  esi, [edi+1]
mov  ecx, 99
cld
rep movsb
mov  [edi], cl           ; CL=0

上面的代码对整个100字节的缓冲区做了什么,下面的代码只对前4个字节做了什么。

代码语言:javascript
复制
mov  eax, [number]
shr  eax, 8
mov  [number], eax

代码语言:javascript
复制
shr  dword [number], 8

如果我们将100字节的数字看作一个位串,我们可以将它的内容向下移位8以外的计数:

代码语言:javascript
复制
    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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69261038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档