【发布时间】:2020-10-29 23:52:53
【问题描述】:
有这个简单的组装:
.text
.globl main
str:
.asciz "%i\n"
add:
push %rbp
mov %rsp, %rbp
movl %esi, %eax
addl %edi, %eax
pop %rbp
ret
main:
mov $1, %esi
mov $2, %edi
lea add(%rip), %rax
call %rax #what is wrong here? the rax should contain first instruction of add
mov %eax, %esi
xor %eax, %eax
lea str(%rip), %rdi
call printf
xor %eax, %eax
ret
我收到错误:
foo.s:17: Warning: indirect call without `*'
为什么? %rax 应该包含函数的地址(如注释中所示),这不是c,其中有带有* 的指针,而是包含地址的寄存器。那么这里有什么问题呢?
【问题讨论】:
-
AT&T 语法包含很多荒谬的规则,其中之一就是这里需要
*。只需添加*,或切换到理智的英特尔语法。 -
根据英特尔文档,
call指令接受地址。无论是否有星号,我都在rax中提供 -
英特尔文档没有描述 AT&T 语法。
-
@interjay 在 nasm 中看起来如何?
-
只需
call rax。
标签: assembly x86 x86-64 gnu-assembler att