• 2017-2018-1 20155306 《信息安全系统设计基础》第5周学习总结


    2017-2018-1 20155306 《信息安全系统设计基础》第5周学习总结

    教材学习内容总结

    第三章 程序的机器级表示


    ++p104, p105: X86 寻址方式经历三代++:

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

    2 8086的分段模式

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

    ++p106:ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解;++

    指令集体系结构ISA:是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。

    ISA在编译器编写者(CPU软件)和处理器设计人员(CPU硬件)之间提供了一个抽象层:

    处理器设计者:依据ISA来设计处理器

    处理器使用者(如:写编译器的牛*程序员):依据ISA就知道CPU选用的指令集,就知道自己可以使用哪些指令以及遵循哪些规范

    ++p107: 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) 产生的代码更接近教材中代码(删除"."开头的语句)

    ++p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。++

    有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看

    od code.o
    od code.o | more
    od code.o > code.txt
    

    ++p109: gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读++.

    .“开始的语句都是指导汇编器和链接器的命令。

    ++p113:++

    操作数的三种类型:立即数($-577)、寄存器(Ea表示寄存器R[Ea]表示寄存器值)、存储器(Mb[Addr]表示对存储在存储器中从地址Addr开始的b个字节值的引用)。

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

    ++p114:++

    MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。

    区分MOV,MOVS,MOVZ:

    MOV传送,MOVS符号拓展,MOVZ零拓展

    掌握push,pop:

    • 栈“先进后出”的原则,push把数据压栈,pop删除数据。
    • 弹出来的值永远是最后被压入且仍在栈中的数据。
    • 总是在栈顶插入和删除数据,栈顶地址是栈中所有地址中最低的。
    • 栈指针%esp

    ++p117:++

    指针就是地址;局部变量保存在寄存器中。

    ++p119:++

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

    • 注意移位操作移位量可以是立即数或%cl中的数。

    • 符号乘法(mull)补码乘法(imull):一个参数必须存放在%eax,而另一个作为指令的源了操作数给出,乘积存放在%edx和%eax中

    • 除法将%edx(高32位)和%eax(低32位)中的64位数作为被除数,商存储在%eax中,余数存储在%edx

    ++p123:++

    结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)。

    ++p131-p145:do while /for/while/switch++

    • do-while循环:汇编器中,其他循环都会首先转化为do while,再编译为机器代码。至少执行一次

    • while循环:使用条件分支,在需要时省略循环体的第一次执行。

    • for循环:先对初始化表达式求值,再进入循环。

    • switch:当开关情况数量比较多,跨度又比较小,就会使用跳转表。

    ++p150/p151:++

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

    • ret指令是从栈中弹出地址,ret指令返回到call后面那条指令。

    教材学习中的问题和解决过程

    • 问题1:运行书上的代码时候,产生的汇编代码,寄存器是%rbp,但是书上的汇编代码上是%ebp?(如下图)

    • 解决:寄存器RBP、RSP和EBP、ESP和BP、SP称分别为64位、32位、16位指针寄存器。64位没有栈帧的指针,32位用ebp作为栈帧指针。

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

    • 问题1
      -用命令objdump查看汇编代码时,出现下图问题,无法出现代码:

    • 解决:检查之后,发现自己没有编译到.o文件,却直接 objdump -d xx.o。后面重新编译,结果正确。

    代码托管

    (statistics.sh脚本的运行结果截图)

    上周考试错题总结

    其他(感悟、思考等,可选)

    本周任务重,课本有100多页的内容,学习内容与大二下学期汇编语言的知识密切相关,上学期知识不扎实且忘记了太多,以至于还得重新温习之前的知识。但是对一些习题还是不太懂,需要再好好看一下,请教一下同学。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 20/20 1/2 10/15 第一章
    第三周 130/210 1/2 21/36 第二章
    第四周 70/ 280 1/3 10/46 第十章
    第五周 91 / 371 1/34 23/69 第三章

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    参考资料

  • 相关阅读:
    SqlDependency和SqlCacheDependency的若干说明
    sublime 3 随笔
    [有得]解决redmine写操作很慢的问题
    Java双重循环
    使用 Docker 打包 Rust Web 服务
    Centos8.3、hadoop-2.6.4 简单的日志分析实验
    广域网数据交换的三种方式
    计算机的起源与发展
    推荐两款生成数据库表结构说明文档工具
    Centos8.3、docker部署springboot项目实战记录
  • 原文地址:https://www.cnblogs.com/0831j/p/7707419.html
Copyright © 2020-2023  润新知