汇编语言程序设计实验四

一、实验目的

掌握汇编编程规范,熟悉编程环境。

二、实验内容

编程计算3550H-2320H,按16进制输出计算所得的差1230H。再输出3550H-2321H的差,检验程序的正确性。
提示:考虑依次将1230H(即0001 0010 0011 0000B)从高位到低位,每4位二进制数一组分离出来,再将4位二进制数转换为ASCII码,利用DOS系统功能调用的2号子功能输出,就得到16进制数据的输出效果。本题要求综合应用移位操作、逻辑操作等指令,并利用条件转移指令实现简单的循环程序,程序流程如图1所示。DOS系统功能调用的2号子功能格式见dos调用表。
汇编语言程序设计实验四_第1张图片
汇编语言程序设计实验四_第2张图片
三、实验步骤算法及关键代码

1. 实验思路与算法

①思路:
本次实验综合比较多的东西,如移位指令,逻辑操作指令,DOS功能等。首先将需要处理的数字存到寄存器中,然后调用移位指令取出四位,再针对每一位,判断其是否是数字或者字母,再使用DOS系统功能调用号为2的显示指令显示即可
大体思路在程序设计图中写的相对比较清楚。
②相关设置与算法:
首先设置BX与AX为需要处理的数字,相减结束后调用第一个子程序
第一个子程序为初始化指令,设置CL为左移次数4(ROL指令只可以识别CL),设置DI为循环次数4,然后调用第二个子程序;
第二个子程序为移位指令,每次将结果数左移四位,然后取出低四位,调用第三个子程序;
第三个子程序为数据转ASCII码指令,设置CH为中间数10,根据是否大于10判断其显示时是数字还是字母,如果是数字则与37H进行与运算;如果是字母则与30H进行与运算;
最后在DOS上显示,继续循环完成其余十二位即可。

2.实验代码

ASSUME CS:CODES
CODES SEGMENT
START:
	;因为要使用AX进行功能调用,所以将值存到BX中防止被影响
    MOV BX,3550H
    MOV AX,2320H
    SUB BX,AX
    CALL S1
    MOV BX,3550H
    MOV AX,2321H
    SUB BX,AX
    CALL S1
   	;系统退出指令
 	MOV AH,4CH
    INT 21H
 	;由于MASM平台在ROL指令上不能识别除CL外的指令,因此将循环次数存到一个寄存器di中
 	;之后手动使用条件指令进行判断
 	;设置每次的左移位数为4
 S1:MOV CL,4
 	;设置循环次数为4
	MOV DI,4
 	;左移4位
 	CALL S2
 	RET
 S2:ROL BX,CL
 	;取出低八位
 	MOV DL,BL
 	;取出低四位
 	AND DL,00001111B
 	CALL S3
 	;设置DOS系统功能调用号为2
 	MOV AH,02
 	;系统功能调用
 	INT 21H
 	;循环计数器减一
 	DEC DI
 	;判断DEC是否为0,如果为0,循环结束
 	CMP DI,0
 	JNE S2
 	RET
 	;因为十六进制中0-9和A-E的ASCLL值的计算方法有不同,需要使用标志寄存器和条件指令进行判断
 S3:MOV CH,10
 	CMP DL,CH
 	JNB S4
 	;如果大于10,和30h进行与运算
 	ADD DL,30H
 	RET
 	;如果小于10,和37h进行与运算
 S4:ADD DL,37H
 	RET
CODES ENDS
    END START

3.实验结果
在这里插入图片描述

四、实验小结(简单说明实验过程中出现的问题和解决方法)

本次实验需要在DOS中显示ASCII码数据,重点考察了对子程序的使用,逻辑指令,移位指令,ASCII码改变,ROL指令等内容,给出了一个程序运行思路和DOS使用说明,需要阅读理解后加以运用。如果没有这个程序流程图,对本次实验的实现将是十分困难的,但给出这次流程图后仍碰到了许多的问题,首先就是如何整理子程序的功能,嵌套的函数用法开始很令我头疼;其次是ROL指令只能操作CL,这样就无法使用LOOP指令进行循环,只能使用逻辑条件指令+寄存器的方法手动设置循环;再有就是移位之后数据的取出,需要先取八位后使用AND指令取出四位;最后就是DOS窗口显示的运用。许许多多的问题都在这次的实验中出现,但万幸通过和同学一定的求教和自己对实验本身材料的理解,完成了这次实验的内容。
总的来说本次实验对之前学过的知识是一个十分综合的应用,和之前实验的感觉完全不同,不像前几次实验有教材的基础,需要自己构建框架和思路一步步完成,其中会出现很多问题,但解决之后就是对学习的知识理解的进一步深入,收获颇多!

你可能感兴趣的:(汇编语言)