asm little-endian register / immediate / memory命令

时间:2014-11-15 16:50:21

标签: linux assembly x86 printf endianness


我对汇编程序很陌生 - 我之前只对8位微控制器进行了一些编程 现在我有一些问题需要了解如何存储litte-endian。我已经阅读了维基百科上的文章(http://en.wikipedia.org/wiki/Endianness)和一些线索,但我仍然感到困惑。

CPU:x64
编译:yasm
操作系统:Linux

现在问题:

  1. 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


  2. 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

  3. 这可能是一个结论:
     寄存器中的数据是BigEndian,在内存中它是LittleEndian?

    谢谢你的回复。
    迈克尔

1 个答案:

答案 0 :(得分:3)

谈论寄存器上的字节序是没有意义的,因为寄存器没有内存地址。

来自您的维基百科来源:“术语字节序和字节序是指用于解释构成数据字的字节的惯例,当这些字节存储在计算机内存中时