Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编语言-为什么寄存器中的字符存储为小端?_Assembly_X86 64_Endianness - Fatal编程技术网

Assembly 汇编语言-为什么寄存器中的字符存储为小端?

Assembly 汇编语言-为什么寄存器中的字符存储为小端?,assembly,x86-64,endianness,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 我想知道为什么数字在寄存器中存储为大端,字符在寄存器中存储为小端 下面的屏幕截图来自调

我不熟悉汇编语言。我正在尝试下面的代码,你可以看到下面的代码

bits 64
global _start
section .text
_start:

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

        mov rax, 60
        mov rdi, 0 
        syscall
我想知道为什么数字在寄存器中存储为大端,字符在寄存器中存储为小端

下面的屏幕截图来自调试器。

我认为只有在内存中,数据才以小端存储。但我不明白为什么这些字符在寄存器中存储为小端。请让我知道


谢谢。

谈论CPU寄存器的终止性没有多大意义,因为地址没有分配给构成寄存器的特定字节,即:没有需要考虑的字节顺序

也就是说,例如,
al
rax
的最低字节,
ah
是第二低字节。记住这一点,
al
ah
的地址是什么?
ah
的地址是高于还是低于
al
的地址?它们没有(内存)地址关联,因此根本没有字节顺序要考虑。 相关的是如何将这些字节存储到内存中(例如:通过
mov
指令)。endianness决定了这一点。对于小端计算机,寄存器的最低字节将放在目标操作数的最低地址,对于大端计算机,则放在最高地址。endianness与将内存操作数加载到寄存器类似


简言之,为了谈论endianness,字节的重要性和相应地址的高度之间必须有一种映射。

这取决于您的汇编程序(您没有指定,但看起来像
nasm
)。这样做的目的是,如果将字符串写入内存,您将按照预期的顺序获取该字符串。x86将以小尾端形式读取该字符串。但是NASM将以这样的方式组装它,“abcd”将以字节“a”、“b”、“c”、“d”的形式进入内存。。。关于字符串endiannes没有太多的理由,这个关于字符串常量的特殊NASM特性就是这样设计的,它“非常方便”,稍微偏离了严格的机器逻辑。因此,如果您使用
mov-eax,'0123'
vs
mov-eax,0x30313233
,这两个值是不同的(在
bswap
中是完全不同的)。你只需要记住它(就像任何其他语法“怪癖”)。或者在汇编所获得的内容后检查清单文件中的机器代码。这更像是NASM将字符串常量视为字节流(在生成的机器代码中保持其“字符串”顺序),即使在上下文中用作word或更大的类型,其中数字常量得到小端处理,并在内存中“反转”。CPU不知道您的源代码,所以它不知道(来自字符串和表示字符的值),它会将其作为正常的32位数字读取,如果您执行类似于
mov eax,'0123'
=>
eax=0x33323130
@vanquish的操作,我不太理解您最后的评论,在内存小endian中,它是温和的“是”,在寄存器中,您可以将其视为big-endian,但更像是在寄存器中,值只是value(无endian)。除了左/右移位外,它几乎没有“空间方向”,它在CPU中的某个位置有位,很难说位在哪里,顺序是什么,你只需按常识计算,如二进制整数值等。。。当存储到内存中时,会被拆分为LE字节。调试器自然地显示reg值(“BE”-like),但这是格式化代码。寄存器有左移位和右移位。右移将位从较高的有效位置移到较低的有效位置。正如你所说,这完全独立于它们在记忆中的混乱程度,而不是终结性。它是一种位顺序,根据左移位和右移位的定义,它的左边总是MSB,右边总是LSB。移位如何跨元素边界(
pslld xmm0,8
/
psldq xmm0,1
)或跨子寄存器(
shl eax,8
set AH=AL和AL=0)定义它们之间的相互关系。