第三章8086CPU指令系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 8086CPU指令系统
本章重点:
1.寻址方式:
立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,基址寻址,变址寻址,基址加变址寻址,串寻址,端口寻址,隐含寻址。
2.8086指令系统:
数据传送指令,算术运算指令,移位指令,程序控制指令,串操作指令,处理器控制指令,I/O指令,中断指令。
学习目标:
1.掌握寻址方式;
2.掌握常用指令的功能和用法。
难点:
区别指令的正确与错误。
§1.寻址方式
指令在存储器中是顺序存放的,而操作数的存放没有规律,因此操作数的寻址方法相对比较复杂。
一、指令的基本格式
1.组成:
一条指令包括操作码和操作数两部分。
操作数:源操作数,目标操作数。
2.寻址方式:
寻找指令中操作数的方法。
3.操作数类型:(8086系统)
寄存器操作数,存储器操作数,立即数(在指令代码中)和I/O端口操作数。
二、寻址方式
1.立即数寻址
⑴方式:
指令中所需的操作数直接包含在指令代码中(即由指令直接提供),立即数可以是8位,也可以是16位。
例:MOV AL,80H ;将十六进制数80H送入AL
MOV AX,1090H;将1090H送AX:90H→AL ,10H→AH
⑵说明:
●采用立即数寻址方式的指令主要用来对寄存器赋值。
因为操作数可以从
指令中直接取得,不需要运行总线周期,所以,其显著特点就是速度快。
●规定:立即数只能是整数,不能是小数,变量或者其他类型的数据;另
外,立即数只能作为源操作数。
2.寄存器寻址
⑴方式:
如果操作数就在CPU的内部寄存器中,那么寄存器名可在指令中指出,这种寻址方式就叫寄存器寻址。
对16位操作数来说,寄存器可以为AX,BX,CX,DX,SI,DI,SP或BP,而对8位操作数来说寄存器可以为AH……DH,AL……DL。
例:INC CX ;将CX内容加1
ROL AH,1 ;将AH中的内容循环左移1位。
⑵说明:
●不需要使用总线周期,因此,执行速度快。
●一条指令中,可以对源操作数采用寄存器寻址方式,也可对目的操作数
采用寄存器寻址方式,或两者都用。
※以下各种寻址方式,操作数都在存储器中。
3.直接寻址。
⑴方式:
数据总是在存储器中,存储单元的有效地址由指令直接指出。
例:MOV AX,[1070H];将DS段的偏移量1070H、1071H的内容装入AX。
即,若DS=2000H,则将21070H和21071H两单元的内容取出送AX。
⑵说明:
●直接寻址是对存储器进行访问时可采用的最简单的方式,且可用符号地
址代替数值地址。
●若要对其它段寄存器所指出的存储区进行直接寻址,则必须指出段寄存
器名。
例:MOV BX ,CS:[3000H];
设CS=5100H,则取54000H和54001H两单元内容送BX。
4.寄存器间接寻址
⑴方式:
将操作数所在的存储单元的偏移地址放在指令给出的寄存器中,而不像直接寻址那样直接给出。
例:MOV AX,[SI];AX←DS:[SI]
MOV [BX],AX;DS:[BX]←AX
⑵说明:
●可用于这种寻址方式的寄存器只能是SI、DI、BP和BX。
●SI,DI,BX约定的段寄存器是DS;而BP约定的段寄存器是SS。
5.基址寻址:
⑴方式:
操作数的有效地址偏移量是基址寄存器BX或基址指针BP的内容与指令给
定的位移量(8位或16位)之和。
例:MOV AX,ARRAY[BX]
等价MOV AX,[ARRAY+BX]
将DS:[BX]+ARRAY 的内容→AX
⑵说明:
●BX约定的段寄存器为DS,BP约定SS,可使用段跨越前缀。
●物理地址=16×(DS)+(BX)+位移量(8或16位)
或16×(SS)+(BP)+位移量(8或16位)
6.变址寻址
操作数的有效地址是变址寄存器SI、DI的内容与指令给定的位移量(8位或16位)之和。
段寄存器约定在DS中,允许段超越。
例:MOV [DI+12H],AX;DS:[DI+12H]←AX
MOV BX,SS:[DI+45H];BX←SS:[DI+45H]
7.基址变址寻址。
⑴方式:
操作数的有效地址是指令给定的位移量和一个基址寄存器(BX或BP)及一个变址寄存器(SI或DI)的内容之和。
段寄存器约定由基址寄存器决定,BX 约定DS,BP约定SS,允许段超越。
例:MOV AX,ARRAY[BX] [SI];
等价MOV AX,[BX+SI+ARRAY];
即:AX←DS:[BX+SI+ARRAY]
⑵说明:
基址寄存器BX,BP不能同时出现在一个方括号内;变址寄存器SI,DI亦如此。
8.串操作寻址方式:
用于串操作指令,其操作数虽然也在寄存器中,但不使用上述寻址方式,而是隐含地运用,SI指出源串偏移地址,DI指出目的串偏移地址。
指令执行后,SI和DI的内容根据方向标志DF的值进行增减,DF=0增,DF=1减。
若串操作按字节进行,增/减“1”;若串操作按字进行,增/减“2”。
●约定源串段地址在DS中,目的串段地址在ES中,不允许段超越。
即
SI→DS DI→ES
例:MOVSB ;字节传送:ES:[DI]←DS:[SI]。
传送完后,SI±1,DI±1。
9.I/O端口寻址:操作数在外设端口中。
⑴直接端口寻址:
指令中直接给出的8位常数是外设端口地址。
(0~255)
例:IN AL,34H;AL←[34H]
OUT 34H,AL;[34H]←AL
⑵间接端口寻址:指令中外设端口的16位地址在DX中。
例:MOV DX,280H
IN AX,DX;AX←[280H]
§2 指令系统
目前在微机上常见的汇编语言是MASM(Macro Assembler Language 宏汇编语言),因此我们以8086/8088 MASM为主要介绍内容,也涉及一些MASM 5.0,MASM 6.0等版本内容。
OPR 指令助记符
SRC 源操作数
DEST 目的操作数
零操作数在指令中隐含指明了操作数所处的地方。
一、传送类指令
1.数据传送指令(MOVE)
⑴格式:MOV DEST ,SRC (不区分大小写)
⑵功能:
可以进行字节数据传递,也可以进行字数据传送。
但SRC和DEST的长度必须一致,不能一个是字节数据,而另一个是字数据。
⑶举例:
①CPU通用寄存器之间传递
MOV CL,AL;8bit
MOV SI,AX;16bit
②通用寄存器与段寄存器之间传递。
MOV DS,AX;AX中16位→DS
MOV AX,ES;ES→AX
③通用寄存器与存储单元之间
MOV AL,[BX];D S数据段(BX)所指存储单元内容→AL
MOV [DI],AX;A X中16位数据→DS:(DI)(DI)+1
MOV [2000H],CX;CX中16位→DS:(2000H)(2001H)
④段寄存器和存储单元之间
MOV DS,[2000H];DS:[2000H] [2001H]→DS
MOV [BX][SI],CS;CS→DS:[BX]+(SI)(BX)+(SI)+1
⑤立即数到通用寄存器。
MOV SP,2000H;2000H→SP
⑥立即数到存储单元。
MOV WORD PTR[SI],4501H;4501H→DS:(SI)(SI)+1 *PTR汇编操作符与WORD一起表示字操作,因为4501H类型不确定。
BYTE PTR限定字节。
⑷说明:
MOV指令数据传送方向如下图所示:
①除源操作数SRC是立即数的情况外,MOV指令中DST和SRC必须要用到一个寄存器,不允许用MOV在两个存储单元之间传送数据。
若需要时,可借助一通用寄存器为桥梁,即:
MOV AL,[SI]
MOV [DI],AL
②不能用CS和IP作目的操作数,即这两个数的内容不能随便改变。
③不允许在段寄存器之间直接传送数据。
④不允许用立即数作目的操作数。
⑤不能向段寄存器送立即数,因此,对段寄存器初始化赋值时,要通过通用寄存器。
MOV AX,DATA
MOV DS,AX
2.交换指令(Exchange)
⑴格式:
XCHG DST,SRC
⑵功能:
源操作数和目的操作数两者的内容相互交换。
⑶举例;
XCHG BX,[BP] [SI]
设指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,
SRC物理地址=2F000+0200+0046=2F246
则:(BX)=4154,(2F246H)=6F30H
⑷说明:
①两个操作数必须有一个在寄存器中。
即可以在寄存器之间或寄存器与存储器之间交换信息。
②不允许使用段寄存器。
③允许字或字节操作,且不影响标志位。
3.堆栈操作指令(PUSH/POP)
堆栈是以“后进先出”的原则暂存一批需要保护的数据或地址的一个特定存储区。
堆栈段段地址由SS提供,偏移地址由SP提供,SP始终指向栈顶。
堆栈操作有压栈(PUSH)和出栈(POP)两种,均以字为单位。
●压栈过程:例PUSH AX
①SP←SP-1
②(SP)←AH
③SP←SP-1
④(SP)←AL
●出栈过程:例POP BX
①BL←(SP)
②SP←SP+1
③BH←(SP)
④SP←SP+1
4.标志位传送指令。
对标志位寄存器进行操作有4条指令,都是零操作数。
⑴取标志寄存器指令(Load register AH from Flag)
格式:LAHF
功能:把标志寄存器的低8位传送给AH寄存器,即把SF,ZF,AF,PF
和CF标志位分别送至AH的第7、6、4、2、0位,AH的第5、3、1位是任意的,指令对标志寄存器的各位无影响。
⑵存储标志寄存器(store register AH into Flag)
格式:SAHF
功能:把寄存器AH中的第7、6、4、2、0位的内容送至FR的SF、ZF、AF、PF、CF标志位,而FR的OF、DF、IF、TF各位不受影响。
⑶标志位进栈(Push Flag)
格式:PUSHF
功能:将FR压入堆栈。
该指令首先把堆栈指针SP减2,然后将16位标志寄存的全部内容送入SP指向的堆栈顶部字单元中。
FR中各标志位本身不受影响。
进栈步骤:SP←SP-1;(SP)←(FR)H
SP←SP-1;(SP)←(FR)L
※堆栈采用“后进先出”原则。
⑷标志位出栈(POP Flag)
格式:POPF
功能:将堆栈顶部的内容弹入标志寄存器。
该指令首先根据SP找到堆栈顶部,并将堆栈顶部的一个字的内容送入FR,然后SP加2。
FR中各标志位的状态,由从堆栈中弹出内容的相应位决定。
出栈步骤:(FR)L←(SP);SP←SP+1
(FR)H←(SP);SP←SP+1;
●PSHF和POPF一般用在子程序和中断处理程序的首尾,起保存和恢复
主程序标志的作用。
●FR中CF、DF、IF有专门指令进行修改,其余标志位都没有指令对它
们直接进行设置或修改。
若要修改这些位,可首先用LAHF把含SF的
FR低8位送入AH,对AH相应位进行修改,然后用SAHF送回FR。
●对TF位修改可先用PSHF将FR压入堆栈,在堆栈中设置TF,然后用
POPF返回。
5.地址传送指令。
该指令传送的是存储单元的地址,而不是它的内容。
⑴装入有效地址(Load effective address):
①格式:LEA DST,SRC
②功能:将源操作数的有效地址(即偏移量EA)送到指定的寄存器。
③举例:
LEA BX,0F62H [BX][SI]
若指令执行前:(BX)=0400H,(SI)=003CH
则指令执行后:(BX)=0400+003C+0F62=139EH
④说明:目的操作数一定是16位的通用寄存器;此指令对FR各位无影响。
▲存放一个存储单元逻辑地址的地址指针需要4个byte,其中高16位(两个高字节)用来存放基址,低16位(两个低字节)用来存放偏移量。
⑵LDS(Load DS with Pointer)指针送寄存器和DS:
①格式:LDS DST,SRC
②功能:把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。
该指令常指定SI寄存器。
③举例:
LDS SI ,[10H]
若指令执行前:(DS)=C000H,(C0010H)=0180H,(C0012H)=2000H,则指令执行后:(SI)=0180H,(DS)=2000H
⑶LES(Load ES With Pointer)指针送寄存器和ES
①格式:LES DST,SRC
②功能:把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。
该指令常指定DI。
二、算术运算类指令。
1.加法指令(Addition)
⑴格式:ADD DEST ,SRC
⑵功能:目的操作数和源操作数相加,它们的和存放在目的操作数中,源操作数内容不变,即,DST←(DST)+(SRC)
⑶说明:
●DST:通用寄存器,存储器
●SRC:通用寄存器,存储器,立即数
●FR:影响CF、DF、AF、ZF、SF、OF
●两操作数不能同时为存储器操作数。
●参加运算的数可以是带符号数或无符号数。
OF位用来表示带符号数的
溢出,CF位用来表示无符号数的溢出。
⑷例:
ADD AX,BX
ADD AL,CL
ADD CX,34
ADD DL,DA_BYTE
2.带进位加法指令。
格式:ADC DST ,SRC
功能:DST←(DST)+(SRC)+CF
用于双精度加法,即低16位向高16位有进位的情况,其余同ADD指令。
3.加“1”指令(Increment)
⑴格式:INC DST
⑵功能:DST←(DST)+1
⑶说明:
●操作数可以是8位或16位通用寄存器或存储单元,但不能是立即数。
●FR:影响PF、AF、ZF、SF、OF;不影响CF
●这条指令一般用在循环程序中修改指针和循环次数(即用于计数器)。
4.减法指令
⑴格式:SUB DST ,SRC
⑵功能;DST←(DST)-(SRC)
⑶说明:
●DST:通用寄存器,存储器
●SRC:通用寄存器,存储器,立即数
●FR:影响CF、DF、AF、ZF、SF、OF
●两操作数不能同时为存储器操作数。
●参加运算的数可以是带符号数或无符号数。
OF位用来表示带符号数的
溢出,CF位用来表示无符号数的溢出。
⑷例:SUB BX,CX ;BX←(BX)-(CX)
5.带借位减法
⑴格式:SBB DST,SRC
⑵功能:DST←(DST)-(SRC)-CF
⑶说明:同SUB指令。
6.减“1”指令
⑴格式:DEC DST
⑵功能:DST←(DST)-1
⑶说明:
●操作数可以是8位或16位通用寄存器或存储单元,但不能是立即数。
●FR:影响PF、AF、ZF、SF、OF;不影响CF。
●这条指令一般用在循环程序中修改指针和循环次数。
7.求负数指令(Negative)
⑴格式:NEG DST
⑵功能:DST←0-(DST)
⑶说明:也称取补指令。
●影响:CF,PF,AF,ZF,SF,OF
8.乘法指令
⑴无符号数乘法指令:MUL SRC
功能:AX←AL*(SRC)(字节乘法)
DXAX←AX*(SRC)(字乘法)
说明:
●操作数可以是通用寄存器、存储器,不能是立即数。
●字节乘:若乘积高8位AH≠0,则CF=1,OF=1;
若乘积高8位AH=0,则CF=0,OF=0。
●字乘:若乘积高16位DX≠0,则CF=1,OF=1;
若乘积高16位DX=0,则CF=0,OF=0。
●例:MUL BX ;DXAX←AX*BX
MUL BYTE PTR [SI];AX←AL*(DS:[SI])
⑵带符号数乘法指令:IMUL SRC
功能:同MUL指令
说明:同MUL指令,但若乘法结果AH或DX(高位部分)只是低(8或16)位部分的符号扩展,则OF=0,CF=0。
9.除法指令
⑴无符号数除法指令:DIV SRC
功能:AL←AX/(SRC),余数在AH中,(字节除)
AX←DXAX/(SRC),余数在DX中(字除)
说明:若商超过AL(字节除)或AX(字除)的范围(FFH或FFFFH)时,系统会自动产生0类中断,且商和余数都不确定。
其他与乘法指令同。
对FR无定义。
⑵带符号数除法指令:IDIV SRC
功能:同上
说明:余数符号和被除数符号相同。
三、位操作类指令。
1.逻辑运算指令。
⑴格式:逻辑“与”:AND DST,SRC
逻辑“或”:OR DST,SRC
逻辑“异或”:XOR DST,SRC
逻辑“非”:NOT DST
⑵功能:对字节或字进行逻辑运算。
主要用于字节或字中某些位的组合,分离或位设置。
例:
AND AL,0FH;分离AL低4位
AND AL,F0H;分离AL高4位
OR AL,04H;AL第4位置“1”
⑶说明:
●SRC可以是寄存器,存储器或立即数。
而DST只能是通用寄存器或存
储器。
且二者不能同为存储器。
●运算结果均送回目的操作数。
●FR:NOT指令对FR各位无影响;其它三条指令影响相同,SF、ZF、
PF,另外,CF和OF总是置“0”,AF不确定。
2.测试指令(TEST)
格式:TEST DST,SRC
功能:与AND指令相同,但运算结果不送回DST,只根据运算结果设置FR。
该指令主要用来测试一个操作数的某一位或某几位的状态。
●通常将被测试数置于DST,测试用的位模式置于SRC。
例:TEST AL,01H ;测试AL最低位是否为“1”
若AL最低位为“0”,则ZF=1;
若AL最低位为“1,则ZF=0;
3.移位/循环,移位指令
⑴算术左移SAL DST,COUNT
逻辑左移SHL DST,COUNT
←0
SAL指令相当于乘以2n,n为左移位数。
说明:
COUNT为移位次数,可以是1,若COUNT大于1时,必须放在CL 中,移位结束后,CL
值不变。
因此移位位数可以是0~255,一般选0~16即可。
⑵算术右移SAR DST,COUNT
功能:
●等效于除以2n,n为右移次数。
⑶逻辑右移SHR dst,count
功能:0
⑷循环左移ROL dst ,count
功能:
⑸循环右移ROR dst, count
⑹带进位循环左移RCL dst, count
⑺带进位循环右移RCT dst count
功能:
△说明:
●每条指令只需一个操作数,可以是字或字节,也可以是寄存器或存储器
操作数。
●影响AF以外的各标志位,而AF不定;当Count= 1时,OF才有意义,
当移位前操作数的最高两位相同时,移位后OF=0;当最高两位不同时,
OF=1。
四、串操作指令
串操作指令中源操作数地址由DS:[SI]提供,目的串操作数地址由ES:[DI]提供。
每条串操作数指令每次仅对串中一个字或一个字节单元进行查找,且根据DF标志自动修改SI/DI。
为了便于对串中多个字或字节单元进行串操作,指令系统设置有重复前缀,重复次数由CX中的内容确定,每执行一次,CX内容减1,而对CX的检测是在执行指令前进行的,最多64K。
1.重复前缀(Repeat)
⑴REP
功能:若CX≠0,重复执行后缀的串指令,CX←CX-1
若CX=0,重复执行结束。
例:REP MOVSB
⑵REPE/REPZ 当相等/为零时重复串操作。
功能:若CX≠0,且ZF=1,重复执行后缀的串指令,CX←CX- 1
若CX=0,或ZF=0,重复停止。
⑶REPNE/REPNZ 当不相等/不为零时重复串操作。
功能:若CX≠0,且ZF=0,重复执行后缀的串指令,CX←CX- 1
若CX=0或ZF=1,重复停止。
△说明;
●LODS、STOS、MOVS不影响FR,所以使用REP。
●CMPS、SCAS,结果要反映在FR上,所以常使用REPE/REPZ和
REPNE/REPNZ。
2.串传送:不影响FR
⑴MOVSB
功能:ES:[DI]←DS:[SI],DI←DI±1,SI←SI±1
⑵MOVSW
功能:ES:[DI]←DS:[SI],但DI←DI±2,SI←SI±2
3.串取出:不影响FR
⑴LODSB
功能:AL←DS:[SI],SI←SI±1
⑵LODSW
功能:AX←DS:[SI],SI←SI±2
4.串存入:不影响FR
⑴STOSB
功能:ES:[DI]←AL,DI←DI±1
⑵STOSW
功能:ES:[DI]←AX,DI←DI±2
5.串比较:
比较方法:将源串中的一个字或字节减去目的串中的一个字或字节,不保留相减结果,但在FR中反映。
⑴CMPSB
功能:DS:[SI]——ES:[DI]
⑵CMPSW
功能:同上,按字比较。
6.串搜索:
在目的串中查找AX或AL指定的内容。
查找方法是用AX或AL的内容减去目的串中一个字或一个字节,相减结果反映在FR中。
⑴SCASB
⑵SCASW
五、循环和转移指令
1.转移指令
转移指令分为:无条件转移指令和条件转移指令
⑴无条件转移指令
格式:JMP DST
功能:使程序无条件的转移到“目标”处,“目标”通常用标号来表达。
例:JMP TARGET
TARGET:……
说明:JMP指令不影响FR。
段内转移:只改变IP指针的内容,有直接寻址
和间接寻址两种;段间转移:CS、IP都改变,也分直接寻址和间接寻址两种。
①段内转移:只改IP,CS不变。
I.段内转移直接寻址:格式同上,DST只需使用符号地址。
●短转:IP←IP+8bit位移
如:JMP SHORT DST
●近转:IP←IP+16bit位移
如:JMP NEAR PTR DST
II.段内转移间接寻址:目标地址在某一个通用寄存器或某一字存储单元中。
例:JMP CX 或JMP WORD PTR[BX] 即DS:[BX]→IP
②段间转移:CS,IP都要修改
标”地址在指令中直接给出。
例:JMP FAR PTR TARGET
即TARGET所对应物理地址应为
20250H
II.段间转移间接寻址:目标地址在
一个做地址指针的双字单元中。
地址指针的前2个byte存放偏移量(IP),后2个byte存放目标的段基址(CS)。
例:JMP DWORD PTR ADDR[BX]
JMP DWORD PTR [BX][SI]
⑵条件转移指令:8086共有18条
格式:JXX DST
①简单条件转移指令:10条
功能:根据单个条件(状态)标志的设置情况转移。
一般适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况。
②无符号数条件转移指令:4条
功能:在条件转移指令前使用比较指令(CMP),比较两个无符号的数(A ——B),并根据比较的结果转移。
说明:
A:ABOVE 高于,B:BELOW低于,E:EQUAL 等于
③带符号数条件转移指令:4条
功能:在条件转移指令前使用比较指令(CMP),比较两个带符号数,并根据比较的结果转移。
说明:
G:Greater 大于,L:Less 小于
⑶比较指令
格式:CMP DST,SRC
功能:减法类型指令。
(DST)-(SRC),其结果不送回(DST),仅根据结果设置FR。
说明:
ZF=1时,表示(DST)=(SRC)
无符号数:CF=0,表示(DST)≥(SRC);
CF=1,表示(DST)<(SRC)
有符号数:OF=SF,表示(DST)>(SRC);
OF≠SF,表示(DST)<(SRC)
2.循环指令:4条
特点:都是段内短距离相对转移指令,转移范围在-128~+127(8bit)之间;都隐含使用CX寄存器作为循环次数计数器,都需要把循环次数送给CX;执行后对FR均无影响。
⑴LOOP指令
格式:LOOP DST
功能:CX←CX-1,若CX≠0则转移到目标地址;若CX=0则顺序执行。
例:有一个首地址为ARRAY的M个字的数组,试编一程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL中。
MOV CX,M
MOV AX,0
MOV SI,AX START-LOOP:ADD AX,ARRAY[SI] ADD SI,2
LOOP START-LOOP MOV TOTAL,AX
⑵LOOPE/LOOPZ指令
格式:LOOPE DST 或LOOPZ DST
功能:CX←CX-1
若CX≠0,且ZF=1,则转移到目标地址;否则顺序执行。
⑶LOOPNE/LOONZ指令
格式:LOOPNE DST 或LOOPNZ DST
功能:CX←CX-1
若CX≠0,且ZF=0,则转移到目标地址;否则顺序执行。
△LOOPZ、LOOPNZ指令提供了提前结束循环的可能性。
譬如,有时需要在字符串中查找一个字符,找到后可提前结束循环而不需要一查到底。
例:NEXT:……
……
CMP AL,ASCⅡSTR[SI]
LOOPNE NEXT
……
⑷JCXZ 指令 格式:JCXZ DST
功能:若CX=0,则转移到目标地址;否则顺序执行。
六、 子程序的调用和返回指令
● ● 断点:子程序调用指令的下一条指令的首字节地址。
1.子程序调用指令 格式:CALL 过程名
功能:先保护程序断点 段内调用:当前IP 内容压栈保护。
CS 压栈,再把IP 内容压栈保护。
然后无条件转移到目标地址。
2.返回指令
格式:RET 或RET n
功能:执行与CALL 相反的操作,从子程序返回主程序。
若指令不带操作数 段内返回:IP ←SP SP ←SP+2
段间返回:IP ←SP ,SP ←SP+2;CS ←SP ,SP ←SP+2
若带立即操作数,上述功能完成后,再次修改SP 的值,即:SP ←SP+n ,n 为偶数。
七、 输入输出指令 1.输入指令
格式:IN OPRN1,OPRN2
说明:OPRN1是AL 或AX ;OPRN2是端口地址。
若采用直接寻址,OPRN2可以是立即数形式,端口地址在0~255(8位)之间;间接寻址时,需要用DX 寄存器存放16位端口地址,地址范围在0~65535之间。
2.输出指令
格式:OUT OPRN1,OPRN2
说明;OPRN1为端口地址;OPRN2为累加器AL 或AX 。
端口地址的确定方法同站上。
无影响对间接寻址(间接调用)
直接寻址(直接调用)
段间调用与返回段内调用与返回类型FR
⎝⎛⎩⎨⎧。