C函数不可调用

问题描述 投票:0回答:1

我正在编写一些我尝试从汇编(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
c gcc x86 nasm inline-assembly
1个回答
0
投票

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

[如果您使用的是现代GCC,则需要将-m16(或将asm(“。code16gcc”)添加到要编译的所有C文件的顶部,以便它们有机会在实模式下工作。下一个问题是您用来转储代码的工具-似乎已被告知要转储以16位代码编写的32位代码,这就是为什么您会得到诸如add [bx + si],al

之类的奇怪解码的原因
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.