
《第3汇编指令系统(3)》由会员分享,可在线阅读,更多相关《第3汇编指令系统(3)(34页珍藏版)》请在文档大全上搜索。
1、例例3-37 32位数移位位数移位 ;将DX.AX中32位数值左移一位 shl ax,1 rcl dx,1 ;把AL最低位送BL最低位,保持AL不变 ror bl,1 ror al,1 rcl bl,1 rol al,1 例例3-38 BCD码合并码合并 ;AH.ALAH.AL分别存放着非压缩分别存放着非压缩BCDBCD码的两位码的两位 ;将它们合并成为一个压缩;将它们合并成为一个压缩BCDBCD码存码存ALAL and ax,0f0fh and ax,0f0fh;保证高;保证高4 4位为位为0 0 mov mov cl,4 cl,4 rol ah,cl rol ah,cl ;也可以用;也可以
2、用shl ah,clshl ah,cl add al,ah add al,ah ;也可以用;也可以用or al,ahor al,ah3.3.4串操作类指令串操作类指令串操作指令是串操作指令是80868086指令系统中比较独特的一类指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,常用指令,采用比较特殊的数据串寻址方式,常用于操作主存连续区域的数据于操作主存连续区域的数据主要熟悉:主要熟悉: MOVS STOS LODS CMPS SCAS REP 一般了解:一般了解: REPZ/REPE REPNZ/REPNE 串数据类型串数据类型串操作指令的操作数是串操作指令的操作数是主存中连续存
3、放的数据主存中连续存放的数据串(串(String)即在连续的主存区域中,字即在连续的主存区域中,字节或字的序列节或字的序列串操作指令的串操作指令的操作对象是以字(操作对象是以字(W)为单位的)为单位的字串,或是以字节(字串,或是以字节(B)为单位的字节串)为单位的字节串 串寻址方式串寻址方式源操作数用寄存器源操作数用寄存器SI寻址,默认在数据段寻址,默认在数据段DS中,中,但允许段超越但允许段超越目的操作数用寄存器目的操作数用寄存器DI寻址,默认在附加段寻址,默认在附加段ES中,中,不允许段超越:不允许段超越:ES:DI每执行一次串操作指令,每执行一次串操作指令,SI和和DI将自动修改:将自动
4、修改:u1(对于字节串)或(对于字节串)或2(对于字串)(对于字串)u执行指令执行指令CLD后,后,DF = 0,地址指针增,地址指针增1或或2u执行指令执行指令STD后,后,DF = 1,地址指针减,地址指针减1或或2 1.串传送串传送MOVS(move string)把字节或字操作数从主存的源地址传送至目的把字节或字操作数从主存的源地址传送至目的地址地址 MOVSB;字节串传送:;字节串传送:ES:DIDS:SI;SISI1,DIDI1 MOVSW;字串传送:;字串传送:ES:DIDS:SI;SISI2,DIDI2 mov si,offset source mov di,offset de
5、stination mov cx,100;cx传送次数 cld;置DF=0,地址增加 again: movsb;传送一个字节 dec cx;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束offsetoffset是汇编操作符,是汇编操作符,求出变量的偏移地址求出变量的偏移地址 例例 3-40 字串传送字串传送 movmov si,offset source si,offset source mov di,offset mov di,offset destination destination mov mov cx, cx,5050
6、;cxcx传送次数传送次数 cldcld ;置;置DF=0DF=0,地址增加,地址增加 again: movswagain: movsw ;传送一个字传送一个字 dec cxdec cx ;传送次数减;传送次数减1 1 jnz jnz again again ;判断传送次数;判断传送次数cxcx是否为是否为0 0 ;不为;不为0 0,则到,则到againagain位置执行指令位置执行指令 ;否则,结束;否则,结束2.串存储串存储STOS(store string)把把AL或或AX数据传送至目的地址数据传送至目的地址 STOSB ;字节串存储:;字节串存储:ES:DIAL ;DIDI1 STOS
7、W ;字串存储:;字串存储:ES:DIAX ;DIDI2 例例3-41 串存储串存储 mov ax,0 mov di,0 mov cx,8000h ;cx传送次数(321024) cld ;DF=0,地址增加again: stosw ;传送一个字 dec cx ;传送次数减1 jnz again;传送次数cx是否为03.串读取串读取LODS(load string)把指定主存单元的数据传送给把指定主存单元的数据传送给AL或或AX LODSB ;字节串读取:;字节串读取:ALDS:SI ;SISI1 LODSW ;字串读取:;字串读取:AXDS:SI ;SISI2例题3-42串读取串读取1 st
8、ring dw string dw 1234h,5678h,0abcdh 1234h,5678h,0abcdh cld cld mov si mov si, offset string, offset string lodswlodsw lodsw lodsw 4.串比较串比较CMPS(compare string)将主存中的源操作数减去目的操作数,以便设将主存中的源操作数减去目的操作数,以便设置标志位,进而比较两操作数之间的关系置标志位,进而比较两操作数之间的关系 CMPSB ;字节串比较:;字节串比较:DS:SIES:DI ;SISI1,DIDI1 CMPSW ;字串比较:;字串比较:DS
9、:SIES:DI ;SISI2,DIDI2例题3-43比较字符串比较字符串 CLD LEA SI, SOURCE LEA DI, DEST MOV CX, 100 NEXT: CMPSB JNZ LOOP1 DEC CX JNZ NEXT; MOV BX, 00H JMP DONE; LOOP1: DEC SI MOV BX, SI MOV AL, BX DONE:5.串扫描串扫描SCAS(scan string)将将AL/AX减去目的操作数,以便设置标志,进减去目的操作数,以便设置标志,进而比较而比较AL/AX与操作数之间的关系与操作数之间的关系 SCASB ;字节串扫描:;字节串扫描:AL
10、ES:DI ;DIDI1 SCASW ;字串扫描:;字串扫描:AXES:DI ;DIDI2例题3-44查找字符串查找字符串 STD MOV DI,OFFSET STRING MOV CX, 100 MOV AL,S NEXT: SCASB;搜索 JZ LOOP1; DEC CX ; JNZ NEXT; JMP DONE; LOOP1: INC DI MOV BX,DI DONE:重复前缀指令重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,
11、实现串操作的重复执行。以加一个重复前缀,实现串操作的重复执行。重复次数隐含在重复次数隐含在CX寄存器中。寄存器中。重复前缀分重复前缀分2类,类,3条指令:条指令: 配合不影响标志的配合不影响标志的MOVS、STOS(和(和LODS)指令的)指令的REPREP前缀前缀 配合影响标志的配合影响标志的CMPS和和SCAS指令的指令的REPZREPZ和和REPNZREPNZ前缀前缀1.REP重复前缀指令重复前缀指令 REP;每执行一次串指令,;每执行一次串指令,CX减减1 ;直到;直到CX0,重复执行结束,重复执行结束REP前缀可以理解为:当数据串没有结束前缀可以理解为:当数据串没有结束(CX0),则
12、继续传送,则继续传送重复串传送重复串传送 movmov si,offset source si,offset source mov di,offset mov di,offset destination destination mov mov cx,100 cx,100;cxcx传送次数传送次数 cldcld rep movsbrep movsb again: movsbagain: movsb ;传送一个字节;传送一个字节 dec cxdec cx;传送次数减;传送次数减1 1 jnzjnz again again ;判断传送次数;判断传送次数cxcx是否为是否为0 0 ;不为;不为0 0(
13、ZF=0ZF=0),则转移),则转移againagain位置执行位置执行 ;否则,结束;否则,结束2.REPZ重复前缀指令重复前缀指令 REPZ ; 执行的操作:执行的操作: 若若(CX)=0或或ZF=0时退出时退出,否则继续执行否则继续执行; (CX) (CX) -1; 重复执行其后的串指令重复执行其后的串指令; 重复重复REPZ/REPE前缀可以理解为:当数据串没有前缀可以理解为:当数据串没有结束结束(CX0),并且比较的数据相等,并且比较的数据相等(ZF1)时时,则继续比较,则继续比较3.REPNZ重复前缀指令重复前缀指令 REPNZ ;每执行一次串指令,;每执行一次串指令,CX减减1
14、;并判断;并判断ZF是否为是否为1, ;只要;只要CX0或或ZF1,重复执行结束,重复执行结束REPNZ/REPNE前缀可以理解为:当数据串没前缀可以理解为:当数据串没有结束有结束(CX0),并且串不相等并且串不相等(ZF0),则继续比较则继续比较 例题3-45比较字符串比较字符串 movmov si,offset string1 si,offset string1 mov di,offset mov di,offset string2 string2 mov cx,count mov cx,count cld cld repz cmpsbrepz cmpsb;重复比较两个字符;重复比较两个字
15、符 jnz unmatjnz unmat ;字符串不等,转移;字符串不等,转移 movmov al,0 al,0 ;字符串相等,设置;字符串相等,设置00h00h jmp jmp output output;转向;转向outputoutput unmat: unmat:movmov al,0ffh al,0ffh;设置;设置ffhffhoutput:output:mov result,almov result,al;输出结果标记;输出结果标记重复比较的解释重复比较的解释指令指令repz cmpsbrepz cmpsb结束重复执行的情况结束重复执行的情况 ZF ZF0 0,即,即出现不相等的字符
16、出现不相等的字符 CX CX0 0,即,即比较完所有字符:比较完所有字符:这种情况下,如果这种情况下,如果ZFZF0 0,说明有字符不等;,说明有字符不等;而而ZFZF1 1表示所有字符比较后都相等,也就表示所有字符比较后都相等,也就是两个字符串相同是两个字符串相同所以,重复比较结束后,所以,重复比较结束后,jnz unmat指令的条指令的条件成立件成立ZF0,字符串不相等,字符串不相等 3-46 查找字符串查找字符串 mov di,offset mov di,offset string string mov mov al,20h al,20h mov cx,count mov cx,coun
17、t cld cld repnz scasbrepnz scasb;搜索;搜索 jzjz found found ;为;为0 0(ZF=1ZF=1),发现空格),发现空格 . ;不含空格,则继续执行;不含空格,则继续执行 found:found:. 3-47 查找字符串查找字符串MOVSI,1000H;源地址为1000HMOVDI,2000H;目的地址为2000HMOVCX,100;字符串长100个字节CLD;方向标志清0,使指针 按增量方向修改REP MOVSB;将源地址开始的100个 字节传送到目的地址3.3.5 处理器控制指令处理器控制指令1.标志设定指令标志设定指令标志位操作指令直接对标
18、志位操作指令直接对CF、DF、IF标志进行标志进行复位或置位复位或置位对标志位进行设置的指令对标志位进行设置的指令 CLC STC CMC CLD STD CLI STI进位标志操作指令用于任意设置进位标志用于任意设置进位标志 CLCCLC;复位进位标志:;复位进位标志:CF0CF0 STC STC;置位进位标志:;置位进位标志:CF1CF1 CMC CMC;求反进位标志:;求反进位标志:CFCFCFCF方向标志操作指令 串操作指令中,需要使用串操作指令中,需要使用 CLDCLD;复位方向标志:;复位方向标志:DF0DF0 STD STD;置位方向标志:;置位方向标志:DF1DF1中断标志操作
19、指令在编写中断服务程序时,需要控制可屏蔽中断在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止的允许和禁止 CLICLI;复位中断标志:;复位中断标志:IF0IF0 STI STI;置位中断标志:;置位中断标志:IF1IF1 2.其它控制指令对对CPU状态进行控制的指令状态进行控制的指令NOP LOCK HLT ESC WAITNOP (no operation)不执行任何操作,但占用一个字节存储单元,不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期空耗一个指令执行周期NOP常用于程序调试常用于程序调试 在需要预留指令空间时用在需要预留指令空间时用NOP填充填充 代码空间多余时也
20、可以用代码空间多余时也可以用NOP填充填充 还可以用还可以用NOP实现软件延时实现软件延时封锁前缀指令 LOCK (lock bus) ;封锁总线这是一个指令前缀,可放在任何指令前这是一个指令前缀,可放在任何指令前这个前缀使得这条指令在执行过程中,这个前缀使得这条指令在执行过程中,8086 处理器的封锁输出引脚有效,处理器的封锁输出引脚有效,LOCK=0,即把总即把总线封锁,使别的控制器不能控制总线;直到该线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除指令执行完后,总线封锁解除暂停指令 HLT (holt) ;进入暂停状态;进入暂停状态暂停指令使暂停指令使CPU进入暂停状态
21、,这时进入暂停状态,这时CPU不进不进行任何操作。当行任何操作。当CPU发生复位或来自外部的中发生复位或来自外部的中断时,断时,CPU脱离暂停状态脱离暂停状态HLT指令可用于程序中等待中断。当程序中必指令可用于程序中等待中断。当程序中必须等待中断时,可用须等待中断时,可用HLT。当由中断使处理器。当由中断使处理器脱离暂停状态,在中断返回时,返回至脱离暂停状态,在中断返回时,返回至HLT指指令的下面一条指令。令的下面一条指令。交权指令交权指令ESCESC:CPUCPU调用协处理器工作调用协处理器工作. .等待指令等待指令WAIT;进入等待状态;进入等待状态若测试到若测试到TEST=0,则则CPU 处于暂停状态处于暂停状态;若测若测试到试到TEST=1,则则CPU脱离暂停状态脱离暂停状态,继续往下执继续往下执行行.8086利用利用WAIT指令和测试引脚实现与指令和测试引脚实现与8087同同步运行步运行