assembly - YASM逻辑右移归零内存?
问题描述
我正在使用 YASM 汇编程序。
如果我有一个这样声明的变量
segment .bss
number resb 100
我像这样执行逻辑右移
shr byte [number], 8
如果例如 123 存储在其中,因此内存看起来像这样的 0x333231,那么我希望结果是 0x3332,但结果是 0x333200。如果我将数据存储在寄存器中,则不会发生此问题,谁能向我解释为什么会发生这种情况以及如何解决它(我想使用内存而不是寄存器)。
解决方案
例如 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
推荐阅读
- android - 如何合并firestore中的任务以创建AND查询?
- rails-activestorage - ActiveStorage service_url && rails_blob_path 在不使用 S3 时无法生成完整的 url
- c++ - 为什么链接器报告全局函数的多重定义符号而不是类静态方法
- node.js - 碰撞 package.json 版本而不使 docker 缓存失效
- c# - 如何从 api 端点绑定到图像?
- css - 将 css 属性的值与 eslint 或 stylelint 对齐
- r - 将时间序列数据子集到范围内
- dask - 类方法是纯粹的吗?
- python - Django-Python 管理站点添加用户文本字段消失了
- html - 在 wiki 页面上制作折叠按钮,但只有一个 div 折叠?详情见页面