我对汇编程序很陌生 - 我之前只对8位微控制器进行了一些编程
现在我有一些问题需要了解如何存储litte-endian。我已经阅读了维基百科上的文章(http://en.wikipedia.org/wiki/Endianness)和一些线索,但我仍然感到困惑。
CPU:x64
编译:yasm
操作系统:Linux
现在问题:
MOV r32,imm32:
section .bss
var: resb 4 ;reserve 4 bytes
varlen: equ $-var
section .text
global _start
_start:
MOV R10D, 0x6162630A
MOV [var], R10D
CMP R10B, 0x0A
JNE nequal
MOV eax, 0x04 ;printf
MOV ebx, 0x01 ;stdio
MOV ecx, var
MOV edx, varlen
int 0x80 ;tell the kernel to print the msg
end:
MOV eax, 0x01 ;return 0
MOV ebx, 0x00
int 0x80
输出:
LF(换行 - 根据0x0a)
cba
上面的代码显示常量被写入寄存器而没有字节交换,但为什么printf从最高内存地址读取到最低?
为什么寄存器中的常量不会根据little-endian进行交换?这是编译器依赖的吗?
这是对的:
| 61H | 62H | 63H | 0AH | ....登记册
31 ........................ 0
内存(adr以字节为单位递增)
adr,数据
0x00 61h
0x01 62h
0x02 63h
0x03 0Ah
MOV r32,m32
section .data
msg: db 0x70,0x71,0x72,0x0a
msglen:equ $-msg
section .text
global _start
_start:
MOV EAX, [msg]
CMP AL, 0x70
JNE end
MOV eax, 0x04
MOV ebx, 0x01
MOV ecx, msg
MOV edx, msglen
int 0x80
end:
MOV eax, 0x01
MOV ebx, 0x00
int 0x80
输出:
pqrLF(LF表示换行)
这是否正确:
| 0AH | 72小时| 71H | 70H | ....登记册
31 ........................ 0
内存(adr以字节为单位递增)
adr,数据
0x00 70h
0x01 71h
0x02 72h
0x03 0Ah
这可能是一个结论:
寄存器中的数据是BigEndian,在内存中它是LittleEndian?
谢谢你的回复。
迈克尔
答案 0 :(得分:3)
谈论寄存器上的字节序是没有意义的,因为寄存器没有内存地址。
来自您的维基百科来源:“术语字节序和字节序是指用于解释构成数据字的字节的惯例,当这些字节存储在计算机内存中时”