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

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

学习任务:教材第三章

学习时间: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命令

 

 

时间: 2024-10-26 11:37:53

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

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

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

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

学习过程总结 一.gcc 编译 使用C99特性时 gcc -std=c99 xxx.c 实验楼环境为64位,编译为32位机器码: gcc -m32 xxx.c 二.重点注意知识点 p20: 三种数字:无符号数.有符号数(2进制补码).浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞 p22: 进制转换,注意拿二进制作中间结果就好转了 p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码 p26: 字节顺序是网络编程的基础,记住小端是“高对高.低对低”,大端与之相反

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 反汇编; 注意函数前两条和后两条汇编代码,所有函数

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

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

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

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

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

第三章 程序的机器级表示 3.1历史观点 Intel处理器俗称x86. IA32就是“Intel32位体系结构”.本章主要了解IA32指令集. Linux采用了平坦寻址方式,使程序员将整个存储空间看做一个大的字节数组. 3.2程序编码 Gcc编译器在gcc命令时调用了一系列程序,将源代码转化成可执行代码.即: C预处理器扩展源代码(插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏)—→编译器产生两个源代码的汇编代码(名字分别为p1.s,p2.s)—→汇编器将汇编代

实验三实验报告20135219洪韶武 20135201李辰希

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础                       班级:1352 姓名:  洪韶武        李辰希 学号:20135219    20135201 成绩:           指导教师:娄嘉鹏          实验日期:2015.12.8 实验密级:       预习程度:            实验时间:15:30~17:30 仪器组次:       必修/选修:必修           实验序

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)文件描述符:一个应用程序通过要求内核打开相应的文件,来宣告