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


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

    教材学习内容总结

    • 机器级代码

    1.机器级编程的两种抽象

    (1)指令集结构ISA

    (2)机器级程序使用的存储器地址是虚拟地址

    2.汇编代码的特点:

    用可读性更好的文本格式来表示。

    3.几个处理器:

    程序计数器(CS:IP)

    整数寄存器(AX,BX,CX,DX)

    条件码寄存器(OF,SF,ZF,AF,PF,CF)

    浮点寄存器

    一条机器指令只执行一个非常基本的操作。

    • 课本上P114页的代码如图所示:
    long mult2(long,long);
    
    void multstore(long x,long y,long *dest){
    
       long t= mult2(x,y);
       *dest = t;
    }
    
    

    在命令行上使用 “-S”选项,可以看到C语言编译器产生的汇编代码。

    gcc -Og -S mstore.c
    

    “-c”命令行选项,则会编译并汇编该代码。

    gcc -Og -c mstore.c
    

    这里还注意一下反汇编器的使用:

    objdump -d xxx.xx
    

    二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。

    od code.o | more
    
    od code.o > code.txt
    
    • Linux——平坦寻址方式:ds,ss,cs等各段的段基地址都指向同一个地方,不管是数据段还是代码段,只要他们的偏移相等,那么他们就是寻址一样的物理内存,所以我们就只需指明偏移就能得到统一的寻址目标,不管这个目标是在代码段还是数据段或者堆栈段之中。

    • 操作数指示符:
      操作数:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。

    • 操作数的三种类型:
      立即数,寄存器,存储器

    • 结果存放的两种可能

    • 寻址方式

    • 数据传送指令:
      1.mov指令2.push&pop

    -(1)堆栈

    1.后进先出

    2.栈指针指向栈顶元素

    3.栈朝低地址方向增长

    • (2)压栈push

    • 指令格式——PUSH r16/m16/seg

    • 指令功能
      第一步:SP←SP-2 ;堆栈指针SP上移
      第二步:(SS):(SP)←r16/m16/seg ;字操作数存入堆栈顶部
      注意 堆栈操作必须至少以字为单位,这时栈顶指针-2
      如果压入的是双字,栈顶指针-4

    • (3)出栈pop
      指令格式——POP r16/m16/seg

    • 指令功能:
      第一步:r16/m16/seg← (SS):(SP) ;栈顶的一个字传送到指定的目的操作数
      第二步:SP←SP+2 ;堆栈指针SP下移,指向新的栈顶
      栈顶指针变化同压栈。

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

    • 无条件跳转:例如 goto。书上的例子就是把if-else语句翻译成了goto形式,然后再由这个形式翻译成汇编语言。

    • 循环

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

    • 问题1:控制流与数据流的区别是什么?
    • 问题1解决方案:
      - 数据流是一个按照时间递增顺序排列的无穷序列,可以表示为: I = α1, α2 ,…,αt的形式,αt 是时刻t 出现的序列元素。 数据流与一般的数据的区别在于它的到达是快速的,无界的,时变的和不可预测的,从而不可能将原始数据流中的数据完全存储。
      - 控制流的英文是control flow,它是程序执行中所有可能的事件顺序的一个抽象表示。控制流语句控制着程序的执行路径。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同。控制流语言使用与程序设计相似的构造使语句得以互相连接、关联和相互依存。

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

    • 问题1:虚拟机出错。这是我上次遇见过的问题,上次我解决了,但是这次我却又出现了,而且用上次的方法还搞不好。

    • 问题1解决方案:因为我之前也出了一次这种错误,所以我本来又试了之前的方法,解决方法1
      但是,却没有用。然后,我又在网上找了一下,找到了解决方法2,结果输入了下面的代码,就成功了。

    mv .zsh_history .zsh_history_bad
    strings .zsh_history_bad > .zsh_history
    fc -R .zsh_history
    

    代码托管

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

    上周考试错题总结

    1. main.c 调用了静态库libmath.a中的函数,编译main.c的命令是()
      A .
      gcc -static main.c ./libmath.a -o main
      B .
      gcc -static main.c -L. -lmath -o main
      C .
      gcc -static main.c -L. -llibmath.a -o main
      D .
      gcc -static main.o ./libmath.a -o main

    正确答案: A B 你的答案: C

    2.针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,相对于m.o, buf是()

    A .
    外部符号
    B .
    全局符号
    C .
    局部符号
    D .
    以上都不对
    正确答案: B 你的答案: A

    3.编译驱动程序gcc -c 会调用()
    A .
    预处理器
    B .
    编译器
    C .
    汇编器
    D .
    链接器
    正确答案: C 你的答案: B

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • 20155232 的博客比较详实,感觉比较多过程图。

    本周结对学习情况

    - [20155232](http://www.cnblogs.com/lsqsjsj/p/7711776.html)
    

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

    这周的实验我觉得收获很大,自己完成的成就感很强,感觉自己对下一次的实验也有了自信。
    然后第三章的内容涉及到很多汇编的知识,而我却发现自己的汇编已经遗忘了大部分了,就觉得很可惜,本来如果上学期学的比较扎实,那这学期学到这个第三章是肯定就能更好一些,这也就在提醒我,每一个知识的学习都是有它的意义所在的,我们应当以正确的态度去对待它。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 100/100 1/1 20/20
    第三周 200/200 2/2 18/20
    第五周 300/300 2/2 20/19

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

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

    • 计划学习时间:20小时

    • 实际学习时间:19小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    【1】windows下IOS开发基础环境搭建
    【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”
    【oracle】oracle REGEXP_SUBSTR分割字符串
    【Oracle安装卸载】oracle卸载
    【oracle】一些的常用命令
    oracle备份与还原(导入导出)
    oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
    oracle表空间扩容
    oracle实现like多关键字查询
    __builtin_ _Find_first()
  • 原文地址:https://www.cnblogs.com/xuanyan/p/7711671.html
Copyright © 2020-2023  润新知