信息安全系统设计基础第四周学习总结
学习任务:教材第三章
学习时间:10小时
学习内容
一、教材知识梳理
1.程序编码与机器级代码
程序编码:
gcc编译器,将源代码转化成可执行代码,C预处理器-汇编器-链接器
机器级代码:
机器级程序的格式和行为,定义【指令集体系结构ISA】,定义了处理器状态,指令格式,以及指令对状态的影响
机器级程序实用的存储地址使用的是虚拟地址
2.数据格式
整数型、长整数型存储为4字节格式
指针类型存储为4字节格式
浮点数有三种形式:单精度、双精度、扩展精度,分别为4字节、8字节、10字节
3.操作数指示符:
第一种是立即数,即常数值
第二种是寄存器,表示某个寄存器的内容
第三种是存储器,根据计算出的有效地址,访问存储器位置
4.操作数格式见课本P113【注意s因子必须是1、2、4或8】
5.数据传送指令:把不同指令分为指令类,同一类指令执行相同操作【不同的是操作数大小不同】
6.MOV类中的指令源操作数的值复制到目的操作数中【源操作数的指定的值是一个立即数,目的操作数指定一个位置】
7.栈是一个数据结构,可以添加或删除值,遵循后进先出原则。
8.加载有效地址【leal】:从存储器读数据到寄存器。
9.一元操作与二元操作
一元操作:只有一个操作数,既是源又是目的
二元操作:其中的第二个操作数既是元又是目的
10.移位操作:先给移位量,再给移位值,可以进行算术和逻辑右移。
11.条件码:寄存器,描述最近的算术或逻辑操作的属性。
最常用的条件码:CF【进位标志】,ZF【零标志】,SF【符号标志】,OF 【溢出标志】
12.注意:CMP指令和TEST指令不会修改任何寄存器的值,只设置条件码。
13.访问条件码:常使用三种方法P125
14.三种循环【do-while】【while】【for】
15.一个过程包括将数据和控制从代码的一部分传到另一部分,在进入时为过程的局部变量分配空间,并在退出时释放空间。
16.栈帧结构:为单个过程分配的那部分栈称为【栈帧】
程序执行时,栈指针可以移动,大多数信息访问都是针对于帧指针的
17.转移控制:call指令、leave指令、ret指令P150
18.递归过程P156
二、重点知识点(与梳理中重复内容不再写)
1.x86寻址方式经历三代:
DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
8086的分段模式
IA32的带保护模式的平坦模式
2.程序计数器【PC】指示将要执行的下一条指令在存储器中的地址
3.gcc -S xxx.c -o xxx.s 获得汇编代码
objdump -d xxx 反汇编,查看目标代码文件的内容
【注意】64位机器上想要得到32代码:gcc -m32 -S xxx.c
MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
4.二进制文件可以用od 命令查看,也可以用gdb的x命令查看
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
5.gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读
6.ATT格式和Intel格式的区别
Intel代码省略了指示大小的后缀,省略了寄存器名字前面的%,用不同方式描述存储器中位置
7.注意P111表中不同数据的汇编代码后缀如:char【b】,short【w】,int【l】
8.esi edi可以用来操纵数组,esp ebp用来操纵栈帧。 对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al都是独立的,我们通过下面例子说明:假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少? 解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.
9.掌握有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
10. MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop
11.栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。
思考一下:CMP和SUB用在什么地方
CMP是比较指令,根据来两操作数之差设置条件码
12.SET指令根据t=a-b的结果设置条件码
13. bt/frame/up/down :关于栈帧的gdb命令