这些 movw 到 AX 和 movb 到 AL 加载指令从 .short 数组中的奇数偏移量有什么区别?
what is the difference between these movw to AX and movb to AL load instructions, from an odd offset in .short array?
.global main
.data
arr: .short 1, 0xEA, 0x2, 0x3, 0b1010
.text
main:
lea (arr), %rbx
movb 3(%rbx),%al #1
movw arr+3, %ax #2
当我尝试此代码时 al
获取值 0x0
但是 ax
获取值 0x200
你能告诉我这是为什么吗? #1 和 #2 有什么区别?
由于 x86 是 little-endian 架构,arr
中的数据如下所示:
arr+0 +1 +2 +3 +4 +5 +6 +7 +8 +9
0x01 0x00 0xEA 0x00 0x02 0x00 0x03 0x00 0x0A 0x00
#1 读取数据到 al
。 al
是一个 one-byte 寄存器,所以 +3
处的 0x00
被加载并且值变为 0x0
.
#2 读取数据到 ax
。 ax
是一个 two-byte 寄存器,所以 0x00 0x02
被加载并且值变成 0x200
.
区别在于目标寄存器的大小。
.global main
.data
arr: .short 1, 0xEA, 0x2, 0x3, 0b1010
.text
main:
lea (arr), %rbx
movb 3(%rbx),%al #1
movw arr+3, %ax #2
当我尝试此代码时 al
获取值 0x0
但是 ax
获取值 0x200
你能告诉我这是为什么吗? #1 和 #2 有什么区别?
由于 x86 是 little-endian 架构,arr
中的数据如下所示:
arr+0 +1 +2 +3 +4 +5 +6 +7 +8 +9
0x01 0x00 0xEA 0x00 0x02 0x00 0x03 0x00 0x0A 0x00
#1 读取数据到 al
。 al
是一个 one-byte 寄存器,所以 +3
处的 0x00
被加载并且值变为 0x0
.
#2 读取数据到 ax
。 ax
是一个 two-byte 寄存器,所以 0x00 0x02
被加载并且值变成 0x200
.
区别在于目标寄存器的大小。