gpt4 book ai didi

assembly - 从 64 位 nasm 代码接收 32 位寄存器

转载 作者:行者123 更新时间:2023-12-01 12:39:20 24 4
gpt4 key购买 nike

我正在学习 64 位 nasm,我通过执行以下操作组装了 .nasm 文件,该文件仅包含 64 位寄存器

nasm -f elf64 HelloWorld.nasm -o HelloWorld.o

并链接它执行以下操作
ld HelloWorld.o -o HelloWorld

程序运行正确,甚至在我运行 file 时说它是 64 位 ELF命令,但是当我使用 objdump 时或 gdb为了反汇编可执行文件,我在代码中作为 64 位寄存器放置的寄存器在反汇编时显示为 32 位寄存器。 (例如: rax 在源代码中在反汇编时显示为 eax)

为什么是这样?

这不会发生在一台计算机上,这是一个新问题,以前没有这样做过。

HelloWorld.nasm:
global _start

section .text

_start:
mov rax, 1
mov rdi, 1
mov rsi, hello_world
mov rdx, length
syscall

mov rax, 60
mov rdi, 11
syscall

section .data

hello_world: db 'Hello World',0xa
length: equ $-hello_world

拆解的HelloWorld:
...
00000000004000b0 <_start>:
4000b0: b8 01 00 00 00 mov eax,0x1
4000b5: bf 01 00 00 00 mov edi,0x1
4000ba: 48 be d8 00 60 00 00 movabs rsi,0x6000d8
4000c1: 00 00 00
4000c4: ba 0c 00 00 00 mov edx,0xc
4000c9: 0f 05 syscall
4000cb: b8 3c 00 00 00 mov eax,0x3c
4000d0: bf 0b 00 00 00 mov edi,0xb
4000d5: 0f 05 syscall
...

最佳答案

为什么

...
mov rax, 1
mov rdi, 1
mov rsi, hello_world
...

被拆解为
...
4000b0: b8 01 00 00 00 mov eax,0x1
4000b5: bf 01 00 00 00 mov edi,0x1
4000ba: 48 be d8 00 60 00 00 movabs rsi,0x6000d8
4000c1: 00 00 00
...

因为字面意思 0x1适合 32 位,和 the upper 32 bits of a 64 bit register are set to 0 when loading the lower 32 bits通过相应的 E -登记。因此,汇编程序可以优化 mov到 32 位操作。

注意加载到 rsi中的地址可能不适合 32 位,因此 rsi仍然如此。

如果加上下面的说明,就可以很清楚的看到效果了:
mov rbx, 0x0ffffffff      ; still fits into 32 bit
mov rbx, 0x100000000 ; does not fit into 32 bits anymore

被拆解为
 a: bb ff ff ff ff          mov    $0xffffffff,%ebx
f: 48 bb 00 00 00 00 01 movabs $0x100000000,%rbx
16: 00 00 00

您可以使用 -O0 禁用 nasm 优化,在这种情况下,指令保持其长格式:
nasm -O0 -f elf64 HelloWorld.asm 

结果:
14: 48 bb ff ff ff ff 00    movabs $0xffffffff,%rbx
1b: 00 00 00
1e: 48 bb 00 00 00 00 01 movabs $0x100000000,%rbx
25: 00 00 00

关于assembly - 从 64 位 nasm 代码接收 32 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504930/

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