实验具体内容

【上篇】分支程序实验

编写一个程序,把AL寄存器中的两位十六位进制数显示出来。

【下篇】循环程序实验

编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示为’c’;若是回车字符(其ASCII码为0DH),则自动结束程序,若为其它字符则不显示,循环等待新的字符输入。

【上篇】分支程序实验

知识点思考:

AX 中数据的绝对值:

1
2
3
4
CMP AX, 0 
JGE NONEG
NEG AX
NONEG: MOV RESULT, AX

思考:如果条件改为JL,以上分支程序段如何改写?是比较程序段的复杂度?

用JL改写:

1
2
3
4
5
CMP AX,0
JL NEXT
JMP SHORT NONE
NEXT:NEG AX
NONE:MOV RESULT ,AX

用JL改写会比JGE复杂

(1)实验流程图:

img

显示AL寄存器中的两位十六进制数流程图

(2)实验源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CODE SEGMENT;代码段
ASSUME CS:CODE;将CS寄存器和代码段地址关联起来
START:;START标号(入口)
MOV AL,3EH;将需要显示的数据存入AL
MOV BL,AL;并备一份需要显示的数据到BL
MOV DL,AL;将AL中的数据传送到DL,开始第一个数(3)的显示操作
MOV CL,4;将4传送到CL中
SHR DL,CL;对DL进行逻辑右移4位(即只保留3EH的高四位,且将原来的高4位移到低4位,以便进行下面的比较),执行结束后,DL=03H
CMP DL,9;用DL中的内容和9比较大小,影响标志位,这里3≤9
JBE NEXT1;根据CMP指令对标志位的影响,JBE指令根据影响结果进行跳转,JBE/JNA即小于等于即跳转,所以这里跳转到NEXT1
ADD DL,7

NEXT1: ;NEXT1标号(入口)
ADD DL,30H;相当于DL=DL+30H,执行结束后DL=33H,对应的ASCII字符即“3”
MOV AH,2;将2传送至AH中
INT 21H ;DOS系统2号功能:输出DL寄存器的字符到显示器
MOV DL,BL;将备份在BL中的数据传送给DL,准备进行第二个数(E)的显示操作
AND DL,0FH;DL中的数据和00001111B对应位进行与操作(在这里实际效果是高4位清零,留下低4位数据),执行后DL=0EH
CMP DL,9;DL中的内容和9比较大小,影响标志位,这里0EH>9
JBE NEXT2;根据CMP指令对标志位的影响可知,这里不做跳转,继续往下执行
ADD DL,7;相当于DL=DL+7,执行结束后DL=15H

NEXT2:;NEXT2标号(入口)
ADD DL,30H;相当于DL=DL+30,执行结束后DL=45H,对应的ASCII字符即“E”
MOV AH,2
INT 21H ;DOS系统2号功能
MOV AH,4CH
INT 21H;DOS系统4CH号功能,告诉编译器编译结束,返回DOS
CODE ENDS;代码段结束
END START;程序结束

(3)实验代码、过程、相应结果(截图)并对实验进行说明和分析:

实验过程:

①编译生成3E.OBJ文件:

img

②连接生成3E.EXE文件:

img

img

③运行3E.EXE:

img

程序中CMP DL,9 ADD DL,7 ADD DL,30作用是什么?

在说之前首先要说明,根据ASCII码对照表可知数字字符对应的十六进制ASCII码刚好与数字本身差30H,只要在数字的基础上加30H就是对应的十六进制ASCII码了。

同理,0AH~0EH与对应的十六进制ASCII码差了37H。

那么现在来说程序:

CMP DL,9是用来判断目前DL中的16进制数是数字还是字母,如果是数字,则可以直接跳转到下一标号,;如果是字母,则不跳转,继续运行。

按目的来说,就是通过比较指令来规划这个数是加30H还是加37H,如果是数字,就加30H;如果是字母,就加37H。

【下篇】循环程序实验

(1)实验流程图:

img

(2)实验源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
CODE SEGMENT;代码段
ASSUME CS:CODE;将定义的代码段和寄存器CS关联起来
START:;START标号

INPUT: MOV AH,1;INPUT标号(输入入口)
INT 21H;向AL键入一个字符
MOV DL,AL;将AL中的内容传送给DL,以方便后面输出。

CMP DL,0DH;与0DH比较(回车键的ASCII码)
JE QUIT;若相等,则跳转到QUIT标号退出程序

CMP DL,61H;与61H比较(字符“a”的ASCII码)
JAE LOWER;若DL≥61H,则跳转到LOWER标号进行二次比较确认

CMP DL,41H;与41H比较(字符“A”的ASCII码)
JAE UPPER;若DL≥41H,则跳转到POWER标号进行二次比较确认

CMP DL,30H;与30H比较(字符“0”的ASCII码)
JAE NUM;若DL≥30H,则跳转到NUM标号进行二次比较确认输出

JMP INPUT;DL<30H,则以上条件转移指令均无法执行,则跳转回INPUT等待键入下一个字符

LOWER: CMP DL,7AH;与7AH比较(字符“z”的ASCII码)
JBE OUTC;若DL≤7AH,则可判定字符为a~z,则跳转到OUTC标号
JMP INPUT;若DL>7AH,则跳转回INPUT等待键入下一个字符

UPPER: CMP DL,5AH;与5AH比较(字符“Z”的ASCII码)
JBE OUTC;若DL≤5AH,则可判定字符为A~Z,则跳转到OUTC标号
JMP INPUT;若DL>5AH,则跳转回INPUT等待键入下一个字符

NUM: CMP DL,39H;与39H比较(字符“9”的ASCII码)
JA INPUT;若大于39H,则跳转回INPUT等待键入下一个字符
MOV AH,2
INT 21H;若DL≤39H,则字符可判定为0~9,直接输出显示该字符
JMP INPUT

OUTC: MOV DL,'c';将c对应的ASCII码传送给DL
MOV AH,2
INT 21H;输出显示 ’c’
JMP INPUT;跳转回INPUT等待键入下一个字符

QUIT: MOV AH,4CH
INT 21H;退出程序,返回DOS

CODE ENDS;代码段结束
END START;程序结束

(3)实验代码、过程、相应结果(截图)并对实验进行说明和分析:

img

编译生成cycle.obj文件

img

img

连接生成cycle.exe文件

img

img

运行cycle.exe

img

验证:

img

键入回车则退出程序,返回DOS

img

输入数字1~9后均会输出显示同样的数字字符,且继续等待输入。

img

输入大小写字母均会输出显示‘c’,且继续等待输入。

img

输入其他字符则不做输出显示,且继续等待输入。