目录
一.指令的组成
二.操作数的寻址方式
1.立即数寻址
2.寄存器寻址方式
3.存储器寻址方式
(1)直接寻址
(2)寄存器间接寻址
(3)寄存器相对寻址方式
(4)基址变址寻址方式(根据基址寄存器判断使用DS还是SS)
(5)相对基址变址寻址方式(根据基址寄存器判断使用DS还是SS)
四、I/O端口寻址
直接端口寻址:
间接端口寻址:
一.指令的组成
汇编语言指令由操作码和操作数两部分组成。
操作码说明指令的功能。即计算机要执行的具体操作,如传送、运算、移位等,它是指令中不可缺少的组成部分。
操作数是指令执行的参与者。即各种操作的对象,有些指令不需要操作数(零地址),有些指令有一个(单地址)或两个操作数(双地址),只有一个操作数的为单操作数,有两个操作数的为双操作数,中间用逗号隔开,逗号左侧的操作数为目的操作数,逗号右侧的操作数为源操作数
指令格式:
操作码 | 目的操作数(dst) | 源操作数(src) |
二.操作数的寻址方式
要执行指令,就要找到指令中的操作数,有的操作数直接出现在指令中,有的操作数存放在CPU的寄存器中,用寄存器的名称指示,有的操作数存放在主存中,用主存的地址指示,所以,要找到指令中的操作数,就要找到存放操作数的地址,寻找指令中的操作地址的方式叫寻址方式。
寻址方式的种类:立即数寻址方式、寄存器寻址方式、存储器寻址方式
1.立即数寻址
(1)概述
操作数是以字节(或字)的形式紧跟在指令操作码之后,作为指令的一部分,与操作码一起存放在存储器的代码段(CS)中。执行时和指令一起被取出到指令队列中,必须执行寻找操作数的总线周期,所以这种寻址执行速度较快。立即寻址方式常用与CPU中的CPU中的寄存器或存储单元赋值。立即数只能用作源操作数(逗号的后面),不能作为目的操作数。
立即数可以是无符号或带符号数,其数值应在可取值范围内
操作数作为指令的一部分存放在操作码之后的主存单元中
(2)占用内存
MOV AL,5
MOV占用一个字节,AL是CPU中的寄存器,在内存空间不占单元,后面的5占用一个空间,这条指令占了2个字节(16位=1个字)
(3)举例:
立即数的类型(字节、字)由前面寄存器(8位、16位)的长度来决定
字符用的是它的ASCII码值带H是16进制
MOV AL,50 | AL = 50 字节= 32H | 将立即数32H送8位寄存器AL |
MOV AX,50 | AX = 50字 | |
MOV BX,1234H | BX = 1234H | 将16位立即数1234H送16位寄存器AX |
MOV DL,'A' | DL = 41H | |
MOV DX,'A' | DX = 41H | |
MOV DX,'AB' | DX = 4142H |
2.寄存器寻址方式
操作数存放在CPU的寄存器中,寄存器可以是16位,也可以是8位寄存器。这种寻址方式的操作数就存放在CPU的内部的寄存器中,不用执行寻找操作数的总线周期,执行速度最快。
3.存储器寻址方式
EA:有效地址(就是前面说的偏移地址)
PA:物理地址
存储器的寻址的操作数存放在存储器中,是除代码段之外的数据段、附加段和堆栈段中的数据(内存数据),在这种寻址方式中,指令给出的是存放该操作数的存储单元的地址或产生该存储单元地址的表达式。CPU执行指令时,首先根据操作数字段提供的地址信息由执行单元(EU)计算出有效地址(EA),有效地址是一个无符号的16位二进制数,再由总线接口单元(BIU)根据物理地址公式:
“PA = 段首地址 * 10H + 有效地址”计算出物理地址,然后到物理地址对应的内存单元取出操作数,执行对该数的操作。
存储器寻址方式根据计算有效地址EA方法的不同分为以下5种:
都要用到【】,里面的内容就是有效地址。
(1)直接寻址
这种寻址方式是从存储器种寻找操作数最简单的一种,指令中直接给出的是该操作数在存储器中的有效地址(EA)。默认的段地址DS,可用段超越前缀改变。
其物理地址为:
PA = 段首地址 * 10H + EA(段首地址默认使用DS段寄存器)
例如:
MOV AX,[2000H]
指令中有效地址EA为2000H,设存储单元的内容为1234H,则指令将1234H传送到AX中。
若操作数默认在数据段,若操作数没在数据段,则应在指令中使用段超越前缀,指明使用的数据在哪一个段。
MOV AX,ES:【2000H】
将该指令的物理地址为 PA = ES * 10H + 2000H的存储单元的值送AX。
(2)寄存器间接寻址
操作数的有效地址由指令中指定的寄存器BX、BP、SI、DI的内容确定,这种寻址方式可分为下面两种情况,也可以使用段超越前缀改变。
只有SI、DI、BX、BP可作为间址寄存器。
例:MOV AX,【BX】
设DS = 2000H,EA = BX = 1000H,则源操作数的物理地址为:
PA = 2000H * 10H + 1000H = 21000H这条指令执行的结果是把内存单元21000H中的数据传送AX寄存器中
(3)寄存器相对寻址方式
这种寻址方式的操作数存放在存储器的内存单元中,是以基址寄存器(BX或BP)变址寄存器(SI或DI)的内容为基地址,然后在这个地址的基础上加上8位或16位的位移量Disp,形成真正操作数的有效地址EA。可用段超越前缀改变
当寄存器为BX、SI、DI时,用段寄存器DS的内容作为段基地址,则:
有效地址EA = BX/SI/DI + Disp8/Disp16
物理地址PA = DS * 10H + EA
当寄存器为BP,则段寄存器SS的内容作为段首地址,则
有效地址EA = BP + Disp8/Disp16
物理地址PA = SS * 10H + EA
例: MOV DI,【BX + 2】;或写成 MOV DI,2【BX】
例如:已知DS = 1000H,SS = 1000H,SI = 3000H,BP = 2000H,(12006H) = 9678H,(13006H) = 1234H,执行指令后,求AX = ? MOV AX,【BP + 6】
| MOV AX,06H【SI】
|
(4)基址变址寻址方式(根据基址寄存器判断使用DS还是SS)
操作数存放在内存单元中,其偏移地址是基址寄存器的内容加上变址寄存器的内容之和,若基址寄存器为BX,则断寄存器为DS,若基址寄存器为BP,则段寄存器为SS。(如果两个基址或者两个变址相加则错误,基址变址寄存器分别只能用一个)
有效地址:EA = BX/BP + SI/DI
物理地址:PA = DS * 10H + EA 或 SS * 10H + EA
例:MOV DS,【BP】【SI】
例如:已知DS = 1000H,SS = 2000H,SI = 6,BX = 2000H,BP = 1000H,(12006H) = 9678H,(21006H) = 1234H,(11006H) = 89ABH,执行指令后,求AX = ? MOV AX,【BX + SI】
| MOV AX,【BP + SI】
|
(5)相对基址变址寻址方式(根据基址寄存器判断使用DS还是SS)
操作数存放在内存单元中,其有效地址由指令指定的基址寄存器加变址寄存器的内容在加上指令的8位或者16位偏移量Disp得到。(BX默认是DS,BP默认是SS)
物理地址 PA = DS * 10H + EA(BX + SI/DI + Disp)
或 PA = SS * 10H + EA(BP+ SI/DI + Disp)
例如:已知DS = 1000H,DI = 1000H,BX = 1000H,(12006H) = 5678H,执行指令后,AX = ?
MOV AX,【BX + DI + 6】 == MOV AX,6【BX + DI】 == MOV AX,6【BX】【DI】
四、I/O端口寻址
寻找输入输出设备的端口地址,可分为直接端口寻址和间接端口寻址。
直接端口寻址:
由指令直接给出I/O设备的端口地址。它规定的端口地址为8位,能寻址256个端口。
例如:IN AL,20H ;将地址为20H的外设内容读入AL中
间接端口寻址:
由DX给出I/O设备的端口地址。由于DX是16位,因此间接端口寻址能寻址多达64K个端口。
例如:OUT DX,AL ;AL中的内容输出给以DX的内容为地址的外设