2019-2020-1 20175311胡济栋 《信息安全系统设计基础》第五周学习总结教材学习
2019-2020-1 20175311胡济栋 《信息安全系统设计基础》第五周学习总结教材学习
程序结构与执行
数据格式
1:指针类型变量的大小只取决于计算机系统的位数,它的大小也等于该计算机系统的int类型大小,即该计算机系统“字”的大小。(这句话中的int其实是上面表格中的long int,因为C语言为了保持跨平台的统一,所以char, short int, int, long long int都采用了固定位数,不随系统位数变化而变化,但是long int类型是根据系统位数决定的!)
2:在32位系统下,是无法直接操作64位的整数的,所以32位下的long long int的操作是编译器通过一系列位运算完成的。
3:一个计算机系统的寻址能力由“字”决定,例如:32位系统下的“字”大小为32位(意思就是采用32位大小的整数来表示每个内存地址),所以寻址能力为2的32次方,地址范围为0 ~ 2^32 - 1。
访问信息
- 对于机器级编程,两种抽象尤为重要。第一种是指令集架构(ISA),其定义了机器级程序的格式与行为,包括处理器状态、指令格式、指令影响。第二种其使用的内存地址是虚拟地址。
- 程序计数器(PC)给出将要执行的下一条指令在内存中的地址。
- 不同的操作数按类型被分为三种:第一种类型是立即数,用来表示常数值。(如$-577)第二种类型是寄存器,它表示某个寄存器里的内容。第三种类型是内存引用,它会根据计算出来的地址访问某个内存位置。
操作数指示符
上图我们可以看出源数据值可以是常数形式给出,或者是从寄存器或存储器中读出。而结果可以存放在寄存器或存储器中。我们将不同的操作数分为如下三种类型:
①、立即数(immediate):书写方式是符号后跟一个标准C表示的整数,比如52,$0x1F等等。任何能放进一个32位的字里面的数值都可以做立即数。
②、寄存器(register):它表示某个寄存器的内容,可以是8个32位寄存器中的一个(比如%eax),也可以是8个16位寄存器中的一个(比如%ax),还可以是8个单字节寄存器寄存器(比如%al)。上图是用Ea来表示任意寄存器a,用引用 R[Ea]来表示它的值。
③、存储器(memory):它会根据计算出来的地址(通常称为有效地址)来访问某个存储器位置。我们将存储器看成一个很大的字节数组,用符号Mb[Addr] 表示对存储在存储器中从地址 Addr 开始的 b 个字节值的引用。上图省略了下方的 b.
从上图我们知道,第一行是立即数,第二行则是寄存器,剩下的全部是存储器。其中最后一行存储器语法 Imm(Eb,Ei,s),表示的是最常用的形式,分为四个部分,
一、Imm 是立即偏移数
二、Eb 是基址寄存器
三、Ei 是变址寄存器
四、s 是比例因子,必须是 1、2、4或8
然后有效地址计算公式为: Imm + R[Eb]+R[Ei]s。比如对于2(%esp,%eax,4)这个操作数来讲,它代表的是内存地址为2+%esp+4%eax的存储器区域的值。
代码测试与实践