实验具体内容
【上篇】分支程序实验
编写一个程序,把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)实验流程图:

显示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文件:

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


③运行3E.EXE:

程序中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)实验流程图:

(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)实验代码、过程、相应结果(截图)并对实验进行说明和分析:

编译生成cycle.obj文件


连接生成cycle.exe文件


运行cycle.exe

验证:

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

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

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

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