gpt4 book ai didi

linux - asm little-endian 寄存器/立即数/内存顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:26 25 4
gpt4 key购买 nike


我对汇编程序很陌生 - 我之前只在 8 位微 Controller 上做过一些编程。
现在我很难理解 litte-endian 是如何存储的。我已经阅读了维基百科 ( http://en.wikipedia.org/wiki/Endianness ) 上的文章和此处的一些主题,但我仍然感到困惑。

中央处理器:x64
编译器:yasm
操作系统:Linux

现在问题:

  1. MOV r32,imm32:

    section .bss
    var: resb 4 ;reserve 4 bytes
    varlen: equ $-var <br/>
    section .text
    global _start <br/>
    _start:
    MOV R10D, 0x6162630A
    MOV [var], R10D
    CMP R10B, 0x0A
    JNE nequal <br/>
    MOV eax, 0x04 ;printf
    MOV ebx, 0x01 ;stdio
    MOV ecx, var
    MOV edx, varlen
    int 0x80 ;tell the kernel to print the msg <br/>
    end:
    MOV eax, 0x01 ;return 0
    MOV ebx, 0x00
    int 0x80

    输出:
    LF(换行 - 根据 0x0a)
    中央银行

    上面的代码显示常量写入寄存器没有字节交换但是为什么printf从最高内存地址读取到最低内存地址?
    为什么寄存器中的常量不按小端交换?这是否依赖于编译器?

    这是正确的吗:
    |61h|62h|63h|0啊| ....寄存器
    31........................0

    内存(adr 以字节为单位递增)
    地址、数据
    0x00 61h
    0x01 62h
    0x02 63h
    0x03 0啊


  2. MOV r32, m32

    section .data
    msg: db 0x70,0x71,0x72,0x0a
    msglen:equ $-msg <br/>
    section .text
    global _start <br/>
    _start:
    MOV EAX, [msg]
    CMP AL, 0x70
    JNE end <br/>
    MOV eax, 0x04
    MOV ebx, 0x01
    MOV ecx, msg
    MOV edx, msglen
    int 0x80 <br/>
    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 - asm little-endian 寄存器/立即数/内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26948196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com