《汇编语言第3章剖析》由会员分享,可在线阅读,更多相关《汇编语言第3章剖析(107页珍藏版)》请在金锄头文库上搜索。
1、1,第三章 Intel 8086/8088的寻址方式与指令系统,3.1 寻址方式,一条指令通常由两大部分构成:,操作码部分:表示该指令应完成的具体操作,如加法、减法、乘法、移位等等。在汇编语言中使用一定的符号来表示,称为助记符。如ADD 、PUSH、POP、MOV等等。,操作数部分: 表示该指令的操作对象。如移位操作的被移位数,加法操作的加数等等。它可以是一个操作数,也可以是多个操作数。这取决于操作码部分的具体需要。,寻找指令中所需操作数的各种方法叫寻址方式,2,Intel 8086/8088 CPU各指令中操作数的来源有以下四种:,(4)输入/输出端口操作数操作数在输入/输出接口的寄存器中。
2、,(1)立即数操作数操作数在指令代码中提供,(2)寄存器操作数操作数在CPU的通用寄存器或段寄存器中,(3)存储器操作数操作数在内存的存储单元中,3,1.立即数寻址,立即数寻址方式的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数。,立即数可以是8位,也可以是16位。,4,5,2.寄存器寻址,寄存器寻址方式是指指令中所需的操作数在CPU的某个寄存器中。寄存器可以是8位或16位通用寄存器,或者是段寄存器。如:AH、AL、AX、CX、DS、ES等。,例如:MOV AX, BX MOV DS, AX,由于存取寄存器操作数完全在CPU内部进行,不需要总线周期,所以执行速度很快。,6,前面介
3、绍了立即数寻址方式以及寄存器寻址方式。 后面介绍的几种寻址方式其操作数都是在存储器中,因此它们的主要区别就是操作数在内存中存放地址的形成方法不同。,7,有效地址EA是以下三个地址分量的几种组合,由CPU的执行单元EU计算出来的。,(1)位移量:位移量是指令中直接给出的一个8位或16位数。一般源程序中以操作数名字(变量名或标号)的形式出现。,(2)基址:由基址寄存器BX或基址指针BP提供的内容。,(3)变址:由源变址寄存器SI或目的变址寄存器DI提供内容,8,9,3.直接寻址,在直接寻址方式的指令中,操作数的有效地址EA只有位移量地址分量。,10,在汇编语言源程序中,直接寻址方式用符号或常数来表
4、示。,(1)用符号表示,例:MOV BX, VAR,它表示将数据段中,偏移了(OFFSET VAR)个字节距离的字单元内容送到寄存器BX中。,它表示将数据段偏移了OFFSET DATA+2的字节单元内容送入AL中。,MOV AL, DATA+2,(2)用常数表示,它表示从当前数据段开始,偏移100个字节的字单元内容送到AX中。不能写为:MOV AX, 64H,例:MOV AX, DS:64H,注意:用常数表示时,必须用方括号括起来,并且指明段前缀。,=MOV BX, DS:VAR,= MOV AL, DS: DATA+2,11,4.寄存器间接寻址,操作数有效地址EA直接从基址寄存器(BX或BP
5、)或变址寄存器(SI或DI)中获得。,OR,OR,OR,BX,DI,BP,SI,12,指示存储器所在段的段寄存器可以省略,当指令中使用的是BP寄存器,则隐含表示使用SS段寄存器,其余情况则隐含使用DS段寄存器。,寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX、BP、SI或DI)中,这些寄存器就如同一个地址指针。,在程序运行期间,只要对寄存器内容进行修改,就可以实现用同一条指令实现对不同存储单元进行操作。,寄存器间接寻址特点,13,5.基址寻址和变址寻址,操作数的有效地址EA等于基地址分量或变址分量加上指令中给出的位移量。,指令中使用BX或BP时为基址寻址。 指令中使用SI或DI时为变址寻
6、址。,14,这两种寻址方式只需通过改变寄存器的内容就可用一条指令访问不同的存储单元,并且由于增加了一个位移量分量,因此它们能够很方便地访问数组和表格数据。,段寄存器的隐含使用规则与寄存器间接寻址方式相同,由于这两种寻址方式中寄存器中的内容是相对于由位移量指定的初始单元。因此也叫寄存器相对寻址。,15,6.基址变址寻址,操作数的有效地址是三个地址分量之和,即:,EA=基址+变址+位移量,当基址选用BX时隐含使用段寄存器DS,而选用BP时则隐含使用段寄存器SS。,16,例如:MOV CX, TABLEBXDI MOV 100HBPDI, AX,下面的用法是错误的。,MOV AX, ARRAYBXB
7、P MOV AX, TABLESIDI,在基址变址寻址方式中,程序运行期间有两个地址分量可以修改。因此它是最灵活的一种寻址方式,可以方便地对二维数组进行访问。,17,存储器操作数寻址方式中地址形成小结,寄存器间接寻址,基址变址寻址,基址(变址)寻址,SI,DI,BX,BP,BX,BP,SI,DI,EA,直接寻址,位移量,EU,18,7.串操作寻址方式,8086/8088设置有专门用于串操作的指令,这些指令的操作数虽然也在存储器中,但它们不使用前面介绍的各种寻址方式,而隐含地使用变址寄存器SI和DI专门指示。,在寻找源操作数时,隐含使用SI作为地址指针。 在寻找目的串时,隐含使用DI作为地址指针
8、。 在串操作完成之后,自动对SI和DI进行修改,使它们指向下一个操作数。,19,在计算机系统,对I/O端口的寻址方式有以下两种方法。,存储器编址方法,特点: 程序设计灵活,但需要占用存储地址空间。,将I/O端口视为存储器的一个单元,对端口的访问就如同访问存储单元一样。访问存储器的指令和各种寻址方式同样适用对I/O端口的访问。,I/O端口编址方法,I/O端口的地址与存储器地址分开,并使用专门的输入指令和输出指令。,8086/8088系统中就是采用的这种方式。可以最多访问64K个字节端口或32K个字端口,用专门的IN指令和OUT指令访问。寻址方式有如下两种。,8. I/O端口寻址,20,(1) 直
9、接端口寻址,在指令中直接给出端口地址,端口地址一般采用2位十六进制数,也可以用符号表示。,直接端口寻址可访问的端口数为0255个。,例如:IN AL,25H,(2)寄存器间接端口寻址,如果访问的端口地址值大于255,则必须用I/O端口的间接寻址方式。,寄存器间接寻址:把I/O端口的地址先送到DX中,用DX作间接寻址寄存器。,例如:MOV DX,378H OUT DX,AL,21,3.2 指令系统,一种计算机所能执行的各种类型的指令的集合称为该计算机的指令系统。,Intel8086/8088CPU指令系统的指令可以分为六大类:,1.传送类指令,2.算术运算类指令,3.位操作类指令,4.串操作类指
10、令,5.程序转移类指令,6.处理器控制类指令,1.双操作数指令:OPR DEST SRC 2.单操作数指令:OPR DEST 3.无操作数指令:OPR,从指令的格式划分,一般可以分为三种:,22,(2)在指令格式中,没有显式地指明操作数,但是它隐含指明了操作数的存放地方。,对于无操作数指令,包含两种情况:,(1)指令不需要操作数,如暂停指令HLT。,23,一、传送类指令,传送类指令的作用是将数据、地址、立即数传送到寄存器或存储单元中,可以分为以下四种情况。,1.通用数据传送指令,指令格式:MOV DEST, SRC,作用:将源操作数指定的内容传送到目的操作数,即DEST=(SRC)。,MOV指
11、令可以是字节数据传送也可以是字数据传送,但是源操作数和目的操作数的长度必须一致。,MOV指令对标志寄存器的各位无影响,当指令执行完后,目的操作数原有的内容被源操作数内容覆盖,即目的操作数和源操作数具有相同内容。,24,MOV指令可以分为以下几种情况:,(1)立即数传送到通用寄存器或存储单元,例:MOV AH, 10H MOV AX, 2345H MOV M_BYTE, 64H MOV M_WORD, 2364H MOV DS, 1234H; 错误 MOV 0FF96H, AX;错误,注意:立即数只能作为源操作数,并且立即数不能传送给段寄存器。,25,(2)寄存器之间的传送,例:MOV AH,
12、CH MOV DS, AX MOV ES, BX MOV AX, CS MOV CS, AX; 错误,注意:段寄存器CS只能作源操作数,不能作目的操作数。,26,(3)寄存器与存储单元之间传送,例:MOV AL, SI MOV DI,AH MOV AX, 10BX MOV TABLEBP, BX MOV DS, BXSI MOV BX, BPSI;错误,注意:存储器与存储器之间不能够使用MOV直接传送。,27,综合起来,MOV指令在使用时需注意以下几个问题:,(1)立即数只能作源操作数,且它不能传送给段寄存器。,(2)段寄存器CS只能作源操作数,段寄存器之间不能直接传送。,(3)存储单元之间不
13、能直接传送数据,(4)MOV指令不影响标志位,28,问题思考: 下面两条指令的功能有什么区别? MOV AX, BX MOV AX, BX,指令“MOV AX, BX”把BX寄存器的内容装入到AX中。 指令“MOV AX, BX”把存储器一个字的内容装入AX寄存器。该字的段基值在DS中,偏移地址在BX中。,29,问题思考: 现有 (DS)=2000H, (BX)=0100H, (SI)=0002H, (20100H)=12H, (20101H)=34H, (20102H)=56H, (20103H)=78H, (21200H)=2AH, (21201H)=4CH, (21202H)=0B7H,
14、 (21203H)=65H 说明下列指令执行后AX寄存器的内容。 (1) MOV AX, 1200H (2) MOV AX, BX (3) MOV AX, DS:1200H (4) MOV AX, BX (5) MOV AX, 1100HBX (6) MOV AX, BXSI (7) MOV AX, 1100HBXSI,1200H (立即数寻址),0100H (寄存器寻址),4C2AH(直接寻址,EA=1200H),3412H(寄存器间接寻址,EA=0100H),4C2AH(基址寻址,EA=1200H),7856H(基址变址寻址,EA=0102H),65B7H(基址变址寻址EA=1202H),
15、30,问题思考: 已经定义数据段如下: DATA SEGMENT NUM=56 X DB NUM ;定义字节型存储变量 Y DB 27 ;定义字节型存储变量 Z DW 148 ;定义字型存储变量 DATA ENDS 指出下列指令中的错误: (1)MOV Y, X (2)MOV BL, 04B8H (3)MOV AL, Z (4)MOV BX, 3 (5)MOV BX, DI (6)MOV DS, DATA (7) MOV NUM, AX (8)MOV ES, DS (9) MOV AX, FLAGS (10)MOV CS, AX,31,(1) 指令MOV Y, X 同时出现了两个存储器操作数。
16、 (2) 指令MOV BL, 04B8H 操作数类型不匹配(04B8H是16位立即数,BL是8位寄存器)。 (3) 指令MOV AL, Z 操作数类型不匹配(Z是16位操作数,BL是8位寄存器)。 (4) 指令MOV BX, 3 操作数类型不能确定(warning)。 (5) 指令MOV BX, DI 出现了两个存储器操作数。 (6) 指令MOV DS, DATA 不能把立即数装入段寄存器。 (7) 指令MOV NUM, AX 立即数不能用作目的操作数。 (8) 指令MOV ES, DS 不能在段寄存器之间直接传输。 (9) 指令MOV AX, FLAGS中,FLAGS寄存器只能隐含在少量指令中使用。 (10) 指令MOV CS, AX 中,CS寄存器不能用作目的操作数。