微机原理学习笔记(四)

总结:这周讲了指令的基本概念,指令格式,汇编语言格式以及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指定的端口中。

 

posted @ 2020-10-11 21:21  莓道理  阅读(979)  评论(0编辑  收藏  举报