字数组内指针加1寻址问题:是否会从两个字的中间位置读取数据?
问题解答
首先明确几个基础前提:
- 代码中
dw是x86汇编的字类型定义符,每个元素占2字节,题目中提到的「SI加2可以获取数组第2个元素」也验证了这个长度规则 - x86架构默认使用小端字节序存储数据:多字节数据的低8位存放在低地址,高8位存放在高地址
内存布局分析
var dw 1,2,3,4在内存中的实际存储(地址从低到高排列)为:
| 相对var首地址的偏移量 | 存储内容(十六进制) | 对应含义 |
|---|---|---|
| 0x00 | 0x01 | 数字1的低8位 |
| 0x01 | 0x00 | 数字1的高8位 |
| 0x02 | 0x02 | 数字2的低8位 |
| 0x03 | 0x00 | 数字2的高8位 |
| 0x04 | 0x03 | 数字3的低8位 |
| ... | ... | ... |
代码执行结果
逐行走读代码逻辑:
LEA SI,VAR:SI寄存器存储var数组的首地址,此时SI指向偏移0x00的位置MOV AX,[SI]:从SI指向的地址读2字节存入AX,此时AX值为0x0001(十进制1)INC SI:SI的值加1,此时SI指向偏移0x01的位置MOV AX,[SI]:从偏移0x01的位置读2字节存入AX,读取的两个字节分别是偏移0x01的0x00、偏移0x02的0x02,按照小端字节序换算,AX的最终值为0x02 * 256 + 0x00 = 0x0200,对应十进制512
注意:这个操作属于非对齐内存访问,部分硬件架构下会直接抛出异常;x86架构虽然支持非对齐访问,但会额外消耗性能,正常开发中不会出现这种写法。
内容的提问来源于stack exchange,提问作者GoAkshay
相关产品推荐
相关产品推荐

