20135318—信息安全系统设计基础第四周学习总结

第三章 程序的机器级表示

3.1历史观点

Intel处理器俗称x86。

IA32就是“Intel32位体系结构”。本章主要了解IA32指令集。

Linux采用了平坦寻址方式,使程序员将整个存储空间看做一个大的字节数组。

3.2程序编码

Gcc编译器在gcc命令时调用了一系列程序,将源代码转化成可执行代码。即:
C预处理器扩展源代码(插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏)—→编译器产生两个源代码的汇编代码(名字分别为p1.s,p2.s)—→汇编器将汇编代码转化成二进制目标代码文件名为p1.o,p2.o—→链接器实现两个目标代码文件与实现库函数的代码合并,产生最终的可执行代码文件p(处理器执行的代码格式)。

1.机器级代码

两种抽象:

(1) 指令集体系结构ISA——机器级程序的格式和行为,定义了处理器状态、指令的格式以及每条指令对状态的影响。

(2) 机器级结构使用的存储地址虚拟地址,存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来。

2.代码实例

(1)

意思为:

(2)反汇编器——查看目标代码文件的内容

带-d命令行标志的程序objdump可以实现:objdump  –d 
code.o

(3)关于格式的注解

以“.”开头的行都是指导汇编器和链接器的命令。

  1. 数据格式

Intel用“字”表示16位数据类型。称32位数为双字节,64位数为四字节。

!大多数常用数据类型都是以双字形式存储,包括int和long
int,并不考虑是否有符号

!所有的指针都存储为4字节的双字

汇编代码指令后的字符后缀表明操作数的大小:

4.访问信息
(1)一个IA中央处理单元(CPU)包含一组8个存储32位值的寄存器,用来存储整数数据和指针。

(2)  操作数指示符

操作数三种类型:
●立即数,即常数值。 如:

●寄存器,表示寄存器的内容

●存储器引用,它会根据计算出来的地址(有效地址)访问某个存储器位置。

(3)  数据传送指令

将一个只从一个存储器位置复制到另一个存储器位置需要两条指令——第一条将原址加载到寄存器中,第二条将该寄存器值写入目的位置。

●三个字节传送指令的差别(movb、movsb1、movzb1)

5.算术和逻辑操作

(1)加载有效地址

如果寄存器%edx的值为x,则

(2)一元操作和二元操作

一元操作——只有一个操作数,既是源又是目的。

二元操作——第一个是源操作数(立即数、寄存器或存储器位置),第二个是目的操作数(寄存器或存储器位置)。

(3)移位操作

左移指令:SAL、SHL,均将右边填上0;

右移指令:SAR执行算术移位(填上符号位),SHR执行逻辑移位(填上0)。

(4)特殊的算术操作

6.控制

数据相关的控制流是实现有条件行为的方法。通常,C语言中的语句和指令根据他们在程序中出现的次序顺序执行。

(1)  
条件码

(2)  
访问条件码

条件码通常不会直接读取,有三种办法:
a.根据条件码的某个组合,将一个字节设置为0或1——SET指令;

b.条件跳转到程序的其他某个部分;

c.有条件的传送数据。

(3)跳转指令及其编码

Jmp指令是无条件跳转,可以直接跳转(.L1),即跳转目标是作为指令的一部分编码的;也可以间接跳转(*),即跳转目标是从寄存器或存储器位置中读出的。

!跳转指令有几种不同的编码,最常用的是PC相关的。

(4)      
翻译条件分支

结合有条件和无条件跳转讲条件表达适合语句从C语言翻译成机器代码

(5)      
循环

(6)条件传送指令

处理器通过使用流水线来获得高性能;采用非常精密的分支预测逻辑猜测每条跳转指令是否执行。

(6)      
Switch语句

进行多重分支。使用跳转表这种数据结构。

!执行switch语句的关键步骤是通过跳转表来访问代码位置。

7.过程

(1)  
栈帧结构

(2)  
转移控制

(3)  
寄存器使用惯例

8.数组分配和访问

(1)  
基本原则

(2)  
指针运算

(3)   嵌套的数组

(4)  
定长数组和变长数组

9.异质的数据结构

创建数据类型机制的两种不同类型的对象:
●结构:用关键字struct声明,将多个对象集合到一个单位中

●联合:用关键字union声明,允许用几种不同的类型来引用一个对象。

【这里主要看书上的例子讲解】

10.综合:理解指针

(1)每个指针都对应一个类型

(2)每个指针都有一个值

(3)指针用&运算符创建

(4)操作符用于指针的间接引用

(5)数组与指针紧密联系

(6)指针也可以指向函数

11.应用:使用 GDB调试器

这些前几周已经开始接触并练习

12.存储器的越界引用和缓冲区溢出

!对抗缓冲区溢出攻击

a.栈随机化

b.栈破坏检测

c.限制可执行代码区域

13.X86-64: 将IA32扩展到64位(了解知识)

14.浮点程序的机器级表示

浮点体系结构——存储模型、指令和传递规则的组合。(x87和SSE)

遇到的问题:

时间: 2024-09-27 01:41:21

20135318—信息安全系统设计基础第四周学习总结的相关文章

20135219洪韶武——信息安全系统设计基础第四周学习总结

信息安全系统设计基础第四周学习总结 学习任务:教材第三章 学习时间:10小时 学习内容 一.教材知识梳理 1.程序编码与机器级代码 程序编码: gcc编译器,将源代码转化成可执行代码,C预处理器-汇编器-链接器 机器级代码: 机器级程序的格式和行为,定义[指令集体系结构ISA],定义了处理器状态,指令格式,以及指令对状态的影响 机器级程序实用的存储地址使用的是虚拟地址 2.数据格式 整数型.长整数型存储为4字节格式 指针类型存储为4字节格式 浮点数有三种形式:单精度.双精度.扩展精度,分别为4字

信息安全系统设计基础第四周学习总结------20135334赵阳林

X86 寻址方式经历三代: 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 2 8086的分段模式 3 IA32的带保护模式的平坦模式 对于机器级编程来说,其中两种抽象尤为重要 1 机器级程序的格式和行为,定义为指令集体系结构(ISA),它定义了处理器状态,指令的格式,以及每条指令对状态的影响 2 机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组 数据格式:由于是从16位体系结构扩展成32位,intel用术语字(word)表示16位数据类型,因此3

20135304刘世鹏——信息安全系统设计基础第四周学习总结

第三章 程序的机器级表示 1.历史观点 GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令.x86架构于1978年推出的Intel 8086中央处理器中首度出现,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.8086在三年后为IBM PC所选用,之后x86便成为了个人计算机的标准平台,成为了历来最成功的CPU架构 2.程序编码 机器级程序的格式和行为,定义为指令集体系结构(ISA),它定义了处理器状态.指

信息安全系统设计基础第四周学习总结

$3.1x86的发展历史 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全   2 8086的分段模式   3 IA32的带保护模式的平坦模式 $3.2程序编码 1.机器级代码:机器级编译的两种抽象:指令集体系结构和存储地址是虚拟地址.一条指令只执行一个非常基本的操作. 2.关于格式的注解:所有以“.”开头的行都是知道汇编器和链接器的命令 gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数

信息安全系统设计基础第四周学习总结—20135227黄晓妍

二进制数字系统和标准字符码 无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字. 补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字. 浮点数(?oating-point)编码是表示实数的科学记数法的以二为基数的版本. 地址 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器(virtual memory).存储器的每个字节都由一个唯一的数字来标识,称为它的地址(address).所有可能地址的集合

20135223何伟钦—信息安全系统设计基础第九周学习总结

学习目的: 1. 掌握系统编程和系统调用的概念 2. 掌握系统编程错误处理的方式 3. 掌握Unix/Linux系统级I/O(open close read write seek stat) 4. 掌握RIO 5. 掌握I/O重定向的方法 一.Unix I/O Unix I/O定义:所有的I/O设备都被模型化为文件,所有的输入和输出都被当作 对相应文件的读和写来执行.这种将设备影射为文件的方式,称为Unix I/O (一)打开文件 (1)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告

20135219洪韶武-信息安全系统设计基础第九周学习总结

第九周学习总结 一.课本内容 1.每个unix文件都是一个m字节的序列:所有I/O设备如网络.磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作. 2.unix系统中输入输出的操作: 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符.unix系统创建每个进程的时候都有三个打开的文件:标准输入:标准输出,标准错误. 改变当前的文件位置.对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量). 读

信息安全系统设计基础第二周学习总结

学习目标 1. 熟悉Linux系统下的开发环境    2. 熟悉vi的基本操作    3. 熟悉gcc编译器的基本原理    4. 熟练使用gcc编译器的常用选项    5 .熟练使用gdb调试技术    6. 熟悉makefile基本原理及语法规范    7. 掌握静态库和动态库的生成 内容一:vim编辑器的使用 1.vim编辑器的三种模式 Ⅰ正常模式:(按Esc或Ctrl+[进入) 左下角显示文件名或为空 Ⅱ插入模式:(按i键进入) 左下角显示--INSERT-- Ⅲ可视模式:左下角显示—V

信息安全系统设计基础第二周学习总结(一)

Linux下C语言编程基础实验报告 学习任务 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 学习内容 1. 快捷键 2. vim 3. gcc 4. gdb 5. make与makefile 学习过程记录 第一部分 第一讲第一节:移动光标 H左.j下.k上.l右 第一讲第二节:VIM的进入和退出 <E