程序调试

合集下载

程序调试和错误解决的方法与技巧

程序调试和错误解决的方法与技巧

程序调试和错误解决的方法与技巧程序调试是软件开发中不可或缺的一个环节,它可以帮助开发者发现和解决程序中的bug和错误,确保程序的质量和稳定性。

程序调试需要一定的方法和技巧,本文将就程序调试和错误解决的方法与技巧进行详细介绍。

一、程序调试的重要性程序调试是软件开发中的一个非常重要的环节,它决定了最终产品的质量和稳定性。

程序中的bug和错误可能会导致程序崩溃或者产生不正确的结果,从而影响用户体验和产品的形象。

因此,及时发现和解决bug和错误对于保证软件的质量至关重要。

二、程序调试的方法1.打印调试打印调试是最简单有效的调试方法之一。

开发者可以在程序中加入一些打印语句,输出程序的执行状态和关键变量的数值。

通过打印调试可以很快发现程序中的问题,具有较高的实时性。

但是打印调试可能会导致程序输出过多的信息,不便于分析和定位问题。

2.断点调试断点调试是一种比较直观的调试方法。

开发者可以在程序中设置断点,当程序执行到断点处时就会停下来,可以查看程序的当前状态和变量的数值。

通过断点调试可以更加清晰地观察程序的执行流程和变量的变化,有助于快速定位问题。

但是断点调试需要开发者花费较多的时间和精力来设置和管理断点,对程序的运行速度有一定的影响。

3.单步调试单步调试是一种逐行执行程序的调试方法。

开发者可以一步一步地执行程序,观察每一步的执行结果和变量的变化。

通过单步调试可以清晰地了解程序的执行流程,及时发现和解决问题。

但是单步调试需要开发者花费较多的时间和精力,不适用于大规模的代码调试。

4.异常捕获异常捕获是一种通过捕获程序抛出的异常来进行调试的方法。

开发者可以在程序中加入异常处理的代码,当程序出现异常时就可以捕获异常并进行相应的处理。

通过异常捕获可以很快地发现程序中的问题,有助于保证程序的稳定性。

但是异常捕获需要开发者对程序的执行流程有一定的了解,不适用于对程序整体的调试。

5.使用调试工具调试工具是一些专门用来辅助程序调试的软件,如IDE中的调试器、代码覆盖率工具、检查内存泄漏的工具等。

程序调试及实验报告

程序调试及实验报告

实验名称:程序调试实验实验日期:2023年3月15日实验地点:计算机实验室实验目的:1. 理解程序调试的基本概念和流程。

2. 掌握使用调试工具进行程序调试的方法。

3. 提高解决程序错误的能力。

实验环境:1. 操作系统:Windows 102. 编程语言:Python3.83. 调试工具:PyCharm实验内容:本次实验主要针对一个简单的Python程序进行调试,该程序实现了一个简单的计算器功能。

程序中存在一些错误,需要通过调试找出并修正。

一、实验步骤1. 编写程序首先,编写一个简单的Python程序,实现以下功能:- 输入两个整数- 计算并输出它们的和、差、积、商代码如下:```pythondef calculator():num1 = int(input("请输入第一个整数:"))num2 = int(input("请输入第二个整数:"))sum = num1 + num2difference = num1 - num2product = num1 num2quotient = num1 / num2print("和:", sum)print("差:", difference)print("积:", product)print("商:", quotient)calculator()```2. 运行程序运行程序,输入两个整数,观察输出结果。

3. 调试程序在运行程序的过程中,可能会发现以下错误:(1)输入非整数时,程序会报错。

(2)当第二个整数输入为0时,程序计算商会报错。

针对以上错误,进行如下调试:(1)使用try-except语句捕获输入错误,确保程序不会因为输入错误而崩溃。

修改后的代码如下:```pythondef calculator():try:num1 = int(input("请输入第一个整数:"))num2 = int(input("请输入第二个整数:"))sum = num1 + num2difference = num1 - num2product = num1 num2quotient = num1 / num2print("和:", sum)print("差:", difference)print("积:", product)print("商:", quotient)except ValueError:print("输入错误,请输入整数!")calculator()```(2)当第二个整数输入为0时,为了避免程序报错,可以添加一个判断条件,当第二个整数为0时,不进行除法运算。

实验报告中程序调试

实验报告中程序调试

一、实验目的1. 理解程序调试的基本概念和方法。

2. 掌握使用调试工具进行程序调试的技巧。

3. 提高解决程序错误的能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 调试工具:PyCharm三、实验内容1. 编写一个简单的程序,实现以下功能:(1)读取一个整数n,并判断其是否为偶数。

(2)如果n是偶数,则输出n/2;如果n是奇数,则输出n+1。

2. 在程序中引入一个错误,使程序无法正常运行。

3. 使用调试工具定位错误,并修复错误。

四、实验步骤1. 创建一个Python文件,命名为“debug.py”。

2. 编写程序代码如下:```pythondef debug_function(n):if n % 2 == 0:return n / 2else:return n + 1try:n = int(input("请输入一个整数:"))result = debug_function(n)print("结果:", result)except ValueError:print("输入错误,请输入一个整数。

")```3. 在程序中引入一个错误,例如将输入部分改为以下代码:```pythontry:n = float(input("请输入一个整数:"))result = debug_function(n)print("结果:", result)except ValueError:print("输入错误,请输入一个整数。

")```4. 打开PyCharm,将“debug.py”文件导入到项目中。

5. 在PyCharm中设置断点,选择需要调试的代码行。

6. 启动调试模式,观察变量值的变化。

7. 定位到错误位置,发现输入部分将整数转换为浮点数,导致无法判断奇偶性。

程序调试及实验总结

程序调试及实验总结

程序调试及实验总结本文介绍了程序调试的基本方法及实验过程,包括断点调试、日志输出、调试工具的使用等,并对实验结果进行了总结和分析。

下面是本店铺为大家精心编写的4篇《程序调试及实验总结》,供大家借鉴与参考,希望对大家有所帮助。

《程序调试及实验总结》篇1引言程序调试是软件开发过程中必不可少的一环,目的是找出程序中存在的错误或问题,并加以修复,以确保程序的正确性和稳定性。

实验是程序调试的重要手段之一,通过实验可以验证程序的正确性,找出程序中存在的问题,进而进行调试和优化。

程序调试的基本方法断点调试是一种常见的程序调试方法,可以通过在代码中设置断点,使程序在执行到该位置时停止运行,以便观察程序执行过程中的变量值、内存信息等。

断点调试可以通过集成开发环境 (IDE) 或命令行调试器等方式实现。

日志输出是另一种常用的程序调试方法,通过将程序执行过程中的关键信息输出到日志文件或控制台,以便开发人员进行分析和调试。

日志输出可以通过打印语句、日志库等方式实现。

调试工具是程序调试的重要辅助工具,可以提供更加丰富的调试功能和工具。

例如,内存分析工具可以帮助开发人员查找内存泄漏问题,网络调试工具可以帮助开发人员调试网络程序等。

实验总结本次实验旨在通过编写程序并进行调试,掌握程序调试的基本方法和工具使用。

实验过程中,我们首先介绍了断点调试和日志输出的基本方法,并使用实际程序进行了演示。

然后,我们介绍了调试工具的使用,包括内存分析工具和网络调试工具等。

通过实验,我们发现程序调试是一个复杂而繁琐的过程,需要耐心和细心。

同时,我们也发现程序调试是一项重要的工作,可以有效提高程序的正确性和稳定性。

最后,我们总结出程序调试的基本原则,包括从小到大、从简单到复杂、从上到下等,这些原则可以帮助我们更加高效地进行程序调试。

总结本文介绍了程序调试的基本方法及实验过程,包括断点调试、日志输出、调试工具的使用等,并对实验结果进行了总结和分析。

计算机程序调试:常见的调试工具和技巧

计算机程序调试:常见的调试工具和技巧

计算机程序调试:常见的调试工具和技巧计算机程序调试是解决程序中的错误或问题的过程。

在软件开发的早期阶段,调试往往是程序员们面临的一项重要任务。

本文将介绍一些常见的调试工具和技巧,帮助读者更有效地调试程序。

一、调试工具1. 编译器自带调试器:大多数编程语言的主流编译器都提供了调试器,例如GDB、LLDB等。

这些调试器通常能够提供强大的功能,如断点设置、变量跟踪、单步执行等。

程序员可以通过调试器逐行查看代码执行过程,帮助发现潜在的错误。

2. 日志调试工具:日志是开发中常用的调试方式之一。

通过在代码中插入日志输出语句,在程序执行过程中记录各个关键节点的数据和状态,从而更好地理解程序的运行流程。

开发者可以使用Log4j、Logback等日志框架来进行日志的输出和管理。

3. 单元测试工具:单元测试是一种精确度很高的调试手段。

通过编写测试用例,测试特定模块或函数的输入输出,可以有效地验证程序的正确性。

JUnit是Java中常用的单元测试工具,而Python的unittest库也是一种常用的单元测试框架。

二、调试技巧1. 断点设置:在调试器中设置断点是调试的常用技巧之一。

通过在程序代码中设置断点,程序执行到断点处时会暂停,此时可以查看各个变量的值,并逐步调试代码。

在调试过程中,可以根据需要添加、删除或禁用不同的断点,以便更好地分析问题。

2. 单步执行:调试器通常支持单步执行功能,允许程序逐行执行。

通过单步执行,可以逐步调试代码,并观察每一行代码的执行情况,对于理解程序运行过程和查找错误非常有帮助。

3. 变量跟踪:在调试过程中,经常需要查看各个变量的值,以便分析问题。

调试器通常提供了变量查看的功能,可以在程序暂停的时候查看当前变量的值,或者设置断点后在断点处查看变量的值。

通过变量跟踪,可以更清晰地了解程序的状态。

4. 日志输出:在程序中适当插入日志输出语句,输出关键数据和状态,有助于程序调试。

在调试过程中,可以根据程序执行的路径和输出的日志,分析程序的运行流程,确定问题的所在。

程序调试的常用方法

程序调试的常用方法

程序调试的常用方法程序调试是软件开发中非常重要的一环,它可以帮助开发人员找出程序中的错误并进行修复,从而保证程序的正常运行。

在实际的开发过程中,程序调试的方法有很多种,下面将介绍一些常用的调试方法。

1. 打印调试信息打印调试信息是最常用的调试方法之一。

开发人员可以在程序中添加一些打印语句,输出程序中的变量值、函数调用信息等,以便于观察程序的执行过程。

在调试完成后,可以将这些打印语句删除或注释掉,以避免影响程序的性能。

2. 使用调试工具调试工具是一种专门用于调试程序的软件,它可以帮助开发人员快速定位程序中的错误。

常见的调试工具有Visual Studio、Eclipse、Xcode等。

这些工具可以提供调试器、断点调试、内存泄漏检测等功能,大大提高了调试效率。

3. 单元测试单元测试是一种测试方法,它可以对程序中的每个模块进行测试,以确保程序的每个部分都能正常运行。

在单元测试中,开发人员可以编写一些测试用例,对程序进行测试,并查找错误。

单元测试可以帮助开发人员快速定位错误,并提高程序的可靠性。

4. 代码审查代码审查是一种通过检查代码来发现错误的方法。

在代码审查中,开发人员可以通过查看代码、注释、变量名等来发现潜在的错误。

代码审查可以帮助开发人员发现一些常见的错误,如语法错误、逻辑错误等。

5. 日志记录日志记录是一种记录程序运行过程的方法。

在程序中添加日志记录语句,可以记录程序中的变量值、函数调用信息等,以便于观察程序的执行过程。

在调试完成后,可以将这些日志记录语句删除或注释掉,以避免影响程序的性能。

总之,程序调试是软件开发中非常重要的一环,它可以帮助开发人员找出程序中的错误并进行修复,从而保证程序的正常运行。

在实际的开发过程中,开发人员可以根据实际情况选择不同的调试方法,以提高调试效率。

实验报告程序调试

实验报告程序调试

实验报告程序调试进行实验时,程序调试是必不可少的一步。

下面我将详细讨论程序调试的重要性以及常见的调试技术。

首先,程序调试是确保程序能够正常运行的关键步骤。

在开发过程中,我们常常会遇到各种各样的错误,包括语法错误、逻辑错误和运行时错误。

通过调试,我们可以准确地找出错误所在,并对其进行修复。

只有通过调试,我们才能保证程序的功能的正确性和稳定性。

其次,程序调试可以提高开发效率。

如果我们没有进行调试,而是一味地猜测错误的原因和位置,那么我们可能会花费大量的时间才能找到问题的根源。

然而,通过调试工具,我们可以定位到具体的代码行,并查看变量的值,从而更加快速地找出错误。

调试可以帮助我们逐步地验证代码的正确性,这对于复杂的程序来说尤为重要。

在进行程序调试时,有几个常见的技术是非常有用的。

首先,我们可以使用断点来调试代码。

断点是指在代码中设定一个停止位置,程序在执行到该位置时会暂停,可以查看此时的变量状态和执行路径。

通过设置断点,我们可以逐步执行程序代码,观察变量的变化,从而找出问题的所在。

其次,利用日志输出是一种非常常见的调试技术。

我们可以在代码中插入一些输出语句,将程序运行时的一些关键信息打印出来,以便观察程序的执行过程和变量的值。

通过分析日志输出,我们可以更加准确地判断程序的执行情况,找到问题的所在。

另外,利用单元测试也是一种非常有效的调试技术。

单元测试是指针对程序的各个单元进行独立测试的方法,通过编写各种测试用例,用于检查程序的各个功能是否正常工作。

通过单元测试,我们可以快速地发现问题所在,并有针对性地进行修复。

此外,我们还可以使用调试器来进行程序调试。

调试器是一种专门用于调试程序的工具,可以让我们逐行执行程序代码,查看变量的值和执行路径。

通过调试器,我们可以更加直观地观察程序的执行情况,并且可以方便地进行变量查看和修改。

调试器通常提供了丰富的功能,如条件断点、变量监视和堆栈跟踪等,可以帮助我们更加高效地调试程序。

程序调试

程序调试
3.5 程序调试
为什么要调试?
问题 我的程序跟书上一样,怎么就不出结果呢? 我的程序没错啊,怎么不出结果啊? 我的程序运行结果不正确,如何找到错误? 原因 程序没有语法错误,不等于就没有语义错误。 要确保程序没错,必须对程序进行各种测试
程序调试入门
什么叫程序调试 所谓程序调试,是将编制的程序在正式投入实际运行前, 用手工或编译程序等方法修正语法错误和逻辑错误的过程。 通俗地说,程序调试就是查错与修改。
2.用程序调试器Debug调试程序
为了查找和修改程序中的逻辑错误, Visual C++ IDE
Integrated Development Environment
面向对象的集成开发环境
提供了重要的调试工具---Debug
Debug的启动
单击Build(组建)菜单 ---Start Debug(开始调试)子菜单 中的菜单项,可以启动 Debug
观察变量i的值的情况
注意在调试过程中
断点不能设置在空白行上面 添加断点和删除断点的方法: Step Into F10:Step over 设置了很多断点的时候,F5(Go)调试程序好 像更好用一点
控制程序的运行
Step over :运行当前箭头指向的代码(只运行一 条代码); Step Into :如果当前箭头所指的代码有函数的 调用,则用Step Into 进入该函数进行单步执行; Step Out:如当前箭头所指向的代码是在某一函 数内,用它使程序运行至函数返回处; Run to Cursor:使程序运行至光标所指的代码 处。
Run to cursor 执行到当前光标处,
注意观察箭头 便于理解记忆
调试程序的基本内容
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加减法参考程序DATA SEGMENT P ARA PUBLIC …DATA‟DATA ENDSSTACK SEGMENT P ARA STACK …STACK‟DB 512 DUP (?)STACK ENDSCODE SEGMENT P ARA PUBLIC …CODE‟ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,0000MOV DX,0000MOV SI,2050HMOV DI,2150HMOV BP,2250HMOV WORD PTR[SI],0205HMOV WORD PTR[DI],0408HMOV WORD PTR[BP],0109HMOV AL,…;送被加数低8位AL=…;低8位相加AL= ,AH= ,CF= …;加法ASCII调整AL= ,AH= ,CF=MOV DL,AL ;DL=MOV AL,[SI+1] ;AL=…;带进位加;AL= ,CF=…;加法ASCII调整AL= ,AH= ,CF= …;AL与DL交换AL= ,DL=…;和的低8位减减数的低8位AL=…;减法ASCII调整AL= ,AH= ,CF= …;AL与DL交换,存低8位结果AL= ,DL= …;高8位带进位减AL=…;减法ASCII调整AL= ,AH= ,CF= MOV DH,AL ;DH=RETSTART ENDPCODE ENDSEND START乘法参考程序DATA SEGMENT P ARA PUBLIC …DATA‟DATA ENDSSTACK SEGMENT P ARA STACK …STACK‟DB 512 DUP (?)STACK ENDSCODE SEGMENT P ARA PUBLIC …CODE‟ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,0MOV BX,0MOV DI,223AHMOV SI,2230HMOV AL,04HMOV BL,06H…;相乘,AL=,CF=…;调整,AH=,AL=MOV WORD PTR [DI],AXMOV AL,03H…;被乘数高8位乘以乘数低8位…;调整…;部分积相加…;调整MOV WORD PTR [DI+1],AXMOV AL,04HMOV BL,05H…;相乘…;调整MOV WORD PTR[SI],AXMOV AL, 03HMUL BL…;调整…;部分积相加…;调整MOV WORD PTR [SI+1],AXMOV AL,[DI] ;MOV BP,2240HMOV [BP],ALMOV AL,[DI+1]…;部分积相加…;调整MOV [BP+1],ALMOV AL,[DI+2] ;…;部分积相加…;调整MOV [BP+2],ALMOV AL,0…;部分积相加…;调整MOV [BP+3],ALRETSTART ENDPCODE ENDSEND START16进制到ACII码参考程序name HEXASCdata segment para public 'data'hex dw 0A5E9hasc db 20 dup(0)data endsstack segment para stack 'stack'db 512 dup (?)stack endscode segment para public 'code'assume c s:code,ds:data, es:data,ss:stackstart proc farpush dsmov ax,0push axmov ax,datamov ds,axmov es,axmov cx,0004hmov ax, …;AX= ,取十六进制数0ebf9hlea bx,ascaa: push cx…;给循环计数器赋转换代码长度…;AX= ,十六进制数循环左移push axand ax,000fh ;AX= ;AX= AX= ;AX=cmp al, …;判别是否为“0~9”… ascii;是“0~9”转asciiadd al,07hascii: add al,30h ;al = ;al = al= ;al =pop axloop aaretstart endpcode endsend startACII码到BCD码参考程序NAME A SCBCDDATA SEGMENT PARA PUBLIC'DATA'ORG 0150HDATA1 DW 3538H,4237H,3946H,3639H,3642HORG 0160HDB 10 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK'STACK'DB 512 DUP(?)STACK ENDSCODE SEGMENT PARA PUBLIC'CODE'ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,05H…; DI= ,[DI]= ASCII首址送DI …; SI= , BCD首址送SIBB:MOV BL,0FFHMOV AL,[DI] ;AL=…;检查是否为大于9的ASCII码…;是转DONE…;AL= ,[DI]= 不是,取ASCII码低4位…; 小于0的十进制数,转DONEMOV BL,ALDONE:MOV AL,BL ; AL= ,[DI]=MOV [SI],AL ;[SI]=…;指针加1…;指针加1…;(CX)不为0,转BBRET [160H]=START ENDPCODE ENDSEND STARTBCD码→二进制参考程序NAME BCD2DATA SEGMENTORG 0180HDAT1 DW 0802H,0103H,0009H,0706H,0407HORG 0190HDAT2 DB 10 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK'STACK'DB 512 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX…;循环计数器赋转换代码长度…;BCD码首址送DI…;二进制首址送SIXL: …;BCD码十位数值赋AL MOV BL,0AHMUL BL ;乘10INC DIMOV AH,00H…;BCD码十位和个位相加,转换结束…;转换结果存二进制起始地址INC DIINC DIINC SI ;(CX)不为0转AALOOP XLRETSTART ENDPCODE ENDSEND START查表处理参考程序DATA SEGMENTLIST DW 12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H DATA ENDSCODE SEGMENTDEL_UL PROC FARASSUME CS:CODE,DS:DATA,ES:DATAMAIN: PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX, ….. ;AX=CLDLEA DI, …; DI= ,[DI]= ….. …取得数据区首地址PUSH DIMOV CX,ES:[DI] ;CX=ADD DI,2…SCASW ; AX= ,DI= ,[DI-2]= 字符串比较…DELETE ;字符相同转移JMP SHORT EXITDELETE:…DEC_CNT ;CX寄存器内容为0则到数据区尾转结束NEXT_EL: MOV BX,ES:[DI] ;BX= , [DI-2]MOV ES:[DI-2],BX ; (DI-2)= ,(DI)=ADD DI,2LOOP NEXT_ELDEC_CNT: POP DIDEC WORD PTR ES:[DI] ; (0H)= ……….EXIT: RETDEL_UL ENDPCODE ENDSEND MAIN分支与循环参考程序DATA SEGMENTORG 200HARRAY DW 56H,12H,-6790H,0,78H,0H,-1H,0H,3000H,90HDATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DSMOVAX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,…;CX= 循环计数器赋转换代码长度MOV BX,0MOV DI,BXMOV SI,BX…;BX= ……字数组首址送BX AGAIN:MOV AX,[BX]…;与0比较…LEQ ;小于或等于0转INC DI ;AX= ,DI=JMP SHORT NEXTLEQ: …NEXT ;小于0转INC SI ;AX= ,SI=NEXT:ADD BX,2LOOP AGAINMOV AX,10…;字数组长度减负数…; AX= 字数组长度减负数再减零RETMAIN ENDPCODE ENDSEND START排序参考程序DATA SEGMENTDAT DW 10,1234H,2345H,3456H,9999HDW 8700H,7000H,0,6500H,5111H,4FBDHDATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,ES:DATASTART:PUSH DS ;初始化SUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX…;字数组首地址送DI…;循环长度送CX…;循环长度减1(10个数据,循环9次) LOOP1:MOV SI,CXINC DIINC DILOOP2:…;取DAT(I)个数据…;与DAT(I+1)个数据比较…;如果DAT(I+1)大于或等于DAT(I)转移…; AX= ,(DI)=否则交换…;(DI)=存较小的数CON: ADD DI,2LOOP LOOP2…;(DI)=……. 取循环长度,准备下次比较…;字数组首地址送DILOOP LOOP1 ;(DI)=……..RETMAIN ENDPCODE ENDSEND START6264参考程序.486DATA SEGMENT AT 0 USE16ORG 4000HDATA1 DB 6 DUP(?)DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA,ES:DATAORG 2000HBEG: JMP STARTSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,0MOV SS,AXMOV SP,1000HMOV AX,…;6264段地址MOV DS,AXXOR AX,AXMOV BX,…;偏移地址MOV CX,…;数据长度M1: M OV BYTE PTR[BX],AL ; (BX)= , (BX)= , (BX)=送数据INC ALINC BXLOOP M1HARTENDPCODE ENDSEND BEG8255参考程序.486DATA SEGMENT AT 0 USE16PORTA EQU …;A口PORTB EQU …;B口PORTC EQU …;C口CONTROL E QU 20FH ;控制口PORT1 EQU 340H ;七段码段地址PORT2 EQU 360H ;七段码位地址ORG …HDATA1 DB 6 DUP (?) ;输入数据区ORG …HDATA2 DB 6 DUP (?) ;显示缓冲区DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA,ES:DATAORG 2000HBEG: JMP STARTTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FHDB 67H,77H,7CH,39H,5EH,79H,71H ;段码表STlART: MOV AX,DATA ;初始化MOV DS,AXMOV ES,AXMOV AX,0MOV SS,AXMOV SP,1000H…;8255初始化……;清显示…LP:…; AL= 读数据……;存数据…CALL CZ ;调用拆字子程序CALL DISP ;调用显示子程序JMP …;循环取数显示CZ PROCPUSH CXLEA SI,DATA1 ; SI= 拆字,取数LEA DI,DATA2 ;DI= 显示缓冲区首址CZ0:MOV BL,[SI]AND BL,0F0H ;BL=MOV CL,4ROL BL,CLMOV [DI],BL ;(DI)=INC DIMOV BL,[SI]AND BL,0FH ;BL=MOV [DI],BLINC SIINC DICMP SI, …HJBE CZ0POP CXRETCZ ENDPDISP PROC ;显示子程序PUSH CXPUSH DXLEA BX,TABLEA SI,DATA2MOV AH,0C1HDISP1:MOV DX,PORT2MOV AL,AHOUT DX,AL ; AL= , AL= 位输出MOV DX,PORT1MOV AL,[SI]XLATOUT DX,AL ;AL= ,AL= 段输出MOV CX,0200HLOOP $INC SISAL AH,1OR AH,0C0HCMP AH,0C0HJNZ DISP1POP DXPOP CXRETDISP ENDPCODE ENDSEND BEG8253参考程序.486DATA SEGMENT AT 0 USE16ZDXL EQU 20H ;中断向量(20H) OPORT EQU 3A0H ;8259偶地址JPORT EQU 3A8H ;8259奇地址PORT1 EQU 340H ;段地址PORT2 EQU 360H ;位地址DS0 EQU 300H ;8253通道0DSC EQU 30CH ;8253控制口COUNT EQU 50ORG 4000HDATA1 DB 6 DUP(?)ORG 4040HDATA2 DB 3 DUP(?)DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA,ES:DATAORG 2000HBEG: CLIJMP STARTTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,DB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;段码表TIMER DB 0 ;延时、计数初值START:…;初始化INIT8253:MOV DX,DSCMOV AL, …;方式3,方波发生器OUT DX,ALMOV DX,DS0MOV AL,0BHOUT DX,ALMOV AL,0E9HOUT DX,ALSETVECT:MOV DI,0MOV DX,OFFSET SERVER ;中断服务子程序偏移地址;送中断向量低位MOV ZDXL[DI],DXMOV DX,CS ;中断服务子程序段地址;送中断向量高位MOV ZDXL[DI+2],DX ,(00:20H)INIT8259:MOV AL,00010011B ;ICW1MOV DX,OPORTOUT DX,ALMOV AL,00001000B ;ICW2MOV DX,JPORTOUT DX,ALMOV AL,00001101B ;ICW4MOV DX,JPORTOUT DX,ALMOV AL,11111110B ;OCW1MOV DX,JPORTOUT DX,ALMOV AL,20H ;EOI(20H)MOV DX,OPORTAGAIN:STI ;开中断CALL CZ ;调拆字CALL DISP ;调显示JMP AGAINCZ PROC…RETCZ ENDPDISP PROC…RETDISP ENDP;--------------------------------------SERVER PROC ;8253中断入口CLIPUSH AXPUSH CXPUSH DXPUSH SIPUSH DILEA SI,TIMERMOV AL,[SI]INC ALCMP AL, …;与延时、计数值终值比较…WORK ;大于、等于(到1秒)转移MOV [SI],AL ;[SI]= , [SI]= ,[SI]=JMP EXITWORK:MOV AL,0MOV [SI],ALLEA SI,DATA2+2MOV AL,[SI]INC AL…;十进制调整CMP AL, …;与60秒比较…MINUTE ;大于、等于(60秒)转移MOV [SI],ALJMP EXITMINUTE:MOV AL,0LEA SI,DATA2+1MOV AL,[SI]INC AL…;十进制调整CMP AL, …;与60分比较…HOURE ;大于、等于(60分)转移MOV [SI],ALJMP EXITHOURE:MOV AL,0MOV [SI],ALLEA SI,DATA2MOV AL,[SI]INC AL…;十进制调整CMP AL, …;与24小时比较…NEXT ;大于、等于(24小时)转移MOV [SI],ALJMP EXITNEXT:MOV AL,0MOV [SI],ALEXIT:MOV AL,20HMOV DX,OPORTOUT DX,ALPOP DIPOP SIPOP DXPOP CXPOP AXIRETSERVER ENDPCODE ENDSEND BEGA/D、D/A参考程序.486DATA SEGMENT AT 0 USE16ORG 4000HDATA1 DB 6 DUP(?) ;转换数据暂存区ORG 4010HDATA2 DB 3 DUP(?) ;显示缓冲区DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA,ES:DATAORG 2000HBEG: JMP STARTTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH DB 67H,77H,7CH,39H,5EH,79H,71H ;段码表ADPORT EQU 3C0HADPORT7 EQU 3DCHDAPORT EQU 3E0HZDXL EQU 20H ;中断向量(20H) OPORT EQU 3A0H ;8259偶地址JPORT EQU 3A8H ;8259奇地址PORT1 EQU 340HPORT2 EQU 360HSTART:…;初始化SETVECT:…;中断初始化LAST: MOV DX,ADPORT ;启动ADCOUT DX,AL;--------------------------------------AGAIN:STICALL CZ ;调用拆字子程序CALL DISP ;调用显示子程序JMP AGAIN;--------------------------------------CZ PROC…RETCZ ENDPDISP PROC…RETDISP ENDP;--------------------------------------IRQ2 PROC ; A/D中断服务程序CLIPUSH AXPUSH SIPUSH DX…;取A/D转换通道地址…;读A/D转换数据LEA SI,DATA1MOV [SI],AL ;保存A/D转换数据…;启动A/D…;取D/A转换通道地址…;启动D/AMOV AL,20H ;EOI(20H)MOV DX,OPORTOUT DX,ALPOP DXPOP SIPOP AXIRETIRQ2 ENDP;--------------------------------------CODE ENDSEND BEG8251参考程序(中断方式,异步数据发送).486DATA SEGMENT AT 0 USE16ORG 4000HDATA1 DB 1 DUP(?) ;发送数据区OUNT EQU 02 ;延时、计数终值C8251 EQU 330H ;8251控制口地址D8251 EQU 320H ;8251数据口地址DS0 EQU 300H ;8253通道0DSC EQU 30CH ;8253控制口DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATAORG 2000HBEG: CLI ;关中断JMP STARTSTART:…;初始化INIT8253:…;8253初始化。

相关文档
最新文档