【发布时间】:2014-06-22 06:59:13
【问题描述】:
如果我写以下内容
section .data
align 4
X: db 1
Y: dw 5
Z: db 0x11
section .text
add dword [X], 0xAA000101
我试图了解大端和小端表示之间的差异,但我不明白每个表示的每个变量的值是什么?它们会一样吗?
【问题讨论】:
标签: assembly endianness
如果我写以下内容
section .data
align 4
X: db 1
Y: dw 5
Z: db 0x11
section .text
add dword [X], 0xAA000101
我试图了解大端和小端表示之间的差异,但我不明白每个表示的每个变量的值是什么?它们会一样吗?
【问题讨论】:
标签: assembly endianness
看看这些图片:
这是所有架构/指令集的字节序列表
【讨论】:
在大端配置中,双字的最高有效字节(x86 上为 32 位)存储在最小地址中,最低有效字节存储在最大地址中。
在 little-endian 配置中,最低有效字节存储在最小地址中。
我们先看大端的例子:
如果我们以大端配置在内存中布置变量,我们会得到:
; -> Address increases ->
X: 01
Y: 00 05
Z: 11
或者,组合在一起:
01 00 05 11
MSB LSB
当被视为等于 0x01000511 的 32 位值时。添加0x01000511 和0xAA000101 给我们0xAB000612。如果我们再次查看内存中的各个字节,我们会得到:
; -> Address increases ->
AB 00 06 12
所以结果是:
X = 0xAB
Y = 6
Z = 0x12
在 little-endian 配置中,我们会:
; -> Address increases ->
X: 01
Y: 05 00
Z: 11
或者,组合在一起:
01 05 00 11
LSB MSB
被视为等于 0x11000501 的 32 位值。添加0xAA000101 给我们0xBB000602。当我们查看我们得到的单个字节时:
02 06 00 BB
结果:
X = 2
Y = 6
Z = 0xBB
(注意:所有 x86 处理器,AFAIK,都是 little-endian)
【讨论】: