您的位置:首页 > 编程语言 > C语言/C++

tc2.0环境下的C语言研究-简单使用寄存器并打印函数的偏移地址

2011-09-22 12:10 465 查看
在c语言中使用变量的目的是:为了编程时存储数据。所以如果有一种方法可以让我们不用变量就可以存储数据,我们就不再需要变量了。

在汇编中存储数据,我们可以利用AX、BX等寄存器和内存空间,在C语言中也是类似的

分别有:_AX、_BX、_CX、_DX、_BP、_SP、_CS、_DS、_SS、_ES等等

这些分别对应了我们在汇编学习到的寄存器。

编写一个url.c的程序

程序如下:

Main()

{

_AX=1;

_BX=1;

_CX=2;

_AX=_BX+_CX;

_AH=_BL+_CL;

_AL=_BH+_CH;

}

为了用debug查看汇编代码,所以必须知道main函数的入口地址,如下程序可以实现打印main函数的偏移地址
Main()

{

Printf(“x%\n”,main);//结果为0x01fa

}

通过u cs:1fa可以得到看到如下汇编代码

-u cs:1fa

0CC3:01FA B80100 MOV AX,0001

0CC3:01FD BB0100 MOV BX,0001

0CC3:0200 B90200 MOV CX,0002

0CC3:0203 8BC3 MOV AX,BX

0CC3:0205 03C1 ADD AX,CX

0CC3:0207 8AE3 MOV AH,BL

0CC3:0209 02E1 ADD AH,CL

0CC3:020B 8AC7 MOV AL,BH

0CC3:020D 02C5 ADD AL,CH

0CC3:020F C3 RET

可以有ret推测:c语言将函数实现为汇编语言中的子程序;经过大量实例可以看出,c语言将函数实现为汇编语言中的子程序的推测是成立的。

进一步推想:C语言将函数实现为汇编语言的子程序,从C语言的层面来看,main函数是一个程序的起始入口点,但实际上,可执行文件即这个.exe程序的入口点并不是main,

是谁调用了main函数呢?是C0S.obj,c0s.obj为程序的执行初始化了环境,比如数据段与代码段的建立等,然后调用main函数执行所需要完成的规定程序动作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: