【发布时间】:2015-01-12 22:03:27
【问题描述】:
我对汇编程序很陌生 - 我以前只在 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 以字节为单位递增)
广告,数据
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|72h|71h|70h| ....注册
31........................0
内存(adr 以字节为单位递增)
广告,数据
0x00 70h
0x01 71h
0x02 72h
0x03 0Ah
这是一个结论吗:
寄存器中的数据是BigEndian,内存中的数据是LittleEndian?
谢谢你的回复。
迈克尔
【问题讨论】:
标签: linux assembly x86 printf endianness