【发布时间】:2021-09-20 21:28:54
【问题描述】:
我正在使用 YASM 汇编程序。
如果我有一个这样声明的变量
segment .bss
number resb 100
我像这样执行逻辑右移
shr byte [number], 8
如果例如 123 存储在那里,那么内存看起来像这样 0x333231 然后我希望结果是 0x3332,但结果是 0x333200。如果我将数据存储在寄存器中,则不会发生此问题,谁能向我解释为什么会发生这种情况以及如何解决它(我想使用内存而不是寄存器)。
【问题讨论】:
-
你使用了
byte操作数大小,所以你只对低字节进行操作,移出所有8位。如果您执行shr al, 8,您将得到相同的结果,而 RAX 的高 7 字节不受影响。 -
请注意,一条
shr指令最多可以影响您使用resb 100保留的100 个字节中的8 个字节(qword);您将需要扩展精度的东西(例如shrd)将该空间作为单个 100 字节整数处理。或者,也许您打算将该空间视为由 25 个dword元素组成的数组? IDK。 -
相关,但从另一个角度提出问题(如果操作更宽,则不会影响高字节,例如不携带的增量):Why do we need to disambiguate when adding an immediate value to a value at a memory address