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

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

    教材学习内容总结

    寻址方式经历:

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

    代码编译:

    • 编译产生汇编代码:gcc –s xxx.c 得到.s文件
    • 编译产生目标代码文件:gcc -o1 xxx.c 得到.o文件

    • 反汇编命令:objdump –d xxx

    • 直接编译64位处理器得到32代码的命令:gcc –m32 -S xxx.c

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

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

    操作数的三种类型

    • 立即数:常数值,表示为$c标准表示的整数
    • 寄存器:表示某个寄存器的内容
    • 存储器:根据计算出来的地址访问某个存储器位置

    栈的特点

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

    四组操作

    • 加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器
    • 一元操作:只有一个操作数,既是源又是目的
    • 二元操作:源操作数是第一个,可以是立即数、寄存器、存储器,目的操作数是第二个,可以是寄存器、存储器,但两个不能同时为存储器
    • 移位:第一个是移位量,用单个字节编码且只允许0-31位的移位,可以是立即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR,填上0)目的操作数可以是一个寄存器或存储器

    条件码

    • CF:进位标志
    • ZF:零标志
    • SF:符号标志
    • OF:溢出标志

    jump指令

    • 直接跳转:后面跟标号作为跳转目标
    • 间接跳转:*后面跟一个操作数指示符

    call指令

    • call指令有一个目标,即指明被调用过程起始的指令地址。
    • call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。

    ret指令

    • ret指从栈中弹出地址,并跳转到这个位置。
    • ret指令返回到call指令后的那条指令。

    gdb

    使用流程

    • 进入GDB  #gdb test
    • test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb)
    • 查看源码  (gdb) l
    • 设置断点  (gdb) b 6
    • 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
    • 查看断点处情况  (gdb) info b
    • 可以键入"info b"来查看断点处情况,可以设置多个断点;
    • 运行代码  (gdb) r
    • 显示变量值  (gdb) p n
    • 在程序暂停时,键入"p 变量名"(print)即可;
    • 在程序暂停时,键入"p 变量名"(print)即可;
    • 单步运行  (gdb) n
    • 程序继续运行  (gdb) c
    • 退出GDB  (gdb) q

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

    这周学习教材内容时,遇到了一些比较难以区分的指令和定义,在此加以比较。

    Mov movs movz的区别:

    将源操作数的值复制到目的操作数中时(不涉及数据大小的转换),用mov

    将一个较小的源数据复制到一个较大的数据位置时,用movs或者movz:

    当数据是有符号数的时候,用movs

    当数据是无符号数的时候,用movz

    Leal mov指令:

    mov是将数据从源操作传到目的操作数中

    lea是将源操作数的地址传到目的操作数中

    一个是数据,一个是地址

    比如:D1 dw 0x0000

    汇编以后可能变成:

    地址 值

    0x9000 00

    0x9001 00

    那么lea SI,D1,SI的值是0x9000而不是0000,要用mov就是0000了

    算数右移和逻辑右移 (SAR K,D SHR K,D):

    逻辑右移:左边统一加0

    算术右移:左边加原数符号位上的数:

    eg:1010101010,其中[]位是添加的数字

    逻辑右移一位:[0]101010101

    算数右移一位:[1]101010101

    (此外,逻辑左移=算术左移,右边都加0)

    CMP 和SUB

    sub S,D 是D-S结果送回D中,即目的操作数中

    而cmp S,D也是相减但结果不送回目的操作数中,一般用作比较数大小时用

    本周代码托管截图

    链接:https://git.oschina.net/20144303sys/work

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

    本周主要学习的是第三章的内容,与之前学的汇编语言有很大的联系。这章有很多类似的定义和指令,看起来内容很多,十分的复杂,但我发现把相似的知识拿来比较,总结他们的相同的和不同点以及各自的用法,可以更快的理解掌握,这样的学习方法可以提高学习效率,以后要多运用。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/1 20/20
    第二周 300/300 1/2 20/40
    第三周 300/600 1/3 20/60
    第五周 200/800 1/4 20/80

    参考资料

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/20144303sys/p/5968132.html
Copyright © 2011-2022 走看看