zoukankan      html  css  js  c++  java
  • 20145216史婧瑶《信息安全系统设计基础》第5周学习总结

    20145216史婧瑶《信息安全系统设计基础》第5周学习总结

    教材内容总结

    • X86 寻址方式经历三代:

      1  DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
      2  8086的分段模式
      3  IA32的带保护模式的平坦模式
      
    • ISA(指令集体系结构):机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响

    • gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编

      注意:64位机器上想要得到32代码:gcc -m32 -S xxx.c
           MAC OS中没有objdump, 有个基本等价的命令otool 
      
    • 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看,如:

      od code.o | more
      od code.o > code.txt
      
    • gcc -S 产生的汇编中以”.“开始的语句是指导汇编器和链接器的命令,可以删除了再阅读

    • esi edi可以用来操纵数组,esp ebp用来操纵栈帧

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

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

    • MOV相当于C语言的赋值“=”(注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下)

    • 栈:“后进先出”,栈顶元素的地址是所有栈中元素地址中最低的

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

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

    • leal不改变条件码寄存器

    • SET指令根据t=a-b的结果设置条件码

    • call/ret; 函数返回值存在%eax中

    思考题总结:

    • 不同数据的汇编代码后缀:

      C声明    Intel数据类型    汇编代码后缀    大小(字节)
      char         字节             b             1
      short         字              w             2
      int          双字             l             4
      long int     双字             l             4
      
    • MOV、MOVS、MOVZ区别:

      MOV:传送
      MOVS:传送符号扩展的字节
      MOVZ:传送零扩展的字节
      
    • 栈通过push操作把数据压入栈中,通过pop操作删除数据

    • CMP和SUB的异同之处:CMP根据两个操作数只差设置条件码,但是不更新目标寄存器;SUB根据两个操作数之差更新寄存器

    学习中遇到的问题

    1、练习3.15中第E个问题没有理解

    2、练习3.23中for循环的执行语句我做的答案是val=(2*val)|(x&ox1);x>>1,参考答案是val=(val<<1)|(x&ox1);x>>=1,结果不一样

    解决方案:对于第一个不同之处,我检查了很多遍自己写的步骤,并没有发现任何错误,在写博客整理问题的时候我突然想到二进制中左移一位相当于该数乘以2,所以我的答案也是正确的;而第二个不一样的地方,我通过上网百度,明白了>>与>>=的差别:>>是右移运算符,只进行计算,不改变x的值;>>=是右移赋值符,进行右移运算后把计算的结果赋值给x。

    3、练习3.29中switch语句体内情况标号的值不知道应该怎么确定

    实验楼练习

    代码托管截图

    实验楼l链接:

    https://git.oschina.net/sjy519/linux-program-C/tree/master

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

    本周学习了程序的机器级表示,感觉很难,看书上的练习题时,总是不知道怎么做,答案也没有解释,就通过问同学或者上网查找资料解决,但仍然有问题没有弄明白,现在才感觉到上学期的汇编没有学好,没有为这门课打好基础,以后只能花更多的时间来好好学习这门课。

    学习进度条

     代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
    目标 3000行 30篇 300小时  
    第一周 0/0 1/2 25/40 学习了Linux基础知识和核心命令 
    第二周 0/0 0/2 0/40  
    第三周 300/300 3/5 40/80

    学习了vim、gcc、gdb指令;

    学习了信息表示和处理

    第五周 200/500 1/6 45/125

    学习了程序的机器级表示

  • 相关阅读:
    算法(Java实现)—— KMP算法
    算法(Java实现)—— 动态规划算法
    算法(Java实现)—— 分治算法
    算法(Java实现)—— 二分搜索算法
    JDBC(八)—— 数据库连接池
    JDBC(七)—— Dao层操作
    JDBC(六)—— 数据库事务
    JDBC(五)—— 批量插入数据
    JDBC(四)—— Blob类型操作
    Myeclipse10.X安装findbugs插件记录
  • 原文地址:https://www.cnblogs.com/sjy519/p/5967633.html
Copyright © 2011-2022 走看看