深入了解C语言-函数的使用[2]

程序员 责任编辑:jerryxf 2008-06-18

添加老师微信

备考咨询

加我微信

摘要:最开始的第一句CALL0003是我们用nasm编译的start.asm所生成的代码。我们主要目标是研究蓝色的C语言的代码,第一句start.asm所生成的代码太简单,就是调用e_main函数。而我们的e_main函数就是蓝色代码部分。从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数。MOVAX,000

最开始的第一句CALL 0003是我们用nasm编译的start.asm所生成的代码。

我们主要目标是研究蓝色的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);

}

[1]  [2]  [3]  

更多资料
更多课程
更多真题
温馨提示:因考试政策、内容不断变化与调整,本网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

软考备考资料免费领取

去领取

!
咨询在线老师!