




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章8086/8088指令系统本章重点掌握汇编语言调试工具DEBUG和MASM的使用掌握8086的寻址方式掌握8086的指令系统-数据传送指令-算术运算类指令
-逻辑运算和移位指令-控制类指令-串操作指令DEBUG命令行的使用
DEBUG命令行
DEBUG是DOS的一个内部命令,是操作系统专门为汇编语言提供的一种调试工具。
DEBUG程序的启动在DOS提示符下,可键入命令:DEBUG[path][文件名][参数1][参数2]在DEBUG程序调入后,出现提示符“-”,此时,可键入所需的DEBUG命令。DEBUG的基本命令显示和修改寄存器命令R,格式为:-R寄存器名
若省略寄存器名称,则显示所有寄存器的内容,否则将显示指定寄存器中的内容。汇编命令A,格式为:-A[地址]
该命令从指定地址开始输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。若地址省略,则从CS段偏移量100(IP=100)的内存地址开始。在汇编状态下输入回车就返回了DEBUG命令状态。运行命令G,格式为:-G[=地址1][地址2…]
其中地址1规定了运行起始地址,后面的若干地址均为断点地址。若地址省略,则从CS段偏移量100(IP=100)的内存地址开始执行代码。追踪命令T,格式为:-T[=起始地址]从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值,如未指定地址则从当前CS:1P开始执行。退出命令Q,格式为:-Q
它退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘。DEBUG的基本命令显示内存内容命令D,
格式为:-D起始地址[长度]在D命令中如不指出段地址,则其默认为DS段。若没有给出起始地址,则从DS段偏移量100处显示内存信息。若没有指定长度范围,则会从上一个D命令所显示的最后地址接下来显示128个字节。长度值用L10、L25的方式给出。修改内存内容命令E,
格式为:-E内存地址
该命令修改DS段指定偏移量地址的内存单元的数据。DEBUG的基本命令DEBUG的基本命令显示标志寄存器命令R,格式为:-R标志名称设置未设置标志名称设置未设置溢出OV(溢出)NV(未溢出)零位ZR(等于零)NZ(不等于零)方向DN(减少)UP(增加)辅助进位AC(进位)NA(无进位)中断EI(许可)DI(禁止)奇偶标志PE(偶)PO(奇)符号NG(负)PL(正)进位CY(设置进位)NC(清除进位)修改标志寄存器命令RF,格式为:-RF指令格式指令的内容由两部分组成,即进行何种操作和从存储器的那个单元取数;前者称为操作码,后者称为操作数。所以指令的一般格式为:操作码操作数1操作数2操作码:指出指令所进行的操作,如加、减、乘、除、取数和存数等等。操作数:可以是操作数本身,也可以是操作数地址,还可以是操作数地址的计算方法,表示参加运算的数据应从存储器的哪个单元取,运算的结果应存到哪个单元。3.18086的指令格式和寻址方式汇编语言的程序中,每一个语句的格式如下:
<标号:>指令助记符目标操作数<,源操作数><;注释>
Start:MOVAX,1090H;将16进制数1090H送入AX<标识符>
表达式
<注解>标识符和表达式用冒号隔开表达式和注解用分号隔开存放结果的操作数汇编指令基本格式立即数寻址操作数就在指令中提供,叫立即数寻址方式。比如: MOV AL,80H ;将16进制数80H送入AL MOV AX,1090H
;将1090H送AX,AH中为10H,AL中为90H采用立即数寻址方式主要是为了给寄存器赋值,不需要总线周期,速度快。立即数可以是8位或16位,若为16位立即数,则低字节在低地址,高字节在高地址。8086的寻址方式寄存器寻址
操作数在CPU的内部寄存器中,寄存器名在指令中直接给出
MOVAX,BX ;将BX中的数据送AX中
MOVBL,CL;将CL的内容送BL中采用寄存器寻址方式由于操作数在寄存器中不需要访问内存,不需要总线周期,速度快。寄存器可以是8位或者16位。直接寻址方式数据在存储器中,存储单元的有效地址(EA)由指令直接给出,是存储器访问的最简单的办法。注意:采用直接寻址方式,如果指令前没有指明操作数在哪个段,默认的段寄存器为数据段寄存器DS。如果对其他段的内存直接寻址,在指令前必须用前缀指明段寄存器。比如:ES:MOVAX,[3000H];将ES段的3000H和3001H;两单元的内容取到AX中比如:MOVAX,[2000H];将DS段的2000H和2001H;两单元的内容取到AX中内存地址寄存器间接寻址采用寄存器间接寻址方式,操作数所在的存储单元的有效地址(EA)由寄存器指出。这些寄存器可以是BX、BP、SI、DI。比如:MOVAX,[BX]
设DS=5000H,BX=3000H,本指令将53000H和53001H两个单元内容送寄存器AX。注意:采用寄存器间接寻址方式,如果指令前没有指明操作数在哪个段,默认段寄存器为数据段寄存器DS;如果寄存器为BP时,对应的段寄存器为堆栈段寄存器SS。通常我们把BX和BP称为基址寄存器,将SI和DI称为变址寄存器,以BX和BP进行的寄存器间接寻址称为基址寻址。以SI和DI进行的寄存器间接寻址称为变址寻址。MOVAX,[BX]基址寻址MOVAX,[SI]变址寻址MOVAX,[BP]基址寻址MOVAX,[DI]变址寻址寄存器相对寻址采用寄存器相对寻址方式,允许在指令中给出一个位移量,操作数所在的存储单元的有效地址由寄存器的内容加上位移量得到(位移量可以是8位可以是16位)。这些寄存器可以是BX、BP、SI、DI。比如:
MOVAX,[SI+0050H]
设DS=5000H,SI=3000H,本指令将53050H和53051H两个单元内容送寄存器AX。对BX、SI、DI寄存器来说,默认的段寄存器为DS,对BP来说,默认的段寄存器是SS。基址加变址寻址将BX、BP(基址寄存器)和SI、DI(变址寄存器)组合起来构成的寻址方式我们称为基址加变址寻址。操作数的有效地址(EA)由一个基址寄存器内容加上一个变址寄存器的内容得到。比如:
MOVAX,[BX+SI]
设DS=1000H,BX=5000H,SI=2000H,EA为7000H,本指令将17000H和17001H两个单元内容送寄存器AX。EA=[BP][BX][DI][SI]+相对基址加变址寻址在基址加变址寻址方式中允许在指令中给出一个位移量,操作数所在的存储单元的有效地址(EA)由由一个基址寄存器内容加上一个变址寄存器的内容再加上位移量得到(位移量可以是8位可以是16位)。比如:
MOVAX,[BX+SI+0050H]
设DS=1000H,BX=5000H,SI=2000H,EA为7050H,本指令将17050H和17051H两个单元内容送寄存器AX。EA=[BP][BX][DI][SI]++16位偏移量8位偏移量指出下列指令的寻址方式及默认的段寄存器
MOVSI,[1250H]MOVBX,1234HMOVDX,BXMOVDX,[DI]MOVAX,[BP]MOVDX,[BX+1234H]MOVCX,[BX+DI]MOVDX,[BP+DI+0050H]直接内存寻址,段寄存器DS立即数寻址,无段寄存器寄存器寻址,无段寄存器寄存器间接寻址,段寄存器DS寄存器间接寻址,段寄存器SS寄存器相对寻址,段寄存器DS基址加变址寻址,段寄存器DS相对基址加变址寻址,段寄存器SS相对寻址方式中的偏移量在寄存器相对寻址和相对基址加变址寻址方式中,其偏移量不仅可用常量表示,也可用符号表示。这个符号可以是变量名,例如WVAR变量,而且支持多种表达形式。MOVAX,[DI+100H]
等同于
MOVAX,100H[DI]等同于
MOVAX,[DI]100HMOVAX,[BX+SI+WVAR]等同于MOVAX,[BX+SI]WVAR等同于MOVAX,WVAR[BX+SI]等同于MOVAX,WVAR[BX][SI]等同于MOVAX,[BX]WVAR[SI]等同于MOVAX,[BX][SI]WVAR若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。;立即寻址①MOV AX,1117H②MOV BX,SP③MOV DX,[BX];寄存器寻址EA=0313H,PA=20000H+0313H=20313H;寄存器间接寻址;寄存器相对寻址④MOV AX,[BP]100H⑤MOV AX,100H[SI];寄存器相对寻址EA=0100H+100H=0200H,PA=68000H+0200H=68200HEA=1123H+100H=1223H,PA=20000H+1223H=21223H若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。;基址变址寻址⑥MOV AL,[BX][SI]⑦MOV AX,[BP+SI+100H];相对基址加变址寻址EA=0313H+1123H=1436H,PA=20000H+1436H=21436HEA=0100H+1123H+100H=1323H,PA=68000H+1323H=69323H若(BX)=0313H,(SI)=1123H,(DI)=0606H,(DS)=2000H,(SS)=6800H,(BP)=0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。3.2数据传送类指令基本数据传送指令MOV
MOV指令是形式最简单,用的最多的指令,它可以实现CPU内部寄存器的数据传递,寄存器和内存的数据传递,还可以把一个立即数送给内部寄存器或者内存单元。
MOVAL,BLMOVAX,[BX]MOV[1000],CXMOVBL,40H;将BL中的8位数据送AL;将BX和BX+1所指内存单元的数据送AX;将CX的值送DS段1000H和1001H单元;将立即数40H送BL注意:(1)在传送指令MOV中,源寄存器和目标寄存器的类型必须匹配,不能一个为字,一个为字节。(2)不能在两个内存单元中直接传送数据。
MOV[0200],[0300]错误!修改为:MOVAL,[0300]
MOV[0200],AL(3)在传送指令MOV中,寄存器可以是源操作数,也可以是目的操作数,但CS和IP不能是目的操作数MOVIP,3090H错误!(4)不能用立即数寻址方式为段寄存器传输,两个段寄存器之间不能用MOV指令直接传送数据。堆栈操作指令PUSH和POP在子程序调用和中断调用时,要保存断点地址(即IP指令指针寄存器的值)和保护现场(通用寄存器的值),调用结束时,要恢复断点地址(即IP指令指针寄存器的值)和恢复现场(通用寄存器的值),这些功能要通过堆栈来完成。寄存器值的保存和恢复要用入栈指令PUSH和出栈指令POP。比如:
PUSHAX;将AX内容推入堆栈PUSH[BX];将BX和BX+1所指内存单元的值入栈同样还有弹出指令:
POPBX;将栈顶两单元弹出送BX8086的堆栈操作SS的值×1600000HFFFFFH堆栈段首址堆栈指针SP2357PUSHAX假设AX的值为2357H,BX的值为41A6H堆栈指针SP栈底栈顶A641堆栈指针SP栈顶PUSHBX……SS段寄存器记录堆栈段的段首地址,栈顶由SP指定,堆栈总是从高地址向低地址方向延伸,当SP为最大值时为空栈,当SP为0时栈满。注意:(1)8086的堆栈操作总是按字进行,没有字节操作指令。
PUSHAL错误!!(2)每执行1条入栈指令,堆栈指针SP的值减2,推入堆栈的数据在栈顶,高字节在高地址先入栈,低字节在低地址后入栈,即低字节是真正的栈顶;出栈操作过程相反。如果用[A]表示寄存器A的内容,SP表示堆栈指示器,Msp表示堆栈指示的存储器栈顶单元,入栈操作和出栈操作可以表示为:入栈:[SP]-2→SP,[A]→Msp
出栈:[Msp]→A,[SP]+2→SP(3)CS的值可以入栈,但不能弹出一个值到CS寄存器。标志传送指令(1)读取标志指令LAHF 将标志寄存器的低8位送AH。1514131211109876543210OFDFIFTFSFZFAFPFCFD7D6D4D2D0AH(2)设置标志指令SAHF将AH寄存器的相应位送标志寄存器的低8位。(3)对标志寄存器的堆栈操作指令
PUSHF将标志寄存器的值推入堆栈顶部。
POPF从堆栈弹出一个字送标志寄存器。交换指令XCHE
交换指令可以实现寄存器之间或者内存与寄存器之间的数据交换。可以是字节交换,也可以是字交换
XCHEAX,BX;AX和BX之间进行字交换XCHECH,AL;CH和AL之间进行字节交换
XCHE[2530],BL;2530单元和BL之间进行字节交换注意:(1)目的操作数和源操作数不能同为内存单元(2)CS和IP不能用于交换指令(3)段寄存器不能参加交换地址传送指令(1)取有效地址指令(LEA)将存储器的偏移地址送到一个寄存器。例如:LEABX,[2728];将内存单元的偏移量2728送BXLEASP,[0482];将内存单元的偏移量0482送SPBUFFER数据区LEABX,BUFFER将存储区域BUFFER的偏移地址送BXMOVBX,BUFFER将存储区域BUFFER的数据送BX(2)装入地址指令 (LDS)功能:将4字节的地址指针(一个段地址和一个偏移量)传送到两个目的寄存器,其中地址指针的后两个字节即段地址一定送到DS中。比如:LDS DI,[2130H];使2130H和2131H中的偏移量送DI,
;使2132H和2133H中的段地址DS。字符串首址偏移量字符串首址段地址2130H(3)装入地址指令 (LES)功能:将4字节的地址指针(一个段地址和一个偏移量)传送到两个目的寄存器,其中地址指针的后两个字节即段地址一定送到ES中。比如:LES DI,[2130H];使2130H和2131H中的偏移量送DI,
;使2132H和2133H中的段地址ES。字符串首址偏移量字符串首址段地址2130H3.3输入/输出指令
8086系统和外部设备之间通过I/O芯片联系的,每一个I/O芯片都有一个8位寄存器和几个8位寄存器,系统要为每个寄存器分配一个地址,此地址叫端口号。
8086系统中可以有64K个8位端口,相邻编号的两个端口可以组合成为一个16的端口。8086采用存储器与I/O端口独立编址方式,即内存单元和I/O端口从0单元开始编址。当M/IO为高电平时访问存储器,当M/IO为低电平时访问I/O端口。
8086有专门的访问I/O端口的指令(IN和OUT),当8086在执行访问I/O端口的输入(IN)指令和输出(OUT)指令时,就会使M/IO信号处于低电平,结合RD和WR信号产生出对相应的I/O端口的读/写操作。
8086系统中允许有65536个8位端口,两个8位端口可以组合成16位的端口。执行输入(IN)输出(OUT)指令时,CPU可以从一个8位端口读入(写出)一个字节到AL中,或者从一个16位端口读入(写出)一个字到AX中。(1)直接输入/输出指令端口号为0~255,用一个立即数表示(00H~FFH)INAL,50H;将50H端口的字节读入ALINAX,70H;分别将70H、71H端口的内容读入AL、AHOUT44H,AL;将AL中的内容输出到44H端口
OUT80H,AX;将AL、AH中的内容分别输出;到80H、81H两端口(2)间接的输入输出指令当端口号大于FFH时,这些端口号不能用在指令中用立即数的形式给出,端口号放在DX寄存器中。例如:将数据C6H送到端口100HMOVDX,100HMOVAL,C6HOUTDX,AL
INAL,DX;从DX所指的端口中读取INAX,DX;从DX和DX+1所指出的两个端口中读取OUTDX,AL;将AL中的字节输出到DX所指的端口中OUTDX,AX;将AL中的字节输出到DX所指的端口中;将AH中的字节输出到DX+1所指的端口中注意:①只能用累加器(AX)作为执行输入输出的机构②寻址范围:直接输入输出指令为0~255(0H~FFH)。端口号在指令中可以用立即数的形式直接给出
间接输入输出指令为0~65535(0H~64K)。端口号在寄存器DX中给出,必须是寄存器DX。③在运行I/O指令的程序时,如果没有硬件的支持可能造成计算机死机。3.4算术运算类指令算术运算指令能够对字节,字,双字的数据进行加、减、乘、除运算,涉及两种类型的数据。无符号数8位无符号数的范围为0~25516位无符号数的范围为0~65535有符号数8位有符号数的范围为-128~+12716位有符号数的范围为-32768~+32767
算术运算指令大都对标志位有影响,有时利用标志位才能得到正确的结果。进位标志CF(CarryFlag)
计算机执行加法运算使最高位产生进位时CF为1。溢出标志OF(OverflowFlag)
计算机加法运算时,当低位往最高位产生进位,但最高位没有往前进位时;或者反过来,当低位往最高位没有产生进位,而最高位往前却有进位时;此时产生了溢出,使OF为1。000001010000101000001111无符号数:5+10=15有符号数:(+5)+(+10)=(+15)CF=0,OF=0000010001111101100000011无符号数:8+251=3有符号数:(+8)+(-5)=(+3)CF=1,OF=01000010000111110010000100无符号数:8+124=132有符号数:(+8)+(+124)=(-124)CF=0,OF=1100001111111010101111100无符号数:135+245=124有符号数:(-121)+(-11)=(+124)CF=1,OF=11结论:如果CF=1,那么无符号数产生溢出。指的是字节运算的结果范围超出了255,字运算的结果范围超过了65535。结论:如果OF=1,那么有符号数产生溢出。指的是字节运算的结果范围超出了-128~+127,字运算的结果范围超过了-32768~+32767。算术运算对标志位的影响有如下规律:
当无符号数运算产生溢出时,CF为1;当有符号数运算产生溢出时,OF为1;如运算结果为0,则ZF=1;
如运算结果为负数,则SF=1;
如运算结果中有偶数个1,则PF=1。加法指令不带进位位的加法指令ADD
例如:ADDAL,50H ;AL和50H相加,结果放在AL中ADDDI,SI ;DI和SI的内容相加,结果在DI不带进位位的加法指令ADD用来实现一个或两个字节的相加操作;结果放在目的操作数的地方。带进位位的加法指令ADC例如:ADCAX,SI;AX和SI以及CF的值相加,结果在AXADCDX,[SI];SI和SI+1所指的单元的内容和DX的内容;以及CF的值相加,结果在DX例如:两个4字节的无符号数相加,这两个数分别为放在内存单元的2000H和3000H开始的存储单元,低位在前,高位在后,第一个数为:10008423H,第二个数为:20007F00H,得到的和放在2000H单元。运算过程如下:1000010000100011011111110000000000000011001000111CF利用ADD指令完成两个低16位8423H和7F00H的相加0001000000000000001000000000000000110000000000011CF利用ADC指令完成两个高16位1000H和2000H的相加注意:带进位位的加法指令ADC可以实现多字节的加法运算。指令序列如下:MOVSI,2000HMOVAX,[SI];取第1个数的低16位送AXMOVDI,3000HADDAX,[DI];第1个数和第2个数低16位相加MOV[SI],AX;低16位和送2000H和2001H单元MOVAX,[SI+2];取第1个数的高16位送AXADCAX,[DI+2];高16位连同进位标志相加MOV[SI+2],AX;高16位和送2002H和2003H单元增量指令INC增量指令仅有目的操作数,作用是将操作数的内容加1,再送回操作数。例如:INCAL;将AL中的内容加1INCCX;将CX中的内容加1汇编语言的程序中,每一个语句的格式如下:
<标号:>指令助记符目标操作数<,源操作数><;注释>存放结果的操作数减法指令不考虑借位的减法指令SUB
该指令完成一个或两个字节的相减运算。例如:SUBBX,CX;将BX中的内容减去CX中的内容,结果在BX中SUBAL,20H;将AL中的值减去20,结果放在AL中考虑借位的减法指令SBB
该指令为实现多字节的相减提供了方便。例如:SBBAX,2030H;将AX的内容减去2030H,并减去CF值减量指令DEC
减量指令仅有目的操作数,作用是将操作数的内容减1,再送回操作数。例如:DECAX ;将AX的内容减1,结果送回AX中DECBL ;将BL的内容减1,结果送回BL中求补指令NEG
该指令使操作数取补码例如:NEGAL ;将AL中的数取补码NEGCX ;将CX中的内容取补码
比较指令指令格式:
CMP操作数1,操作数2注意:比较指令CMP执行两个数的相减操作,但不送回相减的结果。影响标志位AF、CF、OF、PF、SF、ZF。条件转移指令通过判断比较后的标志位进行转移。例如:CMPAX,2000H;将AX的内容和2000H相比较,结果影响标志位CMPAL,50H;将AL中的数和50H比较,结果影响标志位00000101+1111011011111011有符号数:5-10=-5
被减数小SF=1,OF=000001010+1111101100000101有符号数:10-5=5
被减数大SF=0,OF=011111011+1111011011110001有符号数:(-5)-10=-15
被减数小SF=1,OF=000000101+0000101000001111有符号数:5-(-10)=15
被减数大SF=0,OF=0结论:如果SF≠OF,被减数小。结论:如果SF=OF,被减数大。(1)无符号数的比较
a.操作数相等,则ZF=1。
b.CF=0,则无借位,被减数大;
CF=1,则有借位,被减数小;(2)有符号数的比较
a.操作数相等,则ZF=1。
b.如果OF=SF,则被减数大;如果OF≠SF,则被减数小;乘法指令0011×111000101010=42将1110理解为14则该式为:3×14=42将1110理解为-2的补码,则该式不正确在执行乘法运算时,为了使无符号数取得正确的结果,有符号数就得不到正确的结果,应此8086提供了无符号数相乘的指令和有符号数相乘的两套指令。无符号数乘法指令MUL
8086在执行乘法指令时,有一个乘数总是放在AL(8位)或者AX(16位)中,如果两个8位数相乘,得到的16位乘积放在AX中,如果两个16位数相乘,得到的32位乘积放在DX和AX中,其中DX放乘积的高16位,AX放乘积的低16位。例如:MULBL;AL中数和BL中数相乘,结果在AX中MULCX;AX中数和CX中数相乘,结果在DX和AX中有符号数乘法指令IMUL无符号数除法指令DIV
8086在执行除法指令时,当被除数是16位,除数是8位时,被除数放在AX中,得到的8位商放在AL中,8位的余数放在AH中;当被除数是32位,除数是16位时,被除数放在DX和AX中,DX放被除数的高16位,AX放被除数的低16位。得到的16位商放在AX中,16位的余数放在DX中;除法指令DIVCL;AX中的数据除以CL中的数据,;商在AL中,余数在AH中有符号数的除法指令IDIV在计算机中,可以用4位二进制数表示1位十进制数,这种代码称为BCD码。4位2进制数BCD码00000000110010200113010040101501106011171000810019BCD码只有0~9十种编码,对于2进制编码1010~1111在BCD码中无意义BCD码运算指令BCD码有两类:1)一个字节只用低4位表示BCD码,高4位为0。称为非组合(非压缩)的BCD码。2)一个字节的8位用来表示2位BCD码,称为组合(压缩)的BCD码。000000010000001012AX:16位0001001012AL:8位非组合BCD码组合BCD码BCD码BCD码+-×÷二进制的运算指令=非BCD码结果=BCD码结果专门指令调整结果14+28=3C=42ADD指令BCD调整指令BCD码运算过程BCD码十进制调整00001000+0000011100001111(0F)例如:8+7=15BCD码是逢10进1,4位二进制数是逢16进1,若运算产生了非BCD码的结果,可以补加一个6调整结果。+00000110
00010101(15)BCD码调整原理一:如果1位BCD码所对应的4位二进制数超过9,因该补加一个6产生进位来进行调整。BCD码十进制调整00001001+0000100100010010(12)例如:9+9=184位二进制数是逢16进1,BCD码是逢10进1,若运算产生进位则意味丢失了6,应给低位补加一个6。+00000110
00011000(18)BCD码调整原理二:如果低4位向高4位产生进位时,因该在低4位补加一个6进行调整。BCD码的加法十进制调整指令AAA对非组合BCD码相加结果进行调整。DAA对组合的BCD码相加结果进行调整,
注意:所有的BCD码调整指令都只有一个目的操作数并且隐含为AL,将AL中的数据调整为BCD码并将结果放在AL中。例如:MOVAL,14;组合的BCD码MOVBL,28;组合的BCD码ADDAL,BL;AL中为相加的结果3CDAA;对组合的BCD码相加结果调整,跟在加法;指令后面AL中为调整的结果42BCD码的减法十进制调整指令AAS对非组合BCD码相减结果进行调整DAS对组合的BCD码相减结果进行调整注意:紧跟在减法指令后面BCD码的乘法十进制调整指令AAM
对BCD数据进行乘法运算时,要求乘数和被乘数都用非组合的BCD码表示,否则无法调整结果,所以只有将非组合BCD码相乘结果调整的指令。注意:紧跟在乘法指令后面BCD码的除法十进制调整指令AAD注意:紧跟在除法指令后面符号扩展指令将字节扩展成字指令CBW该指令将AL的最高位扩展到AH;如果AL的最高位为0,则AH=00H,如果AL最高位为1,则AH=FFH。将字扩展成双字的命令CWD该指令将AX的最高位扩展到DX;如果AX的最高位为0,则DX=0000H,如果AX最高位为1,则DX=FFFFH。
这两条指令主要用于除法指令中,在除法运算时,除数必须是被除数的一半,当被除数和除数都为8位时,必须把被除数扩展成16位;当被除数和除数都为16位时,必须把被除数扩展成32位;3.5逻辑运算指令和移位指令逻辑运算指令:AND(与)、OR(或)、NOT(非)、XOR(异或)、TEST(测试)指令例如:
AND AL,0FH ;AL中内容和0FH相与,结果在AL中ORAX,00F0H ;AX中内容和00F0H相或,结果在AX中 XOR AX,AX ;AX内容本身进行异或,结果在AX中
NOT AL ;AL中内容求反,结果在AL中AND指令用来对一个数据的指定位清0。OR指令用来对一个数据的指定位置1。XOR指令常常用在程序开始使某个寄存器清零。NOT指令用来求取某个数的反码,加1得到补码。TEST和AND执行同样操作,但TEST指令不送回操作结果,而仅仅影响标志位。TESTAX,8000H;如AX的最高位为1,则ZF=0,;如AX的最高位为0,则ZF=1,
TEST指令经常用来进行位测试,检测指定位是1还是0,以实现程序的转移。例如:如果AL中的数为偶数,则转入LABEL标号的指令。LABEL:…………TESTAL,01H;如AL的最低位为0,则ZF=1
JZLABEL……
移位指令非循环移位指令 4条移位指令:算术左移指令SAL逻辑左移指令SHL算术右移指令SAR逻辑右移指令SHRS:Shift的缩写L:leftR:rightA:Arithmetic算术
H:Logic逻辑SAL指令:最低位补0,最高位进CF,相当于有符号数乘2。SHL指令:最低位补0,最高位进CF,相当于无符号数乘2。SAR指令:最高位不变,高位入低位,最低位入CF,相当于有符号数除2SHR指令:最高位补0,高位入低位,最低位入CF,相当于无符号数除2指令格式:SALSHLSARSHR
寄存器或内存单元
(8位或者16位),移位的位数注意:如果移动1位,指令直接给出;否则移位的位数必须放在CL中。例如:SALDX,1;将DX的内容算术左移1位。SHRAX,CL;将AX的内容逻辑右移若干位,CL
;中给出右移的位数。
移位指令常用来替代乘除法指令,会使程序运行的速度提高5~6倍。下面的程序使AL中的数乘以10SHLAL,1;将AL中的数左移1位,得到2XMOVBL,AL;2X保存在BL中MOVCL,2;移位次数置CL中SHLAL,CL;2X左移2位,得到8XADDAL,BL;2X加8X得到10X循环移位指令 4条循环移位指令:不带CF的循环左移指令ROL不带CF的循环右移指令ROR带CF的循环左移指令RCL带CF的循环右移指令RCRR:Rotate的缩写L:leftR:rightO:OnlyC:进位标志CFROL:低位入高位,最高位移到最低位形成循环,同时最高位移至CF。ROR:高位入低位,最低位移到最高位形成循环,同时最低位移至CF。RCL:低位入高位,最高位移到CF,CF移至最低位形成循环。RCR:高位入低位,最低位移到CF,CF移至最高位形成循环。
指令格式:ROLRORRCLRCR
寄存器或内存单元
(8位或者16位),移位的位数注意:如果移动1位,指令直接给出;否则移位的位数必须放在CL中。例如:将DX和AX中32位数值作为一个整体左移一位SHLAX,1RCLDX,1无条件转移指令JMP格式:JMP地址值或标号使程序的执行转入指令中规定的目标地址。转移方式:1.段内直接转移:偏移量由指令直接给出。
JMP0300H;偏移量IP由指令直接给出2.段内间接转移:偏移量由寄存器或内存单元给出。
JMPCX;偏移量IP在寄存器CX中间接给出3.段间直接转移:段地址和偏移量由指令直接给出。
JMP2000H:0500H;段地址CS和偏移量IP由指令直接给出4.段间间接转移:段地址和偏移量由寄存器或内存单元给出JMPDWORDPTR[SI];段地址CS和偏移量IP在SI、SI+1
;SI+2、SI+3四个内存单元中。3.6控制转移指令过程调用与返回指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行
转移指令有去无回子程序调用需要返回,其中利用堆栈保存返回地址1.子程序调用指令CALLCALL指令分成4种类型(类似JMP)CALLNEAR_PROC ;段内调用、直接寻址CALLR16/M16 ;段内调用、间接寻址CALLFAR_PROC ;段间调用、直接寻址CALLMEM32 ;段间调用、间接寻址CALL指令需要保存返回地址:段内调用——断点偏移地址IP入栈SP←SP-2,SS:[SP]←IP段间调用——断点偏移地址IP和段地址CS入栈SP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.子程序返回指令RET根据段内和段间、有无参数,分成4种类型RET ;无参数段内返回RETi16 ;有参数段内返回RET ;无参数段间返回RETi16 ;有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回——断点偏移地址IP出栈IP←SS:[SP],SP←SP+2段间返回——断点偏移地址IP和段地址CS出栈IP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2条件转移指令条件转移指令根据某一个标志位的值作为判断是否跳转的依据,如果满足条件则跳转,否则不跳转。注意:①条件转移指令只能采用段内直接跳转,只能使用8位的位移量,只能在本指令为中心的-128~127字节范围内跳转。②条件转移指令相当一部分指令是比较2个数的大小后,根据比较(CMP指令)的结果决定是否跳转。通常条件转移指令紧跟在CMP指令后。无符号数之间用“高于”、“低于”和“等于”的概念,有符号数之间用“大于”、“小于”和“等于”的概念。无符号数等于ZF=1高于CF=0低于CF=1有符号数等于ZF=1大于SF=OF小于SF≠OF根据标志位根据比较结果JZ/JE零标志ZF为1则转移(结果为0)JG大于则跳转JNZ/JNE零标志ZF为0则转移(结果不为0)JNG不大于则跳转JS符号标志SF为1则跳转JL小于则跳转JNS符号标志SF为0则跳转JNL不小于则跳转JO溢出标志OF为1则跳转JA高于则跳转JNO溢出标志OF为0则跳转JNA不高于则跳转JC进位标志CF为1则跳转JB低于则跳转JNC进位标志CF为0则跳转JNB不低于则跳转例:写出指令序列完成如下功能:比较AX、BX、CX中存放的无符号数,将最大的数放在AX中。CMPAX,BX;比较AX和BXJNBNEXT1;不低于则跳转
MOVAX,BX;否则将较大数送AXNEXT1:CMPAX,CX;比较AX和CXJNBNEXT2;不低于则跳转MOVAX,CX;否则将较大数送AXNEXT2:INT20H;程序正常结束循环控制指令(1)LOOP指令
格式:LOOP地址值或者标号
LOOP指令在执行时,先将CX的内容自动减1,判断CX的值是否为0,不为0继续循环;否则退出循环。因此LOOP指令前一定有对寄存器CX赋初值的指令。(2)LOOPZ/LOOPE指令将CX减1,在CX≠0并且ZF=1时继续循环。(3)LOOPNZ/LOOPNE指令将CX减1,在CX≠0并且ZF=0时继续循环。
XORAX,AX;AX寄存器清零MOVCX,64H;送循环次数NEXT:ADDAX,CX;计算累加和LOOPNEXTMOV[200],AX;送结果INT20H;程序正常结束例如:计算1+2+……+100将和存放到DS:200的字单元利用DEBUG编写指令序列计算5!并将和存放到数据段DS:400的字节单元。MOVSI,400;偏移地址送SIMOVCX,09;比较的次数送CXMOVAL,[SI];取第一个数送ALLABLE:INCSI;偏移量加1,指向下一个数
CMPAL,[SI];比较第N个数和第N+1个数
JNBNEXT;不低于则转入NEXTMOVAL,[SI];否则将大数送ALNEXT:LOOPLABLE;继续下一次比较,直到CX为0MOV[200],AL;最大数送DS:200单元
INT20H利用DEBUG编写指令序列将DS:400开始的连续10个字节单元中存放的无符号数最大的送DS:200单元。中断指令INT
8086有一个强有力的中断系统,最多可以调用256个不同功能的中断处理子程序,256个中断处理子程序对应中断类型码0~255(FF)。程序员可以通过中断指令调用任何1个中断处理子程序。中断调用的指令格式为:INTn例:INT20H;程序正常退出
INT21H;DOS的系统功能调用溢出中断调用的指令格式为:
INTO
这条指令的功能是检查溢出标志OF,如果OF=1,则启动中断类型码为4的中断处理子程序,INTO相当于INT4。中断返回的指令格式为:
IRET21H中断是DOS的功能系统调用,它包含了从00H到57H共88个最常用的功能子程序。调用号功能入口参数出口参数01H键盘输入字符AL=输入字符02H显示器显示字符DL=输出字符09H显示字符串DS:DX=缓冲区首址0AH输入字符串DS:DX=缓冲区首址2CH取时间CX和DX为时间4CH中止程序并返回21H中断调用格式:(1)在指定寄存器中设置入口参数;(2)将子程序编号送入AH寄存器;(3)执行中断指令:INT21H。例:02H号调用,作用是显示字符,其调用方式是:1.
DL←要输出显示的ACSII字符代码(入口参数)2.
AH←02H(调用的子程序编号)3.
INT21H(中断指令)调用21H中断,显示ACSII码为01的符号
MOVDL,01
;将数值01h装入DL寄存器(待显示字符的ACSII码)
MOVAH,02
;将数值02h装入AH寄存器(调用的子程序编号)
INT21
;调用DOS21H中断2号功能(显示装入DL的字符)MOVCX,100H;装入循环次数MOVDL,0;装入第一个ASCII码NEXT:MOVAH,2INT21H;调用21H中断的2号功能显示字符
INCDL;将数据寄存器DL内的数值加1,装入新码LOOPNEXT;循环指令执行一次,CX减1,直到CX为0.
INT20H;程序正常结束例:编写指令序列显示所有ASCII码对应的字符调用21H中断,从键盘输入一个字符
MOVAH,01;将数值01h装入AH寄存器(调用的子程序编号)
INT21;调用DOS21H中断1号功能(从键盘接收字符)例:编写一个指令序列,判别键盘上输入的字符:若是回车字符(0DH),则结束程序,否则ASCII码加1输出。START:MOVAH,1INT21H;调用21H中断的1号功能输入字符CMPAL,0DH;和回车符比较JZDONE;若是回车,转入DONEADDAL,1;否则,ASCII码加1MOVDL,ALMOVAH,2INT21H;调用21H中断的2号功能输出字符JMPSTART;转入START继续接收新字符DONE:MOVAH,4CHINT21H;调用21H中断的4号功能结束并返回3.7字符串操作指令8086的字符串操作的特点是:可以对字节串操作,也可以对字串操作所有的串操作指令的源操作数都假定在DS段中,偏移量由SI指出,目的操作数都假定在ES段中,偏移量由的DI指出,串操作指令是唯一一组源操作数和目的操作数都在内存的指令
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家庭装修设计施工质量改进合同2篇
- 家电维修保修承诺书范本3篇
- 农业标准化工作总结(4篇)
- 2024年上海复旦大学附属浦东实验学校教师招聘考试真题
- 渔业资源动态监管系统考核试卷
- 气象卫星应用考核试卷
- 安康白河县医疗机构定向招聘笔试真题2024
- 糖批发企业品牌推广与市场拓展考核试卷
- 景区旅游市场拓展策略实施考核试卷
- 车间生产线管理总结(4篇)
- 集体备课培训讲座
- 危废处置方案
- 2025年全国会展策划师岗位职业技能资格知识考试题库与答案
- 贵州省考试院2025年4月高三年级适应性考试历史试题及答案
- 儿童暴发性心肌炎诊治专家建议(2025)解读课件
- GB/T 320-2025工业用合成盐酸
- 企业危险源辨识与风险评估降低风险措施清单
- 天鹅艺术漆施工方案
- 脑卒中患者口腔健康素养的研究进展
- 广东省广州市白云区2024-2025学年高三下学期2月统测英语试卷(含答案)
- 2025至2030年中国煤气渣数据监测研究报告
评论
0/150
提交评论