当前位置:文档之家› 第3章 8086指令系统(2)

第3章 8086指令系统(2)


执行RCR AL,1后,AL=1101 1010,CF=0
例1:将DX.AX中32位数值左移一位 SAL/SHL AX,1 RCL DX,1
DX
CF
AX
0
例2:测试BL寄存器中D5的状态,若为0,则转ZERO
MOV CL,3
ROL BL,CL JNC ZERO ; CF=0,转移到 ZERO
3.6 串操作指令 串操作指令是8086指令系统中比较独特的一类指 令,采用比较特殊的数据串寻址方式,在操作主存连 续区域的数据时,特别方便。 特点:
3.7.1 控制转移指令的寻址方式
8088/8086的寻址方式分为两类: 关于寻找数据的寻址方式 关于寻找转移地址的寻址方式 转移可以分成两类:段内转移和段间转移
例如: 若CF=1,CL=02H, AL=11011101 则执行指令:SHL AL,CL后, AL=01110100 , CF=1 则执行指令:SAL AL,CL后, AL=01110100 , CF=1 则执行指令:SHR AL,CL后, AL=00110111 , CF=0 则执行指令:SAR AL,CL后, AL=11110111 , CF=0
重复前缀共有5种:REP/REPZ/REPE/REPNZ/REPNE
重复前缀不能单独使用,只能加在串操作指令之前,用来 控制跟在其后的基本字符串操作指令,使之重复执行。
1) REP 无条件重复
执行的操作: ①若(CX)=0,则退出REP,否则往下执行; ②(CX)←(CX)-1; ③执行后跟的串操作指令; ④重复①~③。 REP前缀可以理解为:当数据串没有结束(CX≠0),则 继续传送。
若采用重复前缀,程序段如下: MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 REP MOVS AREA2,AREA1
2.串比较指令 CMPS
指令格式: CMPS dst,src 或 MCPSB/MCPSW 指令功能: ① DS:[SI] -ES:[DI] ② 修改地址指针:DI←DI ± 1,SI←SI ± 1 或 DI←DI ±2,SI←SI± 2 该指令把DS段中由SI所指的字节串或字串与ES段中的由DI 所指的字节串或字串比较 (进行相减),但不送回结果,只影响 OF、SP、ZF、AF、PF和CF,并在比较之后,自动修改地址 指针。
3.5 移位指令和循环移位指令 3.5.1 移位指令 移位指令:算术左、右移指令SAL、SAR 逻辑左、右移指SHL、SHR。 格式 SHL src,CL1/1 SAL src,CL/1 SAR src,CL/1 SHR src, CL/1
其功能是用来实现对寄存器或存储单元的 8位或16位数据移动一位或多位。 移位指令的第一个操作数是指定的被移 位的操作数,可以是寄存器或存储单元;后 一个操作数表示移位位数: 若该操作数为1,表示移动一位 若该操作数为CL,CL寄存器值表示移位 位数 (移位位数大于1只能用CL表示)
5. 存字符串指令 STOS
指令格式:STOS dst 或 STOSB/STOSW 指令功能: ① ES:[DI] ← AL /AX ② 修改地址指针:DI←DI ± 1 或 DI←D到ES段由DI所指的内存单元, 并且自动修改地址指针(DI)←(DI)+1(或2)。STOSB/STOSW可以 与REP前缀配用,实现在串内存单元中填入某一相同的数。
1.算术左移指令SAL /逻辑左移指令SHL
指令格式:SAL/ SHL dst,CL/1 指令功能:SAL和SHL的操作相同,将目的操作数顺序向左 移位,最低位补0,最高位进入CF 操作数:8位或16位,寄存器或存储器
CF
dst 0 SAL
CF
dst
0 SHL
例如:SAL SI,1
SHL BYTE PRT [BX],CL
1)串操作指令的操作数是主存中连续存放的数据串 (String)——即在连续的主存区域中,字节或字的序列 2)串操作指令的操作对象是以字(W)为单位的字串, 或是以字节(B)为单位的字节串。
3)源操作数用寄存器SI寻址,默认在数据段DS中,但允 许段超越:DS:[SI] 目的操作数用寄存器DI寻址,默认在附加段ES中,不允 许段超越:ES:[DI]
注意:在使用该指令前将搜索的关键字存于AL/AX 中,若找到搜索字,ZF=1。
例:在ES段偏移地址为1000H的存储区中,有一个长度为 50的字符串,查找是否存在‘空格’符。 程序段如下: MOV DI,1000H MOV AL,20H ;取空格ASCII码 MOV CX,32H ;比较字节个数送CX CLD ;设置增址比较 REPNE SCASB ;搜索 JZ FOUND ;ZF=1,发现空格 ... ;不含空格,则继续执行 FOUND: ... 注意:找到后对应的字符单元为DI-1
例:数据区的初始化(清零或置同一数)
例:编程使ES段中从0400H开始的256个单元清0。 程序段如下: LEA DI,ES:[0400H] MOV CX,0080H CLD XOR AX,AX REP STOSW
;DI指向存储目的首址 ;计数值为128个字 ;增址存储
;0重复存入256个字节中
3.7 控制转移指令
4)串操作指令执行时,由方向标志决定数据串处理方向,当 DF=0时(执行CLD指令后),表示正向处理(地址指针增1或 2);当DF = 1时(执行指令STD后),表示反向处理(地址 指针减1或2)。 5)串长度必须放在CX寄存器中
6)可在串操作指令前加重复前缀,每重复执行一次,CX 内容会自动减1。 需注意的是,执行带有重复前缀的指令时,对CX的检 测是在执行指令前进行的。
8086的指令执行顺序由代码寄存器CS和指令指针IP的内容 确定。
控制转移类指令通过改变IP(和CS)值, 实现程序执行顺序的改变
8086的控制转移类指令可分为四小类,即无条件转移 与调用返回、条件转移、循环控制和中断类指令。除中断 类指令外,其它类指令均不影响标志位。
控制转移类指令用于实现分支、循环、过程等程序结 构,是仅次于传送指令的最常用指令
3. 算术右移指令SAR 格式:SAR dst, 1/CL 功能; dst右移1/CL位;最高位不变,最低位进入CF opr CF SAR
算术左移一位相当于有符号数乘以2 算术右移一位相当于有符号数除以2
-64≤x≤+63 -128≤x≤+127
标志位:移位指令按照移入的位设置进位标志CF,根据移位后 的结果影响SF、ZF、PF、OF 由于移位后可能使符号位发生变化,可通过测试OF 位来判断。 当移位次数为1时:OF=1 ——移位前后符号位有变化 OF=0 ——移位前后符号位无变化
或 DI←DI ±2,SI←SI± 2
*用 MOVS 指令可实现存储器单元间的数据传送; *前面加REP指令可实现一批存储器单元间的数据传送。
例3-7 : 将数据段中从AREA1开始存放的100个字节数据传送 到附加段以AREA2为首地址的区域。 采用用字符串传送指令实现。程序段如下: MOV SI,OFFSET AREA1 LEA SI,OFFSET AREA1 MOV DI,OFFSET AREA2 LEA DI,OFFSET AREA2 MOV CX,100 offset是汇编操作符, AGAIN:MOVS AREA2,AREA1 求出变量的偏移地址 DEC CX 转移指令,ZF ≠ 0转 JNZ AGAIN
CF
opr
ROL
CF
opr
RCL opr RCR CF
CF
opr ROR
循环移位指令的操作数形式与移位指令相同,按指令功能 只影响CF和OF,同样只有当cnt=1时,OF才有意义。不影 响SF、ZF、PF、AF标志 特点:不会丢失源操作数的有效数位 例:设AL=1011 0100B,CF=1执行下列语句: 执行ROL AL,1 后,AL=0110 1001,CF=1 执行ROR AL,1后,AL=0101 1010,CF=0 执行RCL AL,1后,AL=0110 1001,CF=1
4.取字符串指令 LODS
指令格式: LODS src 或 LODSB/LODSW
指令功能: ① AL /AX ←DS:[SI]
② 修改地址指针:SI←SI ± 1或 SI←SI± 2 该指令用来把DS段中由SI所指的存储单元的内容取到AL(或 Ax)中,因此,LODSB/LODSW指令不能加前缀,否则,AL或 AX中的内容会被后一次取入的字符所覆盖。 LODS指令不影响状态标志位。
2) REPE/REPZ 相等/结果为0 (ZF=1)时重复
指令功能:若CX≠0,且ZF=1,重复执行,CX←CX-1, 若CX=0,或 ZF=0,执行下一条指令。
一般用于比较指令和搜索指令,表示只有当两数相等方可 继续比较;若遇到两数不相等时,则可提前结束串操作。即当 数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比 较.
3.5.2 循环移位指令
循环移位指令有四条类似移位指令,但要将从一端移 出的位返回到另一端形成循环。分为: ROL dst, 1/CL ;不带进位循环左移 ROR dst, 1/CL ;不带进位循环右移 RCL dst, 1/CL ;带进位循环左移 RCR dst, 1/CL ;带进位循环右移
串比较指令前可采用重复前缀 REPE/REPZ ,其意义为 当CX=0或ZF=1(两元素相同),重复执行结束。 串比较指令前还可采用重复前缀 REPNE/REPNZ ,其意义为 当CX=0或ZF=0 (两元素不相同),重复执行结束。
例3-8: 上例用MOVS指令传送后,源数据串与目的字节串, 是否相同。若不一样,将找出的不一样的元素存入AL中, 并将偏移地址并记入BX,若相同,在BX中置数FFFFH。 程序段如下: CLD ;设置增址比较 MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,64H REPE CMPSB ;增址重复比较 JNZ ERROR ;出现不相同元素转移 MOV BX,0FFFFH ;两数据串相同 JMP STOP ERROR : DEC SI MOV BX,SI MOV AL,[SI] STOP:HLT---
相关主题