Несмотря на то, что я искал всюду, я не мог найти решение моей проблемы. Проблема в том, что я определил функцию «hello_world()» в файле C «hello.c», и я хочу вызовите эту функцию в файле сборки. «hello_assembly.asm». Кто-нибудь может мне помочь? Спасибо.Вызов функции C в сборе
ответ
Вы можете проверить приведенный ниже пример, который может дать некоторую идею.
\#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.
Надеюсь, вышеуказанная программа поможет вам.
Благодарим за помощь. Моя фактическая проблема - вызов функции, определенной в файле C из сборки. Это как-л: (hello.c hello_world() {Е ("Hello World"); ) (hello.asm ехЬегп hello_world ... вызов hello_world .. ) –
Это помогло мне много, спасибо. –
Документация НКУ должна означать это более детально.
Если вы не смогли найти документацию для своего компилятора и среды, я бы предложил вам скомпилировать вашу функцию C в список ассемблера и посмотреть, как она ожидает передачи аргументов и что она уходит в стек при выходе ,
- 1. Ошибка при сборе: вызов неопределенной функции mysql_escape_string()
- 2. Ветвление в сборе в сборе
- 3. Вызов функции в C++
- 4. Вызов функции в C#
- 5. Обработка трубопроводов в сборе в сборе
- 6. Использование внешнего символа в сборе в сборе
- 7. Проверка сборки в сборе C#
- 8. вызов функции в другой функции в C
- 9. Вызов функции C# из функции C++/CLI
- 10. C вызов функции вызова
- 11. Вызов функции C++
- 12. вызов функции javascript C#
- 13. Вызов функции интерфейса C#
- 14. Вызов функции C#
- 15. Вызов функции периодически C#
- 16. вызов функции C++
- 17. Вызов функции C#
- 18. защищенный вызов функции C++
- 19. Вызов функции неоднозначность в C++
- 20. вызов основной функции в C
- 21. Вызов функции в параллельном C++
- 22. Переопределить вызов функции в C
- 23. Вызов функции в проекте C++
- 24. Вызов функции ASM в C++
- 25. Вызов статической функции в C++
- 26. вызов функции matlab в C#
- 27. Вызов функции delphi в C#
- 28. Вызов функции в конструкторе C#
- 29. вызов функции в объективе-c?
- 30. Вызов функции NASM в C
С каким ассемблером, компилятором, операционной системой и компоновщиком вы пытаетесь это сделать? –
Где и как именно вы искали? –
Посмотрите в документации вашего компилятора «соглашения о привязке к языку ассемблера» или что-то похожее на это. Точные данные варьируются от компилятора до компилятора и архитектуры до архитектуры. – keshlam