汇编实验:按15行×16列的表格形式显示ASCII码为10H—100H的所有字符

上海大学  计算机学院

《汇编语言程序设计实验》报告

         

 

实验名称:       第三周实验        

 

一、实验任务

1. 完成资料里的实验任务一。

2.另外用任意一种高级语言实现相同的任务。

3.比较两种实现方式的可执行代码的长度。选做:比较两种可执行代码的运行时间。

二、实验内容

实验任务1. 按15行×16列的表格形式显示ASCII码为10H—100H的所有字符。

实验步骤

1.设想代码结构:要实现15*16的表格输出,常用方法是使用两层循环分别打印每一行的所有列和各个行,这样就需要2个计数器,因此我们需要在内外循环分别push计数器以保存状态。此外要实现程序的计时功能,应当调用DOS功能的置/读时钟,但是想输出必须将数字转为ASCII字符。

2.在VScode中新建.asm文件,输入以下代码段

 

上述代码分为3层:(1)world层之外:该层在代码核心段之外,作用是首先使用INT 1aH将时钟置0,然后保存dx(里面存程序运行时间);在整段代码执行完毕后将使用INT 1aH读取时钟,并输出到终端显示。在计时并显示时,遇到了问题:dx中存储的是程序运行时间(数字),是无法直接输出到终端的,必须转成ASCII码才行。常用的方法是对16进制的数字使用辗转相除法取余,将每次获得的余数压栈,最后依次输出即是结果。但针对本次实验代码分析,我们发现C++执行同样功能程序一次的时间大约在10~20ms,这意味着汇编程序运行的时间也不会超过100ms.而由INT 1aH中读写时钟的单位:可知,显示的数字是以10ms为基本单位的,因此最后输出的结果不可能是超过1位的(因为即使0AH也代表运行时间有100ms了),所以我们无需考虑辗转相除了,最终答案以16进制和10进制表示是一样的数字。我们只需要+30H即可直接获得对应数字的ASCII码。

需要注意的是我在这里将最外层的CX赋值为60H,这是因为最初只在代码执行的最开始与结束使用一次读取时钟,最后的结果是0,这说明程序运行一次的耗时太短,想要获取准确运行时间我们可以让程序多运行几次,获取运行时间。因此我们选择让程序运行60H(96)次,记录运行时间,再除以96即可获得单次运行的时间。

(2)outer层:设置外层计数器,并且在内层循环结束时输出回车、换行。

(3)innner层:保存外层计数器,设置内层计数器,并且循环输出。

3.右键打开DOS终端,在终端使用命令masm test.asm进行编译,再使用link test.obj对生成的test.obj文件进行链接,生成.exe可执行文件;使用dos环境下的dir指令,可以看到可执行文件大小为584B:

 

再执行程序:

 

从结果我们可以看出程序运行96次耗时40ms,每次运行耗时0.417ms.

实验任务2. 用任意一种高级语言实现相同的任务。

选用C++,编写下列程序实现同样的打印ASCII码表:

 

在这里使用clock函数记录程序运行时间,返回单位为ms。

首先找到程序所在的文件夹目录,查询到可执行文件的大小为14KB:

 

再点击运行:

 

从结果我们可以看出程序运行每次运行耗时8ms.

 

实验任务3. 比较两种实现方式的可执行代码的长度。比较两种可执行代码的运行时间。

上面我们已经获得了两种语言变成下生成可执行文件的大小以及执行时间,下面我们比较其大小和运行时间差异:

 

汇编程序

C++程序

可执行文件大小

584B

14KB

运行时间

0.417ms

8ms

由表格可知汇编程序生成的可执行文件更小,运行时间更短。

 

posted @   丘丘王  阅读(295)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
鼠标点击页面特效

尝试在空白处点击鼠标

点击右上角即可分享
微信分享提示