Да зачем тут статьи? # 1.S .intel_syntax noprefix .section .text .global _main .extern _some_c_function _main: push offset some_text push 12345 call _some_c_function add esp,8 xor eax,eax ret .section .data some_text: .asciz "some text" // 2.c #include <stdio.h> void some_c_function(int n, const char *s) { printf("Hello, world!\n%d %s\n", n, s); } Собирать можно просто cc -m32 1.S 2.c
а почему в файле асма инклюда нет?
Дефайна чего?
Инклуды в .c файле
Инклуды в .c, ассемблерному-то что инклудить? Он ничего внешнего не использует.
ну я же из асма вызываю си, как компилятор файл с си функцией искать будет?
.extern _some_c_function так он вот это использует
Линковщик когда будет объединять два обьектных файла - увидит символ _some_c_function, и подставит туда адрес, никакие инклуды не нужны
Компилятор не будет. Ассемблер сделает из .S .o (объектник), в объектник полетят .public _main (т.е., в этом объектнике определяется такая функция), и .extern _some_c_func (используется, но не определяется). Сишный файл тоже превратится в объектник, у него наоборот будет .public _some_c_func. Линкер оба объектника обработает и соединит все .extern с соответствующими .public (или скажет, что symbol not defined, если что-то не найдет). И всё заработает. А прототипы сишные ассемблеру не нужны.
оо спасибо объяснил))
вот еще вопрос всегда ли параметры в функцию си через стек передаються?
1. ebx 2. ecx 3. edx 4. esi 5. edi 6. ebp 7-... - buffer Разве не так?
на x86-64 почти везде через регистры, если их хватает, иначе остальное через стек
ну вот тут в примере черз стек вызов?
если пишешь на асме можешь придумать своё соглашение, но с яп не слинкуешься
ну если я в стек положу, при вызове значения функция возмет из этих регистров?
тут скорее всего cdecl для i386+
зависит от многих вещей
Как я понял/помню, если у тебя есть что-то в буфере, а функции надо 2 значения, значения возьмутся строго из edx, ecx соответственно
Тут 32-битный код, и как уже сказали, обычный __cdecl. В 64-битном будут регистры. Между своими собственными функциями (как и сишный компилятор между непубличными функциями) может использоваться что угодно, для публичных метод определён ABI. Можешь посмотреть в википедии, там краткое изложение происходящего.
Обсуждают сегодня