微机原理学习笔记(四)
总结:这周讲了指令的基本概念,指令格式,汇编语言格式以及8086寻址方式中的数据寻址方式的各种方法。数据寻址方式就是形成操作数地址的方法,包括立即寻址(操作数直接给出),寄存器寻址(操作数在CPU内部的通用寄存器中)和存储器寻址(操作数存放在内存储器中)。到目前为止汇编语言的帷幕算是正式拉开。
第四章 寻址方式与指令系统
4.1.1 指令的基本概念
程序:能够完成一个完整任务的一系列有序的指令的集合。
指令:计算机进行某种操作的命令,用户使用与控制计算机运行的最小功能单位。
指令系统:一台计算机所能执行的全部指令的集合。
系列计算机:基本指令系统相同,基本体系结构相同的一系列计算机。
机器指令/指令字:二进制编码的指令。
汇编指令:用助记符来代替二进制指令。
汇编程序:将汇编指令翻译成计算机能够识别的机器指令。
4.1.2 指令格式
机器指令通常由操作码字段和操作数字段组成:
操作码 | 操作数 | ... ... | 操作数 |
操作码:规定指令所执行的操作。
操作数/地址码:可能直接给出参与运算的操作数,也可能是描述操作数地址的信息。
指令字长度:一个指令字中包含二进制代码的位数。
机器字长:计算机能直接处理的二进制数据的位数。
单字长指令:指令字长度等于机器字长的指令。
半字长指令:指令字长度等于半个机器字长度的指令。
等长指令字结构:各种指令字长度是相等的。
变字长指令字结构:指令字长度随指令功能而异。
4.1.3 8086汇编语言格式
8086指令的一般格式为:
标号:操作码 操作数;注释
标号:该指令在代码段中的偏移地址。
1.双操作数指令
大多数指令需要两个操作数,分别称为源操作数和目标操作数。
操作码 DST,SRC
例如:
ADD AX,BX; ==> AX+BX->AX
注意:对于双操作数指令,必须有一个操作数存在寄存器中,不能两个数同为存储器操作数。(除了串操作指令)
2.单操作数指令
指令中只给出一个操作数。
操作码 DST
例如:
INC AX; ==> AX+1->AX
MUL
3.无操作数指令
指令中不给出操作数的地址。
操作码 例如: HLT; ==> 停机指令 XLTA
4.2 8086寻址方式
寻址方式:形成指令地址或操作数地址的方式。
4.2.1 数据寻址方式
1.立即寻址
立即寻址:指令的操作数(地址码)字段直接给出操作数本身。
立即数:上述操作数。
MOV AX, 251 ;将十进制数251送入寄存器AX,251是立即数 MOV AL, '5' ;将‘5’的ASCII码送入寄存器AL,‘5’是立即数
注意:立即寻址不能用于单操作数指令;在双操作数指令中,立即数只能用于源操作数(后面的),不能用于目标操作数(前面的)。
2.寄存器寻址
寄存器寻址:操作数在CPU内部的通用寄存器中,指令中指定寄存器名。
源操作数和目的操作数可使用以下寄存器:
16位通用寄存器:AX、BX、CX、DX、SI、DI、BX、BP
8位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL
段寄存器:CS、DS、SS、ES
FLAGS标志寄存器
注意:不能同时为段寄存器
目的操作数不能是代码段寄存器
MOV AX,CX ;将16位寄存器CX中的内容送入寄存器AX
3.存储器寻址
注意:既可用于源操作数,也可用于目的操作数,但两者不能同时使用。
操作数存放在存储器中时采用存储器寻址,段寄存器提供了段地址。
位移量(DISP):指令地址码字段给出的地址。
有效地址(EA):从指令地址码部分计算求得的地址。
1)直接寻址
操作数的有效地址由指令地址码字段直接给出。
以下指令等效:
MOV AL,TABLE ;用TABLE表示1000H
MOV AL,[TABLE]
MOV AL, [1000H]
直接寻址默认段寄存器为DS。
若要访问其他段中的数据,必须在指令中用段跨越前缀指出段寄存器名。
以下指令等效:
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]
2)寄存器间接寻址
寄存器间接寻址:操作数在内存中,操作数的有效地址被放在一个寄存器中,寄存器由指令地址码字段指定,可以使用基值寄存器BX、BP或变址寄存器SI、DI。
注意:如果指令中指定的寄存器是BX、XI、DI,则操作数默认在数据段中,取DS寄存器的值作为操作数的段基地址;如果指定寄存器是BP,则操作数默认在堆栈段中,取SS寄存器的值作为操作数的段基地址。
MOV AX,[BX] ;物理地址=DS*10H+BX MOV AL,[BP] ;物理地址=SS*10H+BP MOV AX,ES:[DI] ;物理地址=ES*10H+DI
3)寄存器相对寻址
寄存器相对寻址:操作数在内存中,操作数的有效地址为基址或变址寄存器与一个位移量之和(或差)。寄存器和位移量均在指令地址码字段指定。
MOV AX,20H[SI] ;物理地址=DS*10H+SI+20H MOV CL,[BP+2000H] ;物理地址=SS*10H+BP+2000H MOV AX,STR[BX]
4)基址加变址寻址
基址加变址寻址:操作数在内存中,操作数的有效地址是两个两个指定寄存器的值之和。
MOV AX,[BX][SI] ;物理地址=DS*10H +BX+SI
MOV AX,[BX+SI] ;物理地址=DS*10H +BX+SI
5)相对基址加变址寻址
相对基址加变址寻址:操作数在存储器中,存储单元的有效地址为一个基址寄存器、一个变址寄存器的内容及指令中指定的8位或16位位移量的和。
以下指令等价:
MOV AL,TABLE[BX][SI] MOV AL,TABLE[BX+SI] MOV AL,[TABLE+BX+SI]
4.I/O端口寻址
1)I/O端口直接寻址
端口地址以8位立即数方式在指令中直接给出,它所寻址的端口号范围为0~255.
IN AL,n ;将8位立即数作为端口号寻址,将该端口地址的字节操作数输入到AL寄存器
2)间接端口寻址
将16位的I/O端口地址放在DX寄存器中,即通过DX间接寻址,故可寻址端口号范围为0~65535。
OUT DX,AL ;将AL的字节内容输出到由DX指定的端口中。