assembly - 如果我将定义为字节的字值大小移动到 32 位寄存器,就好像它是 dword 定义的一样,会发生什么?
问题描述
这是代码:
;NASM
section .data
a dw 0xDEAD
section .text
...
mov eax, dword [a + 1]
; eax now equals 0xDE
...
那么,这是如何工作的呢?大会知道,如果我移动的字节数比定义的多,那么它只会在高位添加零?或者可能是这段代码对我有用,通常是未定义的行为或类似的东西?
解决方案
a dw 0xDEAD
告诉汇编器存储 2 个字节(DW - 定义字(16 位),顺便说一句 - DB = 8 位,DD = 32 位)并用于a
指向它。由于(我敢打赌)您使用的是 x86-64 机器,因此它是“小端序”,这意味着它首先存储从最低有效字节开始的多字节值,因此在内存中您的0xDEAD
值将像这样存储:0xAD
首先,0xDE
下一个。由于您的数据段肯定会被填充为 16 个字节的倍数(例如),因此它可能会填充零。现在,如果我们假设您的数据段是 16 个字节 - 前 2 个定义您的a
变量 - 其余的将为零。
现在数据段看起来像这样(假设零填充到 16 个字节)(没有 0x 前缀的十六进制值):
AD, DE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^
\__ (a+1) points here at DE
通过编写,您告诉您的汇编程序以从 address 中获取(4 个字节)dword ptr [a + 1]
的方式对此类机器代码指令进行编码。这些将是字节: DE, 0, 0, 0 因为(正如我之前所说)x86 是小端,如果读取为 4 字节值意味着这 4 个字节,因此 EAX 等于该值。dword
a+1
0x00000DE
当然,您的数据段可能不是 16 字节,但可能是整页长度,但没有意义。
推荐阅读
- angular - 从 forEach 内部对每个元素进行 api 调用,并使用 Observable 在 Angular 中获取值
- python - tensorflow: tf.set_random_seed() 相同的代码,但得到不同的结果
- python - 考虑匹配和排序python结合2个字符串的字符
- php - Ajax 无法给出成功响应
- javascript - Chrome 扩展 JS 无法从网页 HTML 中读取值,假设是因为权限
- javascript - 第一次点击链接不可点击
- git - git 归档输出是否应该通过 git 版本进行位重复?
- java - 使用反射在 JNI 中查找 Java 类是否为最终类
- sql - 从 XML 类型列解析或获取表
- java - 使用带有 SSL 的 JAVA 连接 MQ 版本 9