gpt4 book ai didi

assembly - 为什么 Linux 上的 NASM 会更改 x86_64 程序集中的寄存器

转载 作者:行者123 更新时间:2023-12-04 23:37:41 25 4
gpt4 key购买 nike

我是 x86_64 汇编编程的新手。我正在用 x86_64 程序集编写简单的“Hello World”程序。下面是我的代码,它运行得很好。

global _start

section .data

msg: db "Hello to the world of SLAE64", 0x0a
mlen equ $-msg

section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, mlen
syscall

mov rax, 60
mov rdi, 4
syscall

现在,当我在 gdb 中反汇编时,它会给出以下输出:
(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000b0 <+0>: mov eax,0x1
0x00000000004000b5 <+5>: mov edi,0x1
0x00000000004000ba <+10>: movabs rsi,0x6000d8
0x00000000004000c4 <+20>: mov edx,0x1d
0x00000000004000c9 <+25>: syscall
0x00000000004000cb <+27>: mov eax,0x3c
0x00000000004000d0 <+32>: mov edi,0x4
0x00000000004000d5 <+37>: syscall
End of assembler dump.

我的问题是为什么 NASM 会以这种方式行事?我知道它会根据操作码更改指令,但我不确定寄存器的行为是否相同。

这种行为也会影响可执行文件的功能吗?

我在 i5 处理器上使用 VMware 中安装的 Ubuntu 16.04(64 位)。

先感谢您。

最佳答案

在 64 位模式下 mov eax, 1将清除 rax 的上部注册(见 here 解释)因此 mov eax, 1在语义上等同于 mov rax, 1 .

然而,前者保留了一个 REX.W(48h 数字)前缀(指定 x86-64 引入的寄存器所需的字节),两条指令的操作码相同(0b8h 后跟 DWORD 或 QWORD) .
所以汇编器继续并选择最短的形式。

这是 NASM 的典型行为,参见 Section 3.3 NASM 手册的示例,其中 [eax*2]组装为 [eax+eax]免除 disp32 SIB 字节 1 之后的字段([eax*2] 只能编码为 [eax*2+disp32],其中汇编程序将 disp32 设置为 0)。

我无法强制 NASM 发出真实的 mov rax, 1指令(即​​ 48 B8 01 00 00 00 00 00 00 00 ),即使在指令前加上 o64 .
如果真mov rax, 1需要(这不是您的情况),必须使用 db 手动组装它和类似的。

编辑 :Peter Cordes' answer表明,事实上,有一种方法可以告诉 NASM 不要使用 strict 优化指令。修饰符。mov rax, STRICT 1产生 10 字节版本的指令 ( mov r64, imm64 ) 而 mov rax, STRICT DWORD 1产生一个 7 字节的版本( mov r64, imm32,其中 imm32 在使用前进行符号扩展)。

旁注:最好使用 RIP-relative addressing ,这避免了 64 位立即数(从而减少了代码大小)并且是 mandatory in MacOS (以防万一)。
更改 mov esi, msglea esi, [REL msg] (RIP-relative 是一种寻址模式,因此它需要一个“寻址”,即方括号,以避免从我们使用的地址读取 lea,它只计算有效地址但不访问)。
您可以使用指令 DEFAULT REL避免输入 REL在每次内存访问中。

我的印象是Mach-O文件格式需要 PIC 代码,但 this may not be the case .

1 Scale Index Base 字节,用于编码当时引入的新寻址模式和 32 位模式。

关于assembly - 为什么 Linux 上的 NASM 会更改 x86_64 程序集中的寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48596247/

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