20145227 《信息安全系统设计基础》第五周学习总结

20145227 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

一、程序编码

编译如下代码: unix> gcc -01 -o p p1.c p2.c

  • 01 表示告诉编译器使用第一级优化。通常,提高优化级别会使最终程序运行的更快,但编译时间可能会变长,用调试工具对代码进行调试会更困难。
  • 从得到的程序性能方面考虑,第二级优化-02被认为是是较好的选择。

二、机器级代码

1、两种抽象

(1)ISA

ISA(Instruction set architecture)指令体系结构:机器级程序的格式和行为,定义了处理器状态、指令的格式、每条指令对状态的影响。

(2)机器级程序使用的存储器地址是虚拟地址

提供的存储器模型看上去是一个非常大的字节数组,实际实现是将多个硬件存储器和操作系统软件组合起来。

2、状态可见的几种处理器

  • 程序计数器 (PC,用%eip表示)
  • 整数寄存器 (包含8个命名的位置,存储32位的值)
  • 条件码寄存器 (实现if和while语句)
  • 浮点寄存器 (存放浮点数)

三、获得汇编代码

1、gcc -S xxx.c -o xxx.s 获得汇编代码

eg:unix> gcc -01 -S code.c

2、objdump -d xxx 反汇编;

eg:unix> objdump -d code.o

注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c
MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)

四、查看二进制格式文件

二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt

五、关于格式的注解

以“.”开头的行都是指导汇编器和链接器的命令,我们通常可以忽略这些行。
gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读。

六、访问信息

1、操作数指示符

操作数:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。
操作数的三种类型

  • 立即数
  • 寄存器
  • 存储器

2、数据传送指令

(1)MOV类指令

定义:将数据从一个位置复制到另一个位置,将源操作数的值复制到目的操作数。

(2)PUSH&POP指令

PUSH:将数据压入程序栈中
POP:从程序栈中弹出数据

七、控制

1、条件码

条件码寄存器:他们描述了最近的算术或逻辑操作的属性。

常用的条件码:

CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志

常见指令:

LEAL:不改变条件码寄存器
XOR:进位标志和溢出标志会设置成0
INC:设置溢出和零标志
DEC:设置溢出和零标志
CMP:根据操作数之差设置条件码
SUB:设置条件码,更新寄存器
TEST:改变目的寄存器的值

2、访问条件码

常用使用方法:

(1)根据条件码的某个组合,将一个字节设置成0或1

(2)可以条件跳转到某个其他部分

(3)可以有条件的传送数据

3、跳转指令及其编码

JUMP指令,导致执行切换到程序中一个全新的位置。

注意:jump分为直接跳转和间接跳转

  • 直接跳转:后面跟标号作为跳转目标
  • 间接跳转:*后面跟一个操作数指示符

八、循环

1、do-while循环

汇编中,根据do-while形式产生循环代码

do-while语句的通用形式:

do
body-statement
while(test-expr);

可翻译成如下:

loop:
body-statement
t = test-expr;
if(t)
	goto loop;

2、while循环

while语句的通用形式:

while (test-expr)
body-statement

GCC采用的方法,是使用条件分支,需要时省略循环体的第一次执行::

if(!test-expr)
	goto done;

do
	body-statement
	while(test-expr);
done:

接下来,这个代码可直接翻译成goto代码:

	t = test-expr;
	 if(!t)
	goto done:
loop:
	body-statement
	t = test-expr;
	if(t)
	goto loop;
done:

3、for循环

for循环的通用形式:

for(init-expr;test-expr;update-expr)
body-statement

汇编结构:

	init-expr
	t=test-expr;
	if(!t)
	goto done;
loop:
	body-statement
	update-expr;
	t=test-expr;
	if(t)
		goto loop;
	done:

4、switch语句

根据一个整数索引值进行多重分支,执行switch语句的关键步骤是通过跳转表来访问代码位置,使结构变得更加高效。

九、过程

过程调用

  • 进入时为过程的局部变量分配空间

  • 将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。

  • 退出时释放这些空间。

1、栈帧结构

  • IA32程序用程序栈来支持过程调用。

  • 机器用栈来传递过程参数、存储返回信息、保存寄存器,以及本地存储。

2、转译控制

(1)call指令

  • 目标是指明被调用过程起始的指令地址
  • 效果是将返回地址入栈,并跳转到被调用过程的起始处。

(2)ret指令

  • 从栈中弹出地址,并跳转到这个位置。
  • 函数返回值存在%eax中

3、寄存器使用惯例

注意:保证当一个过程调用另一个过程时,被调用者不会覆盖某个调用者稍后会用的寄存器的值。

十、应用:使用GDB调试器

关于栈帧的gdb命令:

1、backtrace/bt n

打印当前的函数调用栈的所有信息。
n是一个正整数,表示只打印栈顶上n层的栈信息。
-n表一个负整数,表示只打印栈底下n层的栈信息。

2、frame n

n为栈中的层编号,是一个从0开始的整数
比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
该指令是移动到n指定的栈帧中去,并打印选中的栈的信息。
如果没有n,则打印当前帧的信息。

3、up n

表示向栈顶移动n层
可以不打n,表示向上移动一层。

4、down n

表示向栈底移动n层
可以不打n,表示向下移动一层。

实验过程

实验环境中编写的源代码如下:

执行gcc -S -o main.s main.c -m32命令后编译成汇编代码:

删除gcc产生代码中以"."开头的编译器指令:

注释了栈帧情况的汇编代码:

实验分析:

学习中的问题和解决过程

问题一:做语句这部分的练习题时,只能做到一句句的顺序的读出汇编代码,但是不能准确的对应到C语言代码,只能对比课后答案。希望老师上课堂上可以带着练习练习。

问题二:教材P131练习题3.16得C代码为:

void cond(int a,int *p)
{
    if(p&&a>0)
        *p +=a;
}

按照与汇编代码等价的C语言goto版本,写一个与之等价的C语言代码如下:

void goto_cond(int a,int *p)
{
    if(p == 0)
        goto done;
    if(a<=0)
        goto done;
    *p +=a;
    done:
        return;
}

为什么C语言只有一个if语句;而汇编中有两个分支呢?

原因:第一个条件分支是&&表达式实现的一部分;如果对p为非空的测试失败,代码会跳过对a>0的测试。

问题三:教材P151练习题3.30

  call next
next:
  popl %eax

为什么这个调用没有与之匹配的ret指令呢?这段代码功能是什么?

原因:这并不是一个真正的过程调用,因为控制是按照与指令相同的顺序进行的,而返回值是从栈中弹出的。这是IA32中将程序计数器的值放到整数寄存器中的唯一方法。

本周代码托管链接

https://git.oschina.net/20145227/IS-Design-20145227/tree/master/ch05

其他(感悟、思考等,可选)

  • 这周内容相对较多,但因为从周二开始就每天都看一点内容。总结一点知识,所以周末还是比较轻松的,没有上次那种慌乱的感觉。上次因为把所有内容都堆在周末,导致整个周末都在看这门课,很累而且效率真的不高,这周换了一种方式轻松了许多。这次的很多内容都是在上学期的汇编的基础上进行的,讲的更为深入,有些地方理解起来还是有些困难的,但是我会继续啃教材,相信把教材多研究一下效果会更加好的。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0 2/2 20/20
第二周 100/100 1/3 20/40
第三周 200/300 1/4 22/62
第五周 200/500 1/5 22/84

参考资料

posted @ 2016-10-16 18:15  20145227鄢曼君  阅读(309)  评论(1编辑  收藏  举报