Я скомпилирую код.Как функция библиотеки (C) вызывается на языке ассемблера gnu?
.data
ssttrr:
.string "%d\n"
.text
.globl main
main:
mov $213, %rdx
push %rdx
push $ssttrr
call _printf
add $8, %rsp
или
.global main
.text
main:
push %rax # caller-save register
push %rcx # caller-save register
mov $format, %rdi # set 1st parameter (format)
mov %rax, %rsi # set 2nd parameter (current_number)
xor %rax, %rax # because printf is varargs
call printf # printf(format, current_number)
pop %rcx # restore caller-save register
pop %rax # restore caller-save register
mov %rax, %rdx # save the current number
mov %rbx, %rax # next number is now current
add %rdx, %rbx # get the new next number
dec %ecx # count down
jnz print # if not done counting, do some more
pop %rbx # restore rbx before returning
mov $60, %rax
xor %rdi, %rdi
syscall
format:
.asciz "%20ld\n"
почему "формат" находится в .text поле?
gcc -nostdlib file.s -o program
Зачем возникает ошибка?
/universe/earth/asm/file.s:14: неопределенная ссылка на `_printf» collect2: л.д. возвращается статус 1 выхода
как исправить эту ошибку?
если так, то весь код работает. Зачем???
.global main
.text
main:
push %rbx # we have to save this since we use it
mov $90, %ecx # ecx will countdown to 0
xor %rax, %rax # rax will hold the current number
xor %rbx, %rbx # rbx will hold the next number
inc %rbx # rbx is originally 1
print:
# We need to call printf, but we are using eax, ebx, and ecx. printf
# may destroy eax and ecx so we will save these before the call and
# restore them afterwards.
push %rax # caller-save register
push %rcx # caller-save register
mov $format, %rdi # set 1st parameter (format)
mov %rax, %rsi # set 2nd parameter (current_number)
xor %rax, %rax # because printf is varargs
call printf # printf(format, current_number)
pop %rcx # restore caller-save register
pop %rax # restore caller-save register
mov %rax, %rdx # save the current number
mov %rbx, %rax # next number is now current
add %rdx, %rbx # get the new next number
dec %ecx # count down
jnz print # if not done counting, do some more
pop %rbx # restore rbx before returning
ret
format:
.asciz "%20ld\n"
Почему функция print: не вызывается в основном поле?
CPY: Intel-64 ОС: Debian
А? Если вы хотите вызвать 'printf()', функцию в стандартной библиотеке C, то почему вы говорите компилятору * not * для ссылки на эту библиотеку? – unwind
Это очень странное явление, но так написано в руководстве. – volkov