在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函数执行所需要完成的规定程序动作。