版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言实验指导书 目 录实验一 Debug命令的使用3实验二 基本汇编指令的使用 7实验三 汇编语言程序的调试与运行10实验四 系统功能调用程序的调试与运行15实验五 分支程序设计17实验六 循环程序设计20实验七 子程序设计23实验八 高级汇编语言程序设计25实验九 I/O程序设计 30实验十 中断程序设计33实验十一 综合程序设计38实验一 Debug命令的使用一、 知识点1、 DEBUG简介DEBUG.EXE是DOS提供的用于调试可执行程序的一个工具软件。在汇编语言程序调试中很常用。DEBUG的提示符是“-”,所有DEBUG调试命令均在此提示符下输入。DEBUG命令都是一个字母,后跟一
2、个或多个参数,也可使用默认参数。DEBUG命令的使用注意问题:(1) 字母不分大小写(2) 只使用十六进制数,但没有带后缀字母“H”(3) 命令如果不符合DEBUG的规则,则将以“error”提示,并以“”指示出错位置。(4) 每个命令只有按下回车键后才有效,可以用Ctrl+Break终止命令的执行。2、 Debug的调入和退出以WIN2000环境为例,点击“开始/运行”,在“运行”对话框中输入命令:cmd,然后点击“确定”,进入DOS命令行状态: C:Documents and Settingslfy>然后输入命令: >Debug 进入Debug调试状态,出现Debug命令提示府
3、“-”,在此提示符下可运行所需要的Debug命令了。退出Debug的命令:Q3、 Debug常用命令(1) 汇编命令A,格式为: - A 地址功能:从指定地址开始允许输入汇编指令,并将该指令汇编成机器指令代码从指定地址开始存放。若不指定地址,则系统从默认的地址开始存放。按回车键退出汇编状态应用:用于调试一条指令或几条指令组成的一个程序段。(2) 显示和修改寄存器命令R,格式为: - R 寄存器名功能:若指定寄存器,则显示指定的寄存器的内容,并可进行修改;若不要修改,则按Enter健。若未指定寄存器,则默认为显示所有寄存器的内容。应用:常用于通过寄存器的值查看指令的执行结果。(3) 内存单元内容
4、的命令E,格式为: - E 地址 内容表功能:若指定内容表,则用内容表中的内容代替指定地址开始的存储单元的值;否则,从指定地址开始逐个单元显示其内容,并等待用户修改,按空格键则继续显示下一单元的值,按回车键结束。例如: -E 100 184E: 0100 89,78其中,184E时数据段的段地址,0100是要修改的单元的偏移地址,89为该单元的值,78为程序员键入的值。结果0100单元的值由89H改变为78H。应用:常用于在调试程序的过程中改变变量的初始值。(4) 显示内存单元内容的命令D,格式为: - D 地址 或 D 范围功能:前者为显示从指定地址开始的一段存储单元的值;后者为显示指定范围
5、内的存储单元的值。例如: - D 200 ;显示从DS:200单元开始的各单元的值- D 200 L10 ; 显示从DS:200单元开始的10个字节单元的值。应用:常用于在调试过程中检查变量的值。 (5) 单步执行命令T,格式为:- T =地址功能:从指定地址执行一条指令后停下来,显示寄存器内容和状态值。若未指定地址,则执行当前指令的下一条指令。(6) 反汇编命令 U ,格式为:-U 地址 或 -U 范围 功能:从制定地址开始,反汇编32个字节,或对指定范围内的主存内容进行反汇编。若没有指定地址,则接着上一个U命令的最后一个单元开始;若还没有使用过U命令,则从当前CS:IP开始。例如: -U
6、100,1061343:0100 B80302 MOV AX,02031343:0103 BB0540 MOV BX,40051343:0106 01D8 ADD AX,BX 其中,屏幕最左边是主存逻辑地址(段地址:偏移地址),中间是该指令的机器代码,右边是对应指令的汇编语句格式。(7) 运行命令G, 格式为: -G = 起始地址 断点地址1,断点地址2,断点地址10功能:从等号后的起始地址开始运行,直到遇到断点或程序正常结束。例如: -G=100 106则程序执行从100开始的程序段,到断点106停止。此时指令ADD AX,BX并未执行。二、 实验目的及要求1、编语言调试环境Debug的使用
7、,重点掌握常用命令(A R D E T)的使用,其他指令在以后的学习中逐步掌握。 2、利用Debug命令,调试采用不同寻址方式的指令的执行结果,从实践中加深对寻址方式和MOV指令的理解。三、 实验内容1、 Debug程序的调入和退出2、 Debug常用调试命令的使用3、 MOV指令、XCHG指令、XLAT指令的调试四、 实验步骤说明:首先输入以下程序段,然后单步执行并查看结果;改变寄存器AX的初始值后再运行,并查看结果。带下划线的部分为程序员输入的内容。在DEBUG环境下,所有的数据均以十六进制输入和显示。-A137B:0100 mov ax,20137B:0103 mov bx,ax137B
8、:0105 add ax,bx137B:0107 mov 2000,ax137B:010A-T=0100AX=0020 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=137B ES=137B SS=137B CS=137B IP=0103 NV UP EI PL NZ NA PO NC137B:0103 89C3 MOV BX,AX-T=0103AX=0020 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=137B ES=137B SS=137B CS=1
9、37B IP=0105 NV UP EI PL NZ NA PO NC137B:0105 01D8 ADD AX,BX-TAX=0040 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=137B ES=137B SS=137B CS=137B IP=0107 NV UP EI PL NZ NA PO NC137B:0107 A30020 MOV 2000,AX DS:2000=000-TAX=0040 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=137B
10、ES=137B SS=137B CS=137B IP=010A NV UP EI PL NZ NA PO NC137B:010A 0000 ADD BX+SI,AL DS:0020=FF-D 2000 L2137B:2000 40 00 .;修改0100处的指令mov ax,20 将AX的初始值改为10,并重新运行-A 0100137B:0100 mov ax, 10137B:0103;最后一条指令执行的结果如下:AX=0020 BX=0010 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=137B ES=137B SS=137B CS=1
11、37B IP=010A NV UP EI PL NZ NA PO NC137B:010A 0000 ADD BX+SI,AL DS:0010=DF;查看2000单元的值为0020H-D 2000 l2137B:2000 20 00 .;修改2000单元的值,由20h改为30h 并重新显示-E 2000137B:2000 20.30-D 2000 l2137B:2000 30 00 五、 拓展题MOV、XCHG、XLAT指令的调试。要求:用汇编命令A输入以下源程序段,用T命令单步执行,查看执行结果:寄存器或存储单元的值。提示:在DEBUG环境下输入程序段时要省掉立即数后面的字符“H”1、MOV指
12、令的调试程序段:MOV AL, 55H MOV AH, AL MOV BX, 1000H MOV BYTE PTRBX, 66H MOV WORD PTRBX+2, 77H MOV BX+4, AX2、 XCHG指令的调试程序段:MOV AX, 0203H MOV BX, 0405H XCHG AX, BX XCHG BL, BH 3、 XLAT指令的调试(1) 用E命令从DS:200地址开始输入数据10H、20H、30H、40H、50H(2) 用A命令输入以下程序段:MOV BX, 200 ;将数据的首地址送给BXMOV AL, 4用MOV ;将要查找的数据的偏移地址送给ALXLAT;查看结
13、果寄存器AL中的值,以及从DS:200开始的存储单元的值。六、 实验报告写出在DEBUG状态下编写、运行程序段的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验二 基本汇编指令的使用一、知识点1、 最常用的传送指令 MOV 可以将立即数/内存单元的值/寄存器的值送给寄存器,或将立即数/寄存器的值送给内存单元,但不允许两个内存单元之间直接传送。2、 常用算术运算指令 ADD/ADC/INC、SUB/SBB/DEC/CMP/NEG两个单字节/单字之间的加法用ADD指令、减法用SUB指令;多字节/多字之间的加/减,除最低字节/最低字用ADD/SUB指令外
14、,其余字节/字之间的加/减都要用包含进位/借位的ADC/SBB指令。INC和DEC指令常用于修改计数器或修改指针,常用与循环处理一批数据。CMP指令常用于比较两个数的关系,为下一步的条件转移做准备(后跟条件转移指令)。3、 常用逻辑运算指令 AND/OR/NOT/XOR/TESTAND指令常用于给一个数据的某几位清零;OR指令常用于给一个数据的某几位置1;XOR指令常用于将一个数据某几位翻转;NOT指令常用于将一个数据所有位取反;TEST指令常用于测试一各数据的某一位或某几位的值,后跟条件转移指令。4、 常用移位指令 SHL/SHR/SAR/ROL/ROR/RCL/RCRSHL和SAL功能相同
15、,都是将操作数左移一位或几位,移出的空位补0;SHR和SAR功能不同,虽都是将操作数右移一位或几位,但左边移出的空位分别补0和1(SHR要补0,SAR补1)。二、实验目的及要求1、继续熟悉汇编语言调试环境Debug的使用,掌握常用调试命令。 2、用基本指令编写的程序段,并在Debug环境中调试,从实践中加深对基本汇编语言指令的执行过程的理解。3、实验前要做好充分准备,包括汇编程序段清单、调试步骤、调试方法,以及对程序结果的分析等。三、实验内容1、 单步调试以下程序段,给出每条指令执行后AL的值,以及CF、ZF、SF、OF的状态。MOV AL, 89HADD AL, ALADD AL, 9DHC
16、MP AL, 0BCHSUB AL,ALDEC ALINC AL2、 编写程序段,分别完成11223344H与55667788H的加/减计算,并调试、观察结果。3、 单步调试以下程序段,给出每条指令执行后AL的值,以及CF、ZF、SF、OF的状态。MOV AX, 1470HMOV BX, 3060HAND AX, BXOR AX, BXXOR AX, AXNOT AXTEST AX,0F0F0H4、 设(AX)=1234H,写出执行下列每条指令后AX寄存器的内容,并观察CF的变化。SHL AX, 1MOV CL, 2SHL AX, CLSHR AX, 1ROL AX, 1MOV CL, 3RO
17、L AX, CLRCR AX,1MOV CL, 2RCR AX, CL四、实验步骤1、利用DEBUG的A命令输入待调试的程序段。2、利用单步执行命令T逐条执行指令,观察寄存器及相关状态位的值。以实验内容2中的加法为例,实现加法运算:注:下划线部分为程序员输入的内容。(1)-A1373:0100 MOV AX, 3344 ;DX.AX<- 11223344H1373:0103 MOV DX, 11221373:0106 ADD AX, 7788 ; DX.AX+55667788H->DX.AX 1373:0109 ADC DX, 55661373:010D-T=100AX=3344
18、BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1373 ES=1373 SS=1373 CS=1373 IP=0103 NV UP EI PL NZ NA PO NC1373:0103 BA2211 MOV DX,1122-TAX=3344 BX=0000 CX=0000 DX=1122 SP=FFEE BP=0000 SI=0000 DI=0000DS=1373 ES=1373 SS=1373 CS=1373 IP=0106 NV UP EI PL NZ NA PO NC1373:0106 058877 ADD AX,77
19、88-TAX=AACC BX=0000 CX=0000 DX=1122 SP=FFEE BP=0000 SI=0000 DI=0000DS=1373 ES=1373 SS=1373 CS=1373 IP=0109 OV UP EI NG NZ NA PE NC1373:0109 81D26655 ADC DX,5566-TAX=AACC BX=0000 CX=0000 DX=6688 SP=FFEE BP=0000 SI=0000 DI=0000DS=1373 ES=1373 SS=1373 CS=1373 IP=010D NV UP EI PL NZ NA PE NC1373:010D 00
20、00 ADD BX+SI,AL DS:;结果:DX.AX=6688AACCH五、拓展题:1、 编写程序段:将DX.AX中的双字右移一位。2、 编写程序段:将AX寄存器的最低4位置1,最高3位清0,第7、8、9位取反,其余位不变。设AX中原来的值为0AAH。3、 设AX=2AH,BX=30H,编写程序段计算:AX/BX,并将结果送BX.CX。六、实验报告:1、写出源程序段清单、程序说明、执行结果。 2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验三 汇编语言程序的调试与运行一 知识点1、 汇编语言源程序的格式完整
21、的汇编语言源程序由段组成,即代码段、数据段、附加段和堆栈段。其中,需要独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。例如,输出一个字符串的源程序:.model small ;定义程序的存储模式(小型程序一般采用小模式).stack ;定义堆栈段 .data ;定义数据段 string db An example.,0ah,0dh,$ ;在数据段中定义要显示的字符串 .code ;定义代码段 .startup ;程序的起始点 lea dx, string ;将字符串的起始地址送dx,即设置入口参数 mov ah, 09h ;设置输出字符串的功能调用号 int
22、21h ; 功能调用:显示 .exit 0 ;程序结束点,返回dos end ;汇编结束注:这是简化段定义的程序格式2、 汇编语言程序的开发过程一般步骤:编辑、编译、连接、调试运行(1) 源程序的编辑源程序文件可以利用任一文本编辑器进行编辑,通常我们用“记事本”。源程序文件保存时,一般以 .asm为文件的后缀名。具体实现:如图在win2000环境下,在“另存为”界面中输入文件全名(example.asm),并且将“保存类型“选择为“所有文件”。也可以使用.txt后缀名,不过在汇编时要写源文件的全名,否则系统默认的为.asm。(2) 源程序的汇编、连接汇编是将源程序翻译成由机器代码组成的目标模块
23、文件的过程。连接程序将一个或多个目标文件和库文件合成一个可执行文件。MASM6.X提供的ML.EXE可以实现:先汇编,若没有错误则自动调用LINK.EXE连接程序进行编译;若有错,则提示错误信息,可利用列表文件查看错误所在位置,并改正错误,重新汇编和连接。例如,设上面的例题程序文件为EXAMPLE.ASM,并且该文件与ML.EXE等文件都在同一目录(设该目录为当前目录)下,则汇编、连接的命令为:>ML EXAMPLE.ASM运行结果见实验步骤2。产生:EXAMPLE.OBJ和 EXAMPLE.EXE文件特别说明:ML允许汇编和连接多个程序形成一个可执行文件,而且还可以带参数,格式:ML
24、/参数选项 文件列表常用参数选项有: /c 只汇编源程序,不进行自动连接(注意用小写字母c) /Fl 文件名创建一个汇编列表文件(扩展名LST),用于查找错误。 Sg 在省城的列表文件中,列出由汇编程序产生的指令例如:若将字符串的引号改为中文的“”后重新用下面命令汇编连接,则结果见实验步骤3。>ML /Fl EXAMPLE.ASM(3) 可执行程序的调试在操作系统提示符下直接输入柯执行文件名即可运行:>EXAMPLE当出现运行错误时,通常用DEBUG进行调试:>DEBUG EXAMPLE.EXE然后采用U命令进行反汇编,用T或G命令运行并观察,找出错误所在。二实验目的及要求1
25、掌握数据定义、段定义的方法2熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。3、熟悉常见Jcc指令、loop指令的使用。三实验内容编程实现:1、 求数组array中的20个字元素的和,并存入变量total中。其中,数组元素在定义数组时以初值的形式给出。2、 给DX送一个初值,然后判断:若DX的高4位全为0,则使AX=0;否则使AX=-1。3、 定义一个字符串string,包含若干字符并且以$结尾,用程序统计字符的个数。四、实验步骤以实验内容1为例,介绍实验步骤:1、 编辑源程序:在记事本中输入如下程序,并存在E:MASM6BINEXAM1.ASM中。2、 汇编、编译:情况1:没有
26、错误>ml example.asmObject Modules .obj: example.objRun File example.exe: "example.exe"List File nul.map: NULLibraries .lib:Definitions File nul.def:产生:EXAMPLE.OBJ和 EXAMPLE.EXE文件情况2:源程序中有错误,比如将字符串的引号改为中文的“”后重新用下面命令汇编连接。>ML /Fl EXAMPLE.ASMMicrosoft (R) Macro Assembler Version 6.11Copyrig
27、ht (C) Microsoft Corp 1981-1993. All rights reserved. Assembling: example.asmexample.asm(5): error A2044: invalid character in fileexample.asm(8): error A2006: undefined symbol : string则给出2条错误信息提示,并产生错误列表文件 EXAMPLE.LST在记事本中打开该文件,内容如下:;输出一个字符串的源程序: .model small .stack .data string db An example.'
28、,0ah,0dh,'$' example.asm(5): error A2044: invalid character in file .code ;定义代码段 .startup ;程序的起始点 lea dx, string example.asm(8): error A2006: undefined symbol : string mov ah, 09h int 21h ; 功能调用:显示 .exit 0 ;程序结束点,返回dos end ;汇编结束特别提示:两处错误明显的标在源程序中。实际上,只有一处错误,后面的错误是由于前面的错误引起的,所以改正错误时要从前往后逐个修改,
29、并且每改完一处就重新存盘、汇编,以提高调试效率。3、 调试:C:masm>debug example.exe-u ;反汇编1395:0000 BA9713 MOV DX,13971395:0003 8EDA MOV DS,DX1395:0005 8CD3 MOV BX,SS1395:0007 2BDA SUB BX,DX1395:0009 D1E3 SHL BX,11395:000B D1E3 SHL BX,11395:000D D1E3 SHL BX,11395:000F D1E3 SHL BX,11395:0011 FA CLI1395:0012 8ED2 MOV SS,DX1395
30、:0014 03E3 ADD SP,BX1395:0016 FB STI1395:0017 8D160400 LEA DX,0004 ;源程序中的第一条指令1395:001B B409 MOV AH,091395:001D CD21 INT 211395:001F B8004C MOV AX,4C00 ;对应.exit 0 指令-u1395:0022 CD21 INT 21此时可用debug命令调试该程序了。4、 关于变量名对应的偏移地址源程序的第一条指令是:lea dx, string汇编后对应的指令是:LEA DX,0004因此,可看出变量string所对应的偏移地址是:0004h如果要查
31、看从string开始的字符串的内容,可用如下命令:-D 04 Lc即查看从04H开始的12个单元的内容。五、拓展题1、有两个64位数值,按“小端方式“存放在两个缓冲区buffer1和buffer2种,计算buffer1-buffer2,并将结果存放到变量result中。2、将DX.AX中的双字右移4位。六、实验报告1、写出源程序清单、程序说明、执行结果。 2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验四 系统功能调用程序的调试与运行一、知识点1、常用字符/字符串输入/出系统功能调用(1) 输出一个字符:DOS
32、功能调用INT 21H的02号功能调用使用格式:MOV AH, 02H ;设置功能调用号 AH<-02HMOV DL, * ;设置入口参数DL<-待显示的字符的ASCII码INT 21H ;DOS功能调用:显示(2) 输入一个字符:DOS功能调用INT 21H的02号功能调用使用格式: MOV AH, 01H ; 设置功能调用号 AH<-01H INT 21H ;DOS功能调用:显示出口参数:AL=字符的ASCII码说明:执行此功能时,等待用户按键,然后读取按键值。(3) 输出一个字符串:DOS功能调用INT 21H的09号功能调用使用格式:MOV AH, 09H ;设置功能
33、调用号 AH<-09HLEA DX, STRING ;设置入口参数DX<-待显示的字符串的首地址INT 21H ;DOS功能调用:显示说明:字符串必须以$结束;入口参数DS:DX=待显示的字符串的首地址(段地址:偏移地址)(4) 输入一个字符串:DOS功能调用INT 21H的0A号功能调用,将键盘输入的字符串送入指定的缓冲区。入口参数DS:DX=待显示的字符串的首地址(段地址:偏移地址)使用该功能前,首先要定义接受字符串的缓冲区,格式:BUFFER DB 81 ;定义缓冲区,以及可能输入的最大字符数 DB 0 ;该字节用于存放实际输入的字符的个数 DB 81 DUP(0) ;该区域
34、用于存放输入的字符串,初值设为0使用格式: MOV AH, 0AH ; 设置功能调用号 AH<-01H MOV DX, SEG BUFFER MOV DS, DX ;缓冲区的段地址àDS LEA DX, BUFFER ; 缓冲区的偏移地址àDX INT 21H ;DOS功能调用:输入字符串二、实验目的及要求:1、掌握接受键盘数据的方法,掌握向显示器输出数据的方法。并了解数据显示时,须转为ASCII码的原理。2、 握DOS功能调用的编程方法。3、 实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等。三、实验内容:编程实现:1、 从键盘输入
35、一个小写字母,转换成大写字母,然后换行输出。2、 从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志$,然后输出该字符串。3、 从键盘输入的一个字符串(不超过10个字符,以回车结束,),将字符串的长度送入寄存器AL,然后输出字符串的长度。四、实验步骤:具体编程、调试步骤同实验三编程提示:1、 换行的实现:输出字符0AH、0DH2、 在字符串末尾加上结束标志$的实现:若接收字符串的缓冲区为buffer,则先取出实际输入的字符: mov si, buffer+1然后将字符串末尾加上$:mov buffer+si+2, $,其中buffer+2为字符串的首地址3、 输出字符串长度的实现
36、:首先取出实际输入的字符数,然后将该数字转换成对应的ASCII码,最后输出该数字对应的字符。五、思考题:程序中的原始数据是以怎样的形式存放在数据区中的?请用DEBUG调试程序观察并分析。六实验报告:1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果。5、回答思考题。实验五 分支程序设计一、知识点1、 控制转移类指令无条件转移指令JMP 、条件转移指令Jcc2、 单分支结构注意分支条件的选择:当条件满足时,直接转到分支的下一条指令;否则,
37、执行单分支语句段。例如,求AX中数据的绝对值:CMP AX, 0JGE NONEGNEG AX NONEG: MOV RESULT, AX思考:如果条件改为 JL,以上分支程序段如何改写?是比较程序段的复杂度?3、 双分支结构双分支结构中条件的选择任意,但特别注意:当分支语句段1结束后,一定要用JMP指令跳过分支语句段2,即跳到分支结束的位置。例如,判断AX中的数据的符号,若为非负数,则0àsign;否则,-1àsign。 CMP AX, 0 JGE NONEG MOV SIGN, -1 JMP END0NONEG: MOV SIGN, 0END0: 4、 分支结构程序测试
38、用例的设计基本准则:测试用例要满足能够使每个分支都能执行一次,特别注意边界数据的测试。换句话说,就是首先分析每个分支条件,找出使条件成立、不成立时的数据取值范围,然后从每个范围中选一个数据,形成一个测试用例;另外,边界数据作为单独一个测试用例。举例说明:(1)单分支/双分支结构的测试:比如上面“判断AX中的数据的符号”程序段,需要设计三个测试用例,即分AX>0、 AX<0、 AX=0三种情况,分别确定一个数据(假设AX分别取5、-2、0三个数据)。其中,0就是一个介于条件成立与不成立之间的边界数据。具体操作:在DEBUG环境下,用R命令改变AX的值,调试,分析程序流程和结果。(2)
39、多分支结构的测试:比如,实验内容第3题的多分支结构的测试:则至少要对每一种情况设计一个测试用例, 即19中的一个数、az中的一个字符、AZ中的一个字符、回车符、其他字符,然后设计边界测试用例1、9、A、Z、a、z,共11个测试数据。具体操作:当测试数据需要从键盘输入时,可在在MS-DOS环境下逐个使用测试数据运行;当测试数据是程序中某个变量或寄存器的值时,可在DEBUG环境下,利用R或E命令用测试数据修改寄存器或变量的值,然后运行。二、 实验目的及要求1、掌握分支程序的结构。2、掌握分支程序的设计、调试方法。3、实验前要做好充分准备,包括流程图、汇编程序清单、调试步骤、调试方法,以及对程序结果
40、的分析等。4、编程时先画流程图,培养结构化程序设计的思想;调试前根据程序结构设计测试用例,逐步掌握程序测试方法。三、 实验内容1、 编写一个程序,显示AL寄存器中的两位十六进制数。2、 编写一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量中存放的是8位无符号数。3、 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。四、 实验步骤1、用记事本编写.ASM源程序。2、对源程序进
41、行汇编及连接,产生.EXE文件、.LST文件。3、在DEBUG环境下调试:(1)用DEBUG命令U反汇编,用T单步执行,查看程序的流程及每一步的执行结果。(2)用R命令修改AL寄存器的内容,重新运行第一题的程序,分析结果。(3)用E命令修改变量bufX和bufY的值,重新单步执行第二题的程序,分析程序的流程及运行结果。(4)反复调试运行第三题的程序,分别输入:19中的一个数、az中的一个字符、AZ中的一个字符、回车符、其他字符,分析并记录每次的输入数据与执行结果。4、在MS-DOS下直接运行.EXE文件a. 对第1题、第2题的程序直接在dos提示符下直接运行,查看结果。b. 对第3题,分别输入
42、不同的字符,分别记录结果。 5、调试技巧:(1)对于需要从键盘输入数据的情况,可直接在MS-DOS下调试,当每个测试用例都测试完成后并且没有错误,则程序调试完毕;若有错误,则进入DEBUG单步调试。(2)对于需要在程序中设定变量的值的程序,在DEBUG下直接改变变量的值再调试,效率比较高,省去了在源程序中改变变量的值后要重新编译、连接的过程。(3)在DEBUG下如果要查看程序的运行结果,必须执行以下到指令处停止: MOV AX, 4C00H INT 21这是源程序中伪指令“.EXIT 0”汇编后的对应指令。 此时程序的功能已经执行完毕,但还未结束并返回MS-DOS状态。当程序结束并返回MS-D
43、OS状态后,原来程序中的变量等对应的空间已经不存在了。五、 编程提示1、 显示AL寄存器中的两位十六进制数:(1) 首先显示高4位对应的十六进制数,然后显示第4位对应的十六进制数。(2) 分离高4位和低4位,分别用AL和BL保存:MOV BL, AL AND AL, 0F0HMOV CL, 4SHR AL, CLAND BL, 0FH(3) AL中数字到字符的转换:若为09的数字,则加0或48即可;否则为AF的数字,需要加55,比如数字A对应的字符A的ASCII码为65。 CMP AL, 9 JA CH ADD AL, 0 JMP DISP CH: ADD AL, 55 DISP: MOV A
44、H, 02H ;显示 MOV DL, AL INT 21H说明:因为AL中的数据已经在0F之间,所以判断是否为数字09时只要与9比较即可。实验六 循环程序设计一、知识点1、 常用循环结构的汇编语言实现(1) 对于确定循环次数的循环结构,一般使用LOOP指令构成循环,LOOP指令中的标号位循环体的起始位置。但在循环之前要将循环次数送CX。(2) 对于循环次数不定的循环结构,一般用Jcc指令与标号一起构成循环。(3) 循环结构的汇编语言程序一般包含三部分,即循环初始部分循环之前准备相应的条件,如循环次数、相关变量/寄存器赋初值等;循环体重复执行的程序代码,其中包含改变与循环条件有关的值;循环控制部
45、分判断循环条件,决定是否继续循环。2、 循环程序的测试技巧单步调试与分段调试结合:即对循环体内部的程序段的测试用单步执行的方法,执行12遍循环体,观察并分析每一步的结果及程序流程;对于整个循环体程序段的测试,一般用G命令分段调试,通过结果判断循环体的正确程度。(祥见后面的实验步骤)二、实验目的及要求(1) 掌握循环程序的设计方法(2) 进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。(3) 学会
46、针对不同的问题,选用不同的循环结构的方法。(4)编程前画出流程图,培养结构化程序设计思想。三、实验内容1、编程实现把键入的一个字符,用二进制形式(0/1)显示它的ASCII代码值。2、编写程序,将一个包含有20个有符号数据的数组ARRAYM分成两个数组:正数数组ARRAYP和负数数组ARRAYN。设数据均为8位。3、 在程序中定义两个字符串STRINGA和STRINGB,比较两个字符串是否相等。若相等,输出0,否则输出字符1。四、实验步骤1、用记事本编写.ASM源程序。2、对源程序进行汇编及连接,产生.EXE文件、.LST文件。3、在DEBUG环境下调试:(1)用DEBUG命令U反汇编,用T单
47、步执行2边循环体,查看程序的流程及每一步的执行结果。(2)用G命令分段执行,将循环体作为一个段一次执行完,查看分段执行的结果并分析。(3)用U命令反汇编时,查看各个变量对应的偏移地址并记录,以便在调试过程中显示变量所对应的存储单元的值。(4)运行前,用D命令查看三个数组中的数据存放情况。运行至指令:MOV AX, 4C00H处,再查看程序执行后三个数组的存放情况。假设数组ARRAYM的首地址为300H,则查看该数组的命令为:-D 300 L14(4)对第1题、第3题的程序直接在MS-DOS提示符下直接运行,查看结果。对第1题,分别输入不同的字符,分别记录结果。五、编程提示1、 键入一个字符:
48、MOV AH, 01H INT 21H 显示该字符的ASCII码:用循环实现,每循环一次,将AL循环左移一位,根据标志位CF的值(0/1),确定输出字符0/1。MOV CX, 8 NEXT: ROL AL, 1 JC OUT1 MOV DL, 0 JMP DISPOUT1: MOV DL, 1DISP: MOV AH, 02H INT 21H LOOP NEXT2、 循环处理数组ARRAYM中的每一个数据:取出该数据,测试其正负,若为正数,则存入ARRAYP中,否则存入ARRAYN中。主要程序段:LEA SI, ARRAYMLEA DI, ARRAYPLEA BX, ARRAYNMOV CX,
49、 20CLDGO_ON: LODSB ;取出一个数据送AL CMP AL, 0 ;与0比较,判断正负 JL MINUS ;是负数,转MINUS,将其存入ARRAYN中 JE AGAIN ;是0 ,不作处理STOSB ;是正数,存入ARRAYP中 JMP AGAIN MINUS: MOV BX, AL INC BX AGAIN: LOOP GO_ON 3、 比较两个字符串是否相等,可用加重复前缀的串操作指令实现: REPZ CMPSB当循环结束时,根据标志位ZF即可判断量字符串是否相等(若ZF=1,则相等;否则不相等)。 六、拓展题1、 从键盘任意输入两个字符串STRA和STRB,比较两个字符串,若STRA>STRB,则输出字符1;若相等,则输出字符0;否则输出字符-1。2、 先提示输入数字“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林副产品购销合同
- 施工工程进度保证信
- 践行社会主义核心价值观
- 房屋租赁合同范本完整
- 农业技术产品售后服务协议
- 挂靠合作协议简单
- 沙石运输质量协议书
- 钢筋批发购买
- 代收货款合同书
- 房屋买卖合同的签订与法律纠纷处理
- 护理质控输液查对制度
- 2024三方物流园区租赁与运营管理合同3篇
- 大学生科学运动与控制体重(黑龙江幼儿师范高等专科学校)知到智慧树答案
- 【MOOC】例解宏观经济统计学-江西财经大学 中国大学慕课MOOC答案
- 《中国的土地政策》课件
- 【MOOC】电工学-西北工业大学 中国大学慕课MOOC答案
- 专题12 简·爱-2024年中考语文复习文学名著必考篇目分层训练(原卷版)
- 【高考语文】2024年全国高考新课标I卷-语文试题评讲
- 客户满意度论文开题报告
- 2024-2025学年八年级上册历史期末复习选择题(解题指导+专项练习)原卷版
- 课桌椅人体工程学
评论
0/150
提交评论