我正在编写一些我尝试从汇编(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文件的顶部,以便它们有机会在实模式下工作。下一个问题是您用来转储代码的工具-似乎已被告知要转储以16位代码编写的32位代码,这就是为什么您会得到诸如add [bx + si],al
之类的奇怪解码的原因