Предупреждение: косвенный вызов без `* ' - PullRequest
1 голос
/ 09 июля 2020

Имея эту простую сборку:

.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, где есть указатель с *, а регистр, который содержит адрес. Так что здесь не так?

1 Ответ

3 голосов
/ 09 июля 2020

Замените

call %rax

на

call *%rax

Это не то же самое, что call *(%rax). Из комментария @ interjay ниже:

call *%rax вызывает адрес, хранящийся в rax (это то, что хочет сделать OP), а call *(%rax) вызывает адрес, хранящийся в памяти, на который указывает rax

Звездочка указывает на то, что вызов является косвенным. Это означает, что функция вызова хранится внутри %rax

...