程序的机器级表示

来源:互联网 发布:华为云计算招聘西安 编辑:程序博客网 时间:2024/05/16 17:14

简介

介绍有关于机器如何表示数据,如何存储数据,如何访问和操作数据,如何控制被执行操作的顺序

详细说明

Question1:机器如何表示表示数据,w

1、机器使用二级制数0/1串表示数据,我们叫做位级表示,x86计算机,用8位表示一个字符,用32位表示一个整数,用64位表示一个浮点数。机器如果把最高位解释成为符号位,那么该0,1位串记录了一个有符号数,比如10000000代表8位表示的最小负数-128,机器如果把最高位解释成为数据位,那么该0,1位串始终记录了一个正数,比如10000000表示128。也就是说,一个w位二进制位串{0,1},机器把它解释成为有符号数Tw{0,1} 和解释为无符号数Uw{0,1}表示的数据的关系为Tw{0,1}+2的w次方。

Question2:机器如何存储数据

1、机器在存储器中分配一块L*N字节的连续存储空间用来保持标量型数据,T A[N]:该声明具有2层含义,第一层含义是,T描述了每一元素的大小为L,N描述了这块空间可保持多少个T类型元素。第二层含义是,标识符A指向这块存储空间的起始位置,数组元素i的位置起始位置x+i.L

Question3:机器如何访问和操作数据

我们已经知道计算机以字节为数据的最小存储单元,并且每一个单元都用一个叫做“地址“的数字标识,8位构成一个字节。在问题1中我们已经说明了机器是如何表示数据的,在这里,不同大小数据占用不同大小存储单元,无论我们要访问的对象占用多大的存储空间,都使用该连续的字节单元的头一个字节单元的地址访问到它,以32位x86计算机为例说明,机器实施数据传输的方法有:MOV,XCHG, PUSH,POP,LEA等。注意:

1、这些方法都不能把数据从存储器的一个区传输到存储器的另一个区,通常是要通过寄存器的。

2、使用方法LEA时,目的操作数必须为寄存器,且数值代表地址。

3、使用方法PUSH把一个双字数据压入栈过程的操作细节是先把栈指针减去4,然后把这个双子数据保存到相应的存储器位置。

4、使用方法POP从栈中弹出一个双字数据过程的操作细节是先从栈顶位置读出数据,然后把栈指针加4。

5、栈向低地址方向生长

6、使用gcc 的-S 选项生成c源代码对应的汇编代码

7、使用gcc的-c选项生成c源代码对应的目标代码

8、使用objdump的-的选项读取目标代码里面的内容,将呈现给我们的是汇编代码对应的字节序列

9、使用gcc的-o选项生成可执行文件,可执行文件会改变目标代码在存储器里的位置,不会改变目标代码本身,会定义代码里面的全局变量在存储器的位置等

Question4:机器如何控制被执行操作的顺序。

1、转移控制到过程和从过程中退出到控制

2、过程调用者将实际传递给过程的数据和过程返回的数据保持在栈帧里面

3、过程调用包括三个阶段,第一个阶段是”建立“阶段,初始化栈帧,第二阶段,”主体“阶段,执行过程的实际计算,第三阶段,”完成“阶段,恢复栈的状态和过程返回

4、实现非顺序控制流的机器级机制:

4.1、机器用一个条件码寄存器记录最近一次操作的结果,基于该结果做出是否改变执行顺序的决定,如果需要改变执行顺序,机器会引用跳转指令,将执行引导到另一个全新的位置

4.2、程序计数器PC总是指向将要执行的指令

4.3、switch语句提供了根据一个整数索引值进行多重分支的能力,维护了一张跳转表,表项是一个代码段的地址


0 0