С функция не вызывается - PullRequest
       55

С функция не вызывается

1 голос
/ 26 сентября 2019

Я пишу некоторый простой код 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

1 Ответ

1 голос
/ 27 сентября 2019

Компиляция кода в 16 бит работает для меня, спасибо!

Если вы используете современный GCC, вам нужно передать -m16 (или добавить asm (". Code16gcc") в начало всех ваших файлов C, которые вы хотите скомпилировать, чтобы у них была возможность работать вРеальный режим. Следующая проблема заключается в том, что инструмент, который вы использовали для создания дампа кода, похоже, получил указание сбросить 32-битный код, который вы написали как 16-битный код, поэтому вы получаете странные декодирования, такие как add [bx + si]ал

...