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] 这样奇怪的解码,阿尔
我正在编写一些我尝试从汇编 (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] 这样奇怪的解码,阿尔