第五周
2015-10-11 20:43
176 查看
四、学习任务
第三章 程序的机器级表示
[b]五、学习过程[/b]
1.重要知识点:
一、历史观点
1.X86寻址方式历经三代:1.DOS时代的平坦模式,不区分用户空间和内核空间,不安全。
2.8086分段模式
3.IA32的带保护模式的平坦模式
二、程序编码
1.机器级代码(两种抽象)
ISA(指令集体系结构):它定义了处理器状态、指令的格式,以及每条指令对状态的影响。
2.获得汇编代码:
或
二进制文件可以用od 命令查看,也可以用gdb的x命令查看(x/17xb sum)。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
对一组目标代码文件运行连接器,将main函数卸载main.c文件中:
也可返汇编:objdump -d xxx(可执行文件)
3.关于格式:
gcc、objdump默认的是ATT格式,其他一些都是Intel格式
区别:书P111
三、数据格式
1.访问信息:
(1)一个IA32CPU包含一组8个存储32位值的寄存器,%eax、%ecx和%edx保存和回复惯例不同于ebx、edi和esi,ebp和esp只有根据栈管理标准惯例才能修改值
例题:假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?
解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出。
(2)操作数指示符:
立即数:常数值,$+标准c表示伐
寄存器:表示某个寄存器的内容,对双字操作可以是8个32位寄存器中的一个,对字操作可以是8个16位寄存器中一个。
存储器:根据有效地址访问某个存储器位置
(3)数据传送指令
MOV类:分别在大小为1,2,4个字节的数据上进行操作。(movb,movw,movl)
push操作把数据压入栈,pop操作删除。
等价于:
栈顶元素的地址是所有栈中元素地址中最低的
(4)数据传送示例
c中的指针其实就是地址,间接使用指针就是将该指针放在一个寄存器中,然后在存储器引用中使用这个寄存器
局部变量通常是保存在寄存器中,而非存储器(寄存器访问更快)
五、算术和逻辑操作
四组操作:加载有效地址、一元操作、二元操作和移位
1.一元操作和二元操作
一元只有一个操作数,即是源又是目的,可是寄存器可是存储器位置
二元:第一个操作数可以是立即数、寄存器或存储器位置,第二个是寄存器或存储器位置。(不能同时是存储器位置)
例:subl %eax,%edx使寄存器%edx的值减去%eax中的值
2.移位操作
移位量可以是一个立即数,或放在单字节寄存器元素%cl中
六、控制
1.条件码:CF,ZF,SF,OF
2.访问条件码:注意机器代码如何区分有符号和无符号值。
3.跳转指令:
jmp之无条件跳转,可直接可间接
4.循环
5.switch语句:关键步骤是通过跳转表来访问代码位置
七、过程
1.栈帧结构
为单个过程分配的那部分栈称为栈帧,最顶端的站真以两个指针界定,寄存器%ebp为帧指针,%esp为栈指针
2.寄存器使用惯例P152
十一、使用GDB调试器
启动:
gdb命令见P175
实验练习:
输入代码:
编译:
删除“."开头的汇编代码:
六、遇到的问题及解决方法
七、其他
第三章 程序的机器级表示
[b]五、学习过程[/b]
1.重要知识点:
一、历史观点
1.X86寻址方式历经三代:1.DOS时代的平坦模式,不区分用户空间和内核空间,不安全。
2.8086分段模式
3.IA32的带保护模式的平坦模式
二、程序编码
1.机器级代码(两种抽象)
ISA(指令集体系结构):它定义了处理器状态、指令的格式,以及每条指令对状态的影响。
2.获得汇编代码:
gcc -S xxx.c xxx.s
或
objdump -d xxx.o
二进制文件可以用od 命令查看,也可以用gdb的x命令查看(x/17xb sum)。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more od code.o > code.txt
对一组目标代码文件运行连接器,将main函数卸载main.c文件中:
gcc -o xxx xxx.o main.c
也可返汇编:objdump -d xxx(可执行文件)
3.关于格式:
gcc、objdump默认的是ATT格式,其他一些都是Intel格式
区别:书P111
三、数据格式
1.访问信息:
(1)一个IA32CPU包含一组8个存储32位值的寄存器,%eax、%ecx和%edx保存和回复惯例不同于ebx、edi和esi,ebp和esp只有根据栈管理标准惯例才能修改值
例题:假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?
解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出。
(2)操作数指示符:
立即数:常数值,$+标准c表示伐
寄存器:表示某个寄存器的内容,对双字操作可以是8个32位寄存器中的一个,对字操作可以是8个16位寄存器中一个。
存储器:根据有效地址访问某个存储器位置
(3)数据传送指令
MOV类:分别在大小为1,2,4个字节的数据上进行操作。(movb,movw,movl)
push操作把数据压入栈,pop操作删除。
pushl %ebp 和 popl %eax
等价于:
subl $4,%esp | movl (%esp),%eax movl %ebp,(%esp) | addl $4,%esp
栈顶元素的地址是所有栈中元素地址中最低的
(4)数据传送示例
c中的指针其实就是地址,间接使用指针就是将该指针放在一个寄存器中,然后在存储器引用中使用这个寄存器
局部变量通常是保存在寄存器中,而非存储器(寄存器访问更快)
五、算术和逻辑操作
四组操作:加载有效地址、一元操作、二元操作和移位
1.一元操作和二元操作
一元只有一个操作数,即是源又是目的,可是寄存器可是存储器位置
二元:第一个操作数可以是立即数、寄存器或存储器位置,第二个是寄存器或存储器位置。(不能同时是存储器位置)
例:subl %eax,%edx使寄存器%edx的值减去%eax中的值
2.移位操作
移位量可以是一个立即数,或放在单字节寄存器元素%cl中
六、控制
1.条件码:CF,ZF,SF,OF
2.访问条件码:注意机器代码如何区分有符号和无符号值。
3.跳转指令:
jmp之无条件跳转,可直接可间接
4.循环
5.switch语句:关键步骤是通过跳转表来访问代码位置
七、过程
1.栈帧结构
为单个过程分配的那部分栈称为栈帧,最顶端的站真以两个指针界定,寄存器%ebp为帧指针,%esp为栈指针
2.寄存器使用惯例P152
十一、使用GDB调试器
启动:
unix> gdb prog
gdb命令见P175
实验练习:
输入代码:
编译:
删除“."开头的汇编代码:
六、遇到的问题及解决方法
七、其他
相关文章推荐
- sgu Flow construction
- 请描述一下 cookies,sessionStorage 和 localStorage 的区别?
- HTML 表单和输入
- 使用CSS3制作简单的图形运动变换
- 大学C语言考点简析
- 优先级队列
- 我的第一篇博客
- 信息安全系统设计基础第四周学习总结
- Slalom
- Node 中使用 supervisor
- POSIX 最大时间
- MySQL 存储过程 定时任务
- 30天自制操作系统之第17天 命令行窗口
- 记:CVTE校招软件类笔试
- Android Socket 编程
- 例10-10 uva10491(简单概率)
- ocp-305
- 例10-10 uva10491(简单概率)
- 面试中的二叉树题目
- bootstrap之Click大事