【问题标题】:asm little-endian register/immediate/memory orderasm little-endian 寄存器/立即数/内存顺序
【发布时间】:2015-01-12 22:03:27
【问题描述】:


我对汇编程序很陌生 - 我以前只在 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 以字节为单位递增)
    广告,数据
    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|72h|71h|70h| ....注册
    31........................0

    内存(adr 以字节为单位递增)
    广告,数据
    0x00 70h
    0x01 71h
    0x02 72h
    0x03 0Ah

这是一个结论吗:
寄存器中的数据是BigEndian,内存中的数据是LittleEndian?

谢谢你的回复。
迈克尔

【问题讨论】:

    标签: linux assembly x86 printf endianness


    【解决方案1】:

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

    来自您的 Wikipedia 来源:“endian 和 endianness 术语指的是用于解释构成数据字的字节的约定当这些字节存储在计算机内存中时

    【讨论】:

    • 非常感谢您的帮助和快速响应!现在一切都说得通了。
    猜你喜欢
    • 2013-05-13
    • 2010-10-16
    • 2019-03-13
    • 1970-01-01
    • 2018-08-09
    • 2013-07-04
    • 2022-12-12
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多