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

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

教材学习内容总结

第三章 程序的机器级的表示

1.寻址方式经历三代:

  • DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
  • 8086的分段模式
  • IA32的带保护模式的平坦模式

2.ISA的定义

3.64位机器上想要得到32代码:gcc -m32 -S xxx.c

4.MAC OS中没有objdump, 有个基本等价的命令otool

5.Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)

6.二进制文件可以用od 命令查看,也可以用gdb的x命令查看。

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

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

7.Intel与ATT格式的不同:

  • Intel代码省略了指示大小的后缀
  • Intel代码省略了寄存器名字前的“%”符号
  • Intel代码用不同的方式来描述存储器中的位置。
  • 在带有多个操作数的指令情况下,列出操作数的顺序相反

8.操作数的三种类型:

  • 立即数,也就是常数值。
  • 在ATT格式的汇编代码中,立即数的书写方式是“”后跟一个用标准C表示法表示的整数。任何一个能放进32 位字中的数值都可以用做立即数,不过汇编器在可能时会使用一个或两个字节的编码。

9.寄存器,表示某个寄存器的内容

10.存储器,根据计算出来的地址(有效地址)访问某个存储器的位置。

11.有效地址的计算方式: Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
(注意:ATT格式中的方向:第一个是源操作数,第二个是目的操作数)

12.栈

  • 后进先出原则
  • push压栈,pop出栈
  • 栈顶:总是从这端插入和删除元素
  • 栈顶元素的地址是最低的
  • 栈指针%esp保存着栈顶元素的地址

13.lean指令

  • lean是加载有效地址指令
  • 指令形式实际上并没有引用存储器,它的第一个操作数其实是将有效地址写入到目的操作数
  • 可以为后面的存储器引用产生指针,简洁的表述普通算数操作。

14.目的操作数必须是一个寄存器。

15.过程
过程调用:

  • 进入,为过程的局部变量分配空间
  • 将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。
  • 退出,释放这些空间。

16.转移控制

  • call
  • call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。
  • call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
  • ret
  • ret指从栈中弹出地址,并跳转到这个位置。
  • 在上学期的汇编语言学习中,call和ret常被用来进行子函数、子模块的调用。

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

  • 问题1:

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

  • 问题1:使用gcc -g gdbdemo.c -o gdbdemo -m32命令在64位的机器上产生32位汇编代码,在产生32位汇编代码时可能会出现如下错误:

1071527-20171019192729599-947765890.png

  • 问题1解决方案:解决方法是在终端输入如下命令:sudo apt-get install libc6-dev-i386,安装一个库,安装成功后再次执行gcc -g gdbdemo.c -o gdbdemo -m32命令就可以顺利进行下一步了

1071527-20171019192839052-275373132.png

  • 使用gdb gdbdemo指令打开gdb调试器

  • 使用break main指令在main函数处设置断点(可以使用l指令在屏幕上打印代码),然后,使用r指令运行代码,可以看到运行时在main函数位置停了下来

1071527-20171019192916787-292546573.png

  • 使用disassemble指令获取汇编代码(因为之前执行的命令中有-m32,所以此处显示的是32位汇编代码)

1071527-20171019193345927-869886644.png

  • 用i r指令查看各寄存器的值

1071527-20171019201540740-167233601.png

  • 将C语言文件编译成汇编文件并查看汇编文件内的内容:

1071527-20171019220513912-1596622605.png

  • 删除以.开头的语句之后:

1071527-20171019223812224-2089895085.png

反汇编代码分析:

  • 首先进入gdb调试环境,在虚拟机上输入如下命令生成带有调试信息的elf文件,然后进入gdb调试:

    (gdb)layout asm
    (gdb)b main
  • 然后使用

    (gdb)si

1071527-20171019230356787-287782559.png

代码托管

1071527-20171021145816177-135868898.png

上周考试错题总结

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 学习态度认真
  • 代码中值得学习的或问题:
    • 编写代码严谨
  • 其他

本周结对学习情况

- [20155311](博客链接)
- 结对照片
- 结对学习内容
    -fork函数,wait函数,exec函数,实现mybash
    -第三章 程序的机器级的表示
   

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周10/ 101/110/10
第三周158/ 1681/217/27
第三周145/ 3133/ 521/48

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

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

  • 计划学习时间:20小时

  • 实际学习时间:17小时

  • 改进情况:学期初没有好好准备学习工作,认真学习课程知识。以后一定会努力赶上进度认真学习。

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

参考资料

转载于:https://www.cnblogs.com/20155305ql/p/7689662.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值