2018-2019-1 20165225《信息安全系统设计基础》第三周学习总结
教材学习内容总结
gcc -Og -o p p1.c p2.c:-Og告诉编译器使用会生成符合原始C代码整体结构的机器代码的优化等级。
gcc -Og -S xxx.c:可看到编译器产生的汇编代码。
objdump -d xxx.o:可查看机器代码文件的内容。
C语言调用机制使用了栈数据结构提供的后进先出的内存管理原则。
call指令有一个目标,即指明被调用过程起始的指令地址。
有些情况下局部数据必须存放在内存中。
寄存器不够存放所有本底数据。
对一个局部变量使用地址运算符“&”。
某些局部变量是数组活结构。
寄存器组是唯一被所有过程共享的资源。必须确保一个过程调用另一过程时,寄存器值不会被覆盖。
处理器:
- 程序处理器:只是下条将要执行的指令在存储器中的地址
- 整数寄存器:包含16个命名的位置,分别存储64位值。可用来记录某些文件状态,也可用来保存临时值。
- 条纹寄存器:保存最近执行的算数或逻辑指令的状态信息。
- 浮点寄存器:一组向量寄存器可以存放一个或多个证书或浮点数值。
处理器的通用目的寄存器
X86-64的中央处理单元(cpu)包含一组16个存储64位值的通用目的寄存器.
GDB调试
- 反汇编:objdump -d mstore.o
- 可在函数入口设置断点,查看各个寄存器和存储器,还可单步跟踪程序,一次执行几条命令
汇编指令
mov类指令:源操作数的值复制到目的操作数中。
movb 传送字节
movw 传送字
movvl 传送双字
movz 零扩展
一元操作
INC 加一
DEC 减一
NEG 取负
NOT 取补
二元操作
ADD 加
SUB 减
IMUL 乘
XOR 异或
OR 或
AND 与
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
寻址方式
立即数寻址:操作数在指令中直接给出,只能用于源操作数,数据长度应与目的操作数长度匹配。
寄存器寻址:数放在CPU的内部寄存器中,源操作数与目的操作数长度应一致。
存储器寻址:操作数存放在存储器中,指令中给出操作数的偏移地址信息。
本周错题总结
有关gdb调试汇编,下面说法正确的是()
A .可以用disas反汇编当前函数
B .以16进制形式打印%rax中内容的命令是 print /x $rax
C .可以用info registers查看所有寄存器的值
D .可以用info frame 查看所有栈帧的信息
E .可以使用up,down切换栈帧
正确答案: A B C E 你的答案: A E
- /x是16进制的打印,info registers可查看所有寄存器的值。
下面的跳转指令与ZF有关的是()
A .jmp
B .je
C .js
D .ja
E .jb
F .jbe
正确答案: B D F 你的答案: A B D
- jbe为小于等于跳转,zf可判断跳转结果是否为0
假设用ADD指令完成C表达式t=a+b的功能,有关条件码寄存器的说法正确的是()
A .若t==0 ,则ZF=1
B .若t<0, 则CF=1
C .若t<0, 则SF=1
D .若(a<0==b<0)&&(t<0 != a<0), 则OF=1
E .若(a<0==b<0)&&(t<0 != a<0), 则CF=1
F .leaq指令不影响条件码寄存器
G .cmp指令不影响条件码寄存器
正确答案: A C D F 你的答案: A D F
- 计算结果为负时,sf为1
x86-64 Linux中,函数调用的返回值存在()寄存器中。
A .%rax
B .%rbx
C .%rcx
D .%rsp
E .%rbp
正确答案: A 你的答案: D
- rsp是指向栈顶的寄存器,rax才是寄存器
结对学习
- 本周依然和5221同学一起复习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3500行 | 12 | 14小时 | |
第一周 | 63/150 | 1/12 | 3小时 | |
第二周 | 150/150 | 2/12 | 10小时 | |
第三周 | 150/150 | 3/12 | 13小时 |