观察程序可以发现,函数f()的返回值放在ax中。那么如果程序有多个返回值应该怎么存放呢?还有如果从main函数向f()传参,也是用ax存放吗?如果返回的参数不是int型,而是char或者long int型,应该用什么存放呢?通过网络查阅资料,发现如果是1字节的数据,用al存放,如果是4字节的数据,高16位用dx传递,低16位用ax传递。
再看下一个程序:
#define是宏定义,在程序中用Buffer代替((char *)*(int far *)0x02000000)
malloc(20)是开辟20个字节的内存空间。
我个人的理解:这里是将指向开辟的20个字节的内存空间的指针赋给buffer,即200:0000~200:0001里存储的是开辟的20个字节的内存空间的首地址。Buffer[10]处是一个计数器,将a~h分别存到buffer[0]到buffer[7]的内存空间中。
二、 解决的问题
(1) c语言中直接使用对内存空间进行操作和先把内存单元地址给寄存器再对寄存器所代表的内存空间进行操作是一样的,而且C语言中可以将内存空间的地址直接与寄存器相加减
(2) 为什么*(char far *)(0x20001000+_BX)=*(char *)_AX;是把0x2000里的值赋给0x20003000而不是0x20002000.?
答:在语句*(char *)(_BX+_BX)=’a’;执行后寄存器bx的值是已经改变了的,为0x2000.
(3) C语言将全局变量存放在哪里?将局部变量存放在哪里?每个函数开头的“push bp;mov bp,sp。有何含义?”
答:全局变量是存放在指定的内存空间中,而局部变量是存放在栈中,到函数生命周期结束时释放。因为要用bp记录sp原来的位置,以便函数结束时将sp还原,所以要对bp进行保护,所以会有
push bp;mov bp,sp.
(4) C语言将函数的返回值放在哪里?
答:如果是1字节的数据,用al存放,如果是2字节的数据,用al存放,如果是4字节的数据,高16位用dx传递,低16位用ax传递。
三、 未解决的问题
(1)*(char *)0x2000=’a’ 只给出了偏移地址,那么段地址在哪里呢,是该语句所在的函数的段地址吗?
(2)函数有多个返回值在汇编应该怎么存放呢?
(3)如果从main函数向f()传参,也是用ax存放吗?
(4)最后一个程序是怎么在汇编中实现的?
四、 学习感想
在研究试验中,我们是以汇编的角度去看C语言的问题,弄明白C语言的一些东西在汇编中是怎么实现的。但是这样就涉及到一些C语言方面的知识,我的做法是查资料和请教别人,但是别人的回答都是从C语言的角度而不是汇编的角度,这样并不能给我们解决问题带来帮助。有时候一个东西从不同的角度来看会有不同的样子,也许从一个角度看来不能理解的问题,从另一个角度来看可能会比较容易理解。但是如果需要大量时间才能搞清楚,却对当前学习没有很大帮助的问题,是可以暂时放一放,去完成更加重要的学习进度的。