汇编语言程序设计
⑤ 循环左移指令
格式:ROL OPR,CNT 操作:
⑥ 循环右移指令
格式:ROR OPR,CNT 操作:
⑦ 带进位循环左移指令 格式:RCL OPR,CNT 操作:
⑧ 带进位循环右移指令 格式:RCR OPR,CNT 操作:
说明:
1. 可以为字/字节操作
2. 对条件码的影响(CF)
3. OPR可以是除立即数以外的任何寻址方式
4、串操作指令
包括: MOVS,CMPS,SCAS ,LODS,STOS 与上述指令配合使用的前缀有:
- 20 -
汇编语言程序设计
REP 重复
REPE/REPZ 当相等/为零时重复
REPNE/REPNZ 当不相等/不为零时重复
1)重复指令 ① REP重复串操作 格式:REP 串指令 操作:
1. CX=0时,退出REP,否则继续执行 2. CX=CX-1
3. 执行REP后面的串指令 4. 重复1.~3. ② REPE/REPZ 当相等/为零时重复串操作 格式:REPE(或REPZ) 串指令 操作:
1. CX=0或ZF=0时退出,否则继续执行 2. CX=CX-1
3. 执行REPE/REPZ后面的串指令 4. 重复1.~3. ③ REPNE/REPNZ 当不相等/不为零时重复串操作
当CX=0或ZF=1时退出,其余的操作与REPE/REPZ相同
2)串处理指令 ① MOVS 串传送指令
格式:MOVSB 字节操作,MOVSW字操作 操作: ·((DI))←((SI)) ·修改SI,DI
字节:(SI)←(SI)±1 ,(DI)←(DI)±1 字:(SI)←(SI)±2 ,(DI)←(DI)±2 注:DF=0时,用+,DF=1时,用- 功能:把SI指向的数据段中的一个字/字节传送到由DI指向的附加段的一个字/字节单元中。
设置DF的指令: 设置DF=0,CLD 设置DF=1,STD
例如:将数组STR1的内容传送到数组STR2中。 设 STR1 DB ‘HELLO’ ;(在数据段中)
- 21 -
汇编语言程序设计
STR2 DB 5 DUP(?) ;(在附加段中) 程序
LEA SI,STR1 LEA DI,STR2 MOV CX,5 CLD
REP MOVSB
由此可知,要想传送整个字符串,需做以下工作: 1. 设置SI,DI
2. 将字符串长度送CX寄存器 3. 设置DF
4. 执行REP MOVSB ② CMPS 字符串比较指令
格式:CMPSB 字节操作,CMPSW字操作 操作: ·((SI))—((DI)) ·修改SI,DI
字节:(SI)←(SI)±1 ,(DI)←(DI)±1 字:(SI)←(SI)±2 ,(DI)←(DI)±2 功能:将SI指向的数据段中的一个字/字节单元的内容与DI指向的附加段中的一个字/字节单元的相减,但不保存结果,根据结果设置标志位。
例如:比较字符串STR1与字符串STR2是否相等。 设 STR1 DB ‘HELLO’ ;(在数据段中) STR2 DB ‘HELOO’ ;(在附加段中)
程序如下: LEA SI,STR1 LEA DI,STR2 MOV CX,5 CLD
REPE CMPSB JE MATCH
JNE NOMATCH ……
MATCH:………… …… ……
NOMATCH:…… …………
- 22 -
汇编语言程序设计
………… ③ SCAS 字符串检索指令
格式:SCASB 字节操作,SCASW字操作 操作: · 字节:(AL)—((DI)),(DI)←(DI)±1 · 字: (AX)—((DI)),(DI)←(DI)±2 功能:常用于查找某字符是否在某字符串中。
例如:在附加段中定义如下字符串STR,查找空格是否在该字符串中。 STR DB ‘WHAT IS THIS’
程序如下: MOV AL,20H LEA DI,STR MOV CX,12 CLD
REPNE SCASB JNZ NOFOUND JZ FOUND ……
FOUND:………… …… ……
NOFOUND:…… ………… ………… ④ LODS 取字符串指令
格式:LODSB 字节操作,LODSW字操作 操作: · 字节:(AL)←((SI)),(SI)←(SI)±1 · 字: (AX)←((SI)),(SI)←(SI)±2
功能:把由SI指向的数据段中的一个字/字节单元的内容传送到AL/AX中。 ⑤ STOS 存字符串指令
格式:STOSB 字节操作,STOSW字操作 操作: · 字节:((DI))←(AL),(DI)←(DI)±1 · 字: ((DI))←(AX),( DI)←(DI)±2
功能:把AL/AX中的内容传送到由DI指向的附加段中的一个字/字节单元中。
5、控制转移指令 1)无条件转移指令
- 23 -
汇编语言程序设计
格式:JMP OPR
功能:转移到指定的地方继续执行
2)条件转移指令
JE/JZ 相等,则转移
JNE/JNZ 不相等,则转移 ·带符号数的比较
(大于:Greater 小于:Less 等于:Equal)
JG/JNLE 大于,则转移 JNG/JLE 不大于,则转移 JL/JNGE 小于,则转移 JNL/JGE 不小于,则转移 ·无符号数的比较
(高于:Above 低于:Belove 等于:Equal)
JB/JNAE 低于,则转移 JNB/JAE 不低于,则转移 JA/JNBE 高于,则转移 JNA/JBE 不高于,则转移 ·根据某个标志位的值
JZ ZF为1,则转移 JNZ ZF为0,则转移 JS SF为1,则转移 JNS SF为0,则转移 JO OF为1,则转移 JNO OF为0,则转移 JP PF为1,则转移 JNP PF为0,则转移 JC CF为1,则转移 JNC CF为0,则转移 ·测试CX之为零则转移指令
JCXZ ;CX的值为0,则转移
例如:比较AX和BX中两个带符号数的大小,如果(AX)>(BX),则令CX=0;否则令CX=0FFFFH (条件设置指令 略) 3)循环指令 ① LOOP 循环指令 格式:LOOP OPR 循环条件:(CX)≠0
- 24 -