

计算机组成与体系结构
计算机基本结构
1. 冯·诺依曼计算机结构
要点:
1. 计算机应该由运算器,控制器,存储器,输入设备和输出设备共五个部分组成。
2. 数据和程序均以二进制代码形式不加区别地放在存储器中,存放位置由存储器的地址指定
3. 计算机在工作时能够自动地从存储器中取出指令加以执行
冯·诺伊曼计算机的主要构成:
1. 运算器,CA:central arithmetical
2. 控制器,CC:central control
3. 存储器,M:memory
4. 输入设备,I:input
5. 输出设备,O:output
外部记录设备,R:outside recording medium
2. x86指令系统概览
代表:
字长16位:
Intel 8086(1978年)
字长16位,内部的通用寄存器为16位,既能处理16位数据,也能处理8位数据。
对外有16根数据线和20根地址线,可寻址的内存空间为1MByte()。
物理地址的形成采用“段加偏移”的方式。
Intel 80286(1982年)
字长16位,地址总线扩展到24位,可寻址16MB的内存空间。
引入了“保护模式”,但是机制有缺陷。
为保持兼容,保留了8086的工作模式,被称为实模式(实地址模式)。
字长32位:
Intel 80386(1985年)
80x86系列中的第一款32位微处理器。
地址总线扩展到32位,可寻址4GB的内存空间
改进了“保护模式”:(80386及以上的微处理器的主要工作模式,支持多任务,支持设置特权级,可以访问4GB的物理存储空间,引入了虚拟存储器的概念)
增加了“虚拟8086模式”,可以同时模拟多个8086微处理器
字长64位:
AMD Opteron (2003年)
x86扩展到64位的第一款处理器
可以访问高于4GB的存储器
兼容32位x86程序,且不降低性能
3. x86的地址空间
指令指针寄存器IP(Instruction Pointer):
保存一个内存地址,指向当前需要取出的指令。
当CPU从内存中取出一个指令后,IP会自动增加,指向下一指令的地址。
程序员不能直接对IP进行存取操作
转移指令,过程调用与返回等会改变IP的内容。
段寄存器
与处理器中其他寄存器联合生成存储器地址
段寄存器的功能在实模式下和保护模式下是不同的。
DATA SEGMENT ; 数据段
NUM DW 0011101000000111B;
NOTES DB 'The result is :','$'
DATA ENDS ; 数据段结束
STACK SEGMENT ; 堆栈段
STA DB 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS ; 堆栈段结束
CODE SEGMENT ; 代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:
MOV AX, DATA
MOV DS, AX ;为DS赋初值
MOV AX, STACK
MOV SS, AX ;为SS赋初值
MOV AX, TOP
MOV SP, AX ;为SP赋初值
...
CODE ENDS ; 代码段结束
END BEGIN ;模块结束
( 1 ) 代码段寄存器 CS (Code Segment)
保存了代码段(一个存储区域,用以保存微处理器使用的代码)的起始地址 。
用CS:IP指示下一条要执行的指令地址
( 2 ) 数据段寄存器 DS (Data Segment)
保存了数据段(一个存储区域,包含程序所使用的大部分数据)的起始地址。
实模式数据段的长度限制为64KB,保护模式数据段长度限制为4GB。
( 3 )附加段寄存器 ES (Extra Segment)
保存了附加段(附加的数据段,也用于数据的保存,某些串操作指令将附加段作为其目的操作数的存放区域,长度限制与代码段以及数据段相同。)的起始地址。
用ES:DI指示串操作的目的操作数的地址
如果数据存在放在数据段以外的其他段(例如附加段),则应在指令中给出“段跨越前缀”。
如 MOV AX,ES:[3000H] 或 ES:MOV AX,[3000H]
( 4 )堆栈段寄存器 SS (Stack Segment)
用以指示堆栈段的首地址
ESP/SP或EBP/BP指示堆栈栈顶的偏移地址
用SS:SP等组合操作堆栈中的数据
( 5 )新增加的附加段寄存器FS和GS
80386起新增了这两个附加段寄存器
FS和GS的功能和ES相同
增加FS和GS可以减轻ES寄存器的负担,以便程序灵活访问相应的两个附加数据段。
8086的物理地址生成
实例:
直观的存储器分段方法
实现方法:把20位物理地址分为2部分,高4位为段号,用段号寄存器来保存,低16位为段内地址,也称便宜地址。
不足之处:段号寄存器和其他寄存器不兼容,且每个逻辑段固定占用16K字节,浪费存储空间,相比而言8086的分段技术更灵活。
IA-32的存储器寻址
实模式 CS:IP
保护模式:CS:EIP,保护模式下,段基地不在CS中,而是在内存中。
4. x86汇编语言的格式
Intel 和AT&T 格式的区别
Intel 格式
Intel制定,x86相关的文档手册使用该格式
主要应用在MS-DOS和Windows等系统中
AT&T格式
AT&T制定,起源于贝尔实验室研发的Unix
最初用在PDP-11/VAX等机型,后移植到x86
主要应用于Unix和Linux等系统中
- 前缀(后缀):
Intel语法:寄存器和立即数都没有前缀,十六进制、十进制、八进制和二进制立即数后缀分别为h,d,o(q)和b。整数默认为10进制,以字母开头的十六进制数必须加0,字符串常数用单引号括起。实数即为 ()E()
AT&T语法“寄存器使用前缀”%“,立即数使用前缀”$“,十六进制立即数使用前缀0x
- 操作数方向
Intel语法:第一个操作数是目的操作数,第二个操作数是源操作数
AT&T语法:第一个操作数是源操作数,第二个操作数是目的操作数
- 内存单元操作数
Intel语法:基寄存器用[ ]标明
AT&T语法:基寄存器用( )标明
- 间接寻址方法
Intel语法:segreg:[base+index*scale+disp]
AT&T语法:%segreg:disp(base,index,scale)
- 操作码后缀
AT&T语法: 操作码带后缀,以指出操作数的大小
I:32位;w: 16位 ;b:8位
Intel语法:内存单元操作数带前缀,以指出操作数的大小
dword ptr; word ptr ;byte ptr
汇编语言程序
组成
分段结构:按段进行组织,最多由四个段组成(代码,数据 ,附加,堆栈),每个段以“段名 SEGMENT”开始,以“段名 ENDS”结束。
语句行:段由若干语句行组成,语句行的三种类型:指令、伪指令
宏指令。
语句的执行
指令语句的执行:汇编器计算指令语句中表达式的值->汇编器将指令语句翻译成机器指令代码->程序运行时,由CPU按机器指令代码的要求完成各种运算与操作。
伪指令语句的执行:汇编器计算伪指令语句中表达式的值,不产生机器代码,汇编器解释伪指令语句的含义并遵照执行。
数据定义:变量(编程时只能确定其初始值,程序运行期间可修改其值的数据对象称为变量)是存储单元中的数据,可定义在任何段,由伪指令说明符DB、DW、DD等定义
符号定义:常量(编程时已确定其值,程序运行期间不会改变其值)可由伪指令说明符”EQU”或“=”定义,不产生目标代码,不占用存储单元。EQU左边的符号名不可重复定义,但=可以。
段定义:说明符SEGMENT(段开始),ENDS(段结束),ASSUME(指定段寄存器)
指定段内的偏移地址:
“ORG 常数表达式”指定当前可用的存储单元的偏移地址为常数表达式的值。
“EVEN”将当前可用的存储单元的偏移地址调整为最近的偶数值。
示例:
DATA SEGMENT
ORG 1000H
A DB 47H,12H,45H
EVEN
B DB 47H
DATA ENDS
//ORG指令将A的偏移地址部分指定为1000H,从A开始存放3个字节变量,占用地址1000H,1001H和1002H,EVEN指令会将B的偏移地址部分从1003H调整为偶数地址1004H
过程定义:
“过程名 PROC 类型属性名”:从过程名代表的地址开始定义一个过程;“类型属性名”可以选择NEAR(近过程)或FAR(远过程),默认为NEAR
“过程名 ENDP”:表示该过程到此结束,此处的过程名必须与过程开始时PROC左边的过程名相同。