Я пишу некоторый простой код c, который я пытаюсь вызвать из сборки (nasm).Однако, прежде чем фактически использовать код в сборке, уже есть ошибки, которые я не понимаю.
Это код:
void start();
void print();
void start()
{
print();
}
void print()
{
asm("mov si, 0");
asm("mov ah, 0");
asm("mov al, 0");
asm("int 0x27");
}
Декомпиляция кода приводит к следующему:
00000200 55 push bp
00000201 89E5 mov bp,sp
00000203 83EC08 sub sp,byte +0x8
00000206 E80200 call word 0x20b
00000209 0000 add [bx+si],al
0000020B C9 leave
0000020C C3 ret
0000020D 55 push bp
0000020E 89E5 mov bp,sp
00000210 66BE0000B400 mov esi,0xb40000
00000216 B000 mov al,0x0
00000218 CD27 int 0x27
0000021A 5D pop bp
0000021B C3 ret
В строке 206 вызов функции «print ()» приведет к переходу на позицию 20B, но это процедура выхода из функции «start ()».Если вызов был правильным, он должен перейти в положение 20D, не так ли?
Я не знаю, что я делаю неправильно с таким небольшим количеством кода - я не привык к программированию на c.
Кстати, я компилирую и связываю код c со следующими параметрами командной строки в Windows:
gcc ccode.c --freestanding -masm=intel -c -o ccode.o
ld -o ccode.bin ccode.o