• 20145204《信息安全系统设计基础》第5周学习总结


    20145204《信息安全系统设计基础》第5周学习总结

    教材学习内容

    x86寻址方式
    • DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
    • 8086的分段模式
    • IA32的带保护模式的平坦模式
    机器级编程的两种抽象

    -ISA(Instruction set architecture)。ISA简单来说就是指令集体系结构。定义了处理机状态,指令格式以及指令对状态的影响。
    -机器级使用的存储器地址是虚拟地址。

    机器代码中的处理机状态
    • 程序计数器(PC)表示将要执行的下一条指令在存储器中的地址。
    • 整数寄存器文件。存储32位的值。存储程序状态或用来保存临时数据。
    • 条件码寄存器
    • 浮点寄存器
    Gcc编译代码

    1.产生汇编代码文件:gcc -01 -S xxx.c生成xxx.s文件
    2.产生目标代码文件:gcc -01 -c xxx.c生成xxx.o文件
    3.查看目标代码文件的内容:objdump -d xxx.o

    不同数据汇编代码后缀
    • movb(传送字节)
    • movw(传送字)
    • movl(传送双字)注意:汇编代码中后缀l可以表示4自己整数和8字节双精度浮点数。
    操作数指示符寻址
    • 立即数:$0xff.
    • 寄存器中的内容:%eax(32位),%ax(16位),%al(4位)。
    • 存储器:根据计算出来的地址访问存储器
      学会多种寻址方式寻址。错误的寻址方式:1. 存储器间接寻址错误使用寄存器:movb $0xf,(%bl).2.二元操作如sub,mov中两个操作数不能同时是存储器位置 。
    数据传送指令
    • MOVS和MOVZ指令比较:MOVS符号位扩展,MOVZ零扩展(高位0填充)
    • pushl数据压栈,popl数据出栈。采用先进后出的原则。栈顶地址小,栈底地址大。IA32栈向低地址方向增长。所以push指令减小栈指针。
    • 4个整数操作指令
      addl、subl、andl、xorl
    • 7个跳转指令(jXX)
      jmp、jle、jl、je、jne、jge、jg
    • 有6个条件传送指令(cmovXX)
      只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
      cmovle、cmovl、cmove、cmovne、cmovge、cmovg
    桢栈结构

    为单个过程分配的那部分栈称为栈帧(stack frame)。寄存器%ebp为帧指针,而寄存器%esp为栈指针。栈帧结构(栈用来传递参数、存储返回信息、保存寄存器,以及本地存储)

    转移控制

    支持过程调用和返回的指令:

    指令 描述

    -call Label 过程调用

    -call *Operand 过程调用

    -leave 为返回准备栈

    -ret 从过程调用中返回

    call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是在程序中紧跟在call后面的那条指令地址。

    寄存器使用惯例

    程序寄存器组是唯一能被所有过程共享的资源。虽然在给定时刻只能有一个过程是活动的,但是我们必须保证当一个过程(调用者)调用另一个过程(被调用者)时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。根据惯例,寄存器%eax、%edx和%ecx被划分为调用者保存寄存器。当过程P调用Q时,Q可以覆盖这些寄存器,而不会破任何P所需要的数据。另一方面,寄存器%ebx、%esi和%edi被划分为被调用者保存寄存器。这意味着Q必须在覆盖这些寄存器之前,先把它们保存到栈中,并在返回前恢复它们。

    代码调试过程中的问题以及解决过程

    • 编译代码

    • gcc -s xxx.c得到汇编结果

    删减汇编多出的辅助信息得到以下代码:

     1 add:
     2     pushl    %ebp            //保存现场,将父函数的栈底寄存器存入当前程序栈中
     3     movl    %esp, %ebp      //构建当前函数堆栈
     4     movl    8(%ebp), %eax   //从父函数堆栈中取得参数,存入ax寄存器
     5     addl    $3, %eax        //完成+3操作
     6     popl    %ebp            //恢复原父函数堆栈
    
     8 r_turn:
     9     pushl    %ebp            //保存现场,将父函数的栈底寄存器存入当前程序栈中
    10     movl    %esp, %ebp      //构建当前函数堆栈
    11     pushl    8(%ebp)        //
    12     movl    8(%ebp), %eax   
    14     call    add               //调用add
    15     addl    $4,%esp
    17 main:
    18     pushl    %ebp
    19     movl    %esp, %ebp
    20     push    $4        
    21     call    r_turn      
    22     addl    $4,%esp              
    23     addl    $1, %eax        //完成+1操作
    
    
    
    • objdump -d xxx.o得到反汇编结果:

    -gdb打印栈信息
    刚开始yonggdb调试时直接使用bt命令结果是:NO stack

    后来仔细查阅资料发现:bt是指当前函数调用栈的所有信息,所以在一个函数下设置断点后使用bt命令,结果如下:

    教材中的问题

    1.关于mol和leal指令,课本上说leal指令是用来计算地址的,所以他不改变条件码,那么mov和leal到底区别在哪?
    lea eax,[eax+2*eax]的效果是eax = eax + eax * 2

    mov edx [ebp+16]的效果是edx=(dword)(ebp+16).因此leal指令不改变条件码。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 3500行 30篇 400小时
    第一周 100/100 1/1 20/20
    第二周 200/300 1/2 30/50
    第三周 100/400 1/3 28/78
    第四周 60/460 1/4 20/98

    代码托管

    代码链接

    参考资料

  • 相关阅读:
    嵊州D1T2 圣女
    嵊州D1T1 总统先生,一路走好!
    第三节暑期信息奥赛课——图论
    并查集小结
    洛谷P1003 铺地毯 noip2011提高组day1T1
    洛谷p1216 IOI1994 Day1T1
    Title
    Title
    Title
    Title
  • 原文地址:https://www.cnblogs.com/yayaer/p/5965566.html
Copyright © 2020-2023  润新知