zoukankan      html  css  js  c++  java
  • 20145207《信息安全系统设计基础》第4周学习总结(1)

    这次由于自己成绩低,被要求提前写博客,心里好不好受呀,第一次上老师的课就落下这么个名头,唉!考试电脑没带,当然自己复习也不到位,这两天找您查代码就是了,由于宿舍看了好久的书,代码没来得及敲,表明了页数。本周第二次的博客就直接贴代码了,不写其他的了。总之,不爽。。。。。

     

    X86 寻址方式经历三代:

    1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全

    2 8086的分段模式

    3 IA32的带保护模式的平坦模式

     

    程序编码

    1.编译

    gcc -01 -o p p1.c

    -01:表示使用第一级优化。通常提高优化级别会使最终程序运行得更快,但是编译时间可能会变长,用调试工具对代码进行调试会更困难。(实际中,第二级优化-02被认为是较好的选择)

    gcc命令调用一系列程序将源代码转换成可执行代码:

    - C预处理器 扩展源代码,插入#include命令指定的文件,扩展#define声明指定的宏

        - 编译器 产生两个源代码的汇编代码。(.s)

        - 汇编器 将汇编代码转化成二进制目标代码(.o)

        - 连接器 将两个目标代码与实现库函数的代码合并,并产生最终的可执行代码文件。

    2.两种抽象

    计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。对于机器级编程来说,两种抽象尤为重要:

    • 机器级程序的格式和行为,定义为 ISA :指令集体系结构。
    • ISA,定义了处理器状态,指令格式,以及每条指令对状态的影响。
    • 处理器的硬件并发的执行许多指令,但是可以采取措施保证整体行为与ISA指定的顺序整形完全一致。
    • 解决的问题:

        指令的编码方式(即如何编码)

        操作数和操作结构的存放位置

        数据的类型和大小

        支持哪些操作

    3.IA32机器代码

    一些通常对C语言程序员隐藏的机器代码在IA32中是可见的:

    • 程序计数器(在IA32中,通常称为“PC”,用%eip表示)

    指示将要执行的下一条指令在存储器中的地址。

    • 整数寄存器

    包含8个命名的位置,分别存储32位的数值,这些寄存器可以存储地址(对应C语言的指针)或整数数据,有的寄存器被用来记录某些重要的程序状态,其他的寄存器用来保存临时数据,例如过程的局部变量和函数的返回值。

    • 条码寄存器

    保存着最近执行的算术或逻辑指令的状态信息,他们用来实现控制或数据流中的条件变化。

    • 浮点寄存器

    一组浮点寄存器存放浮点数据

     

    获得汇编代码的两种方式:

    gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编

    (反汇编不需要访问程序的源代码或者汇编代码)

     

    C语言数据类型在IA32中的大小:

    P111页表格。

     

    8个寄存器(32)

    eax,ecx,edxe;bx,esi,edi为六个通用寄存器。

    esi edi可以用来操纵数组

    ebp(帧指针),esp(栈指针)保存指向程序栈中重要位置的指针。

     

    立即数,存储器,寄存器寻址方式:

    P113表格公式。3.1的例题帮助检验掌握否。

    特别是:有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

     

    数据传送指令:

    MOV:movb,movw,movl分别传送字节,字,双字

    MOVZ(零扩展,高位用0填充):同上,压栈出栈见p114表格。(注意栈顶的地址值是栈中最小的)

    MOVS(符号扩展,高位用原来最高位的数值填充):同上

    C语言中,指针就是地址,间接引用指针就是将指针放在一个寄存器中,然后在存储器中使用这个寄存器。

     

    算术运算和逻辑运算:

    四种整数操作:加载有效地址,一元操作,二元操作,移位。

    具体见p119表格。

     

    控制:

    核心是跳转语句。

    无条件跳转:jmp跳转目标可以是直接跳转,即跳转目标是作为指令的一部分编码;也可以是间接跳转,目标是从寄存器或存储器中读出的。

    条件跳转:判断条件:标志位 p124,跳转指令 p128.

    CMP是不会改变源操作数的减法,只是做比较之后改变标志位。

    SUB是会改变源操作数的减法。

    循环

    if-else 的汇编结构:

    p130的三个版本的代码帮助理解汇编代码。

     

    do-while的汇编结构:

    p133三个代码。

     

    While的汇编结构:

    p135三个代码。

     

    for的汇编结构:

    p138的三个版本的代码。

     

    条件传送指令:

    P140三个代码。

    基于条件数据传送的指令比基于条件控制转移指令的性能好。但是,条件数据传送很受限制,好在它们能用的情况还比较常见。

     

    Switch:

    P145,146的三个代码时理解的核心。

    注意没有的情况归入default。汇编就直接跳转到所有情况后面的最后。

     

    过程:

    栈:栈顶指针,%esp。在汇编语言中,执行子程序之前,要将该跳转指令下一条指令的地址压入栈中保护起来,在子程序执行完了之后出栈,保证可以继续执行主程序。

    Call指令将控制转移到一个函数的开始,ret指令返回到call指令后的下一条指令。

     

    栈帧的gdb命令:

    backtrace/bt n

    n是一个正整数,表示只打印栈顶上n层的栈信息。

     

    -n表一个负整数,表示只打印栈底下n层的栈信息。

     

    frame n

    n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

     

    这个指令的意思是移动到n指定的栈帧中去,并打印选中的栈的信息。如果没有n,则打印当前帧的信息。

     

    up n

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

     

    down n

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

     

    感受就是憋着写的,跟之前比草率了许多。。。继续加油吧

  • 相关阅读:
    vscode .vue文件中不能提示html代码
    vscode不能提示已经定义的类名和id?
    vue常用指令
    移动端性能陷阱和硬件加速
    关于样式的获取问题
    “'npm' 不是内部或外部命令,也不是可运行的程序”
    JavaScript之闭包问题
    Sublime Text 套件介紹:Pretty JSON
    教你解决Sublime Text中文乱码问题
    C# 连接Mysql 字符串
  • 原文地址:https://www.cnblogs.com/20145207lza/p/5954525.html
Copyright © 2011-2022 走看看