控制转移类指令
赋初值 循环体
【例】另一种做法
AGAIN:
MOV SI , 0 MOV DI , 0 MOV CX , 100 MOV AL , AREA1[SI] MOV AREA2[DI] , AL INC SI INC DI DEC CX JNZ AGAIN
赋初值 循环
3. 循环指令 LOOP
格式:LOOP label 操作:(CX)-1→CX;
Jcc M,N
M N 无符号数(A,B)
有符号数(G,L)
< (¬ >=)JB(JNAE)
JL(JNGE)
<= (¬>) JBE(JNA)
JLE(JNG)
> (¬<=) JA(JNBE)
JG(JNLE)
>= (¬<) JNB(JAE)
JNG(JLE)
=
JE/JZ
≠
JNE/JNZ
功能号:AH=01H 出口参数:AL=字符的ASCII码 功能:获得按键的ASCII代码值 调用此功能时,若无键按下,则会一直等待, 直到按键后才读取该键值
例:判断按键
getkey: mov ah,01h ;功能号:ah←01h
int 21h ;功能调用
cmp al,’Y’ je yeskey
2. 字符串输出的功能调用
DOS功能调用 INT 21H 功能号:AH=09H 入口参数: DS:DX=欲显示字符串在主存中的首地址 字符串应以$(24H)结束 功能:在显示器输出指定的字符串
可以输出回车(0DH)和换行(0AH)字符产生回 车和换行的作用
例:显示字符串
string DB
例:JZ/JNZ指令
next1: done:
next2: done:
test al,80h ;测试AL的最高位 jz next1 ;D7=0(ZF=1),转移 mov ah,0ffh ;D7=1,顺序执行 jmp done ;无条件转向 mov ah,0 ... test al,80h ;测试最高位
3.2.5 系统功能调用
21H号中断是DOS提供给用户的用于调用系 统功能的中断,它有近百个功能供用户选择 使用,主要包括设备管理、目录管理和文件 管理三个方面的功能
ROM-BIOS也以中断服务程序的形式,向程序员提供系统 的基本输入输出程序
汇编程序设计需要采用系统的各种功能程序
充分利用操作系统提供的资源是程序设计的一个重 要方面
... ;无溢出,结果正确 overflow: ... ;有溢出,出错处理
例:JP/JNP指令
;设字符的ASCII码在AL寄存器中
;将字符加上奇校验位
数
next:
and al,7fh ;最高位先置“0”,并判断“1”的个
jnp next ;个数已为奇数,则转向next
or al,80h ;否则,最高位置“1” ...
HLT
例:若X>50,转到TOO_HIGH,否则 计算X-Y: 溢出转到OVERFLOW, 否则 |X-Y|→RESULT
MOV AX, X CMP AX, 50 JG TOO_HIGH SUB AX, Y JO OVERFLOW JNS NONNEG NEG AX NONNEG: MOV RESULT, AX TOO_HIGH: … OVERFLOW: …
例:比较无符号数
next:
cmp ax , bx ;比较ax和bx jnb next ;若ax≥bx,转移 xchg ax , bx ;若ax<bx,交换
...
结果:AX保存较大的无符号数
例:比较有符号数
举例:比较AL、BL、CL中带符号数的大 小,将最小数放在AL中。
BBB: CCC:
CMP AL,BL ;AL和BL比较 JNG BBB ;若AL≤BL,则转 XCHG AL,BL ;若AL>BL,则交换 CMP AL,CL ;AL和CL比较 JNG CCC ;若AL≤CL,则转 XCHG AL,CL ;若AL>CL,则交换
(3) DF设置指令
CLD STD
0→DF (串操作的指针移动方向从低到高) 1→DF (串操作的指针移动方向从高到低)
2.外部同步指令
(1)暂停指令 HLT
HLT ;进入暂停状态 暂停指令使CPU进入暂停状态,这时CPU不进行任何 操作。当CPU发生复位或来自外部的中断时,CPU脱 离暂停状态 HLT指令可用于程序中等待中断。当程序中必须等待 中断时,可用HLT,而不必用软件死循环。然后,中断 使CPU脱离暂停状态,返回执行HLT的下一条指令 HLT不影响标志位。
若(CX)≠0,则转至label处执行; 否则退出循环,执行LOOP后面的指令。
LOOP指令与下面的指令段等价: DEC CX JNZ label
例:记录字符串中空格的个数
;String是附加段中的一个字符串
mov cx,count ;设置循环次数
lea si , string
xor bx,bx ;bx=0,记录空格数
'Hello,Everybody !',0dh,0ah,'$' ;在数据段定义要显示的字符串
... mov ah,09h ;设置功能号:ah←09h mov dx,offset string
;提供入口参数:dx←字符串的 偏移地址
int 21h ;DOS功能调用:显示
3. 字符输入的功能调用
DOS功能调用 INT 21H
next:
mov ax , X sub ax , Y jns next neg ax ;neg是求补指令:0-ax mov result , ax
例:JO/JNO指令
;计算X-Y; ;X和Y为存放于X单元和Y单元的字操作数 ;若溢出,则转移到overflow处理
mov ax , X sub ax , Y jo overflow
指令
MOV DI,1000H MOV CX,64H MOV AL,2AH MOV [DI],AL
109E : 010A INC DI
109E : 010B DEC CX
109E : 010C JNZ 0108
109E : 010E HLT
109E : 0110
写入2AH(*)后,数据段中相应存储单元的内容改 变如下:
mov al,20h ;空格的ASCII码为20H
again: cmp al,es:[si]
jnz next ;ZF=0非空格,转移
inc bx
;ZF=1是空格,个数加1
next: inc si
dec cx
loop again
jnz again
;字符个数减1,不为0继续循环
应用举例:将数据段1000H开始的100个存储 单元全部填充为ASCII码2AH(*)。
(2)空操作指令NOP
不执行任何操作,但占用一个字节存储 单元,空耗一个指令执行周期,然后执行 下一条指令。 NOP常用于程序调试
在需要预留指令空间时用NOP填充 (占位子)
代码空间多余时也可以用NOP填充 还可以用NOP实现软件延时
AREA2 AREA2+1 AREA2+99
...
SI
SI=2000H [SI] ~ AREA1[0] INC SI SI=2001H [SI] ~ AREA1[1]
DI
【例】等价程序
AGAIN:
LEA SI , AREA1 LEA DI , AREA2 MOV CX , 100 MOV AL , [ SI ] MOV [ DI ] , AL INC SI INC DI DEC CX JNE AGAIN
jnz next2 ;D7=1(ZF=0),转移
mov ah,0 ;D7=0,顺序执行
jmp done ;无条件转向
mov ah,0ffh
...
பைடு நூலகம்
例:JC/JNC
CMP AX, BX JC NEXT MOV AX , BX NEXT:MOV MIN ,AX
例:JS/JNS指令
;计算|X-Y|(绝对值) ;X和Y为存放于X单元和Y单元的16位操作数 ;结果存入result单元
功能调用的步骤
通常按照如下4个步骤进行: ⑴ 在AH寄存器中设置系统功能调用号 ⑵ 在指定寄存器中设置入口参数 ⑶ 执行指令INT 21H(或ROM-BIOS的中断向
量号)实现中断服务程序的功能调用 ⑷ 根据出口参数分析功能调用执行情况
1. 字符输出的功能调用
DOS功能调用 INT 21H 功能号:AH=02H 入口参数:DL=字符的ASCII码
Jcc指令的分类
Jcc指令不影响标志,但要利用标志 位。根据利用的标志位不同,16条指 令分成3种情况:
(1)判断单个标志位状态 (2)比较无符号数高低 (3)比较有符号数大小
(1)判断单个标志位状态
这组指令单独判断5个状态标志之一
⑴JZ和JNZ:判断结果是否为零(或相等) ⑵JS和JNS:判断结果是正是负 ⑶JO和JNO:判断结果是否产生溢出 ⑷JP和JNP:判断结果中“1”的个数是偶是奇 ⑸JC和JNC:判断结果是否进位或借位
MOV DI,1000H MOV CX,64H MOV AL, 2AH AGAIN: MOV [DI],AL INC DI DEC CX JNZ AGAIN HLT
;循环计数器
上程序段存放在代码段中,設(CS)=109EH, 则各条指令存放地址如下:
CS : IP 109E : 0100 109E : 0103 109E : 0106 109E : 0108
【例】复制数据块
AREA1 AREA1+1 AREA1+99
AREA2 AREA2+1 AREA2+99