2017-2018-1 20155234《信息安全系统设计基础》第五周学习总结
20155234第一周《信息安全系统设计基础》学习总结
程序的机器级表示
3.2程序编码
gcc是Linux上默认的编译器 。gcc -0g告诉编译器使用第一级优化。优化等级越高,程序运行的越快,编译时间越长,用调试工具调试程序越困难。高级别的的优化产生的代码会严重改变形式。
gcc将源代码转换为可执行代码。首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。
汇编器将汇编代码转换成二进制目标代码,目标代码是机器代码的一种形式,包含所有指令的二进制表示,但没有填入地址的全局值。
连接器将目标文件与实现库函数的代码合并,并产生最终的可执行代码文件。可执行代码是处理器执行的代码格式。
3.2.2 代码示例
gcc -01 -s code.c //使用“-s” 就能得到C语言编译器产生的汇编代码 。这会产生一个汇编文件 code.s
gcc -01 -c code.c //使用“-c”gcc会编译并汇编该代码,产生目标代码文件code.o,他是二进制格式,无法直接查看。
反汇编器可以查看目标文件内容:objdump -d code.o
“gcc -01 -o prog code.o main.c” 通过之前讲的,应该是让编译器将目标文件“code.o”与实际函数库 “main.c”合并 生成可执行文件prog
3.2.3 关于格式的注解
3.3 数据格式
单精度:4字节 双精度:8字节 扩展精度:10字节实际存储成12字节
moveb、movw、movl:对应字节、字、双字。
3.5 算术和逻辑操作
加载有效地址
一元操作
二元操作
移位操作
3.5.1 加载有效地址
加油有效地址“leal”-将有效地址写到目的操作数,目的操作数必须是一个寄存器。
3.5.2 一元操作和二元操作
一元操作,它只有一个操作数,既是原操作数又是目的操作数,操作数可以是一个寄存器,也可以是一个存储器位置。
二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。
二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。
3.5.3 移位操作
移位操作,先给出位移量,第二项给出要移位的数值。
因为32为计算机,所以以为最多移位31为(排除循环移位),所以只允许0到31位的位移。
位移量可以是个立即数,或者是只允许%cl。
SAL和AHL没有区别。
SAR为算数右移,最高位要和符号标志位配合进行算数右移。
SHR为逻辑右移。
移位操作的目的操作数可以是一个寄存器或者是一个存储器的位置。
3.5.5 特殊的算术操作
双操作数乘法(imull)指令,从两个32位的操作数产生一个32位的乘积。
单操作数乘法指令mull和imull,这两条指令都要求一个参数必须在寄存器%eax中,另一个由原操作数给出,高32为存放在%edx中,低32为存放在%eax中。
3.6.1 条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志位
leal指令不改变任何条件,用它进行地址计算。
对于移位操作,进位标志将设置为最后一个移除的位,而溢出标志设置为0.
CMP指令根据他们的两个操作数之差来设置条件码,CMP与SUB指令的行为是一致的。
TEST指令与AND指令的行为是一致的。
3.6.2 访问条件码
SET指令的目的操作数是8个单字节寄存器元素之一,或者是一个字节的存储器位置,将这个字节设置成0或者1。
movzbl指令用来清零%eax的三个高字节。
3.6.3 跳转指令及其编码
jmp指令是无条件跳转,它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或存储器位置中读出的。
程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址。
3.7.1 栈帧结构
为单个过程分配的那部分称为栈帧。
%esp:栈指针
%ebp:帧指针
栈指针可以移动,因此大多数信息的访问是通过栈指针的
3.7.2栈帧结构
call指令有一个目标,即指明被调用过程起始的指令地址,直接调用是一个标号,间接调用是“*”后面跟一个操作指示符。
call指令的效果是将返回地址入栈,并跳转到被调用过程的起始位置。
ret指令从栈中弹出地址,并跳转到这个位置。
%exa用来返回值
leave为返回值做好准备
代码托管
结对搭档
感想
因为我上学期汇编学的不够好导致理解困难。特别是看栈帧及递归调用这部分,虽然看了很多,但是还是不能很好地去理解运用。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | |
---|---|---|
目标 | 5000行 | 30篇 |
第一周 | 6/6 | 1/1 |
第三周 | 150/156 | 2/3 |
第四周 | 77/233 | 1/4 |