【问题标题】:Little Endian byte storage for character string constants as immediate operands?将字符串常量作为立即操作数的小端字节存储?
【发布时间】:2019-02-04 02:14:34
【问题描述】:

处理器使用little endian将字节存储在内存中

mov rax, "bloopers"
mov [s_out], rax

在这种情况下,地址[s_out] 和[s_out+7] 存储的内容 当我打印s_out时会发生什么

我很困惑rax 会将“bloopers”存储为“srepoolb”。

但我不知道如果你将rax 移动到s_out 会发生什么。和收银机一样吗?

【问题讨论】:

    标签: assembly nasm x86-64 endianness


    【解决方案1】:

    我学到了什么:

    mov rax, "bloopers" 将字符串 "bloopers" 存储在 rax 中,但是当以小端格式查看内存时,它显示为 0x737265706f6f6c62。

    mov [s_out], rax 只是按顺序存储字符串"bloopers"。所以在内存地址s_out,它拥有字符b,在s_out+7,它拥有s。

    这在https://www.nasm.us/doc/nasmdoc3.html#section-3.4.3 中记录了 NASM。对于具有多个字符的字符常量,其他汇编程序的行为类似。

    感谢 @fuz 和 @Ped7g 帮助我。

    【讨论】:

    • rax 包含值 0x737265706f6f6c62。这不是小端格式,而是 64 位整数格式。您可以将其读作“bloopers”或“srepoolb”,具体取决于您从哪里开始(低字节或高字节)。将 qword 0x737265706f6f6c62 值存储到内存后,CPU 将以小端方式将其存储为字节 62 6c ...,即“bloopers”。当您将rax 存储到内存中时,小端序就会发挥作用。虽然 value 仅保留在 CPU 内部(在rax 中),但它只有 64 位,没有字节序。其他汇编器不会有类似的行为,NASM 是一种例外
    • 通常 "mov rax," 在汇编中没有意义,所以这就是汇编程序特定规则将应用于此类源代码行的原因。 x86 CPU 只有类似的指令,如mov rax,imm64,它需要 64 位常量。所以汇编器必须决定,如何将“string”转换为64位,有的会报错,有的会按字节转换,得到值0x626c6f6f70657273,存入内存后会形成字符串“srepoolb” ”。通常,汇编中所有相关的语法都是特定于汇编程序的,即使对于相同的 CPU 目标也是如此。
    • @Ped7g 这并不完全正确。通过eax、ax、ah 和al 检查其部分,您可以看到该值仍然具有字节序。你的评论所做的只是把 X3Gamma 发现的不太清楚的情况变得更加混乱。
    • @fuz al是低8位,0x737265706f6f6c62的低8位是0x62。这更多的是关于你如何写数字的方式,而不是字节序。即使 x86 是大端,rax 仍然是 0x737265706f6f6c62 和 al 仍然是 0x62。
    • @Ped7g 进一步注意,gas 实际上的行为方式与 wrt 相同。包含多个字符的字符文字。我认为许多 C 编译器也这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多