第三章节学习
第3章 程序的机器级表示
3.1 历史观点
Intel处理器俗称x86,经历了长期不断发展的过程。
Intel处理器模型:8086
80286
I386
I486
Pentium
Pentium ||
Pentium |||
Pentium4
Pentium 4E
Core 2
Core i7
3.2 程序编码
Gcc命令调用了一系列程序 将源代码转化成可执行代码
c处理器扩展源代码
机器级代码
格式形式:指令集体系结构
程序计数器:将要执行的下一条指令在存储器中的地址
查看目标代码文件内容:反汇编器 课本P107页3.2.2例子
在linux中 ‘d’可充当此角色
Unix > objdump –d code.o
3.3 数据格式
P111页C语言数据类型
访问信息
IA32 cpu 包含一组8个存储器32位值的寄存器用来存储整数数据和指针
操作数指示符
IA32支持多种操作数格式
不同操作数可能性被分为三种类型
立即数
寄存器
存储器
数据传送指令:将数据从一个位置复制到另一个位置
MOV:将源操作数的值复制到目的操作数中
MOVS/MOVZ:将较小源操作数据复制到较大数据位置
3.5 算术逻辑操作
ADD由三条加法指令组成: addb
addw
add1
每个指令类都有对应字节,字,双字节进行操作的指令:加载有效地址
一元操作
二元操作
移位
加载有效地址指令leal实际上是movl指令的变型
形式:从存储器读数据到寄存器,实际上没有用存储器
移位: 给出移位量
给出要移位的数据
左移指令 :SAL SHL 将右边填上0
右移指令:SAR 算术移位
SHR 逻辑移位
3.6 控制
条件码:
CF:进位标志
ZF:零标志
SF:符号位标志
OF:溢出标志
访问条件码的三种方式:
1 根据条件码某个组合,将一个自己设置成0/1 (SET指令)
2 可以条件跳转到程序其他部分
3 可以有条件传送数据
跳转指令及其编码
Jump导致: 执行切换到程序中一个全新的位置
跳转的目的地通常用lable指明
3.7 过程
栈帧结构
栈帧:为单个过程分配的那部分栈
寄存器%ebp-帧指针
寄存器%esp-栈指针
假如P调用Q
则: Q的参数放在P的栈帧中
P的返回地址被压入栈中
转移控制
指令 |
描述 |
Call Label |
过程调用 |
Call *Operand |
过程调用 |
leave |
为返回准备栈 |
ret |
从过程调用中返回 |
call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
2.ret
ret指从栈中弹出地址,并跳转到这个位置。
备注: 前几次成绩都不是很好,包括博客的分数,此次较认真的完成了博客。本章节内容在写完博客还没有彻底了解一些问题 会在今日到周三之前详细学习。