2014-01-09 3 views
1

Несмотря на то, что я искал всюду, я не мог найти решение моей проблемы. Проблема в том, что я определил функцию «hello_world()» в файле C «hello.c», и я хочу вызовите эту функцию в файле сборки. «hello_assembly.asm». Кто-нибудь может мне помочь? Спасибо.Вызов функции C в сборе

+4

С каким ассемблером, компилятором, операционной системой и компоновщиком вы пытаетесь это сделать? –

+0

Где и как именно вы искали? –

+0

Посмотрите в документации вашего компилятора «соглашения о привязке к языку ассемблера» или что-то похожее на это. Точные данные варьируются от компилятора до компилятора и архитектуры до архитектуры. – keshlam

ответ

2

Вы можете проверить приведенный ниже пример, который может дать некоторую идею.

\#include <stdio.h> 
int main(void) 
{ 
     signed int a, b; 
     a=5,b=25; 
     mymul(&a,&b); 
     printf("\nresult=%d",b); 
     return 0; 
} 

mymul является функцией, которая записывается на языке ассемблера в файле под названием mymul.S

Ниже приведен код для mymul.S

.globl mymul 
mymul: 
     pushl %ebp   # save the old base pointer register 
     movl %esp, %ebp  #copy the stack pointer to base pointer register 
     movl 8(%ebp), %eax # get the address of a 
     movl 12(%ebp), %ebx # get the address of b 
     xchg (%eax), %ecx  # we get the value of a and store it in ecx 
     xchg (%ebx), %edx  # we get the value of b and stored it in edx 
     imul %ecx,%edx  # do the multiplication 
     xchg %ecx, (%eax)  #save the value back in a 
     xchg %edx, (%ebx)  # save the value back in b 
     movl %ebp, %esp  # get the stack pointer back to ebp 
     popl %ebp    #restore old ebp 
     ret     #back to the main function 

Мы используем команду " куб. см "для составления наших вышеуказанных программ

$ cc mymul.S mul.c -o mulprogram 

В mul.c, когда мы вызываем mymul, мы передаем адрес a и b, и этот адрес попадает в стек. Когда выполнение программы переходит в mymul функцию, стек выглядит следующим образом: addressofb, addressofa, returnaddress, oldebp


мы получаем значение, хранящееся в адрес и адрес б с помощью XCHG (мы могли бы использовать movl здесь), умножить и сохранить результат в b.


Надеюсь, вышеуказанная программа поможет вам.

+0

Благодарим за помощь. Моя фактическая проблема - вызов функции, определенной в файле C из сборки. Это как-л: (hello.c hello_world() {Е ("Hello World"); ) (hello.asm ехЬегп hello_world ... вызов hello_world .. ) –

+0

Это помогло мне много, спасибо. –

2

gcc calling conventions

Документация НКУ должна означать это более детально.

Если вы не смогли найти документацию для своего компилятора и среды, я бы предложил вам скомпилировать вашу функцию C в список ассемблера и посмотреть, как она ожидает передачи аргументов и что она уходит в стек при выходе ,

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