不能在 GCC 内联汇编中强制使用 64 位寄存器
Can't force the use of 64-bit registers in GCC inline assembly
我正在尝试使用 GCC 内联汇编做一些事情,在这种情况下,进行系统调用,但我想强制使用 64 位寄存器(rax、rdi、rsi、...)而不是 32 位寄存器(eax, edi, ...),但是我试了很多方法,都没有。
void syscall(uint64_t arg1, uint64_t arg2) {
// arg1 -> rax arg2 -> rdi
__asm__("syscall" : : "a" (arg1), "D" (arg2));
}
当我编译时得到:
mov eax, 60
syscall
我在一个函数中,所以 "edi" 是从参数中获取的,但是就像你看到的 "eax",我想使用 rax。
如何强制使用 64 位寄存器而不是 32 位寄存器?
这实际上将 RAX 寄存器设置为 60:
mov eax, 60
Writing to EAX always clears the upper 32-bit half of the 64-bit register。这不像 AH 和 AL,其中写入保留寄存器的其余部分。
如果你绝对想迁移到 RAX,你需要使用这样的东西:
static inline __attribute__ ((always_inline)) void
syscall(uint64_t arg1, uint64_t arg2)
{
__asm__("mov rax, %0; syscall" : : "i" (arg1), "D" (arg2) : "rax");
}
请注意,gas
仍会 assemble 这是一个 32 位立即移动。
我正在尝试使用 GCC 内联汇编做一些事情,在这种情况下,进行系统调用,但我想强制使用 64 位寄存器(rax、rdi、rsi、...)而不是 32 位寄存器(eax, edi, ...),但是我试了很多方法,都没有。
void syscall(uint64_t arg1, uint64_t arg2) {
// arg1 -> rax arg2 -> rdi
__asm__("syscall" : : "a" (arg1), "D" (arg2));
}
当我编译时得到:
mov eax, 60
syscall
我在一个函数中,所以 "edi" 是从参数中获取的,但是就像你看到的 "eax",我想使用 rax。
如何强制使用 64 位寄存器而不是 32 位寄存器?
这实际上将 RAX 寄存器设置为 60:
mov eax, 60
Writing to EAX always clears the upper 32-bit half of the 64-bit register。这不像 AH 和 AL,其中写入保留寄存器的其余部分。
如果你绝对想迁移到 RAX,你需要使用这样的东西:
static inline __attribute__ ((always_inline)) void
syscall(uint64_t arg1, uint64_t arg2)
{
__asm__("mov rax, %0; syscall" : : "i" (arg1), "D" (arg2) : "rax");
}
请注意,gas
仍会 assemble 这是一个 32 位立即移动。