汇编语言 - 为什么字符存储在小端?

Kan*_*rus 0 assembly x86-64 endianness

我是汇编语言的新手.我正在尝试下面的代码,你可以看到下面的代码.

bits 64
global _start
section .text
_start:

        mov rcx, 1234567890
        xor rcx, rcx
        mov rcx, 'wxyz'

        mov rax, 60
        mov rdi, 0 
        syscall
Run Code Online (Sandbox Code Playgroud)

我想知道为什么数字在寄存器中存储为Big endian,字符作为Little-endian存储在寄存器中

屏幕截图来自调试器. 在此输入图像描述

在此输入图像描述

我以为只在内存中,数据存储为Little endian.但我不明白为什么字符在寄存器中存储为Little endian.请告诉我.

谢谢.

眠りネ*_*ネロク 8

说到CPU寄存器的字节序没有多大意义,因为地址没有分配给构成寄存器的特定字节,即:没有字节顺序要考虑.

也就是说,例如al是最低字节rax,ah第二低字节.考虑到这一点,al和的地址是ah什么?是ah的地址高于或低于al地址?它们没有关联的(存储器)地址,因此根本没有字节顺序需要考虑.

相关的是这些字节如何存储到存储器中(例如:通过mov指令).字节序决定了这一点.对于小端机器,寄存器的最低字节将放置在目标操作数的最低地址,对于最高地址的大端机器.字节顺序与将内存操作数加载到寄存器中类似.

简而言之,为了谈论字节序,必须在字节的重要性和它们相应地址的高度之间进行一种映射.

  • 寄存器*做*有左右移位.右移将比特从更重要的位置带到不太重要的位置.正如你所说,这完全独立于他们在内存中的混乱,而不是字节序.这是一个位序,左边的MSB,右边的LSB,左右移位的定义.跨越元素边界("pslld xmm0,8"/"psldq xmm0,1")或跨子寄存器(`shl eax,8`设置AH = AL和AL = 0)的移位如何定义它们之间的相互关系. (4认同)