2013-04-15 2 views
0

Я скомпилирую код.Как функция библиотеки (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

+0

А? Если вы хотите вызвать 'printf()', функцию в стандартной библиотеке C, то почему вы говорите компилятору * not * для ссылки на эту библиотеку? – unwind

+0

Это очень странное явление, но так написано в руководстве. – volkov

ответ

2

, почему "формат" находится в .text поле?

.text в сборе средств "раздел кода"

НКУ -nostdlib file.s -o программа Почему я получаю сообщение об ошибке? /universe/earth/asm/file.s:14: неопределенная ссылка на `_printf» collect2: л.д. возвращается 1 выход статус

вы не связывая стандартные библиотеки, где расположен Е (-nostdlib опция) : linker не может найти это

как исправить эту ошибку?

Либо связать стандартную библиотеку (STDLIB) в явном виде, или связать другую библиотеку, которая обеспечивает реализацию PRINTF или удалить -nostdlib переключатель

Почему функция печати: не вызывается в основном поле ?

«print» - это всего лишь метка: вы можете назвать ее, jmp, или просто позволить управляющему потоку программы войти в нее, как в этом случае. (я могу сказать, что печать не является «функцией», потому что ей не хватает правильного пролога).

Могу ли я предложить вам некоторые собрания?

Или многие другие вы можете найти в Интернете

+0

Как связать стандартную библиотеку C? ** gcc -g3 hello3.s -o привет ** и я получаю hello3.s: 14: неопределенная ссылка на '_printf ' collect2: ld возвращен 1 статус выхода – volkov

+0

извините, я не замечаю. _ – volkov

1

почему "формат" находится в .text поле? Неясно, что вы просите, но я думаю, что вы спрашиваете о двух вещах, сжатых здесь:

mov  $format, %rdi   # set 1st parameter (format) 

format: 
    .asciz "%20ld\n" 

В вашем .text разделе, вы ссылаетесь на format этикетки. Позже вы определяете метку format.

Зачем возникает ошибка? Вы указываете опцию компилятора -nostdlib, которая исключает библиотеки, которые обычно включаются, включая функцию printf.

Почему функция print: не вызывается в основном поле? Существует не функции печати, но есть метка, и является используется:

jnz  print     # if not done counting, do some more 

Это, как представляется, точка прекращения цикла на основе %ecx, который считает от 0x90 до 0.

Смежные вопросы