• 20145307《信息安全系统设计基础》第五周学习总结PT2


    20145307《信息安全系统设计基础》第五周学习总结PT2:

    教材学习内容总结

    之前有第一部分学习总结:

    http://www.cnblogs.com/Jclemo/p/5962219.html

    以下为第二部分

    执行汇编命令:gcc –s xxx.c –o xxx.s反汇编命令:objdump –d xxx 64位处理器得到32代码的命令:gcc –m32 –s xxx.c

    Ltme:

    1、三种操作数:

    立即数:常数值。表示为$c标准表示的整数。

    寄存器:表示某个寄存器的内容。

    存储器:根据计算出来的地址访问某个存储器位置

    2、数据传送指令

    栈的特点

    a、 遵循“后进先出”的原则b、 push压栈,pop出栈c、 栈顶:总是从这端插入和删除元素d、 栈顶元素的地址是最低的e、 栈指针%esp保存着栈顶元素的地址

    3、数据传送示例

    局部变量通常保存在寄存器中;

    寄存器访问比存储器访问要快的多。

    算术和逻辑操作四组操作

    加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器。

    一元操作:只有一个操作数,可以是寄存器也可是存储器位置。

    二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 ;目的操作数是第二个,可以是寄存器、存储器;两个不能同时为存储器。

    移位##:第一个是移位量,用单个字节编码(只允许0-31位的移位),可以是立即数或者放在单字节寄存器%cl中 ;算术右移SAR,填上符号位;逻辑右移SHR,填上0。目的操作数可以是一个寄存器或存储器。

    2、特殊的算术操作img

    1、条件码

    CF:进位标志

    ZF:零标志SF:符号标志OF:溢出标志

    2、访问条件码条件码常用的使用方法

    根据条件码的某个组合,将一个字节设置为0或1

    SET指令根据t=a-b的结果设置条件码; 可以条件跳转到程序的某个其他部分;可以有条件的传送数据。

    3、跳转指令及其编码

    jump指令

    直接跳转:后面跟标号作为跳转目标间接跳转:*后面跟一个操作数指示符

    其他跳转指令

    除了jump指令外,其他跳转指令都是有条件的。有条件跳转是指根据条件码的某个组合,或者跳转或者继续执行下一条指令。

    4、翻译条件分支

    将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转。

    5、循环循环结构的三种形式

    do-while:先执行循环体语句,再执行判断,循环体至少执行一次。while: 把循环改成do-while的样子,然后用goto翻译 for: 把循环改成do-while的样子,然后用goto翻译

    汇编中用条件测试和跳转组合实现循环的效果。大多数汇编器根据do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,然后再编译成机器代码。

    6、条件传送指令

    实现条件转移的方式传统方式: 利用控制的条件转移。当条件满足时就,程序沿着一条执行路径进行,而当条件不满足时,就走另一路径。

    7、switch语句

    跳转表是一种非常有效的实现多重分支的方法,是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。

    过程

    1、栈帧结构

    机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。 最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。

    2、转移控制

    call指令

    call指令有一个目标,即指明被调用过程起始的指令地址。 call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。

    ret指令

    ret指从栈中弹出地址,并跳转到这个位置。ret指令返回到call指令后的那条指令。

    leave指令leave指令可以使栈做好返回的准备 等价于:

    movl %ebp,%esp popl %ebp

    3、寄存器使用惯例

    程序寄存器组是唯一能被所有过程共享的资源。

    惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖

    使用惯例:%eax,%edx,%ecx 调用者保存寄存器  %ebx,%esi,%edi 被调用者保存寄存器  %ebp,%esp 保持寄存器

    保存某值的两种方式

    由调用者保存。在调用之前就压进栈。 由被调用者保存,在刚被调用的时候就压进栈,并在返回之前恢复。

    gdb调试

    img

    实验练习中的问题和解决过程

    使用gcc –S –o main.s main.c -m32命令编译成汇编代码,如下代码中的数字和函数名请自行修改以防与他人雷同

    leafpad删除 . 开头文件命令

    leafpad//注释

    详解main函数保存%ebp,并设置新的帧指针。

    pushl   %ebpmovl    %esp,%ebp

    分配4字节的栈空间

    subl  $4,%esp

    设置arg1=8

    movl      $8,(%esp)

    call调用f f被调用,初始化帧指针,分配栈空间。 将(%esp)中的8给 %eax,即存入栈中

    movl    %eax,(%esp)

    call调用g g被调用,初始化栈指针,分配栈空间 将 %eax 与立即数 123123

    相加add     $123123,%eax

    在g结束前弹栈

    popl    %ebp

    ret返回f中call的调用位置 f也结束,return返回main中call调用的位置 main继续 %eax 加3的操作

    addl    $3,%eax

    leave为返回准备栈,相当于%ebp出栈,最后ret结束。

    本周代码托管截图

    链接

    https://git.oschina.net/Jclemo/Jclemo-programmi-for_linux/commit/6055b51c0165a8f62851d5bfa14761d5bef3b7a1

  • 相关阅读:
    XtraGrid回车添加行,
    此行属于此表解决方案
    实践重于理论——创建一个监控程序探测WCF的并发处理机制
    使用SerialPort类设计串口通讯程序 (VS2005)[转载]
    WCF实例上下文基本内容概述
    DotNetBar教程
    MSChart使用做折线图饼图
    WCF Data Contract之KnownType
    WCF学习笔记之 搭建WCF技术知识框架
    C# SerialPort运行方式
  • 原文地址:https://www.cnblogs.com/Jclemo/p/5967978.html
Copyright © 2020-2023  润新知