设为首页 加入收藏

TOP

从汇编来看C语言之变量(二)
2017-01-02 08:15:09 】 浏览:448
Tags:汇编 来看 语言 变量
放其他功能的程序。


这里函数返回语句是在函数最后面,如果是选择语句或者有多个返回语句的情况,就会出现这种情况。


(2)函数里局部变量都是第一个定义的在si寄存器里,其他的在栈段里吗?


答:不是,经过实验,只有当该局部变量需要返回时,才存储在si寄存器里,否则只是存储在栈段里。


(3)静态局部变量与全局变量的区别就在于在后者整个程序的所有函数里都能访问,而前者只能在定义的函数里访问吗?


答:最明显的区别就是作用域的区别。


(4)加载第3章的5个程序。查看偏移地址为1fa处的指令,为什么有的程序有“pushbp”和“movbp,sp”两条指令,有的程序没有?


答:我的5个程序都有保护语句,如果没有可能是编译器的问题。


如果用TC2.0编译,是有的,如果用tcc编译,会出现这种情况。


(5)程序1中,全局变量n,是由“unsignedintn”这条语句定义,还是由main函数中的“n=0”这条语句定义?


答:应该是由前者定义的,函数外定义的变量,不管有没有加static,没有初始化的话,系统默认初始化为0。如果在n=0语句之前打印n,是能够打印出它的值的。


(6)结构体中数据项的存储为何不使用push、pop指令进行操作?


答:题目的意思应该是结构体型数据参数的传递和返回是怎么实现的,我们已知是通过搬运函数来实现的,即将存储结构体函数的数据段的值整体移动到一个栈段中。那么为什么不通过push、pop实现呢?我觉得理由如下:1、c语言是将结构体作为一个数据类型的,和int、char等数据类型一样,所以对它的处理方式和其他数据类型是一样的,即要对它整体来处理,如果用push、pop的话,就要对它里面的数据项分开来处理,这是不符合我们建立结构体数据类型的初衷的。2、如果要对它里面的数据项分开来处理,就要知道它里面有哪些数据项、有几个,那么就需要进行统计,这个是不好实现的(我还没找到实现的方法)。3、我们只需要实现传值的目标而不需要在这个过程中对数据进行处理,那么就要选择最简单快捷、开销最小的方法,很显然块搬运是最好的方式。


(7)程序4中,在声明的局部变量structstub的后面,假如在后面定义一个char型变量,所占用的字节数为6(char型数据所占用字节数+局部变量structstub的数据项所占字节数);假如在后面定义一个整型变量,所占用字节数8,此时有了1个字节的填充,为什么?


答:



e是int型,eee是char型,前5个变量所占空间为7个字节,加上eee才8个字节。




局部变量的情况是一样的,加上int型的e和char型的eee也才8个字节。


如果在结构体数据后面再添加一个独立的int型数据,会出现这种情况。内存对齐的结果,结构体内外都有可能出现。


(8)重新研究,不同类型的变量,存储空间的分配情况。


答:char型变量占1个字节,int型的变量占2个字节,long型占4个字节。int型在TC里占2个字节,在VC字节里占4个字节。因为TC模拟的是16位dos操作系统,VC模拟的是32位操作系统。


(9)再次对程序5进行研究,找到每一条c语句对应的汇编代码。


Structna;


Intb;--------------------subsp,6


a=func();----------pushss;


pushbx;


call0266;


pushds;


Pushax;


movcx,6;


Call076a:1085;


b=f(a);------------leabx,[bp-6]


Movdx,ss


Movax,bx


Movcx,6


Call076a:10a1


Call256


Printf(“%d”,b);---movsi,ax


Pushsi


movax,194;


Pushax


Call093a


Printf(“%d”,f(func()));---call266


Movdx,ds


Movcx,6


Call076a:10a1


Call256


Addsp,6


Pushax


Movax,198


Pushax


Call93a


Func():


Structna;-----------subsp,6


a.a=1;----------------movwordptr[bp-6],1


a.b=2;----------------movwordptr[bp-4],2


a.c=2;----------------movwordptr[bp-2],3


Returna;-------------movbx,426


Pushds;


Pushbx;


Leabx,[bp-6]


Pushss;


Pushbx;


Movcx,6


Call076a:1085


(10)全局变量、局部变量存储方式的不同有什么普遍的意义?


答:我们把这里的局部变量理解为动态局部变量。全局变量的存储空间是固定的,局部变量是动态分配的,他们的存储方式决定了他们的特点:1、作用域。全局变量在该程序所有地方都可以使用,局部变量只能在定义的函数里使用。2、生命周期。全局变量的生命周期和整个程序是一样的,而局部变量的生命周期与函数一样,函数结束即释放。这种方式更有利于减小程序的内存开销,避免变量定义出错,保证函数的独立性,使程序模块化,方便编写和调试。


全局变量放在数据段中,局部变量放在栈段中。比如一个程序有100个函数,每个有5个局部变量,如果都放在数据段中,就会造成内存开销太大,不好管理和调用,所以要用栈段来存放局部变量,这就是高级语言的核心机制。


本章研究了函数的各种类型的变量的存储方式,是比较重要的一章。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于tcc、tlink的编译链接机制的.. 下一篇obj文件的连接问题以及tlib的基本..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目