摘要:最开始的第一句CALL0003是我们用nasm编译的start.asm所生成的代码。我们主要目标是研究蓝色的C语言的代码,第一句start.asm所生成的代码太简单,就是调用e_main函数。而我们的e_main函数就是蓝色代码部分。从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数。MOVAX,000
我们主要目标是研究蓝色的C语言的代码,第一句start.asm所生成的代码太简单,就是调用e_main函数。而我们的e_main函数就是蓝色代码部分。
从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数。
MOV AX,000B
000B就是我们的全局变量ch所在内存的地址。C语言会把所有的全局变量在另一块内存区.C代码先把ch的地址传给AX,然后通过
PUSH AX
把AX的值,也就是ch的地址压入堆栈。然后再
CALL 0020
而0020就是e_putchar代码的地址。通过这跳语句,计算机就跳到e_putchar的代码部分去执行了.我在这里并不给出e_putchar的代码,因为我们这个案例只是研究C语言中如何传递参数给其它函数的,并不管e_putchar如何取参数。下在一个案例中,我们将研究函数如何取参数。
在这里我得把CALL指令解释清楚,因为在下个研究函数如何取参数的部分中大家可能会迷惑.CALL XXXX 指令简单地或就是
PUSH IP
JMP XXXX
它首先把当前的执行地址IP压入堆栈,然后跳转到要CALL的地址去。CALL和RET指令是配套的。RET指令等同于
POP IP
也就是回复CALL前的执行地址IP。
正因为这样,所以你一旦使用了CALL指令,你的堆栈指针SP就会自动减2。
POP CX
是每个函数调用完毕后都有的常用操作。在这里它不起任何作用。可能作用就是与CALL 0020前的PUSH AX像对应.这样堆栈指针SP才能回原。
好了,简单的第一个案例研究结束了。虽然就这4跳指令,但是我们已经可以看出C语言传递参数方法了。总结起来就是通过"MOV AX,参数地址"把参数的地址传到AX,然后"PUSH AX"把参数的地址压入堆栈。最后"CALL 函数地址"转向执行要调用的函数。最后调用完后,"POP CX",恢复堆栈指针SP。
研究案例二
工具: Turboc C v2.0,Debug,MASM v5.0,NASM,TASM
实例C程序:
/* example1.c */
char ch;
extern void e_putchar(char c);
int e_main()
{
ch=0x44;
e_putchar(ch);
}
软考备考资料免费领取
去领取