20155325 2017-2018-1 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
- 向后兼容:较早版本上的代码可以在较新的处理器上运行。
- 内存看作一个字节数组。
- which查看命令所在位置
- exec
eg
printf……[1]
exec(某命令)[2]
printf……[3]
运行结果:[1]->[2] 无[3]
原因:[2]时把代码全换成某命令的了。
- gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编
- 64位机器上想要得到32代码:gcc -m32 -S xxx.c
- Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
- 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt - gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读
- esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
教材学习中的问题和解决过程
- 问题1:ia32-libs与IA32是否存在某种联系?
- 问题1解决方案:当x86系统上想要运行32位的程序时,往往要下载ia32-libs之类的营造一个32位运行环境去运行,就像之前我们学习汇编的时候,运行时候用DOSbox相似的道理。
- 问题2:看到那的时候觉得x86应该就是ia32的64位版本,然而名字不是一个套路所以是否是有什么概念上我理解错误呢?
- 问题2解决方案:x86-64就是IA32的64位拓展,最常用的名字是"x86"。见教材P112
- 问题3:汇编课上的代码和书上的汇编代码不同。以前学的诸如
mov ax,bx
pop cx
书上的代码
pushq %rbx
movq %rdx,%rbx
call mult2
movq %rax,(%rbx)
popq %rbx
ret
- 问题3解决方案:指令结尾的'q'大小指示符,在大的多数情况中可以省略。GCC产生的汇编代码指令上有后缀,而反汇编代码没有。源和目的类型的五种可能组合见P123。%那些在P120
代码调试中的问题和解决过程
- 问题1:P151习题3.23
GCC产生的汇编代码如下:
long dw_loop(long x)
x initially in %rdi
dw_loop:
movq %rdi,%rax
movq %rdi,%rcx
imulq %rdi,%rcx
leaq (%rdi,%rdi),%rdx
.L2
leaq 1(%rcx,%rax),%rax
对于这一段的leaq的操作不理解
- 问题1解决方案:在汇编中lea指令的功能是取偏移地址。
- eg.LEA AX,[1000H],作用是将源操作数[1000H]的偏移地址1000H送至AX。
而书上P121,(ra,rb)代表变址寻址,实际上是M[R[rb]+R[ri]],我的理解是"x+x"的值赋给偏移地址是%rdx代表的寄存器。所以第二个leaq就是x = x+y+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
正确答案:AB
解析:记住格式
针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,相对于m.o, buf是()
A .
buf
B .
temp
C .
swap
D .
buffp0
正确答案:A C D
解析:temp是局部变量,不出现在符号表中。
上图是典型的ELF的可重定位目标文件的格式,对于代码:
int a[100] ={0};
int b[100];
int main()
{
int i=0;
for(i=0; i<100; i++)
b[i] = i;
printf("the b[3]= %d\n", b[3]);
return 1;
}
其中b[100]存放在()节
A .
.text
B .
.data
C .
.bss
D .
.rodata
正确答案: C
解析:全局未初始化的数据放在bss节
- gcc hello.c产生的a.out属于()
A .
可重定位目标文件
B .
可执行目标文件
C .
共享目标文件
D .
目标模块或目标文件
正确答案: B
解析:手抽点错
- Linux中,目标文件XXX.o中的代码和数据节是从地址0开始的。
A .
正确
B .
错误
正确答案: A
解析:编译器和汇编器生成从地址0开始的代码和数据节。
结对
- 本周结对学习情况
- 20155328
- 结对照片
- 结对学习内容
- 第三章
学习进度条
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 16篇 | 400小时 | |
第一周 | 9/9 | 1/1 | 19/19 | 熟练下载安装技能,锻炼解决问题能力 |
第2周 | 380/389 | 2/3 | 26/45 | 1、7章 |
第3,4周 | 1270/1659 | 3/6 | 42 | 2、10章 |
第5周 | 20/1679 | 2/8 | 实验一&3章 |
-
计划学习时间:22小时
-
实际学习时间:22小时
-
改进情况:
参考资料
《深入理解计算机系统》