test-asm.asm
[bits32]
[section .code]
global _test
_test:
xor eax, eax
ret 0
----------
test-c.cpp
extern "C" int test ();
int main () {
test ();
}
---------
nasm -f elf -o test-asm.o test-asm.asm
gcc -o test test.c test.o
Еще разок привет.
Суть ясна :)
Спасибо ! Как объявлять секцию кода я только сейчас понял. Либо в NASM е паршивая дока либо я не умею ее читать. С TASM ом таких проблем небыло...
1. Символ подчеркивания для asm-функций не нужен, поскольку gcc по
умолчанию не генерит подчеркивания (в отличие от компиляторов под
DOS/Windows).
2. Несколько дополнений:
- параметры передаются через стек в обратном порядке;
- результат возвращается в EAX;
- если в asm-функции предполагается использование регистров EBX,
ESI или EDI, они должны быть сохранены перед изменением, а перед
выходом -- восстановлены.
3. Пример из программы.
--------- Файл i386.asm:
[BITS 32]
[GLOBAL count_lines]
[SECTION .text]
;Возвращает кол-во строк в тексте + 1.
;int count_lines(const char *text, int text_len)
count_lines:
push edi
cld
mov al, 10
mov edi, [esp+8] ;text
mov ecx, [esp+12] ;text_len
xor edx, edx
.new_line: ;локальная метка
inc edx
repnz scasb
jz .new_line
xchg eax, edx
pop edi
ret
[SECTION .data]
;Инициализированные данные (db, dd и т.п.).
[SECTION .bss]
;Неинициализированные данные (resb, resd и т.п.).
-------- Файл edit.cc:
extern "C" int count_lines(const char *text, int text_len);
void edit::init()
{
//...
lines = count_lines(text, text_len);
//...
}
--------- Makefile:
i386.o: i386.asm
nasm -f elf -o i386.o i386.asm