我在《汇编语言程序设计》(英文名是Professional Assembly Language)一书中看到一段这样的解释,原文如下:
==原文内容=========================
要记住,存储在内存中的超过1个字节的整数被存储为小尾数(little-endlian)格式,这很重
要。这就是说,低位字节存储在最低的内存位置,其余字节顺序地存储在它之后。但是,把整数值
传送给寄存器时,值按照大尾数(big-endian)格式存储在寄存器中。有时候这会给处理造成混乱。
===============================
按照书中的理解就是内存中是小尾数,寄存器中是大尾数。于是我自己写了一小段程序,来证实一下,代码如下:
==汇编代码=========================
.section .data
data1:
.int 0x12345678
.section .text
.globl _start
_start:
nop
movl data1, %eax
movl $0, %ebx
movl $1, %eax
int $0x80
===============================
==调试过程=========================
ubuntu@ubuntu-desktop:~/assembly$ gdb -q test
(gdb) break *_start+1
Breakpoint 1 at 0x8048075: file test.s, line 8.
(gdb) run
Starting program: /home/ubuntu/assembly/test
Breakpoint 1, _start () at test.s:8
8 movl data1, %eax
Current language: auto; currently asm
(gdb) x/x &data1
0x8049088 <data1>: 0x12345678
(gdb) x/4b &data1
0x8049088 <data1>: 0x78 0x56 0x34 0x12
(gdb) x/4t &data1
0x8049088 <data1>: 01111000 01010110 00110100 00010010
(gdb) next
_start () at test.s:9
9 movl $0, %ebx
(gdb) print/x $eax
$1 = 0x12345678
(gdb) print/t $eax
$2 = 10010001101000101011001111000
(gdb) cont
Continuing.
Program exited normally.
(gdb) quit
===============================
(gdb) print/t $eax
$2 = 10010001101000101011001111000
这个不是小尾数存储的吗?
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法