zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155234《信息安全系统设计基础》第五周学习总结

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

    程序的机器级表示

    3.2程序编码

    gcc是Linux上默认的编译器 。gcc -0g告诉编译器使用第一级优化。优化等级越高,程序运行的越快,编译时间越长,用调试工具调试程序越困难。高级别的的优化产生的代码会严重改变形式。
    gcc将源代码转换为可执行代码。首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。
    汇编器将汇编代码转换成二进制目标代码,目标代码是机器代码的一种形式,包含所有指令的二进制表示,但没有填入地址的全局值。
    连接器将目标文件与实现库函数的代码合并,并产生最终的可执行代码文件。可执行代码是处理器执行的代码格式。

    3.2.2 代码示例

    gcc -01 -s code.c //使用“-s” 就能得到C语言编译器产生的汇编代码 。这会产生一个汇编文件 code.s
    gcc -01 -c code.c //使用“-c”gcc会编译并汇编该代码,产生目标代码文件code.o,他是二进制格式,无法直接查看。
    反汇编器可以查看目标文件内容:objdump -d code.o
    “gcc -01 -o prog code.o main.c” 通过之前讲的,应该是让编译器将目标文件“code.o”与实际函数库 “main.c”合并 生成可执行文件prog

    3.2.3 关于格式的注解

    3.3 数据格式

    单精度:4字节 双精度:8字节 扩展精度:10字节实际存储成12字节
    moveb、movw、movl:对应字节、字、双字。

    3.5 算术和逻辑操作

    加载有效地址
    一元操作
    二元操作
    移位操作

    3.5.1 加载有效地址

    加油有效地址“leal”-将有效地址写到目的操作数,目的操作数必须是一个寄存器。

    3.5.2 一元操作和二元操作

    一元操作,它只有一个操作数,既是原操作数又是目的操作数,操作数可以是一个寄存器,也可以是一个存储器位置。
    二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。
    二元操作,有两个操作数,第一个为原操作数,可以是立即数、寄存器或存储器位置;第二个为目的操作数,可以是寄存器或者是存储器位置。

    3.5.3 移位操作

    移位操作,先给出位移量,第二项给出要移位的数值。
    因为32为计算机,所以以为最多移位31为(排除循环移位),所以只允许0到31位的位移。
    位移量可以是个立即数,或者是只允许%cl。
    SAL和AHL没有区别。
    SAR为算数右移,最高位要和符号标志位配合进行算数右移。
    SHR为逻辑右移。
    移位操作的目的操作数可以是一个寄存器或者是一个存储器的位置。

    3.5.5 特殊的算术操作

    双操作数乘法(imull)指令,从两个32位的操作数产生一个32位的乘积。
    单操作数乘法指令mull和imull,这两条指令都要求一个参数必须在寄存器%eax中,另一个由原操作数给出,高32为存放在%edx中,低32为存放在%eax中。

    3.6.1 条件码

    CF:进位标志
    ZF:零标志
    SF:符号标志
    OF:溢出标志位
    leal指令不改变任何条件,用它进行地址计算。
    对于移位操作,进位标志将设置为最后一个移除的位,而溢出标志设置为0.
    CMP指令根据他们的两个操作数之差来设置条件码,CMP与SUB指令的行为是一致的。
    TEST指令与AND指令的行为是一致的。

    3.6.2 访问条件码

    SET指令的目的操作数是8个单字节寄存器元素之一,或者是一个字节的存储器位置,将这个字节设置成0或者1。
    movzbl指令用来清零%eax的三个高字节。

    3.6.3 跳转指令及其编码

    jmp指令是无条件跳转,它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或存储器位置中读出的。
    程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址。

    3.7.1 栈帧结构

    为单个过程分配的那部分称为栈帧。
    %esp:栈指针
    %ebp:帧指针
    栈指针可以移动,因此大多数信息的访问是通过栈指针的
    3.7.2栈帧结构
    call指令有一个目标,即指明被调用过程起始的指令地址,直接调用是一个标号,间接调用是“*”后面跟一个操作指示符。
    call指令的效果是将返回地址入栈,并跳转到被调用过程的起始位置。
    ret指令从栈中弹出地址,并跳转到这个位置。
    %exa用来返回值
    leave为返回值做好准备

    代码托管

    结对搭档

    201555226

    感想

    因为我上学期汇编学的不够好导致理解困难。特别是看栈帧及递归调用这部分,虽然看了很多,但是还是不能很好地去理解运用。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积)
    目标 5000行 30篇
    第一周 6/6 1/1
    第三周 150/156 2/3
    第四周 77/233 1/4

    参考资料

  • 相关阅读:
    P1117 [NOI2016] 优秀的拆分 SA+DP
    P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM
    P3705 [SDOI2017]新生舞会 分数规划+费用流
    P2336 [SCOI2012]喵星球上的点名 SA+树状数组
    543. Diameter of Binary Tree
    451. Sort Characters By Frequency
    563. Binary Tree Tilt
    703. Kth Largest Element in a Stream
    743. Network Delay Time
    kaggle _Titanic: Machine Learning from Disaster
  • 原文地址:https://www.cnblogs.com/zxm20/p/7709436.html
Copyright © 2011-2022 走看看