Компиляция и линковка

Допустим, имеем следующий каркас:

main.c:

extern int test (); int main () { test (); return 0; }

test.s:

use16 bits 16 global _test section .text _test: mov ax,0x1234 ret

Тогда команды компиляции и сборки следующие:

bcc -c main.c -o main.obj -0 nasm test.s -o test.obj -f as86 ld86 main.obj test.obj -o test.exe

Передача параметров

В этом разделе будет дана теоретическая модель построения связи asm-c

Данный способ передачи параметров используется в языках программирования Си, Си++, Пролог и других. Этот метод противопоставлен методу языка Паскаль, поэтому связка asm-pascal будет выглядеть по-другому!

Итак, если мы определим функцию в Си

int foo (int a,int b,int c,int d);

то при вызове функции выполнятся следующие машинные инструкции:

push d push c push b push a call _foo add sp,8 ;Освобождение стека осуществляется автоматически!

При этом для правильного использования переданных параметров процедура foo может выглядеть так:

_foo: push bp mov bp,sp ;a = [bp+4] ;b = [bp+6] ;c = [bp+8] ;d = [bp+0xa] ;... pop bp ret