gpt4 book ai didi

assembly - 64 位汇编,何时使用较小尺寸的寄存器

转载 作者:行者123 更新时间:2023-12-02 19:26:27 25 4
gpt4 key购买 nike

据我了解,在 x86_64 汇编中,例如有(64 位)rax 寄存器,但它也可以作为 32 位寄存器、eax、16 位、ax 和 8 位寄存器进行访问。在什么情况下我不会只使用完整的 64 位,为什么,会有什么优势?

作为示例,使用这个简单的 hello world 程序:

section .data
msg: db "Hello World!", 0x0a, 0x00
len: equ $-msg

section .text
global start

start:
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to standard out = 1
mov rsi, msg ; The address of hello_world string
mov rdx, len ; The size to write
syscall ; Invoke the kernel
mov rax, 0x2000001 ; System call number for exit = 1
mov rdi, 0 ; Exit success = 0
syscall ; Invoke the kernel

rdi 和 rdx 至少只需要 8 位而不是 64 位,对吗?但是,如果我将它们分别更改为 dil 和 dl(它们的较低 8 位等效值),程序将进行汇编和链接,但不会输出任何内容。

但是,如果我使用 eax、edi 和 edx,它仍然可以工作,所以我应该使用这些而不是完整的 64 位吗?为什么或为什么不?

最佳答案

您在这里问了几个问题。

如果您只加载寄存器的低 8 位,则寄存器的其余部分将保持其先前的值。这可以解释为什么你的系统调用得到了错误的参数。

当您只需要 32 位时,使用 32 位的一个原因是许多使用 EAX 或 EBX 的指令比使用 RAX 或 RBX 的指令短一个字节。这也可能意味着加载到寄存器中的常量更短。

指令集已经发展了很长时间并且有很多怪癖!

关于assembly - 64 位汇编,何时使用较小尺寸的寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577458/

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