信息安全系统设计第四周实验报告
程序编码
一组浮点寄存器存放浮点数据。
机器代码只是将存储器看成一个很大的、按字节寻址的数组。
程序存储器(program memeory)包含:程序的可执行机器代码(代码和数据区),操作系统需要的一些信息(应该也在代码和数据区),用来管理过程调用和返回的运行时栈(栈),以及用户分配的存储器块(堆)。
操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器(processor memory)中的物理地址。
gcc -O1 -s xxx.c 输出 汇编代码
gcc -O1 -c xxx.c 输出 目标代码
objdump -d xxx.o 反汇编机器代码(包括目标代码和可执行代码,两者的区别在于偏移地址)
gdb 可以直接对机器代码使用(包括目标代码和可执行代码)
gcc -s产生的汇编代码中,所有以点开头的行都是用于指导汇编器和链接器的。
gcc和objdump产生的汇编代码是ATT风格,微机原理里面学习的是Intel风格。
数据格式
大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。
(P111表格)
访问信息
Linux——平坦寻址方式:
ds,ss,cs等各段的段基地址都指向同一个地方,不管是数据段还是代码段,只要他们的偏移相等,那么他们就是寻址一样的物理内存,所以我们就只需指明偏移就能得到统一的寻址目标,不管这个目标是在代码段还是数据段或者堆栈段之中
算术和逻辑操作
加载有效地址
leal,从存储器读数据到寄存器,而从存储器引用的过程实际上是将有效地址写入到目的操作数。目的操作数必须是一个寄存器。
一元操作和二元操作
-
一元操作:只有一个操作数,既是源又是目的,可以是一个寄存器或者存储器。
-
二元操作:第二个操作数既是源又是目的,两个操作数不能同时是存储器。
移位
先给出位移量,然后是位移的数值,可进行算数和逻辑右移。移位操作移位量可以是立即数或%cl中的数。
控制
常用的条件码:
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
CF:(unsigned)t < (unsiged)a 无符号溢出
ZF: (t==0) 零
SF: (t < 0) 负数
OF:(a <0 == b< 0)&& (t < 0 != a < 0) 有符号溢出
访问条件码的读取方式:
- 根据条件码的某个组合,将一个字节设置成0或1;
- 跳转到程序某个其他的部分
- 有条件的传送数据。
SET指令根据t=a-b的结果设置条件码
JUMP指令,同样是汇编中常用的指令,根据不同的条件和符号位进行不同的跳转动作,具体见书128页。
跳转指令有几种不同的编码,最常用的是PC(程序计数器)相关的。
过程
-
为单个过程分配的栈叫做栈帧,寄存器%ebp为帧指针,而寄存器指针%esp为栈指针,程序执行时栈指针移动,大多数信息的访问都是相对于帧指针。
-
栈向低地址方向增长,而栈指针%esp指向栈顶元素。
-
call:目标是指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
ret:从栈中弹出地址,并跳转到这个位置。