文章目录
- 一、8086/8088 16位微处理器内部结构
- 二、汇编指令集
- 指令概述
- 1、指令
- 2、指令的分类
- 3、指令的组成
- 4、指令的存放
- 标志寄存器
- 1、C标志——进位/借位标志
- 2、A标志——辅助进位/辅助进位标志
- 3、S标志——符号标志
- 4、Z标志——零标志
- 5、P标志——奇偶标志
- 6、O标志——溢出标志
- **操作数寻址方式
- 1、操作数的分类
- 2、立即寻址方式
- 3、寄存器寻址
- 4、存储器操作数寻址方式
- 4.1直接寻址
- 4.2寄存器间接寻址
- 4.3基址寻址
- 4.4变址寻址
- 4.6 基址+变址寻址
- 5、寻址方式总结
- 6、寻址方式总结续:
前言:在开始之前,先了解一些寄存器、cpu内部结构等等。
一、8086/8088 16位微处理器内部结构
这里我们仅需了解它们的基本就够用了;
-
AX、BX、CX、DX
:16位寄存器(一个内存单元是8位,即为一个字节),EAX,EBX,ECX,EDX:这些是32位寄存器,不是很常用。 -
其中以
‘H’
结尾的,是高八位,而以‘L’
结尾是低八位。这里大家可能不好理解,我举个列子,二进制数:1110 1100 1000 0000
,前面八位即可用H
结尾的寄存器表示,后八位也就不言而喻了。
注意:有个规则,二进制数,从左到右,位制依次降低,即为左面高,右面低。 -
SP:堆栈指针寄存器
BP:基址指针寄存器
DI:目地变址寄存器
SI:源变址寄存器
这四个寄存器,在后面的寻址方式会用到。 -
CS: (code section)代码段 ,用于存放代码段的段基址
DS:(data section)数据段
SS:堆栈段寄存器
ES:附加段寄存器
IP:指令指针寄存器,内存中存放的是下一条指令的地址。
二、汇编指令集
指令概述
1、指令
定义:指令位CPU基本的单位,每条指令执行一个特定的操作,可以理解为:指令通知CPU执行某种操作的“命令”。
2、指令的分类
-
机器指令:二进制格式编码的序列(由0,1代码书写)
注意: 硬件只能识别,存储,运行机器指令。 -
符号指令:用字符串形式的序列(包含字符串形式的操作码以及操作数助记符)表示。
-
这里的符号指令,将是我后面所会讲道德汇编指令。
我们来看几个实例:
3、指令的组成
格式:
标号: | 操作码助记符 | 空格 | 操作数助记符 | ;注释 |
---|
如:NEXT: ADD AX,BX ;AX+BX------>AX
- 操作码:计算机要执行的操作,如加减乘除;
- 操作数:执行操作过程中所要操作的数,如,执行加法的两个加数,很类似高级语言里面的变量,但这里,操作数有范围显示。
**注:**多字节指令占用连续的内存单元,存放指令第一字节的内存单元地址,成为“指令地址”。
4、指令的存放
首先存放操作码,然后存放操作数,多字节操作数是连续存放的,顺序依据小端法规则,即:低位字节存放在低地址单元,高位字节存放在高地址单元。
标志寄存器
说明一下:这些每一位数字用字母如何表示?
1 1 1 1 0 0 0 0
D7 D6 D5 D4 D3 D2 D1 D0
一 一对应
1、C标志——进位/借位标志
这里书上的表述过于复杂,我来简述一下;
如有两个八位二进制的数相加,当第八位上面的数大于1时候,就要进位,因为这里是二进制数,最高为1,当大于1时就要进位,那么此时C=1,没有进位C=0。
2、A标志——辅助进位/辅助进位标志
判断 字、字节、双字加/减,D3产生进位/借位时,A=1,否则A=0;
3、S标志——符号标志
用于判断最高位的数字是多少,当数运算后,若结果的最高位为1,则S=1,否则为0.
4、Z标志——零标志
运算结果全为0时,Z=1;反之,Z=0。
5、P标志——奇偶标志
运算结果低八位里面,若“1”的个数为偶数个,则P=1,否则为0;
6、O标志——溢出标志
我来教大家一个简便的方法,就看最高位,两个数运算时,第一个数最高位为1,第二个数最高位是1,最后运算出,结果的最高位为0,此时O=1;
还有一种情况就是第一个数最高位为0,第二个数最高位是0,最后运算出,结果的最高位为1,此时也O=1;
简记:110/001
**操作数寻址方式
(此单元非常非常非常之重要!!)
寻址方式:通俗的来讲,就是通知CPU本条指令的操作数在哪儿?或者说用什么方式才能得到操作数。
1、操作数的分类
- 操作数包含在指令中,这种操作数称为立即数。
- 操作数存放在cpu的某个寄存器里,这种操作数成为寄存器操作数。
- 操作数存放在存储器中,这种被称为存储器操作数。
- 操作数存放在I/O端口中,这种操作数称为I/O端口操作数。
前三两种较为常用。
注意:
立即 寻址方式:获得立即数;
寄存器 寻址方式:获得寄存器操作数;
存储器 寻址方式 :获得内存操作数。
2、立即寻址方式
立即寻址方式,所提供的操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在代码段区域中,立即数可以是8、16、32位。
操作数是指令一部分,当去取这条指令时,也就获得了操作数。
3、寄存器寻址
操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称。
如:
MOV AX,BX ;BX内容赋值给AX
INC SI ;SI+1---->(这里执行增量操作,每次加一的操作)
DEC DI ;这里做减量操作,每次做减一的行为
例子:MOV DX,AX
4、存储器操作数寻址方式
在本类里面,所有给出的地址都是偏移地址。
- 在读写内存操作数之前,CPU必须知道相关存储单元的物理地址。
- 由于CPU对存储器采用分段管理,因此指令格式中只能写出存放操作数的内存单元的“逻辑地址”。
- 程序员的责任仅在于正确的书写逻辑地址表达式,然后由CPU自动运算以求出物理地址。
注意:存储器寻址是在内存中寻址,必然要先知道该操作数所放在的位置地址,然后根据根据这个地址来寻找,区别于前两种,这里的寻址格式,在操作数位置是逻辑地址,格式如下:段寄存器:[偏移地址]
4.1直接寻址
(1)地址表达式的格式1:段寄存器:[偏移地址]
如:
MOV AL,ES:[2CH]
从ES附加段偏移地址位2CH的单元取数,赋值给AL
MOV AX DS:[2000H]
从数据段偏移地址为2000H的单元取值赋给AX
看一个例子:
看到[1234H],我们需要想到几点,第一点,该操作数在内存里面,第二点,方括号里面是偏移地址(逻辑地址),而不是物理地址(段基址+偏移地址)。
(2)地址表达式的格式2:段寄存器:变量名
-----用变量名代表存储单元的有效地址
说明:
- 格式一很少使用,因为程序员不知道某单元的偏移地址
- 汇编语言允许为某单元起一个“名字”,这个名字就称该单元的“变量名”,经过汇编之后,变量名有段基址和偏移量两种属性。
- 变量名是唯一的,程序中不能有重复的变量名。
看个题目:设数据段XX字节单元的内容为11H,ES附加段YY字单元的内容为2233H
MOV AL,DS:XX
或 MOV AL,XX ;取XX字节单元内容赋值给AL,此时AL=11H
MOV AX,ES:YY
或 MOV AX,YY ;取ES附加段YY字节单元的内容2233H赋值给AX
思考:大家想一想,如果在这里,我把AX改成AH/AL呢,那么答案是什么?
显然,AH表示数值高八位,在这里即为22H,AL则表示低八位,在这里即为33H.
4.2寄存器间接寻址
寄存器间接寻址,又称间接寻址,间址。
注意,操作数在内存单元,而该单元的段基址在段寄存器里,偏移地址却在间接寄存器里面。
(1)间接寻址的地址表达式
段寄存器:[间接寄存器]
注:某单元的物理地址=段寄存器内容(段基址)*16+间接寄存器(偏移地址)
(2)格式可以省略段寄存器。
例子1:
例子2:
设数据段BUF字节单元的内容为55H,取出该数给AL;思考一下,应该怎么编写?答案在图片下面
解1:
MOV DS,数据段段基址
MOV BX,BUF单元的偏移地址
MOV AL,DS:[BX] ;AL=55H,这里DS可省
解2:
MOV DS,数据段段基址
MOV BP,BUF单元的偏移地址
MOV AL,DS:[BP] ;AL=55H,这里DS不能省略,因为BP是堆栈段,与BUF不在一个位置
解3:
采用直接寻址。BUF为变量名
MOV DS,数据段段基址
MOV AL,BUF
约定规则:
4.3基址寻址
该寻址方式的偏移地址一部分是由基址寄存器,另一部分则为常量构成。
(1)地址表达式格式:
段寄存器:[基址寄存器+位移量]
(2)这里的段寄存器依然可以省略。
先看一个约定:
例子一:
例子二:
设数据段BUF单元依次有:78H\56H\34H\12H
MOV DS,数据段段基址
MOV BX,BUF单元偏移地址
MOV DH,[BX+1] ;DH=56H
MOV DX,[BX+2] ;DX=1234H
4.4变址寻址
地址表达式格式:
段寄存器:[比例因子*变址寄存器+位移量]
先看个约定:
例子1:
4.6 基址+变址寻址
存储单元的偏移地址有三部的组成:
(1)地址表达式格式:
段寄存器:[基址寄存器+比例因子*变址寄存器+位移量]
段寄存器可以省略
例子:
5、寻址方式总结
- 指令中的操作数有4种:立即数,寄存器数,内存操作数和I/O端口操作数。
- 访问立即数叫做立即寻址方式,访问寄存器操作数叫做寄存器寻址方式。
- 访问内存操作数有五种寻址方式:
直接寻址、间接寻址、基址寻址、变址寻址、基址+变址寻址。