If-Then结构:
一般格式:
IF 条件 THEN 条件为真执行
END_IF
CMP A,0 ;把A和0比较
JGE @END_IF ;A如果不是负数就跳转到@END_IF
NEG A ;把操作数按位取反加一,也就是取相反数
@END_IF:
If-Then-Else结构:
一般格式:
IF 条件 THEN 条件为真执行
ELSE 条件为假执行
END_IF
例:输入两个字符,将ASCII码值较大的字符输出到屏幕上。
- 显示输出问号
- 键盘输入 两个数字
- 比较BL和CL的大小
- 如果BL更大就跳转到Then,并把BL存储到DH(等会输出DH)
- 如果CL更大就直接把CL存储到DH
- 无条件跳转到END_IF
- END_IF:先显示输出回车,再把DH的值存到DL,执行输出
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH,2
MOV DL,'?'
INT 21H ;显示输出问号
MOV AH,1
INT 21H ;键盘输入并回显
MOV BL,AL ;把用户输入的数字存储到BL里
INT 21H ;再次键盘输入并回显
MOV CL,AL ;把用户输入的第二个数字存储到CL里
CMP BL,CL ;比较BL和CL的大小,BL-CL
JA @THEN ;如果BL>CL 就输出BL,先跳转到THEN
MOV DH,CL ;把用户输入的第二个数字(CL比BL大)存储到DH(待输出的数字)
JMP @END_IF ;无条件跳转到END_IF
@THEN:
MOV DH,BL ;把BL(因为BL比CL大)存储到DH(待输出的数字)
@END_IF:
MOV AH,2 ;显示输出
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;回车换行
MOV DL,DH ;把DH存储到DL
INT 21H ;输出
MOV AH,4CH ;结束
INT 21H
MAIN ENDP
END MAIN
CASE 结构:
CASE 表达式(expression)
值_1 : 语句1
值_2 : 语句2 … …
值_n : 语句_n
END_CASE
例:用户输入一个数字,如果为1表示“SPRING”,如果为2表示“SUMMER”,3表示“FAL”,如果为4,则表示“WINTER”,如果输入其他字符,则编写输出“ERROR”的程序。
- 显示输出问号
- 键盘输入
- 把用户输入的数转换为真实数值(因为后面要把它和数字相减做比较)
- 用CMP指令让AL分别和1、2、3、4比较并跳转相应的,跳转以后取对应的偏移地址 并跳转到END_CASE
- 如果都不满足就取ERR_MSG的偏移地址,并跳转到END_CASE
- 输出字符串
*ASCII码转真实数值,就减30h
.MODEL SMALL
.STACK 100H
.DATA
;数据段
SPR_MSG DB 0DH,0AH,'SPRING$'
SUM_MSG DB 0DH,0AH,'SUMMER$'
FAL_MSG DB 0DH,0AH,'FALL$'
WIN_MSG DB 0DH,0AH,'WINTER$'
ERR_MSG DB 0DH,0AH,'ERROR$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
;把DATA的首地址传送到AX里,AX再传送到DS里
MOV AH,2
MOV DL,'?'
INT 21H ;显示输出问号
MOV AH,1
INT 21H ;键盘输入并回显
SUB AL,30H ;转真实数值
;输入了一个数后,这是一个字符(ASCII码),如果你要变成真实数值,就要减去30h
;比如说我输入一个数字1,它的ASCII码是31H这个时候减去30h,刚好就是1,也就是它本身真实数值
CMP AL,1 ;用户输入的数减1,如果输入的数是1,减1以后就是0.此时ZF=1
JE @SPRING ;JE如果等于就跳转,ZF=1
CMP AL,2
JE @SUMMER
CMP AL,3
JE @FALL
CMP AL,4
JE @WINTER
;同上,这里用到的是JE的,如果等于则跳转,ZF=1
LEA DX,ERR_MSG ;如果以上的都不满足,就取ERR_MSG的偏移地址
JMP @END_CASE ;并且直接跳到END_CASE
@SPRING:
LEA DX,SPR_MSG ;取SPR_MSG的偏移地址,存储到DX里
JMP @END_CASE ;直接跳转到END_CASE
@SUMMER:
LEA DX,SUM_MSG ;取SUM_MSG的偏移地址,存储到DX里
JMP @END_CASE ;直接跳转到END_CASE
@FALL:
LEA DX,FAL_MSG ;取FAL_MSG的偏移地址,存储到DX里
JMP @END_CASE ;直接跳转到END_CASE
@WINTER:
LEA DX,WIN_MSG ;取WIN_MSG的偏移地址,存储到DX里
@END_CASE:
MOV AH,9 ;输出字符串
INT 21H ;输出的内容看DX的偏移地址是哪个
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
AND结构:
一般形式:IF 条件1 and 条件2
Then 满足条件执行的语句
ELSE 不满足执行的语句
END_IF
例:如果输入的字母是大写的,则输出大写;如果不是大写,则从头开始让用户继续输入字母的程序。
- 显示输出问号
- 键盘输入,把用户输入的存储到BL里
- 过滤掉符号数字,如果是符号数字就跳转到WRONG从头来
- 过滤掉小写字母,如果是小写字母就跳转WRONG从头来
- 输出
*观察ASCII表,小于A的基本上都是符号数字等,大于Z的是小写字母,需要把这些排除掉 是个and的关系
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
@BEGIN:
MOV AH,2 ;2=显示输出
MOV DL,'?'
INT 21H ;输出问号
MOV AH,1
INT 21H ;键盘输入并回显
MOV BL,AL ;把用户输入的内容存储到BL里
CMP BL,'A' ;把用户输入的内容与A比较,A在ASCII码中是41(十六进制)
JB @WRONG ;比41小的基本上都是符号或者数字什么的,跳转WRONG
CMP BL,'Z' ;把用户输入的内容和Z比较,Z在ASCII码中是5A
JA @WRONG ;JA是大于,如果大于的话,就证明用户输入的是超过5A的就比如小写字母,跳转WRONG
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;回车换行
MOV DL,BL ;把用户输入的内容存到DL,待输出
INT 21H ;输出
JMP @EXIT ;跳转EXIT
@WRONG:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;回车换行
JMP @BEGIN ;无条件跳转到BEGIN
@EXIT:
MOV AH,4CH ;结束
INT 21H
MAIN ENDP
END MAIN
OR结构:
一般形式:IF 条件1 or 条件2
Then 满足条件执行的语句
ELSE 不满足执行的语句
END_IF
1 条评论
[…] 汇编(17)判断语句If.Then.Case.And.Or […]