文章目录
机器语言
- 机器指令是指挥计算机完成某个基本操作的命令
- 机器指令的一般形式为:操作码 + 地址码
- 操作码和地址码均是由 0 和 1 组成的二进制代码
- 操作码指出了操作的种类, 如加、减、传送、移位等
- 地址码指出了参与运算的操作数和运算结果存放的位置
一个简单的机器语言程序
将偏移地址为 1000H 的字存储单元中的内容加 3000H , 再送回到原存储单元中去
1 0 0 0 0 0 0 1
0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0
每台计算机都有一些基本指令,这些指令的集合即为该计算机的指令系统,也称为机器语言,用机器语言编写的程序称为机器语言程序
汇编语言
- 机器语言是二进制的,编写、调试、阅读、维护都很困难,所以出现了汇编语言
- 汇编语言用助记符表示机器指令的操作码,用变量代替操作数的存放地址,在指令前冠以标号,用来代表该指令的存放地址等
- 这种用符号书写的、其主要操作与机器指令基本上一一对应的、并遵循一定语法规则的计算机语言就是汇编语言
- 用汇编语言编写的程序称为汇编源程序
- 指令助记符、语句标号、数据变量、伪指令及它们的使用规则构成了整个汇编语言的内容
将刚才的例子改用汇编语言写
操作码:加 | 操作数类型 | 目的操作数 | 源操作数 |
---|---|---|---|
ADD | WORD PTR | DS:[1000H] | 3000H |
汇编程序
- 汇编源程序经过翻译转换,生成的机器语言程序称为目标程序
- 把汇编源程序翻译成目标程序的语言加工程序称为汇编程序
- 汇编程序进行翻译的过程叫做汇编
伪指令
- 为了能让汇编程序准确地完成翻译工作,就要求汇编源代码中有一套命令去告诉汇编程序如何进行汇编工作
- 这种命令称伪指令(或称汇编控制命令)
宏汇编程序
- 为了简化程序的编写, 提高编程效率, 现代的计算机系统一般都提供了宏汇编程序
- 它允许程序员用一个名字(宏指令名)来代替程序中重复出现的一组语句, 然后在源程序中所需要的地方使用宏指令名字及不同的参数进行宏调用
80X86微处理器结构
总线接口部件
CPU与外界(外设、存储器等)打交道的接口,能接受所有的总线操作请求,利用本身的资源为这些请求服务
执行部件
- 执行机器指令,负责从译码指令队列中取出指令并执行
- 执行部件主要由寄存器组、标志寄存器、算逻部件、控制部件等组成
寄存器组
- 寄存器组中含有8个32位的寄存器, 这些寄存器属于CPU内的存储器, 也称通用寄存器
- 按其用途可将它们分成两组:数据寄存器组和指示器变址寄存器组
数据寄存器组
- 主要用来保存操作数、运算结果或作指示器、变址寄存器等
寄存器名 | 累加器 | 基址寄存器 | 计数寄存器 | 数据寄存器 |
---|---|---|---|---|
32位 | EAX | EBX | ECX | EDX |
16位 | AX | BX | CX | DX |
8位 | AH,AL | BH,BL | CH,CL | DH,DL |
指示器变址寄存器组
寄存器名 | 堆栈指示器 | 堆栈基址寄存器 | 源变址寄址器 | 目的变址寄存器 |
---|---|---|---|---|
32位 | ESP | EBP | ESI | EDI |
16位 | SP | BP | SI | DI |
- ESP : 当前堆栈段中栈顶的偏移地址
- EBP : 对堆栈操作的基址寄存器,存放的是该段中某一存储单元的偏移地址
- ESI/EDI : 源操作数和目的操作数的偏移地址
指令预取部件、译码部件
- 预取部件把将要执行的指令从主存中取出, 送入预取指令队列中
- 译码部件从预取指令队列中读出指令并译码, 再送入译码指令队列排队供执行部件使用
指令指示器EIP
- 保存着下一条将要被CPU执行的指令,相对于代码段的偏移地址
- IP/EIP的内容由微处理器硬件自动设置, 不能供程序直接访问,
分段部件、分页部件
- 帮助实现虚拟地址空间到物理地址空间的映射
- 分段部件用于将各段二维的逻辑地址转换为一维的线性地址, 从而完成从虚拟空间到线性空间的转换
- 分页部件则主要用于物理存储器的管理
- 分段部件有6个16位的段寄存器
代码段寄存器 | 堆栈段寄存器 | 数据段寄存器 | 附加数据段寄存器 |
---|---|---|---|
CS | SS | DS | ES FS GS |
三种工作方式
实地址方式、保护方式、虚拟8086方式
主储存器
- 用来存放程序和数据
- 一个计算机系统的存储系统由主存和辅助存储器组成
- 按8位(1个字节)进行编址
- 对于字,双字等类型,高位数据放高地址,低位数据放低地址
堆栈
- 先进后出
- 16位段的栈时,自动使用SP,32位段自动使用ESP
- ESP/SP移动的字节数,取决于操作数的大小,子类型移动2,双字移动4
PUSH OPS
- 将源操作数压栈,系统自动确定操作数类型
- 源操作数可以是立即数,寄存器,段寄存器,存储器
POD OPD
- 栈顶元素出栈,送到目的操作数
- 目的操作数可以是寄存器,存储器,段寄存器(CS除外)
PUSHA
- 将8个16位寄存器按AX、CX、DX、BX、SP、BP、SI、DI顺序入栈保存
- 压入堆栈的SP值是执行PUSHA之前的值
PUSHAD
- 将8个32位寄存器按EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI顺序入栈保存
- 压入堆栈的ESP值是执行PUSHAD之前的值
POPA
- 8个16位寄存器出栈
POPAD
- 8个32位寄存器出栈
实方式物理地址
- 段首地址:偏移地址,称为二维的逻辑地址,用以表示某段中的某个地址单元
- CPU 可访问6个段:CS, SS, DS, ES, FS, GS
- EIP/IP 是CS段下一次执行指令的偏移地址
- ESP/IP 是SS段中栈顶的偏移地址
保护方式物理地址
特权级
保护方式下有4个特权级:
- 0级:操作系统内核
- 1级:操作系统服务程序
- 2级:系统扩展程序
- 3级:应用程序
每一个段,都有对应的特权级,当前执行的代码段,对应的特权级,就是当前特权级
被访问段的特权级,不能高于当前特权级
描述符
段按作用分类:
- 存储段:保存可访问数据和程序
- 系统段:实现存储管理机制
- 控制段:用于控制系统任务切换、特权变换、中断异常处理
描述符的定义:用4个字,来描述段的所有信息
描述符的对应分类:
存储段描述符、系统段描述符、控制段描述符
描述符表
描述符表是描述符的集合,分类如下:
- 局部描述符表:每一个程序,对应一个局部描述符表(LDT),包含该程序所有段的描述符
- 全局描述符表:只有一个,包含各任务共享段的描述符
- 中断描述符表:含有指向中断服务程序的描述符
段选择符和描述符寄存器
段寄存器的内容称为段选择符,可以用描述符表中选择相应的描述符
为了得到物理地址,必须将虚拟存储空间映射到物理空间,这个过程,就是根据段选择符,到对应的LDT或者GDT中查找对应的描述符,CPU把所有段选择符对应的描述符,装入描述符高速缓冲寄存器,提高查找速度
保护方式物理地址形成
- 根据段寄存器中的段选择符,在描述符高速缓冲寄存器中,查找对应的描述符
- 从高速缓冲寄存器中取出段基址,与偏移地址相加,得到32位线性地址
- 如果有分页部件,还需要经过分页部件的映射
数据在计算机内的表示形式
定点数、浮点数、BCD码、ASCII码
BCD码
- 压缩过的:利用4位二进制数,表示一个10进制数
- 未压缩的:利用8位二进制数,表示一个10进制数,高4位无效,可以压缩
标志寄存器
常用的标志位
- 符号标志SF:运算结果最高位为1,则SF=1
- 零标志ZF:运算结果为0,则ZF=1
- 溢出标志OF:上溢或者下溢,则OF=1
- 进位标志CF:最高位产生进位、借位的情况,CF=1
- 辅助进位标志AF:做字节运算时,低半字节向高半字节 进位与借位,AF=1,主要用于BCD码的运算
- 奇偶标志PF:运算结果最低字节中,1的个数为偶数,PF=1,用于检测传输错误
- 方向标志DF:串操作指令中,对字符串进行正向处理DF=0,反向处理DF=1
- 中断允许标志IF:允许开中断时,IF=1
操作指令
- LAHF:将EFLAGS的低8位,送入AH中
- SAHF:将AH中的内容,送入EFLAGS的低8位
- PUSHFD:32位EFLAGS入栈
- POPFD:32位EFLAGS出栈
进位与溢出
进位的条件
最典型的是:正数+负数=正数
另外很多情况下,均能产生进位,进位不是错误,溢出才是
溢出的条件
- 正数 + 正数 = 负数
- 负数 + 负数 = 正数