《南昌大学汇编语言实验报告.pdf》由会员分享,可在线阅读,更多相关《南昌大学汇编语言实验报告.pdf(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.实 验 报 告 实验课程:IBM-PC 汇编语言程序设计 学生姓名:刘昌盛 学 号:7101310013 专业班级:电气信息类 III 101 班 2011 年 12 月 15 日.汇编语言实验指导 前 言 汇编语言是计算机专业的一门重要的专业基础课,主要介绍汇编语言程序设计的基本原理和方法。汇编语言是一门理论性和实践性较强的课程,辅助课堂教学的实验有助于帮助学生理解汇编语言的基本原理,锻炼学生的动手能力,提高学生的综合应用知识的能力。本实验指导按照汇编语言程序设计的教学大纲要求编写。依据循序渐进、由浅入深的规律,通过实例复习巩固所学知识,借助实例开展汇编语言程序设计。通过这种既具有构造性又
2、具有创造性的学习活动,更便于初学者的理解和掌握,通过上机实验,并在实验后完成实验报告,又能进一步加深和拓宽所学知识。为了帮助老师和学生开展实验,我们特编了这本实验指导,希望能对我校的汇编语言教学工作有所帮助。本实验指导所有实例均在 PC 机上调试通过。.目录 (1)利用 DEBUG 调试汇编语言程序段(2)初级程序的编写与调试实验(一)(3)初级程序的编写与调试实验(二)(4)汇编语言程序上机过程(5)分支程序实验(6)循环程序实验(7)子程序实验 .实验 1 利用 DEBUG 调试汇编语言程序段 一实验目的 1熟悉 DEBUG 有关命令的使用方法;2利用 DEBUG 掌握有关指令的功能;3利
3、用 DEBUG 运行简单的程序段。二实验内容 1进入和退出 DEBUG 程序;1)开始运行,输入 cmd,点确定进入命令窗口 2)在命令窗口中输入 dubug 进入 debug 程序 .3)进入 debug 窗口后,输入 q 命令退出 debug 2学会 DEBUG 中的 1)D 命令(显示内存数据 D 段地址:偏移地址)例 1:-D100 ;显示 DS 段,0100 开始的 128 个字节内容 说明:指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。D SEGREG起始地址 L 长度 ;显示SEGREG段中(缺省内默认为DS),以起始地址(缺省内为当前的偏移地址),开始的L 长度
4、(缺省内默认为 128)个字节的内容.D SEGREG段地址:偏移地址 ;显示SEGREG段中(缺省内默认为DS),段地址:偏移地址 开始的L 长度(缺省内默认为128)个字节内容 D ;默认段寄存器为 DS,当前偏移地址(刚进入 debug 程序偏移地址为 0100H).D DS:100 ;显示 DS 段,0100H 开始的 128 个字节内容 D CS:200;显示 CS 段,0200H 开始的 128 个字节内容 D 200:100;显示 DS 段,0200:0100H 开始的 128 个字节内容 D 200;显示 DS 段,0200H 开始的 128 个字节内容 D 100 L 10;
5、显示 DS 段,100H 开始的 100H 个字节内容 2)E 命令(修改指定内存)例 1:-E100 41 42 43 44 48 47 46 45 -D 100,L08 结果:08F1:0100 41 42 43 44 48 47 46 45 例 2:-E 100:08F1:0100 76 42:42 是操作员键入 此命令是将原 100 号内存内容 76 修改为 42,用 D 命令可察看。E 地址 ;从指定地址开始,修改(或连续修改)存储单元内容。DEBUG 首先显示指定单元内容,.如要修改,可输入新数据;空格键显示下一个单元内容并可修改,减号键显示上一个单元内容并可修改;如不修改,可直接
6、按空格键或减号键;回车键结束命令。E 地址 数据表;从指定的地址开始用数据表给定的数据修改存储单元。E DS:100 F3 AB 8D;把 DS 段中 0100H 开始的四个字节修改为 F3 AB(A 和 B 的 ASCII 码)8D 也可以按下面的方式实现 3)R 命令(显示当前寄存器的内容)显示修改寄存器命令 R R;显示所有寄存器和标志位状态;显示当前 CS:IP 指向的指令。显示标志时使用的符号:标志 标志=1 标志=0 OF OV NV DF DN UP IF EI DI SF NG PL ZF ZR NZ AF AC NA PF PE PO CF CY NC 4)T 命令(设置陷井
7、,单步执行)T;从当前 IP 开始执行一条指令。.T 数值;从当前 IP 开始执行多条指令,数值:执行的指令条数。T=地址;从给定的地址执行一条指令 T=地址 数值;从给定的地址执行多条指令,数值:执行的指令条数.T;从当前 IP 开始执行一条指令 T5;从当前 IP 开始执行 5 条指令 T=100 5;从当前 0100H 开始执行 5 条指令 5)A 命令(将指令直接汇编成机器码输入到内存中。)汇编命令 A A 地址;从指定的地址开始输入符号指令;如省略地址,则接着上一个 A 命令的最后一个单元开始;若第一次使用 A 命令省略地址,则从当前 CS:IP 开始(通常是 CS:100)。注释:
8、在 DEBUG 下编写简单程序即使用 A 命令。每条指令后要按回车。不输入指令按回车,或按 Ctrl+C 结束汇编。支持所有 8086 符号硬指令,伪指令只支持 DB、DW,不支持各类符号名。使用 A 命令在 0100H 开始输入指令 mov ax,10 inc cx mov bl,al 单步执行上述指令 6)G 命令等的使用(执行 A 命中输入的汇编指令)运行程序命令 G G;从 CS:IP 指向的指令开始执行程序,直到程序结束或遇到 INT 3。G=地址;从指定地址开始执行程序,直到程序结束或遇到 INT 3。G 断点 1,断点 2,断点 10;从 CS:IP 指向的指令开始执行程序,直到
9、遇到断点。G=地址 断点 1,断点 2,断点 10 G;从 CS:IP 指向的指令开始执行程序。G=100;从指定地址开始执行程序。G=100 105 110 120 使用 A 命令在 0100H 开始输入指令 mov ax,10 inc cx mov bl,al int 3 然后使用 g 命令执行.上面的例子设断点在 100H 处然后用 T 命令单步执行 3.用 DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。三实验要求 仔细阅读有关 DEBUG 命令的内容,对有关命令,要求事先准备好使用的例子;四实验环境 PC 微机 DOS 操作系统或 Wind
10、ows 操作系统 MASM.EXE,LINK.EXE,DEBUG.COM 或宏汇编集成环境 五实验步骤 用 DEBUG 验证乘法、除法、加法、减法带进位加、带借位减、堆栈操作指令、串操作指令的功能:1.验证加法和带进位加,使用 A 命令,在 DEBUG 中键入以下代码:mov ax,f111 mov bx,f222 mov cx,2 mov dx,3 add ax,bx adc cx,dx 使用 G 命令查看结果.2.验证减法和带借位减法,使用 A 命令,在 DEBUG 中键入以下代码:mov ax,2 mov bx,3 mov cx,5 mov dx,2 sub ax,bx sbb cx,d
11、x 使用 G 命令查看结果 3.验证乘法和除法,使用 A 命令,在 DEBUG 中键入以下代码:乘法:mov al,b4 mov bl,11 mul bl 使用 G 命令查看结果 除法:mov ax,400 mov bl,b4 div bl 使用 G 命令查看结果 4.验证堆栈操作指令,使用 A 命令,在 DEBUG 中键入以下代码:mov ax,1111.push ax mov ax,2222 使用 G 命令查看结果后在使用 A 命令,在 DEBUG 中键入以下代码:pop ax 使用 G 命令查看结果 5.验证串操作指令,使用 A 命令,在 DEBUG 中键入以下代码:org 1000 d
12、b hello mov si,1000 mov di,1500 mov cx,5 cld rep movsb 使用 G 命令查看结果 六实验报告要求 1如何启动和退出 DEBUG 程序;2整理每个 DEBUG 命令使用的方法,实际示例及执行结果。七思考题 启动 DEBUG 后,要装入某一个.EXE 文件,应通过什么方法实现?答:进入 DOS,输入 DEBUG xxx.exe,其中 xxx 为文件名。.实验 2 初级程序的编写与调试实验(一)一实验目的 1进一步熟悉DEBUG命令;2掌握数据在内存中的存放方式和内存操作数的几种寻址方式,段寄存器和物理地址计算;3熟悉数据传送指令、算术运算指令、逻
13、辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP;4掌握简单的汇编语言程序编写与调试。二实验内容 1内存操作数及各种寻址方式使用;2求累加和程序;3多字节加法程序;4数据串搬家程序;5段寄存器概念及字符串传送指令练习。三实验要求 1仔细阅读有关 DEBUG 命令的内容,对有关命令,要求事先准备好使用的例子;2阅读数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令 MOVS、STOS及重复前辍 REP 的内容;3用 DEBUG 的有关命令调试本实验中的求累加和程序、多字节加法程序、数据串搬家程序段。四实验环境 PC 微机;DOS 操作系统或 Window
14、s 操作系统;MASM.EXE,LINK.EXE,DEBUG.COM 或宏汇编集成环境。五实验步骤 1内存操作数及各种寻址方式使用 MOV AX,1234 MOV 1000,AX MOV BX,1002 MOV BYTE PTRBX,20 MOV DL,39 INC BX MOV BX,DL DEC DL MOV SI,3 MOV BX+SI,DL.MOV BX+SI+1,DL MOV WORD PTRBX+SI+2,2846 步骤:(1)用A命令键入上述程序,并用T命令逐条运行。(2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。注意D命令显示结
15、果中右边的ASCII字符及双字节数存放法。.2求累加和程序:程序:MOV BX,1000 MOV CX,10 SUB AX,AX LOP:ADD AL,BX ADC AH,0.INC BX J:LOOP LOP INT3 步骤:(1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替;(2)用命令N AA 将此程序命名为文件AA(文件名可任取);(3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址;(4)用命令W 100将此程序存到AA命名的磁盘文件中;(5)用命令Q退出DEBUG;(6)用命令D
16、EBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序;若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入;(7)用E命令在内存地址1000H处键入16个数字;(8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值;(9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错;(10)重复G、J与T,再检查AX是否正确;(11)用G命令使程序运行到结束,检查AX值是否正确。.3多字节加法程序 程序:MOV DI,1000 MOV CX,8 MOV SI,2000 CLC L
17、OP:MOV AL,SI ADC DI,AL INC SI INC DI LOOP LOP INT 20 步骤:(1)用命令键入此程序(2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。分步计算并得到结果,如下图所示:.4数据串搬家程序(1)用A命令键入下列程序:MOV SI,1000 MOV DI,2000 MOV CX,0F LOP:MOV AL,SI MOV DI,AL INC SI INC DI LOOP LOP INT 20(2)用A命令DB伪指令在1000H键入下列字符串:IBM_PC COMPUTER(3)用G命令运行此程
18、序,并用D命令检查目的地址处的字符与源串a是否一致。.5段寄存器概念及字符串传送指令练习(1)用A命令键入下列程序:MOV SI,0 MOV DI,0 MOV AX,1000 MOV DS,AX MOV AX,1500 MOV ES,AX MOV CX,0F CLD REP MOVSB INT 20(2)用A命令DB伪指令在1000:0000处键入字符串IBM_PC COMPUTER,并用D命检查之(3)用D命令检查0F00:1000处内容,看是否一样。为什么?(4)用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS与ES值。(5)修改此程序,使ES与DS为同一值,以减少一条
19、指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。.6自编程序 用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同多字节加法程序,调试并.做记录。六实验报告要求 1各项实验记录;2要求你修改的程序的清单(修改后)和调试记录;3自编程序原稿及调试后修正稿,写出原稿错在那里。七思考题 1MOV BYTE PTRBX,20 MOV WORD PTRBX+SI+2,2846 上述指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。2用G命令运行多字节加法程序,并用D命令检查其结果(存放在哪里?),是否正确?3将多字节加法程序中的INT 20H指令改为INT
20、 3,有何区别?若这条指令不加,行不行?试一试。.4数据串搬家程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这一点。MOV SI,100E MOV DI,1010 MOV CX,0F LOP:MOV AL,SI MOV DI,AL DEC SI DEC DI LOOP LOP INT 20.或者 DB IBM_PC COMPUTER MOV SI,100E MOV DI,1010 MOV AX,137E MOV ES,AX MOV CX,0F STD REP MOVS INT 20.实验3 初级程序的编写与调试实验(二)
21、一实验目的 1掌握无条件转移指令、条件转移指令;2掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;3掌握直接向视频RAM送ASCII码进行屏幕显示的方法;4掌握屏幕字符显示程序编写与调试。二实验内容 1 字符、字符串的屏幕显示;2 直接向VRAM送ASCII码显示字符;3 用字符搜索法确定字符串长度;4 16进制数化ASCII码的一般方法(显示内存内容)。三实验要求 1 仔细阅读有关无条件转移指令、条件转移指令的内容;2 阅读利用 DOS 功能调用 INT21H 的 2 号和 9 号功能进行屏幕显示的内容;3阅读实验指导书中的字符串屏幕显示程序、字符屏幕显示程序、直接向
22、VRAM 送 ASCII 码显示字符程序、用字符搜索法确定字符串长度程序、16 进制数化 ASCII 码的一般方法的程序段,调试上述程序。四实验环境 PC 微机;DOS 操作系统或 Windows 操作系统;MASMEXE,LINKEXE,DEBUGCOM 或宏汇编集成环境。五实验步骤 1利用INT 21 0AH号功能调用显示字符串。(1)用A命令在100H处键入下列程序:MOV AH,9 MOV DX,110 INT 21 INT 20(2)用A命令在110H处键入下列字符串的ASCII码:DB This is a sample!$(3)用N命令和W命令将此程序(包括数据区)存入文件名为AA
23、CcOM的磁盘文件中。(存入前BX:CX必须置为文件长度值)。(4)用Q命令退出DEBUG。(5)在DOS命令下打AA,运行此程序,即在屏幕上显示This is a sample!字符串,若不出现,用DEBUG检查程序有无错误。.2利用INT 21H 2号功能显示字符(1)用A命令在100H处键入下列程序:XOR DL,DL MOV CX,100 LOP:MOV AH,2 INT 21 INC DL PUSH CX MOV CX,8 DELY:PUSH CX MOV CX,0 J:LOOP J POP CX LOOP DELY POP CX LOOP LOP INT 20(2)用G命令运行程序
24、,即在屏幕上依次缓慢的显示256个ASCII字符。仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?(3)按CTRL+BREAK退出此程序,若一次不行可多做几次。.3直接向VRAM送ASCII码显示字符(1)用A命令在100H处键入下列程序 MOV AX,B000 MOV DS,AX XOR AL,AL XOR BX,BX MOV CX,100 LOP:MOV BX,AL INC BX INC AL PUSH CX MOV CX,8 DELY:PUSH CX MOV CX,0 J:LOOP J POP CX LOOP DELY POP CX
25、 LOOP LOP INT 20(2)用N命令和W命令将此程序存入BB.COM文件中。(一定要先存入!)(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?.控制字符在该程序中没有显示,在上一个程序中显示为笑脸 4用字符搜索法确定字符串长度(1)用A命令在100H开始的内存处键入下列程序 JMP START DB This is the program to measure DB the length of a string!$START:MOV BX,102 MOV
26、AL,24 XOR CL,CL LOP:CMP AL,BX JZ EXIT.INC BX INC CL JMP LOP EXIT:INT3(2)用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?CL的统计长度与实际长度相等,均为35H 5用字符搜索法确定字符串长度 (1)用A命令在100H处键入下列程序:MOVSI,0 MOVBL,10 LOP:MOVDL,SI MOVCL,4 SHRDL,CL CMPDL,0A JC J1 ADD DL,7 J1:ADD DL,30 MOV AH,2 INT 21 MOV DL,SI AND DL,0F CMP DL,0A JC J
27、2 ADD DL,7 J2:ADD DL,30 MOV AH,2 INT 21 MOV DL,20 MOV AH,2 INT 21 INC SI.DEC BL JNZ LOP INT 20(2)用N,W命令将此程序用CCCOM文件名存入磁盘。(3)用Q命令退出DEBUG。(4)在DOS命令状态下直接运行CCCOM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。(5)自编程序:修改上面程序,使除以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用代替。答:在DOS下输入DEBUG CC.COM打
28、开程序,从最后一条指令INT 20(包括该指令)开始修改,修改方法如下:MOV CX,10 MOV SI,0 J3:MOV DI,SI MOV AH,2 CMP DL,0D JBE J5 J4:INT 21 INC SI.DEC CX JNZ J3 INT 20 J5:CMP DL,07 JNB J4 MOV DL,2E JMP J4 六实验报告要求 1、各项实验记录及观察体会。2、自编程序草稿及调试结果。七思考题 利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?答:利用INT 21H显示时,07H-0DH的控制符会用笑脸之类的符号显示;直接向VRAM送A
29、CSII码时,07H-0DH的控制符不显示。.实验 4 汇编语言程序上机过程 一实验目的 熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。了解汇编语言程序的汇编、运行环境。二实验内容 1掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;2伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;3利用的INT 21H的1号功能实现键盘输入的方法;三实验要求 1仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;2 了解利用的INT 21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及
30、用INT 21H 4C号功能返回系统的方法;3阅读下面程序段。四实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 MASM。EXE,LINK。EXE,DEBUG。COM 或宏汇编集成环境 五实验步骤 程序:data segment message db This is a sample program of keyboard and disply db 0dh,0ah,Please strike the key!,0dh,0ah,$data ends stack segment para stack stack db 50 dup(?)stack ends code segm
31、ent assume cs:code,ds:data,ss:stack start:mov ax,data mov ds,ax mov dx,offset message mov ah,9 int 21h;显示This is a sample program of keyboard and disply again:mov ah,1 int 21h;等待键盘输入,保存至AL.cmp al,1bh;1bh 字符ESC的ASCII je exit cmp al,61h ;61h字符a的ASCII jc(jb)nd;小于(CF=1有借位)转向ND原样显示 cmp al,7ah;ja nd ;大于转向
32、ND原样显示 and al,11011111b;转化为大写字母 sub al,20h nd:mov dl,al mov ah,2 int 21h jmp again exit:mov ah,4ch int 21h code ends end start 实验步骤:1 用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为ASM。2 用MASM对源文件进行汇编,产生OBJ文件和LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3 用TYPE命令显示1产生的LST文件。.4 用LINK将OBJ文件连接成可执行的EXE文件。5 在DOS状态下运行LINK产生的EXE文
33、件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。按ESC键可返回DOS。若未出现预期结果,用DEBUG检查程序。.六实验报告要求 汇编,连接及调试时产生的错误,其原因及解决办法。答:汇编的程序的标点符号用得不对,在进行汇编时会出现很多错误。只能重新输入过,不能进行复制、粘贴。七思考题 1若在源程序中把INT 21H的H省去,会产生什么现象?修改后代码的IO.ASM编译连接均没有出现什么问题,一切正常,但是最后运行IO.EXE时造成无法输入输出,也无法退出返回到DOS状态。2.把 INT 21H 4CH号功能改为 INT 20H,行不行?再更改之后,
34、io的编译连接、输入输出等都正常,但是在按下ESC退出时会出现上述对话框错误。.实验 5 分支程序实验 一实验目的 1 掌握分支程序的设计方法;2 掌握利用 DEBUG 修改参数、检查结果的方法;3 熟悉汇编语言源程序的编辑、汇编、连接及调试过程。二实验内容 1编写一个程序,显示 AL 寄存器中的两位十六进制数 2编写一个程序,判别键盘上输入的字符;若是 1-9 字符,则显示之;若为 A-Z 或 a-z 字符,均显示“c”;若是回车字符(其 ASCII 码为 0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。三实验要求 1编写实验内容要求的两个程序;2写出调试以上程序,即修改程
35、序参数,检查结果的操作方法;3熟悉源程序汇编、连接命令的使用方法即要回答的内容。四实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 MASM.EXE,LINK.EXE,DEBUG.COM 或宏汇编集成环境 五实验步骤 1 用 EDIT 或其它编辑软件,编写.ASM 源程序,例如 HEXASC.ASM 及 DSPKEY.ASM。2对其进行汇编及连接,产生.EXE 文件。3对.EXE 文件进行调试运行。(1)用 DEBUG 调试运行,学会修改 AL 内容的方法;.(2)对 DSPKEY.EXE 键入不同的字符,分别进行调试;(3)在 MS-DOS 下运行这两个.EXE 文件。六实
36、验报告要求 1画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。2说明本实验是如何利用 DEBUG 进行调试的。七思考题 编写显示 AX 中四位十六进制数程序,画出程序的流程图。实验参考程序清单(1)显示 AL 中两位十六进制数程序:;DISPHEX.ASM CODE SEGMENT ASSUME CS:CODE START:MOV AL,3EH MOV BL,AL MOV DL,AL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7 NEXT1:ADD DL,30H MOV AH,2 INT 21H ;显示高位 ASCII 码 MOV
37、DL,BL.AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7 NEXT2:ADD DL,30H MOV AH,2 INT 21H ;显示低位 ASCII 码 MOV AH,4CH INT 21H CODE ENDS ;返回 DOS END START(2)显示键入字符程序;DISPKEY.ASM CODE SEGMENT ASSUME CS:CODE START:MOV AH,1 INT 21H ;等待键入字符,送 AL CMP AL,0DH ;是否是回车符?JZ DONE ;是则转 DONE 退出程序 CMP AL,0 JB NEXT CMP AL,9 JA CH
38、ARUP MOV DL,AL MOV AH,2 INT 21H JMP START CHARUP:CMP AL,41H JB NEXT CMP AL,5AH JA CHRDN DISPC:MOV DL,C MOV AH,2 INT 21H NEXT:JMP START CHRDN:CMP AL,61H JB NEXT CMP AL,7AH JA NEXT JMP DISPC DONE:MOV AH,4CH INT 21H CODE ENDS END START.实验 6 循环程序实验 一实验目的 1掌握循环程序的设计方法;2学会针对不同的问题,选用不同的组织循环的方法;3进一步熟悉利用 DEB
39、UG 程序修改参数的方法,并检查和验证结果的正确性。二实验内容 1编写一个程序,显示 BX 寄存器中的两位十六进制数;2编写一个程序,判别键盘上输入的字符;若是 1-9 字符,则显示之;若为 A-Z 或 a-z 字符,均显示“c”;若是回车字符(其 ASCII 码为 0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。三实验要求 1编写实验内容要求的两个程序;2写出调试以上程序,即修改程序参数,检查结果的操作方法;3熟悉源程序汇编、连接命令的使用方法即要回答的内容。四实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 MASM.EXE,LINK.EXE,DEBUG
40、.COM 或宏汇编集成环境 五实验步骤 1用 EDIT 或其它编辑软件,编写.ASM 源程序,例如 HEXASC.ASM 及 DSPKEY.ASM;2对其进行汇编及连接,产生.EXE 文件;.3对.EXE 文件进行调试运行。(1)用 DEBUG 调试运行,学会修改 BL 内容的方法;(2)对 DSPKEY.EXE 键入不同的字符,分别进行调试;(3)在 MS-DOS 下运行这两个.EXE 文件。六实验报告要求 画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。七思考题 编写一循环程序,测量一字符串长度,并用 16 进制数显示之。.实验 7 子程序实验 一实验目的 1掌握主程序与子程
41、序之间的调用关系及调用方法;2掌握子程序调用过程中近程调用与远程调用的区别;3掌握通过堆栈转送参数的方法。二实验内容 1将 BUF 开始的 10 个单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXAC 实现,在转换过程中,通过子程序 DISP 实现显示。2编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址TABLE,字符串长度N 及字符”b”.子程序返回字符b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。三实验要求
42、 1第一个实验程序用子程序的近程调用实现。由于在调用 HEXASC 子程序时,子程序又调用了 DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查 CS 值是不变的。2第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看 CS 值,它与主程序中的 CS 值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串
43、的长度 N 及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过 BP 指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。四实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 MASM.EXE,LINK.EXE,DEBUG.COM 或宏汇编集成环境 五实验步骤 1编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2用 DEBUG 的 R 命令,T 命令或 G 命令和 D 命令检查远程调用及近程调用时堆栈的变化。特别
44、是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。3检查程序执行的结果是否正确。.实验内容 1 流程图:开始将数据段起始有效地址赋予BXCX=0AHAL=BX调用子程序HEXASCBX=BX+1CX=0?结束是否 开始DL=ALCL=4DL左移四位,使最高位移至最低位,PUSH CX,PUSH AX调用子程序DISPPOP AX,DL=AL,将 DL高四位置零调用子程序DISP,POP CX返回主程序 开始DL=9DL=DL+30HDL=DL+7HAH=2INT 21H返回程序HEXASC否是 主程序 子程序 HEXASC 子程序 DISP .六实验报告要求 1说明用堆栈传送参数的过
45、程及其具体方法。2分析实验结果及所遇到问题,并说明解决的方法。七思考题 分析远程调用与近程调用的区别,在用 DEBUG 有关命令观察时,执行过程有何不同。参考程序清单 1码型转换程序清单:;CONV.ASM DATA SEGMENT BUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUF AGAIN:MOV AL,BX CALL HEXASC.INC BX
46、LOOP AGAIN MOV AH,4CH INT 21H HEXASC PROC NEAR MOV DL,AL PUSH CX MOV CL,4 SHR DL,CL POP CX CALL DISP ;显示高位 HEX 数 MOV DL,AL AND DL,0FH CALL DISP RET HEXASC ENDP DISP PROC NEAR CMP DL,9 JBE NEXT ADD DL,7 NEXT:ADD DL,30H MOV AH,2 INT 21H ;显示 RET DISP ENDP CODE ENDS END START 2统计并显示某键入字符的个数的程序:;COUNTER.
47、ASM DATA SEGMENT CHAR DB b BUF DB 50H,?,50H DUP(?)DATA ENDS MCODE SEGMENT ASSUME CS:MCODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,9 INT 21H LEA SI BUF MOV CL,SI+1 MOV CH,0 ;CX 中为字符串长度 INC SI .INC SI ;SI 指向串首址 TABLE MOV AL,CHAR MOV AH,0 ;AX 中为待查字符 PUSH SI PUSH CX PUSH AX ;参数送堆栈 CALL CHE
48、CK POP AX :统计个数在 AL 中 MOV DL,CHAR MOV AH,2 INT 21H MOV DL,AL AND DL,0FH CMP DL,9 JBE NEXT ADD DL,7 NEXT:ADD DL,30H MOV AH,2 INT 21H ;显示统计个数 MOV AH,4CH INT 21H M CODE ENDS SCODE SEGMENT ASSUME CS:SCODE CHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX,BP+8 MOV AX,BP+6 XOR AH,AH AGAIN:CMP AL.SI JNE NEXT1 INC AH NEXT1:INC SI LOOP AGAIN MOV AL,AH MOV BP+10,AX POP BP RET 4 CHECK ENDP END START