1、第3章 寻址方式和指令系统,用来指挥和控制计算机完成指定操作的命令称为指令。不同的微处理器具有各自不同的指令。 每种微处理器能够识别和执行的所有指令的集合称为该微处理器的指令系统。,3.1 寻址方式,计算机的指令一般由操作码和操作数两部分组成。操作码表示指令所要执行的操作,操作数表示指令执行过程中操作的对象。 所谓寻址方式,就是寻找操作数或操作数地址的方式。与数据有关的寻址方式有: 立即数寻址 寄存器寻址 直接寻址 寄存器间接寻址 存储器相对寻址 基址变址寻址 基址变址相对寻址 寄存器比例寻址,3.1.1 立即数寻址,立即数,操作数直接包含在指令中,作为指令的一部分存放在代码段中例3-1 MO
2、V AX,2004H ;(AH)=20H,(AL)=04H MOV BL, 5AH ;(BL)=5AH MOV EAX,22334455H ;(EAX)=22334455H, (AX)=4455H立即数常用于给寄存器赋初值,只能作源操作数,不能作目的操作数,3.1.2 寄存器寻址,操作数存放在指令指定的8位、16位或32位通用寄存器中。例3-2 寄存器寻址 MOV AX,BX ; 将BX中的内容送入AX中,BX中的内容保持不变 MOV SI,DI ;将DI中的内容送入SI中,DI中的内容保持不变 MOV EAX,EBX ;将EBX中的内容送入EAX中,3.1.3 直接寻址,直接寻址指的是操作数
3、在存储器中的有效地址EA直接包含在指令中,书写时有效地址加上中括号例3-3 存储器直接寻址 MOV AX,1000H ;将DS段的1000H和1001H两个单元的内容送入AX寄存器中 MOV EAX,ES:2000H ;将ES段的2000H2003H四个单元的内容送入EAX寄存中,其中ES为段超越前缀 MOV AX,BUF ;将DS段内以有效地址BUF(符号地址)起始的两个单元的内容送入AX寄存器中,3.1.4 寄存器间接寻址,操作数的有效地址EA放在基址寄存器BX,BP,或变址寄存器SI,DI中。 操作数的物理地址为: (DS)16(SI/DI/BX)或(SS)16(BP)例3-4 假定(D
4、S)2000H,(SI)=3600H,(23600H)=6022H MOV AX,SI ;先将DS中的值左移4位,然后与SI中的值相加,形成物理地址是23600H,再将该物理地址中的数据6022H送入AX寄存器中例3-5 假定(SS)=3000H,(BP)=1100H,(31100H)=5E28H MOV BX,BP 例3-6 偏移量为32位时的寄存器间接寻址 MOV EAX,ECX MOV EAX,DX,3.1.5 寄存器相对寻址,操作数的有效地址是一个基址寄存器或变址寄存器中存放的数据加上指令给出的8位或16位偏移量,其物理地址为: (DS)16(SI/DI/BX)8位或16位偏移量或 (
5、SS)16(BP)8位或16 位偏移量例3-7 假定(DS)=2000H,(SS)=3000H,(SI)=3600H,(BP)=1100H,COUNT=10H,(23620H)=8A76H,(31110H)=4567H MOV AX ,SI+20H MOV BX ,BP+COUNT指令MOV BX,BP+COUNT书写有下面的等效形式: MOV BX,BP+COUNTMOV BX,COUNTBP,3.1.6 基址变址寻址,操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。其物理地址为: (DS)16(BX)(SI/DI) 或(SS)16+(BP)+(SI/DI)例3-8基址变址寻址,
6、假定(DS)=2000H,(SS)3000H,(BX)=1800H,(BP)=2080H ,(DI)=1000H,(SI)=0800H, (22800H)=80CFH,(32880H)=067AHMOV AX,BXDI MOV AX,BP+SI,3.1.7 基址变址相对寻址,操作数的有效地址是一个基址寄存器内容和一个变址寄存器的内容和8位或16位偏移量相加之加,其物理地址为: (DS)16(BX)+(SI/DI)+8位或16位偏移量 (SS)16(BP)+(SI/DI)+8位或16位偏移量例3-9基址变址相对寻址 MOV AX, BX+SI+100H MOV 20H BP+SI, AX MOV
7、 CX,DS:BX+SI+NUM MOV DX,SS: NUMDIBP例3-10 32位偏移量的寄存器比例寻址 MOV EAX,DAT EBX+ESI MOV EAX,NUM EBP+EDI,3.1.8 寄存器比例寻址,这种寻址方式中,形成存储器操作数的有效地址可以采用: (1)变址寄存器的内容乘以比例因子,再加上偏移量,称为比例变址方式 (2)变址寄存器的内容乘以比例因子,再加上基址寄存器的内容,称为基址比例变址方式。 (3)变址寄存器的内容乘以比例因子,再加上基址寄存器的内容和偏移量,称为基址比例变址偏移方式。例3-11 寄存器比例寻址 MOV EAX,XEDI*4 MOV EBX,EDI
8、*8EBX ;EA=(EDI)*8+(EBX) MOV EAX,XESI*4EBP ;EA=(ESI)*4+(EBP)+X,3.2 8086指令系统,8086指令系统是80x86的基本指令集,按功能可以把这些指令分为六种类型: 数据传送指令 算术运算指令 逻辑运算与移位指令 串操作指令 控制转移指令 处理器控制指令,3.2.1 数据传送指令,数据传送指令用于寄存器,存储单元和输入输出端口之间传送数据或地址。除SAHF和POPF外,对标志无影响。主要有四类: 1通用数据传送指令 2地址传送指令 3标志传送指令 4输入输出指令,1通用数据传送指令,(1)基本的传送指令mov 格式:MOV DEST
9、 , SRC 功能:将源操作数的内容传送到目的操作数例3-12 基本的传送指令 MOV AL,30H ;立即数传送到寄存器 MOV AL, BL ;寄存器之间传送字节数据 MOV SI, BX+62H ;寄存器和存储器之间传送数据例3-13下列指令是不合法的。 MOV 6234H,AX ;立即数不能用于目的操作数 MOV CS,AX ;CS不能用于目的操作数 MOV IP,AX ;IP不能用于目的操作数 MOV DS,4234H ;立即数不能直接传送给段寄存器 MOV AL,BX ;源操作数与目的操作数的位数必须一致 MOV BUF1,BUF2 ;不能在两个存储器单元之间传送数据 MOV DS
10、,ES ;不能在两个段寄存器之间传送数据,(2)交换指令,格式:XCHG DEST,SRC 功能:将源操作数与目的操作数的内容交换(Exchange)例3-14 交换指令 XCHG AL,CL ;字节交换 XCHG BX,SI ;字交换 XCHG AX,BX+SI ;寄存器和存储器之间交换数据例3-15 下列指令是非法的 XCHG AX,6234H ;寄存器与立即数之间不能交换 XCHG BUF1,BUF2 ;存储器单元与存储器单元之间不能交换 XCHG ADDR,4234H ;存储器单元与立即数之间不能交换 XCHG CS,DATBX ;不能与CS(或IP)寄存器进行交换,(3)堆栈操作指令
11、,堆栈是按“先进后出”原则工作的一段存储器区域 格式:PUSH SRCPOP DEST 例3-16 将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中,已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH,其示意图见图3-1和图3-2。,(4)换码指令,格式:XLAT 功能:这是一条专门用于AL和字节表中某一存储单元之间执行数据传送的指令。执行(AL) BX+AL的操作,使AL中的一个值变换为内存表格中的某一个值,实现编码的转换。例3-17 在内存的数据段中存放有一张数值09的ASCII码转换表,首地址为Hex_table,如图3-3所示。现要把数值8转换成对应的A
12、SCII码,可用以下几条指令实现: LEA BX,Hex_table ;(BX)表首偏移地址 MOV AL, 8 ; (AL)8 XLAT ;查表转换,2.地址传送指令,(1)有效地址传送指令 格式:LEA DEST,SRC 功能:这是一条取有效地址的指令(Load effective address)。它用来将源操作数的偏移地址传送到通用寄存器、指针或变址寄存器中 例3-18 有效地址传送指令 MOV BX,3200H ;将3200H单元的内容送BX LEA BX,3200H ;将有效地址3200H送BX LEA SI,ADDR ;将ADDR的有效地址送SI,(2)地址指针传送指令,格式:L
13、DS DEST,SRCLES DEST,SRC 功能:将源操作数指定的连续4个存储器单元中存放的32位地址指针(包括一个段地址和一个偏移地址)传送到两个16位寄存器 例3-19 地址指针传送指令 POINT DD 55663344H ;设定POINT的段地址和偏移地址LDS BX,POINT ;(BX)=3344H,(DS)=5566HLES BX,POINT ;(BX)=3344H,(ES)=5566H,3.标志传送指令,(1)标志读写指令 格式:LAHF/SAHF 功能:LAHF用于将标志寄存器的低8位送AH,即将标志寄存器FLAGS中的SF(符号标志)、ZF(零标志)、AF(半加进位标志
14、)、PF(奇偶标志)和CF(进位标志)5个标志位分别传送到累加器AH的对应位,(2)标志入栈出栈指令,格式:PUSHF/POPF 功能: PUSHF指令是将标志寄存器中的内容压入堆栈,指令的操作为SP-1(FLAGSH),SP-2(FLAGSL),(SP)(SP)-2POPF指令是将栈顶的字单元内容弹出到标志寄存器中,同时SP(SP)+2,4输入输出指令,格式:IN DEST,SRCOUT DEST,SRC 功能:专门用于累加器和I/O端口之间执行数据传送例3-20 输入输出指令 IN AL,28H ;从端口28H输入一个字节到AL OUT 15,AL ;从AL输出一个字节到端口15 MOV
15、DX,0362H ;先将端口地址送入DX IN AX,DX ;从端口0362H输入一个字到AX,3.2.2 算术运算指令,算术运算指令包括加,减,乘,除4种基本的运算指令。 算术运算指令除了符号扩展指令,均不同程度影响标志位。,1.加法指令,(1)不带进位加法指令 格式:ADD DEST, SRC 功能:将源操作数与目的操作数相加,结果送入原存放目的操作数的地方。该指令对标志位有影响。例3-21 不带进位加法指令 ADD CL,20H ;(CL)(CL)+20H ADD AX,SI ;(AX)(AX)+(SI) ADD DATA BX,AL ;(BX)+DATA)(BX)+DATA)+(AL)
16、 ADD DX,BX+SI ;(DX)(DX)+(BX)+(SI),(2)带进位加法指令,格式:ADC DEST,SRC 功能:将源操作数和目的操作数相加,同时加上进位标志的现行值CF,结果送入原存放目的操作数的地方例3-22 带进位加法指令 ADC AX,SI ;(AX)(AX)+(SI)+CF ADC BX,3000H ;(BX)(BX)+3000H+CF ADC AX,DATSI ;(AX)(AX)+(SI+DAT)+CF,(3)加1指令,格式:INC DEST 功能:将目的操作数中的内容加1,然后送回该操作数。目的操作数可以是寄存器或存储器。该指令一般用在循环程序中修改指针和循环次数例
17、3-23 加1指令 INC BX ;(BX)(BX)+1 INC BYTE PTR DI+100H ;将(DI)100H所指的字节单元内容加1,(4)BCD码加法十进制调整指令, 未组合BCD码的加法调整指令 格式:AAA 功能:将AL的内容调整为一位非组合型的十进制数 例3-24 两个未组合BCD码的加法运算,设(AH)=0 MOV AL,08 ;(AL) 08 (AL)=00001000 ADD AL,09 ;(AL) 08+09 (AL)=00010001=11H AAA ;AF=1,(AH)(AH)+01,AL(AL+6),AL高4位为0,(AL)=00000111,结果(AX)=01
18、07 AF=1 CF=1 组合BCD码的加法调整指令 格式:DAA 功能:将AL的内容调整为两位组合型的二进制数。调整方法与AAA指令类似,不同的是DAA指令要分别考虑AL的高4位和低4位。如果AL的低4位大于9或AF1,则AL的内容加6,并将AF置1;如果AL 的高4位大于9或CF=1,则AL的内容加60H,且将CF置1。 例3-25 两个组合BCD码的加法运算 MOV AL,37 ;(AL)37 MOV BL,35 ;(BL)35 ADD AL,BL ;(AL)=6CH,AF=0,CF=0 DAA ;因为AL中的低4位大于9,所以(AL)(AL)+06,结果(AL)=72,AF=1,CF=
19、0,2. 减法指令,(1)不带借位的减法指令 格式:SUB DEST, SRC 功能:将目的操作数减去源操作数,结果送入目的操作数。例3-26 不带借位的减法指令 SUB AX,3000H ;(AX)(AX)-3000H SUB BX,SI+100H ;(BX)(BX)-SI+100H,(2)带借位的减法指令,格式:SBB DEST, SRC 功能:将目的操作数减去源操作数,还要减去CF的值,结果送入目的操作数例3-27 带借位的减法指令 SBB AX,BX ;(AX)(AX)-(BX)-CF SBB WORD PTR SI,1068H ;(SI)(SI)-1068H-CF,(3)减1指令,格
20、式:DEC DEST 功能:将目的操作数的内容减1,然后送回目的操作数。例3-28 减1指令 DEC BL ;(BL)(BL)-1 DEC BYTE PTRDI+2 ;DI+2DI+2-1,(4)求补指令,格式:NEG DEST 功能:对目的操作数取补码,即用零减去此操作数,结果送回此操作数中。例3-29设(AX)=020H,(BX)2212H NEG AX ;(AX)0-(AX),结果(AX)=0FEH NEG BX ;(BX)0-(BX),结果(BX)=DDEEH,(5)比较指令,格式:CMP DEST,SRC 功能:将目的操作数减去源操作数,结果不送回目的操作数,二操作数原值不变,只是影
21、响状态标志位。其余同SUB指令。 这条指令后边一般跟条件转移指令,以判断二操作数是否满足某种关系。根据比较结果对标志位的影响来实现程序的分支。,(6)BCD码减法十进制调整指令, 未组合BCD码的减法调整指令 格式:AAS 功能:与AAA指令类似是将AL的内容调整为一位非组合型的十进制数 例3-30 两个未组合BCD码的减法运算 MOV AX,0608H ;AX0608H SUB AL, 09H ;AL0FFH AAS ;AL09H,AH05H 组合BCD码的减法调整指令 格式:DAS 功能:与DAA指令类似,是将AL 的内容转换成两位组合型的十进制数 例3-31:两个组合BCD码的减法运算
22、MOV AL,73H ;AL73H SUB AL,27H ;AL4CH DAS ;AL46H,3.乘法指令,(1)无符号数乘法指令 格式:MUL SRC 功能:字节相乘时,AL与源操作数相乘,乘积为16位送入AX中;字相乘时,AX与源操作数相乘,乘积为32位,高16位送DX,低16位送AX。 对标志位影响:若乘积的高半部分(字节相乘时为AH,字相乘时为DX)不为零,则CF1,OF1;否则CF=0,OF=0。其它标志位为任意值。例3-32 无符号数乘法指令 MUL DL ;AXAX*DL MUL CX ;DX:AXAX*CX MUL BYTE PTR SI+8 ;AXAL*SI+8,(2)有符号
23、数乘法指令,格式:IMUL SRC 功能:与MUL的功能相同,只是要求两乘数都必须为有符号数。例3-33两个有符号数的乘法 MOV AL,FEH ;ALFEH,FEH看作有符号数-2 MOV CL,11H ;CL11H,11H看作有符号数17 IMUL CL ;AXFFDEH,执行02H*11H,将乘积结果取补码,FFDEH=-34,(3)非组合BCD码乘法调整指令,格式:AAM 功能:用于将非组合BCD码乘法的结果(在AL中)转换成两个非组合型BCD码(AH和AL中)例3-34 两个非组合BCD码的乘法运算。 MOV AL,,06H ;AL06H MOV BL,07H ;BL07H MUL
24、BL ;AX002AH AAM ;AX0402H,4. 除法指令,(1)无符号数除法指令 格式:DIV SRC 功能:a.字节除法:将AX/SRC的商送入AL,将AX/SRC的余数送入AH b.字除法:将DX:AX/SRC的商送入AX,将DX:AX/SRC的余数送入DX例3-35 无符号数除法指令 DIV CL ;AX中的16位数除以CL中的8位数, 商送AL, 余数送AH DIV CX ;DX和AX中的32位数除以CX中的16位数,商送AX,余数送DX,(2)有符号数除法指令,格式:IDIV SRC 功能:与DIV指令相比只有两点不同: a.两个操作数均为有符号数。 b.如果被除数不是除数的
25、两倍长度,对被除数要用专门的指令进行符号扩展,以产生双倍长度表示的被除数。,(3)非组合BCD码除法调整指令,格式:AAD 功能:AAD指令常用于DIV指令之前,将AX中的两位非组合BCD码变为二进制数例3-36 两个非组合BCD码的除法运算。 MOV AX, 0605H ;AX0605H MOV BL,07H ;BL07H AAD ;AX0041H DIV BL ;商值AL09,余数AH02H,(4)有符号扩展指令,格式:CBWCWD 功能:CBW为字节扩展指令,将AL中有符号数的符号位扩展到AH中例3-37 MOV AL,12H ;AL12H CBW ;AX0012H,AH=00H MOV
26、 AX,BBA3H CWD ;DXFFFFH,AXBBA3H,3.2.3 逻辑运算与移位指令,逻辑运算与移位指令包括逻辑运算指令,移位指令,循环移位指令。,1逻辑运算指令,逻辑运算指令主要用于对寄存器或存储器单元中某些位的测试,置位,复位等操作。逻辑运算指令对操作数都是按位进行操作,对相应的标志位产生影响,操作数可以是字节或字。 格式:AND DEST,SRCOR DEST ,SRCNOT DESTXOR DEST,SRCTEST DEST,SRC,例3-38 AND AL,0FH ;AL中的内容和OFH相与,结果在AL中 AND AX,BX ;AX和BX中的内容相与,结果在AX中 AND D
27、X,BX+SI ; OR AX,00F0H ;AX和00F0相或,结果在AX中 XOR AL,0FH ;AL和0FH相异或,结果在AL中 XOR AX,AX ;AX的内容本身进行异或,结果AX清零例3-39 TEST AX,8000H ;如果AX的最高位为1,则ZF0,否则ZF=1 TEST AL,01H ;如果AL的最低位为1,则ZF=0, 否则ZF=1例3-40 NOT AL ;AL中内容求反码,结果在AL中 NOT BX ;BX中内容求反码,结果在BX中 NOT WORD PTR 1000H ;1000H和1001H2个单元中 的内容求反码,再送回这2个单元中例3-41 AND AL,0
28、FH ;AL中的高4位请零 OR AL,0FH ;AL中的低4位置1 XOR AL,0FH ;AL中的低4位求反 TEST AL,0FH ;检查AL中的低4位是否全为零,2.移位指令,移位指令可以对寄存器或存储器单元按字节或字进行操作,移位指令包括:算术左移指令SAL,算术右移指令SAR,逻辑左移指令SHL,逻辑右移指令SHR。 格式:SAL DEST,COUNTSAR DEST,COUNTSHL DEST,COUNTSHR DEST,COUNT,例3-42将AL寄存器中的数据左移1位,BL寄存器中的数据右移4位MOV AL,52H ;AL52HMOV BL,63H ;BL63HMOV CL,
29、04H ;CL04HSHL AL,1 ;ALA4HSHR BL,CL ;BL0CH,3循环移位指令,循环移位指令包括,不含进位位的循环左移指令ROL,不含进位位的循环右移指令ROR,含进位位的循环左移指令RCL,含进位位的循环右移指令RCR。 格式:ROL DEST,COUNTROR DEST,COUNTRCL DEST,CPUNTRCR DEST,COUNT,例3-43 将AX的最高位移入DX的最低位 RCL AX,1 ;将AX的最高位移位CF RCL DX,1 ;将CF移入DX的最低位 例3-44 将AX00A2H,BX=00B4H,装配在一起形成AXA2B4H MOV CL,8 ;(CL
30、)移位数8 ROL AX,CL ;AX循环左移8位,(AX)=A200H ADD AX,BX,3.2.4 串操作指令,串操作指令就是用一条指令实现对存储器中一串字符或数据的操作。8086指令系统提供了5条基本的串操作指令和一条重复前缀指令。,1基本串操作指令,(1)串传送指令 MOVSB ;字节传送,ES:DIDS:SI,SISI1,DIDI 1 MOVSW ;字传送,ES:DIDS:SI,SISI 2,DIDI 2(2)取串指令 LODSB ;字节传送,ALDS:SI,SISI 1 LODSW ;字传送,AXDS:SI,SISI 2(3)存串指令 STOSB ;字节传送,ES:DIAL,DI
31、DI 1 STOSW ;字传送,ES:DIAX,DIDI 2.,(4)串比较指令 CMPSB ;字节传送ES:SI-DS:DI,SISI 1,DIDI 1 CMPSW ;字传送,ES:SI-DS:DI,SISI 2,DIDI 25)串搜索指令 SCASB ;字节传送,AL-ES:DI,DIDI 1. SCASW ;字传送,AX-ES:DI,DIDI 2,2重复前缀指令,格式: REP ;无条件重复前缀指令REPE/REPZ ;条件重复前缀指令REPNE/REPNZ ;条件重复前缀指令REP指令用在MOVS、STOS指令之前,每执行一次串指令,CX(CX)-1,直到CX=0,重复执行结束 REP
32、E/REPZ指令用在CMPS、SCAS指令之前,每执行一次串指令,CX(CX)-1,并判断ZF标志位是否为0;只要CX=0或ZF=0,则重复执行结束 REPNE/REPNZ指令用在CMPS、SCAS指令之前,每执行一次串指令,CX(CX)-1,并判断ZF标志位是否为1;只要CX=0或ZF=1,则重复执行结束 LODS指令之前不能添加重复前缀,例题,例3-45将首地址为SRC的源字符串传送到DEST为首地址的内存区,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA SI,SRC ;DS:SI字符串首地址 LEA DI,ES:DEST ;ES:DI目标地址 MOV CX,N ;字符串
33、长度 REP MOVSB ;重复字符串传送,例3-46比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为SRC和DEST,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA SI,SRC ;DS:SI字符串首地址 LEA DI,ES:DEST ;ES:DI目标地址 MOV CX,N ;字符串长度 REPNE CMPSB ;重复比较字符串 JNZ NOT_FOUNT ;无相同的元素,转 NOT_FOUNT,否则继续执行下条指令,例题,例3-47在首地址为ES:DEST的字符串中检查是否有字符M,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA DI,ES:DE
34、ST ;ES:DI目标地址 MOV CX,N ;字符串长度 MOV AL,M ;AL搜索字符 REPNE SCASB ;重复搜索字符串是否有字符M,例3-48将首地址为DS:SRC的字节数据串中非0元素送到首地址为ES:DEST的内存区中。字符串长度为N。 CLD;DF=0,增量方向 LEASI,SRC;DS:SI字符串首地址 LEADI,ES:DEST;ES:DI目标地址 MOVCX,N;字符串长度 GOON:LODSB;取字符串的一个元素 CMPAL,0;字符串元素为0吗? JZNEXT;是0,继续下一个元素 STOSB;非0,存入首地址为ES:DEST的内存区中 NEXT:DECCX J
35、NEGOON,3.2.5 控制转移指令,控制转移指令通过改变段寄存器CS和指令指针IP可以改变指令执行的顺序。 控制转移指令根据程序转移地址的不同: 1.段内转移 只改变IP内容 2.段间转移 改变IP和CS的内容,1无条件转移指令,(1)段内直接转移 程序转移有效地址是当前IP内容加上指令中给出的8位或16位偏移量。 如: JMP 1200H ;IP1200H,直接转移到1200H去执行指令 JMP SHORT LOOP ;IP(IP)+8位偏移量,段内短转移,转向符号地址LOOP处 JMP NEAR PTR L2 ;IP(IP)+16位偏移量,段内近转移,转向符号地址L2处,(2)段内间接
36、转移 程序转移的偏移地址在寄存器或存储单元之中。 如: JMP CX ;IP(CX) JMP AX+SI ;IPAX+SI JMP WORD PTR SI ;IP(SI)所指定的存储器字单元之中的16位数据,(3)段间直接转移 指令中直接给出转移地址的段地址和偏移地址: 如: JMP FAR PTR NEXT ;CS:IP新的段基址和新的偏移地址 (4)段间间接转移 程序转移的段基址和偏移地址在存储单元之中 如: JMP DWORD PTR DI ;(IP) (DS:DI),(CS) (DS:DI+2),2过程调用及返回指令,程序设计中,将具有独立功能的程序模块称为子程序,8086汇编中称为过
37、程。 程序执行过程中,由调用程序使用调用指令调用这些子程序;当子程序执行后,通过返回指令返回主程序。,(1)调用指令,格式:CALL 过程名 功能:调用已定义的过程,并将断点地址压入堆栈保存。 段内直接调用 CALL ;SP(SP)-2,SS:SP IP;IP(IP)+16位偏移量 段内间接调用 CALL BX ;SP(SP)-2,SS:SP IP;IPBX偏移量 段间直接调用 CALL FAR PTR SUB2 ;SP(SP)-2,SS:SPCS;SP(SP)-2 SS:SP IP,IPSUB2偏移地址,CSSUB2段地址 段间间接调用 CALL FAR PTR SI ;SP(SP)-2,S
38、S:SPCS;SP(SP)-2 SS:SP IP,IPSI,CSSI+2,(2)返回指令,格式:RET n 功能:将断点地址从堆栈中弹出,然后按返回地址继续执行。 无参数段内返回 RET ;IPSS:SP,SP(SP)+2 有参数段内返回 RET n ;IPSS:SP,SP(SP)+2,SP(SP)+n 无参数段间返回 RET ;IPSS:SP,SP(SP)+2,CSSS:SP,SP(SP)+2 有参数段间返回 RET n ;IPSS:SP,SP(SP)+2,CSSS:SP,SP(SP)+2, SP(SP)n,3条件转移指令,格式:JXX DEST 功能:以标志位的状态或者以标志位的逻辑运算结
39、果作为转移依据,如果满足转移条件,则转到DEST所指示的指令处执行,否则顺序执行下一条指令。 从指令的转移条件以及上条指令参加运算的操作数性质,可以将它们分成三类:,(1)根据单个标志位的状态判断转移的指令,(2)根据两个无符号数的比较结果判断转移的指令(3)根据两个有符号数的比较结果判断转移的指令,例题,例3-53 根据单个标志位的状态判断后转移的指令 ADD AX,BX JC TOO_BIG ;若加法有进位转至TOO_BIG处理 SUB AL,BL JZ ZERO ;若减法结果为0,转至ZERO处理例3-5比较无符号数FEH和05H的大小,执行下面的指令后,将转移到ABC处继续执行指令。
40、MOV AL,0FEH CMP AL,05H JA ABC ;若(AL)05H,则转向ABC,4循环控制指令,格式:LOOP DEST ;(CX)0,则循环 LOOPE/LOOPZ DEST ;ZF=1且(CX0),则循环 LOOPNE/LOOPNZ DEST ;ZF=0且(CX)0,则循环 JCXZ DEST ;(CX)=0,则循环,例3-54在以DATA为首地址的内存数据段中,存放有200个16位有符号数,试找出其中最大和最小的有符号数,并分别放在MAX和MIN为首的内存单元中START: LEA SI,DATA ;(SI) 数据块首地址MOV CX,200 ;(CX) 数据块长度 CLD
41、 ;清方向标志DFLODSB ;(AX)一个16位有符号数MOV MAX,AX ;将该数送MAXMOV MIN,AX ;将该数送MINDEC CX ;(CX) (CX)-1 NEXT: LODSW ;取下一个16位有符号数CMP AX,MAX ;与MAX单元内容进行比较JG LARGER ;若大于则转LARGERCMP AX,MIN ;否则再与MIN单元内容进行比较 JL SMALL ;若小于MIN的内容则转SMALLJMP GOON ;否则就转至GOON LARGER:MOV MAX, AX ;(MAX) (AX)JMP GOON SMALL: MOV MIN,AX ;(MIN) (AX)
42、GOON: LOOP NEXT ;(CX)-1,若CX0,则转NEXTHLT,5中断指令,(1)中断指令 格式:INT n 功能:用于产生软件中断,以调用中断类型号为n的中断服务程序 n为一个8位立即数,取值范围为0255。(2)溢出中断指令 格式:INTO 功能:用来判断有符号数加减运算是否溢出。一般把INTO指令安排在有符号数加、减运算指令的后面,一旦查出OF=1。则转到溢出中断处理程序。INTO指令是n4的INT指令。其中断向量为0010H。(3)中断返回指令 格式:IRET 功能:将堆栈中的断点地址弹出赋给IP和CS,以实现中断返回;将标志寄存器的值弹出,恢复中断前的状态。,3.2.6
43、 处理器控制指令,1标志操作指令 CLC ;CF0,进位标志位置0(Clear carry) STC ;CF1,进位标志位置1(Set carry) CMC ;CF= 进位标志取反(complement Carry) CLD ;DF0方向标志位置0(clear direction) STD ;DF1方向标志位置1(set direction) CLI ;IF0中断允许标志位置0(clear interrupt) STI ;IF1中断允许标志位置1(set interrupt),2. 外部同步指令 (1)暂停指令HLT (2)等待指令WAIT (3)交权指令ESC (4)封锁指令LOCK (5)
44、空操作指令NOP,3.3 80X86与Pentium扩充和增加的指令,3.3.1 80286扩充和增加的指令 180286扩充功能的指令 (1)堆栈操作指令 PUSH SRC (2)有符号数乘法指令 IMUL DEST,SRC IMUL DEST,SRC1,SRC2 ; 例3-55 有符号数乘法 IMUL CX,205 ; (CX) (CX)205 IMUL DX,BP,68H ; (DX)BP68H,(3)移位指令 例3-56 下列指令都是正确的 SAL AX,9 ROL BP,29 RCR BXSI,31 SAR DX,6 ;算术右移6次,280286增加的指令,(1)栈操作指令PUSHA
45、、POPA (2)字符串输入指令INS ES:DI,DX( INSB 、INSW) (3)字符串输出指令OUTS DX,DS:SI (OUTB 、OUTW ) (4)数组界限检查指令BOUND DEST,SRC (5)建立堆栈空间指令ENTER DEST,SRC (6)取消建立的栈空间指令LEAVE (7)控制保护指令,控制保护指令有16条: LAR ;装入访问权限 LSL ;装入段界限 LGDT ;装入全局描述符表 SGDT ;存储全局描述符表 LIDT ;装入8字节中断描述符表 SIDT ;存储8字节中断描述符表 LIDT ;装入局部描述符表 SLDT;存储局部描述符表 LTR ;装入任务寄存器 STR ;存储任务寄存器 LMSW ;装入机器状态字 SMSW ;存储机器状态字 ARPL ;调整已请求特权级别 CLTS ;清除任务转移状态 VERR ;对存储器或寄存器读校验 VERW ;对存储器或寄存器写校验,