目录
实验上篇 分支程序实验
【实验要求】
1. 编写一个程序,把AL寄存器中的两位十六进制数显示出来。
【实验具体内容】
1.实验流程图(从实验2.2 分支程序实验和循环程序实验开始必须画流程图):

2.实验源代码:(注释后来加的,没写分号,复制需添)
CODE SEGMENT代码段
ASSUME CS:CODE段寻址伪指令ASSUME是说明将哪个逻辑段的段起始地址装入段寄存器,即将哪个逻辑段设置为当前段。此处是将名为code的段设置为当前段,将该段的起始地址存入代码段寄存器cs之中。
START:MOV AL,3EH将 3EH(十六进制)移动到AL寄存器中。AL=0011 1110
MOV BL,AL将AL中的值复制到BL寄存器。BL指令用于带链接的程序跳转,也就是说它在进行跳转的同时,还要保存返回地址。BL起到的作用是当DL的值发生改变时,重新将值赋给DL(因为AL之后要用于计算,会发生数值变化)。
MOV DL,AL将AL中的值复制到DL寄存器。DL用来之后分离高四位低四位
MOV CL,4将立即数4移动到CL寄存器,CL通常用作移位操作的计数寄存器。
SHR DL,CL将DL中的值逻辑右移CL指定的位数(这里是4位)。右移四位的目的是分离出高四位,将十六进制数的高四位移到低四位。SHR指令将目的操作数顺序右移1位或CL寄存器指定的位数。DL=00000011。
CMP DL,9比较DL中的值与9
JBE NEXT1如果DL中的值小于或等于9,则跳转到NEXT1标签。Jump if Below or Equal
ADD DL,7如果DL中的值大于9(即A-F的十六进制数字),则加7以将其转换为ASCII码中的字符(因为9和A隔7)。
NEXT1:
ADD DL,30H将DL中的值加上30H,将其转换为ASCII码(0-9的ASCII码为30H-39H)。因为字符'0'(表示数字零的字符)的ASCII码值比数字0(作为整数值)大48。
MOV AH,2设置AH寄存器为2,这是DOS中断INT 21H的“显示字符”功能的编号。
INT 21H ;显示高位 ASCII 码,调用DOS中断以显示DL中的字符。
MOV DL,BLDL在运算中发现变化,所以重新把BL给DL。使DL=0011 1110
AND DL,0FH将DL中的值与0FH进行按位与,保留低四位。DL=0000 1110
CMP DL,9比较DL中的值与9。
JBE NEXT2如果DL中的值小于或等于9,则跳转到NEXT2标签。
ADD DL,7如果DL中的值大于9,则加7以将其转换为ASCII码中的字符。
NEXT2:
ADD DL,30H同NEXT1
MOV AH,2
INT 21H ;显示低位 ASCII 码
MOV AH,4CH设置AH寄存器为4CH,这是DOS中断INT 21H的“程序终止”功能的编号。
INT 21H
CODE ENDS ;返回 DOS
END START
3.实验过程、相应结果(截图)并对实验进行说明和分析:
(1)将代码复制到MASM集成实验环境中,保存运行后得到结果3E,如图1.1
当然,我们也可以用记事本完成代码,另存为C盘中masm5文件夹,之后修改文件后缀位.asm

图1. 1
(2)将程序另存为C盘中masm5文件夹中,如图1.2,观察到除了asm后缀之外还有lst obj后缀文件一起存入。

图1. 2
(3)打开Dosbox,在指令区输入masm CPU22,表示在虚拟环境内运行该文件,并生成obj文件,如图1.3(不能直接输入CPU22,提示illegal command,因为没有生成可执行文件不能直接运行)但是显示系统无法打开指定的输入文件,再次尝试输入MASM CPU22,结果恢复正常,如图1.4

图1. 3

图1. 4
(4)输入link CPU22,生成可执行文件,然后输入CPU22,运行文件,即可发现AL中存放的两位16进制数为3E。如图1.5所示。//同时可以在文件夹中查看到生成CUP22.EXE文件,如图1.6所示。

图1.5

图1. 6
(5)使用debug来逐句运行该代码,如图1.7~图1.12

图1.7

图1.8

图1.9

图1.10


5544

被折叠的 条评论
为什么被折叠?



