《微机原理与接口技术》辅助教学电子课件第三章寻址方式和指令系统一、指令与指令系统指令:控制计算机完成某种操作的命令指令系统:处理器所能识别的所有指令的集合指令的兼容性:同一系列机的指令都是兼容的。二、指令格式指令中应包含的信息:运算数据的来源运算结果的去向执行的操作指令码的格式:•指令码由操作码和操作数字段两部分组成。•操作码指示该指令执行的操作。•操作数字段指示操作数的类型和操作数的寻址方式。操作码操作数…操作数操作码字段操作数字段•操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分•操作数是指令执行的参与者,即各种操作的对象•有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数3.18086/8088系统的寻址方式8086/8088指令系统操作数的种类分为两大类:3.1.1操作数的种类•数据操作数•转移地址操作数数据操作数•具体数值,也称立即数(im):操作数据在指令中。•寄存器(reg):操作数存放在寄存器中。•存储器(mem):操作数存放在指定的存储单元中。•I/O端口:操作数来自或送到I/O端口。指令的执行速度对不同的操作数,指令执行的时间不同:存储器快!立即数寄存器转移地址操作数•指令操作的对象不是数据,而是要转移的目标地址。要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元中。•对于转移地址操作数,其指令只有一个目标操作数,它是一个供程序转移的目标地址。寻址方式(AddressingMode)•指令中关于如何求出存放操作数有效地址的方法。有效地址EA(EffectiveAddress)•根据寻址方式计算得到的地址。3.1.2寻址方式(AddressingMode)•操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分,这种操作数称为立即数(im)•立即数可以是8位(00H~FFH)•也可以是16位(0000H~FFFFH)立即数寻址方式(Immediateaddressing)例3.1MOVBL,80HMOVAX,0102H指令执行后的结果为:BL=80H;AX=0102H•立即数寻址方式只能作为源操作数,主要用来给寄存器或存储单元赋值。演示•操作数存放在指令指定的寄存器(reg)中•可以8位寄存器(reg8):AH、AL、BH、BL、CH、CL、DH、DL•可以16位寄存器(reg16):AX、BX、CX、DX、SI、DI、SP、BP及CS、DS、SS、ES•寄存器名表示其内容(操作数)寄存器寻址方式(Registeraddressing)例3.2MOVCL,DLMOVAX,BX如果DL=50H,BX=1234H,则执行结果为:CL=50H,AX=1234H演示存储器寻址方式操作数在主存储器中,用主存地址表示程序设计时,8088采用逻辑地址表示主存地址•段地址在默认的或用段超越前缀指定的段寄存器中•指令中只需给出操作数的偏移地址(有效地址EA)1.直接寻址方式2.寄存器间接寻址方式3.寄存器相对寻址方式4.基址变址寻址方式5.相对基址变址寻址方式存储器寻址方式又分为•操作数的有效地址EA直接在指令中给出•用中括号包含有效地址,表达存储单元的内容•直接寻址方式的操作数默认在存储器的数据段,即默认的段寄存器是DS•允许使用段超越前缀改变段寄存器。在操作数的前面写上段寄存器名,再加上冒号“:”。直接寻址方式(Directaddressing)例3.3MOVAX,[2000H]EA=2000H,如果当前DS=1492H,则操作数存储单元的物理地址为:14920H+2000H=16920H若[16920]=9078H执行结果为:AX=9078H演示MOVAX,ES:[2000H];AX←ES:[2000H]例如:MOVAL,VALUE或MOVAL,[VALUE]VALUE也称为为存放操作数单元的符号地址。•在用汇编语言编程时,常用符号地址代替数值地址。•有效地址在指令中指定的寄存器SI、DI、BX或BP中,操作数本身在存储器中。•若指定的寄存器为:SI、DI、BX,默认的段寄存器是DS•若指定的寄存器是BP,默认的段寄存器是SS寄存器间接寻址方式(Registerindirectaddressing)•书写指令时,用作间址的寄存器必须加上方括弧,以免与寄存器寻址方式混淆•允许使用段超越前缀改变段寄存器例3.4:MOVAX,[SI]如果DS=3000H,SI=2000H物理地址=30000H+2000H=32000H若[32000H]=4050H执行结果为:AX=4050H又:MOV[BP],AL如果SS=5000H,BP=1000H物理地址=50000H+1000H=51000H执行结果为:[51000H]=50HMOVAX,[BX];AX←DS:[BX]演示例:段超越MOVES:[DI],AXMOVDX,DS:[BP]ADDAL,ES:[BX]SUBCS:[SI],AX寄存器相对寻址方式(Registerrelativeaddressing)•有效地址EA是一个由指令中指定的8位或16位位移量disp(displacement)与基址或变址寄存器的内容之和,即EA=SIDIBXBP+disp8disp16•若指令中指定的寄存器是SI,DI,BX,则存放操作数的段寄存器默认为DS•若指令中指定BP寄存器,则默认的段寄存器应SS•允许段超越前缀改变默认段寄存器。•位移量可常用符号表示例3.5:如果DS=3000H,BX=1000HCOUNT=1050H对于指令:MOVCX,[BX+COUNT]物理地址=30000H+1000H+1050H=32050H若[32050H]=4030H执行后:CX=4030H以下三种指令的形式皆允许,它们完全等价:MOVAL,[BP+TABLE]MOVAL,[BP]+TABLEMOVAL,TABLE[BP]演示MOVAX,[SI+06H];AX←DS:[SI+06H]MOVAX,06H[SI];AX←DS:[SI+06H]基址变址寻址方式(Basedindexedaddressing)•有效地址是由指令指定的一个基址寄存器BX或BP和一个变址寄存器SI或DI的内容之和。即:SIDIBXBPEA=+•若基址寄存器为BX,默认的段寄存器为DS•若基址寄存器为BP,默认的段寄存器为SS•允许段跨越演示MOVAX,[BX+SI];AX←DS:[BX+SI]MOVAX,[BX][SI];AX←DS:[BX+SI]例3.6:MOV[BX+DI],AX若DS=3000H,BX=1000H,DI=1100H则EA=1000H+1100H=2100H物理地址=30000H+2100H=32100H若AX=0050H则执行结果为:[32100H]=0050H。指令:MOVAH,[BP][SI]如果BP=2000H,SI=1200H,SS=4000H物理地址=40000H+2000H+1200H=43200H若[43200H]=56H则执行结果为:AH=56H基址变址相对寻址方式(Relativeindexedaddressing)•有效地址是指令中指定的8位或16位位移量(disp)与一个基址寄存器和一个变址寄存器的内容之和。即:SIDIBXBPEA=++disp8disp16•当基址寄存器为BX时,默认为DS段寄存器•当基址寄存器为BP时,默认为SS段寄存器。•允许段超越。演示MOVAX,[BX+DI+6];AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOVAX,[BX+SI+COUNT]MOVAX,COUNT[BX][SI]MOVAX,[BX+COUNT][SI]MOVAX,[BX]COUNT[SI]MOVAX,[BX+SI]COUNTMOVAX,COUNT[SI][BX]•基址加变址相对寻址方式的不同的书写形式:例3.7MOVAX,MASK[BX][SI]如果DS=3000H,BX=2000H,SI=1000H,MASK=0520H物理地址=30000H+2000H+1000H+0520H=33520H若[33520]=1234H执行结果为AX=1234H3.28086的汇编指令系统数据传送指令位操作指令程序控制指令8086的指令系统包括100多条指令,可分为以下六种类型:算术运算指令串操作指令处理器控制指令•格式:MOVDST,SRC•操作:dst←src•dst表示目的操作数,src表示源操作数。•MOV指令可以是字节(8位)操作,也可以是字(16位)操作。3.2.1数据传送指令MOV(Move)数据传送指令演示例:MOVAX,05H;字操作MOVBL,’A’;字节操作•不允许dst与src同时皆为‘mem’操作数•目的操作数dst不允许是立即数‘im’、段寄存器‘CS’和‘IP’•不允许将立即数直接传送给段寄存器•‘MOV’指令不影响标志位。•dst,src的具体格式为:dstsrc说明reg1reg2reg1不能是IP与CSregimreg不能是CS,DS,ES,SS和IPmimregmemreg不能是CS与IPmreg表中:reg为寄存器操作数,mem代表存储器操作数,im代表立即数。例:合法指令MOV[BX],AXMOVAX,DATA_SEGMOVDS,AXMOVAX,COUNT[BX][SI]MOVAL,‘E’MOV[SI],DSMOVAX,DS;AX←DSMOVES,AX;ES←AX←DS对段寄存器的操作不灵活MOV指令--立即数传送movcl,4;cl←4,字节传送movdx,0ffh;dx←00ffh,字传送movsi,200h;si←0200h,字传送movbvar,0ah;字节传送;假设bvar是一个字节变量,定义如下:bvardb0movwvar,0bh;字传送;假设wvar是一个字变量,定义如下:wvardw0明确指令是字节操作还是字操作以字母开头的常数要有前导0MOV指令--寄存器传送movah,al;ah←al,字节传送movbvar,ch;bvar←ch,字节传送movax,bx;ax←bx,字传送movds,ax;ds←ax,字传送mov[bx],al;[bx]←al,字节传送寄存器具有明确的字节和字类型MOV指令--存储器传送moval,[bx];al←ds:[bx]movdx,[bp];dx←ss:[bp+0]movdx,[bp+4];dx←ss:[bp+4]moves,[si];es←ds:[si]不存在存储器向存储器的传送指令MOV指令--段寄存器传送mov[si],dsmovax,ds;ax←dsmoves,ax;es←ax←ds对段寄存器的操作不灵活MOV指令的非法形式•非法指令的主要现象:•两个操作数的类型不一致•无法确定是字节量还是字量操作•两个操作数都是存储器•段寄存器的操作有一些限制非法指令的主要现象:非法指令--两个操作数类型不一致非法指令:moval,050ah修正:movax,050ah非法指令:movsi,dl修正:movdh,0movsi,dx•在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令非法指令--无法确定是字节量还是字量操作非法指令:mov[bx+si],255修正:movbyteptr[bx+si],255;byteptr说明是字节操作;movwordptr[bx+si],255;wordptr说明是字操作•当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明非法指令--两个操作数都是存储器movbuf2,buf1;非法指令,修正:;假设buf2和buf1是两个字变量;movax,buf1;movbuf2,ax;假设buf2和buf1是两个字节变量;moval,buf1;movbuf2,al•8088指令系统除串操作指令外,不允许两个操作数