变量存储与长度

研究实验三

在学习汇编语言的时候,提供了很多种寻址方式,便于我们找到内存单元地址,我们关注数据,无非关注数据的两个量:数据存放的位置;数据有多大。那么,在C语言中,我们如何使用内存存储数据,使得我们能够达到和汇编一样的水平:即我们清楚的知道我们的数据在哪,我们知道我们的数据与多大?

下面通过实验一研究,C语言中数据如何放置到内存中,通过其汇编代码使我们更清晰的去认识这一点:

图1  uml.c程序对应的汇编代码

对于图中显示的汇编代码存在下列问题:字符’a’的偏移地址是2000,那么它的段地址是谁?即如何找到’a’?

通过单步执行程序,发现和汇编语言中国结论一样,段地址默认还是DS

通过修改ip使其指到1fa,开始用t命令单步执行程序,然后通过d命令查看相应内存内容,发现C语言对使用内存存储数据达到了和汇编语言一样的目的!

以及我们发现如下特点,对于C语言中所出现的段地址:偏移地址或者寄存器表示偏移地址的情况,均采用寄存器BX传递地址。

用C语言在屏幕上显示字符:

图2  C语言屏幕显示

可以发现,再次印证,C语言能够达到和汇编同样的目的,同样能够随心所欲的操控内存。

图3 全局变量和局部变量

从对应的汇编语言可以看出的,全局变量存在一个固定的内存里,而局部变量存放在堆栈中。而push bp,mov bp,sp的作用就是为了用于存放局部变量的而设置的。

图4  返回值

通过汇编代码可以看出程序返回值存放在AX中。

 

图5  安全空间

 

总结体会:

本次研究实验,最重要的是学到了两点:C语言也可以和汇编语言一样,能够达到随心所欲操控内存的目的,不管对于何种语言,我们对所关心数据的参数,无非是数据在哪,数据有多大。以及,全局变量存放在一个固定的内存单元中,局部变量存放在堆栈中。

 

posted @ 2017-12-06 23:05  少年π  阅读(313)  评论(0编辑  收藏  举报