首页
社区
课程
招聘
[旧帖] [求助]内存和寄存器中数据的表示方法到底是大尾数还是小尾数? 0.00雪花
发表于: 2009-3-8 12:21 4034

[旧帖] [求助]内存和寄存器中数据的表示方法到底是大尾数还是小尾数? 0.00雪花

2009-3-8 12:21
4034
我在《汇编语言程序设计》(英文名是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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
高位对应高位
底位对应底位
内存中存放
3412
mov给AX
就是1234
ah=12
al=34
linux看不懂。
2009-3-8 13:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那就是这本书说错了。不管内存还是寄存器都是小尾数存储数据。高位对应高位,底位对应底位。
2009-3-8 14:34
0
游客
登录 | 注册 方可回帖
返回
//