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

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏