打印一个ASCII表在高级程序设计语言中是一个非常简单的程序,但是用汇编又该如何编写呢?
一、设计思路
我们可以按15行*16列的表格形式显示ASCII码为10H一100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:
Movah,02h
Movdl,输出字符的ASCLL码
Int21h
可把dl初始化为10H,然后不断使其加1(用INC指令)以取得下一个字符的ASCLL码。
显示空白符时,用其ASCLL码0置入dl寄存器。每行结束时,用显示回车(ASCLL为0dh)和换行符(ASCLL为0ah)来结束本行并开始下一行。
由于逐个显示相继的ASCLL字符时,需要保存并不断修改dl寄存器的内容,而显示空白,回车,换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASCLL字符。具体用法是:在显示空白或回车,换行符前用指令
Pushdx
把dl的内容保存到堆栈中去。在显示空白或回车,换行符前用指令
Popdx
恢复dl寄存器的原始内容。
二、程序实现代码
采用类似于C语言的双层循环输出的方式,在外层循中输出一行,总共循环15次,输出15行;在内层循环中输出一行中的16个字符,循环16次。用DX寄存器保存对应的字符的ASCII值,并增加DX的值来得到下一个ASCII码。
具体实现如下:
assume cs:codesg
codesg segment
;设置寄存器初值
mov dx, 0000H
mov dl, 10H ;从ASCII码为10H的字符开始显示
mov cx, 000FH ;设置外循环的次数15,即要显示的行数
mov ax, 0000H
r:
mov ah, 02H ;设置显示方式
push cx ;保存外循环次数的计数
mov cx, 0010H ;设置内循环次数16,即一行16个字符
c:
int 21H ;显示ASCII值为[dl]的字符
push dx ;保存dx的值
mov dl, 00H ;输出空格
int 21H
pop dx ;恢复dx的值,并加1,产生下一个ASCII字符
inc dx
loop c
;已经进行完了一次内循环
pop cx ;恢复外循环次数的计数
push dx ;保存dx的值
mov dl, 0dH ;输出回车换行
int 21H
mov dl, 0aH
int 21H
pop dx ;恢复dx的值
loop r
;外循环结束,程序的功能完成
mov ax, 4c00H
int 21H
codesg ends
end
运行结果如下:
三、程序分析
代码采用类似于C语言的双层循环输出的方式,在外层循中输出一行,总共循环15次,输出15行;在内层循环中输出一行中的16个字符,循环16次。用DX寄存器保存对应的字符的ASCII值,并增加DX的值来得到下一个ASCII码。
由于在输出空格、回车和换行时,会破坏DX中原来的值,所以在用空格、回车和换行的ASCII值覆盖DX寄存器原来的内容时,先把DX寄存器中的内容压入栈中保存,即PUSHDX。输出空格、回车和换行后,调用POPDX恢复DX寄存器的值。以便下次直接把DX的值加1产生后继字符。
由于本程序中使用了两个循环,而每一个循环中都要用CX保存和记录循环的次数,所以在进入内层循环时,要先把外层循环的计数,即用PUSHCX,把CX的值压栈保存。在内层循环结束时,再恢复外层循的计数,即POPCX。然后在LOOP指令中判断外层循环是否完成退出。
PS:由于所用的操作系统问题,在运行程序时后面一些行(ASCII码为128及以后的行)有时会显示乱码。可用虚拟软件虚拟16位系统或在Debug中运行该程序即可正确输出。
分享到:
相关推荐
例如,编写程序,判断一个年份是否是闰年的汇编语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM。也可以在Windows 2000或者在Windows XP环境下鼠标单击...
迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程语言有哪些特点? 解: 面向对象的编程语言与以往各种编程...
3.6 编写程序加载NT式驱动 3.6.1 SCM组件和Windows服务 3.6.2 加载NT驱动的代码 3.6.3 卸载NT驱动的代码 3.6.4 实验 3.7 WDM式驱动的加载 3.7.1 WDM的手动安装 3.7.2 简单的INF文件剖析 ...
3.6 编写程序加载NT式驱动 3.6.1 SCM组件和Windows服务 3.6.2 加载NT驱动的代码 3.6.3 卸载NT驱动的代码 3.6.4 实验 3.7 WDM式驱动的加载 3.7.1 WDM的手动安装 3.7.2 简单的INF文件剖析 ...
用户用计算机高级语言编写的程序,通常称为 A.源程序 B.目标程序 C.汇编程序 D.二进制代码程序 6.计算机操作系统的主要功能是( ) A.对计算机的所有资源进行控制和管理,为用记使用计算机提供方便 B.对源程序进行...
他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工...
40.用高级语言编写的源程序,必须经过__B___处理,计算机才能执行。 A、汇编 B、解释或编译 C、解释 D、编译 判断题 1.计算机的常用输入设备有键盘和鼠标器。( Y ) 2.软盘要远离如电话、录音设备等热源、磁源。...
0086 用回溯法找出n个自然数中取r个数的所有组合 58 0087 0~N位数的任意组合 59 0088 在数组中快速查找近似值 60 0089 实现直接插入法排序 61 第4章 函数应用 63 4.1 字符串处理函数 64 0090 使用...
actionScript 3.0开发人员指南中文版,总共67章,955页。学习actionScript不错的书籍。 目录: 目录 第章:使用日期和时间 管理日历日期和时间 控制时间间隔 ...第章:Adobe图形汇编语言(AGAL) AGAL字节码格式
使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
6.19 我怎样编写接受编译时宽度未知的二维数组的函数? 6.20 我怎样在函数参数传递时混用静态和动态多维数组? 数组的大小 6.21 当数组是函数的参数时,为什么sizeof不能正确报告数组的大小? 6.22 如何在一...
6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...
6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++标准库 1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 ...
C是一门简洁精妙的语言,掌握基本语法容易,真正能够自如运用,就不那么简单了。你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的...