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]; DS数据段(BX)所指存储单元内容?AL
MOV [DI],AX; AX中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指令数据传送方向如下图所示:
立即数
通用寄存器
存储器 AX BX CX DX
BP SP SI DI
CS
段寄存器
DS ES SS
?除源操作数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)?(SP);SP?SP+1 L
(FR)?(SP);SP?SP+1; H
, 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各位无影响。
4byte16
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 CF
nSAL指令相当于乘以2,n为左移位数。 说明:COUNT为移位次数,可以是1,若COUNT大于1时,必须放在CL
中,移位结束后,CL值不变。因此移位位数可以是0~255,一般选0~16即可。
?算术右移 SAR DST, COUNT
功能: ? CF
n,n为右移次数。 , 等效于除以2
?逻辑右移 SHR dst,count
CF 功能: 0? ? ?循环左移 ROL dst ,count
CF 功能: ?
?循环右移 ROR dst, count
CF 功能: ?
?带进位循环左移 RCL dst, count
CF
功能: ?
?带进位循环右移 RCT dst count
CF
功能: ? ?说明:
, 每条指令只需一个操作数,可以是字或字节,也可以是寄存器或存储器
操作数。
, 影响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都要修改 CS段
I.段间转移直接寻址:要转移的“目OP码
标”地址在指令中直接给出。 50
新(IP)=0250H例:JMP FAR PTR TARGET 02
JMP指令即TARGET所对应物理地址应为00新(CS)=2000H2020250H
II.段间转移间接寻址:目标地址在
一个做地址指针的双字单元中。地址指针的前2个byte存放偏移量(IP),后2
个byte存放目标的段基址(CS)。
例:JMP DWORD PTR ADDR[BX]
JMP DWORD PTR [BX][SI]
?条件转移指令:8086共有18条
格式:JXX DST
?简单条件转移指令:10条
标志位 指令 转移条件 含义
JC CF=1 有进位/借位
CF
JNC CF=0 无进位/借位
JE/JZ ZF=1 相等/等于‘0’
ZF
JNE/JNZ ZF=0 不相等/不等于‘0’
JS SF=1 是负数
SF
JNS SF=0 不为负
OF JO OF=1 有溢出
JNO OF=0 无溢出
JP/JPE PF=1 有偶数个‘1’
PF
JNP/JPO PF=0 有奇数个‘1’ 功能:根据单个条件(状态)标志的设置情况转移。一般适用于测试某一次
运算的结果并根据其不同特征产生程序分支作不同处理的情况。 ?无符号数条件转移指令:4条
指令 转移条件 含义
JA/JNBE CF=0 AND ZF=0 A>B
JAE/JNB CF=0 OR ZF=1 A?B
JB/JNAE CF=1 AND ZF=0 A<B
JBE/JNA CF=1 OR ZF=0 A?B 功能:在条件转移指令前使用比较指令(CMP),比较两个无符号的数(A
——B),并根据比较的结果转移。
说明:
A:ABOVE 高于, B:BELOW低于, E:EQUAL 等于
?带符号数条件转移指令:4条
指令 转移条件 含义
JG/JNLE SF=OF AND ZF=0 A>B
JGE/JNL SF=OF OR ZF=1 A?B
JL/JNGE SF?OF AND ZF=0 A<B
JLE/JNG SF?OF OR ZF=1 A?B 功能:在条件转移指令前使用比较指令(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 ADD AX,ARRAY[SI]
MOV AX,0 ADD SI,2
MOV SI,AX LOOP START-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,则转移到目标地址;否则顺序执行。 六、 子程序的调用和返回指令
段内调用与返回直接寻址(直接调用),,,, 类型对FR无影响,,段间调用与返回间接寻址(间接调用),,
, 断点:子程序调用指令的下一条指令的首字节地址。 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。端口地址的确定方法同站上。