20145339《信息安全系统设计基础》第5周学习总结
程序的机器级表示
GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序的每一条指令。
intel处理器的模型:
8086:
它是第一代单芯片、16位微处理器之一。体系结构上讲只有20位长。
i386:
体系结构扩展到了32位,Linux和Windows系列操作系统都是使用的这种模式,这是Intel系列中第一台支持Unix操作系统的机器。
80286:
增加了更多的寻址模式,构成了IBM PC—AT个人计算机的基础,这种计算机是MS Windows最初的平台。
程序编码:
假设一个c程序,有两个文件p1.c和p2.c。我们用unix命令编译这些的代码如下
unix> gcc -o1 -c p p1.c p2.c
"gcc"指的是GCC C编译器,将源代码转换成可执行代码。 “-o1”告诉编译器使用第一级优化。
在命令行上使用“-s”选项,就能得到c语言编译器的汇编代码c:
unix> gcc -o1 -s code.c
在命令行上使用“-c”选项,GCC会编译并汇编该代码:
unix> gcc -o1 -c code.c
反汇编器,程序根据目标代码产生一种类似于汇编代码的格式:
unix> objdump -d code.o
生成可执行文件prog:
unix> gcc -O1 -o prog code.o main.c
我们用下面的命令来启动GDB:
unix> gdb prog 我们可以以各种方式查看哥哥寄存器和存储器位置
命令对应的效果:
quit 退出GDB
run 运行程序
kill 停止程序
stepi 执行第一行指令
stepi4 执行第四行指令
nexti 类似于stepi 但以函数调用为单位
continue 继续执行
help 获取有关GDB的信息