一个80x86汇编语言程序的查错
来源:互联网 发布:外国人用淘宝吗 编辑:程序博客网 时间:2024/05/16 06:50
题目:在数据段中有从STRING单元开始存放的100个字节数据,编写程序要求将字符串中的大写字母转换为小写字母,并显示到屏幕上。
汇编源程序如下:
DATA SEGMENT ; 数据段定义STRINGDB100DB?BUFDB100 DUP(?)CNTEQU$-BUFDATA ENDSCODE SEGMENT ; 代码段定义 ASSUME CS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX ;设置DS LEADX,STRINGMOVAH,10INT21H;从键盘接收字符串PUSHDXPUSHAXMOVDL,0DHMOVAH,2INT21HMOVDL,0AHMOVAH,2INT21HPOPAXPOPDX;回车换行MOVCH,CNT;总的字符个数MOVSI,OFFSET BUFNEXT:MOVCL,[SI]CMPCL,41HJBNEXT2CMPCL,5AHJANEXT2;判断是否是大写ADDCL,20H;把大写字母改为小写字母NEXT2:MOVDL,CLMOVAH,2INT21H;输出字符MOVDL,20HMOVAH,2INT21H;输出空格INCSIDECCHJNZNEXT MOV AH,4CHINT21HCODE ENDSEND START
查错经过:
仔细阅读一下代码,发现,这段代码里,有一处关于获取实际输入字符串个数的用法(第28行)有问题。
根据10号DOS功能调用的用法,从键盘实际输入的字符的个数应该保存在STRING+1单元,所以,这条指令应该改为MOV CH,STRING+1。
将修改后的程序汇编、连接后运行,结果正确,如下图所示。
尽管修改了一条指令后,程序可以正确运行了,但是,笔者的疑问依然存在。刚刚修改的一条指令,仅仅是关于循环次数的。为什么,循环次数比实际字符个数多的时候,无法正确显示结果呢?DEBUG.EXE是调试汇编程序的重要工具。为了解决这个问题,必须要借助DEBUG。
在命令窗口,执行DEBUG yxj.exe命令,调试该程序。下图所示,是调试窗口的情况。
进入DEBUG后,设置一个断点。这个断点应该设置在键盘输入DOS功能调用之后,结果输出之前。本次调试,笔者设置的断点是cs:000e处的指令。程序运行到断点处,停下来后,笔者利用D DS:0命令,查看了一下输入字符缓冲区。此次输入的字符串是Aa123,在输入缓冲区看到,在实际输入的字符串后面,10号调用执行后,自动在输入字符的后面插入字符串结束符0DH。现在谜底找到了。无法正常运行的程序,由于多输出了实际输入字符后面的全部输入缓冲区的内容,这其中包括0DH(这个符号是回车符)。这样,当输出到回车符时,光标回到显示行的最左边,将之前输出的内容全部覆盖了。因此,看到的现象是没有输出。
为了验证,笔者的判断是否正确。在DEBUG里,笔者临时修改了保存0DH值的单元的内容(用 E DS:7命令)。运行结果(见上图),正确。
心得:
汇编学习是一个需要耐心和恒心的过程。只有通过不断的上机练习,才能给真正掌握这门程序设计语言。本例提示我们,运行时发生的错误,应该从多个方面去查找问题,不应该孤立的查找错误。例如,本例出错的根本原因是字符串的个数弄错了,而运行后的表现却是没有显示。
这种错误的发生,是比较难查找的。
- 一个80x86汇编语言程序的查错
- 用80x86汇编语言,编写一个判断闰年的程序
- 用80x86汇编语言,编写一个输出16进制数字的程序
- 80x86汇编语言程序:判断奇、偶数的个数
- 80x86汇编语言程序错误分析
- 80X86学习笔记--汇编语言的语句
- 80x86 汇编语言:统计数据的个数
- 80x86汇编语言程序:提示输入矩形的长和宽,并显示周长
- 一段简单c程序的汇编语言学习(ubuntu+x86)
- 80x86 汇编语言基础教程
- 数据键入与排序程序--80x86汇编语言
- 80x86 汇编语言编程:用 “*” 显示一个三角形
- 用80x86汇编语言:在字符串中删除一个字符
- 80x86 汇编语言编程:显示一个螺旋数据方阵
- 王爽汇编语言 一个奇怪的程序
- 80x86汇编语言程序设计P50
- 80x86 汇编语言编程:求和
- 80x86汇编语言:福到了
- 淘淘搜2014校园招聘图像搜索引擎笔试题
- xmapp Windows 下配置问题
- 网站优化做好这八步你就是seo第一
- SDWebImage(简化网络图片处理)
- 飞思卡尔XS128之看门狗
- 一个80x86汇编语言程序的查错
- OCP-1Z0-053-V12.02-149题
- 浅谈MVC
- 有趣代码二
- 【Java Web】: JSON 数据格式详解
- 二维背包问题(五)
- C++基础学习系列——前言
- textview 中处理spannable使得ListView的点击事件失效的解决方法
- 从输入域名到访问网站的流程