LINUX.ORG.RU

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 

anonymous
()

пардон,
g++ -o test test.cpp test-asm.o

anonymous
()

Да твою мать.
g++ -o test test-c.cpp test-asm.o

короче, должно быть понятно.

anonymous
()

Еще разок привет. Суть ясна :) Спасибо ! Как объявлять секцию кода я только сейчас понял. Либо в NASM е паршивая дока либо я не умею ее читать. С TASM ом таких проблем небыло...

anonymous
()

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

nobody ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.