C函数不可调用

C function not callable

我正在编写一些我尝试从汇编 (nasm) 调用的简单 C 代码。然而,在实际使用汇编代码之前,已经出现了我不理解的错误。

这是代码:

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 编程。

顺便说一下,我在 windows 上使用以下命令行选项编译和 link c 代码:

gcc ccode.c --freestanding -masm=intel -c -o ccode.o
ld -o ccode.bin ccode.o

将代码编译为 16 位对我有用,谢谢!

如果您使用的是现代 GCC,您需要传递 -m16(或将 asm(".code16gcc") 添加到您希望编译的所有 C 文件的顶部,以便它们有机会在实际中工作模式。下一个问题是您用来转储代码的工具 - 似乎已被告知将您编写的 32 位代码转储为 16 位代码,这就是为什么您会得到像 add [bx+si] 这样奇怪的解码,阿尔