DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
8060的分段模式
IA32的带保护模式的平坦模式html
①指令集结构ISA是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响git
②机器级程序使用的存储器地址是虚拟地址,提供的储存器看上去是一个很是大的字节数组,其实是将多个硬件存储器和操做系统软件组合起来编程
编译产生汇编代码:gcc –s xxx.c 获得.s文件
编译产生目标代码文件:gcc -o1 xxx.c 获得.o文件
反汇编命令:objdump –d xxx
直接编译64位处理器获得32代码的命令:gcc –S –o xxx.s xxx.c -m32数组
当即数:常数值,表示为$c标准表示的整数
寄存器:表示某个寄存器的内容
存储器:根据计算出来的地址访问某个存储器位置安全
1.后进先出的原则
2.push压栈,pop出栈
3.栈顶:老是从这端插入和删除元素
4.栈顶元素的地址是最低的
5.栈指针%esp保存着栈顶元素的地址函数
①加载有效地址:将有效地址写入目的操做数,目的操做数必须是寄存器
②一元操做:只有一个操做数,既是源又是目的
③二元操做:源操做数是第一个,能够是当即数、寄存器、存储器,目的操做数是第二个,能够是寄存器、存储器,但两个不能同时为存储器
④移位:第一个是移位量,用单个字节编码且只容许0-31位的移位,能够是当即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR,填上0)目的操做数能够是一个寄存器或存储器学习
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志测试
①根据条件码的某个组合,将一个字节设置为0或1
②能够条件跳转到程序的某个其余部分
③能够有条件的传送数据编码
SET指令根据t=a-b的结果设置条件码操作系统
直接跳转:后面跟标号做为跳转目标
间接跳转:*后面跟一个操做数指示符
•if-else
•do-while
•while
•for
•swith
利用控制的条件转移,当条件知足时就,程序沿着一条执行路径进行,而当条件不知足时,就走另外一路径。
数据的条件转移方式
call指令有一个目标,即指明被调用过程起始的指令地址
call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处
ret指从栈中弹出地址,并跳转到这个位置
ret指令返回到call指令后的那条指令
用栈来传递过程参数、存储返回信息、保存寄存器用于之后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。
最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针
%eax,%edx,%ecx 调用者保存寄存器
%ebx,%esi,%edi 被调用者保存寄存器
%ebp,%esp 保持寄存器
1)进入GDB #gdb test
test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。
2)查看源码 (gdb) l
源码会进行行号提示。
若是须要查看在其余文件中定义的函数,在l后加上函数名便可定位到这个函数的定义及查看附近的其余源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。
3)设置断点 (gdb) b 6
这样会在运行到源码第6行时中止,能够查看变量的值、堆栈状况等;这个行号是gdb的行号。
4)查看断点处状况 (gdb) info b
能够键入"info b"来查看断点处状况,能够设置多个断点;
5)运行代码 (gdb) r
6)显示变量值 (gdb) p n
在程序暂停时,键入"p 变量名"(print)便可;
GDB在显示变量值时都会在对应值以前加上"$N"标记,它是当前变量值的引用标记,之后若想再次引用此变量,就能够直接写做"$N",而无需写冗长的变量名;
7)观察变量 (gdb) watch n
在某一循环处,每每但愿可以观察一个变量的变化状况,这时就能够键入命令"watch"来观察变量的变化状况,GDB在"n"设置了观察点;
8)单步运行 (gdb) n
9)程序继续运行 (gdb) c
使程序继续往下运行,直到再次遇到断点或程序结束;
10)退出GDB (gdb) q
•实验楼实验
根据书上的步骤输入gdb prog出现这种状况,输入bt/frame/up/down显示NO STACK
按下图方法便可
之前输入git pull --rebase origin master后就能够成功上传,但此次出现了新的状况
解决方法,多是git pull -rebase用的太多了,不用新建文件夹,直接保存在上周代码的那个文件夹上传就能够了
博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|
目标 | 30篇 | 400小时 | |
第零周 | 1/1 | 20/20 | |
第一周 | 1/2 | 20/40 | |
第二周 | 1/3 | 20/60 | |
第三周 | 1/4 | 20/80 | |
第四周 | 0/4 | 00/80 | |
第五周 | 1/5 | 20/100 |