C函数不可调用

标签 c gcc x86 nasm inline-assembly

我正在编写一些我尝试从程序集 (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 上使用以下命令行选项编译和链接 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],al

关于C函数不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122726/

相关文章:

c - fgets,其中读取的字符数大于存储大小

c - 堆栈粉碎和 sscanf

c++ - 创建从父进程标准输入到子进程标准输入的管道

c++ - if-else if 梯形图和编译器优化

assembly - 如何取反存储在 32 位寄存器对中的 64 位整数?

c - 为什么我们需要将结构体字段放在堆内存中?

c++ - openmp g++错误: collapsed loops not perfectly nested

c - <命令行> :0:11: warning: extra tokens at end of#undef directive [enabled by default]

linux - 程序集:printf 不打印新行

c++ - 获取调用者的返回地址