《汇编语言程序设计》实验指导书_第1页
《汇编语言程序设计》实验指导书_第2页
《汇编语言程序设计》实验指导书_第3页
《汇编语言程序设计》实验指导书_第4页
《汇编语言程序设计》实验指导书_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编语言程序设计实 验 指 导 书物理学与信息技术学院20065目 录第一部分 汇编语言程序设计的上机环境1 MS-DOS操作系统12 文本编辑器13 汇编程序14 连接程序15 调试程序1第二部分 汇编语言程序设计的上机过程1 编辑22 汇编23 连接24 运行25 调试2第三部分 DEBUG简介1 DEBUG的启动格式22 DEBUG中的标志位33 DEBUG的常用命令34 DEBUG命令使用说明45 示例5第四部分 实验内容实验一 利用DEBUG调试程序实验6实验二 分支实验8实验三 循环实验11实验四 子程序实验(一)12实验五 子程序实验(二)17实验六 字符处理程序实验22实验七

2、数据处理实验(一)27实验八 数据处理实验(二)29实验九 代码实验31实验十 输入/输出功能调用实验34实验十一 文件操作37第一部分 汇编语言程序设计的上机环境1 MS-DOS操作系统(如:MSDOS6.22, MSDOS7.0 等)2 文本编辑器(如:EDIT.COM, TURBO.EXE, TC.EXE, C.EXE 等)3 汇编程序(如:MASM.EXE, ASM.EXE 等)4 连接程序(如:LINK.EXE 等)5 调试程序(如:DEBUG.EXE,TD.EXE 等)第二部分 汇编语言程序设计的上机过程正确正确修改!完成逻辑错源程序.exe.obj.asm语法错调试编辑汇编连接运

3、行EDITMASMLINKDEBUG 1 编辑建立源程序文件(.ASM)这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,该过程也称源代码录入。(1)通过MD_DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:filename.asm ;(其中filename为你起的文件名,由1-8个字符组成),asm 是为汇编程序识别而必须加上去的,不可更改。存盘后在DOS下可用DOS命令DIR来查看。(2)如

4、果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、编辑,如可用C语言或Pascal语言的文本编辑器或Windows的记事本来编辑,最后将文件存为filename.asm的形式即可。 2 汇编生成目标文件(.OBJ)这个过程计算机将把你编辑的源代码翻译为机器语言目标程序。如果此时你的程序有语法错误,系统将报错,并指出错误的位置及类型,你可以根据提示信息去逐一修改,直到无错为止。格式:MASM filename(回车)(注:如果你系统的汇编程序为ASM.EXE时,便将命令变为ASM filename。其中filename为你刚才建立的源程序文件名)汇编程序的输出文件可以有三个(分别是.

5、obj、 .lst、 .crf),便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过。但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。 MASM filenamefilen (filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。3 连接产生可执行文件(.EXE)在汇编时,如错误个数非“0”,则必须改错后重新汇编,直到显示警告性和服务性错误个数都是“0”时才能连接。在这个过程中一般

6、没有意外,如果有也就是文件名打错了。格式:LINK filename(回车)。4 运行检查结果连接之后会产生一个可执行文件,这时只需要在操作系统下运行这个程序,看它是否按你所预期那样得出结果。在试运行期间,要尽量试一些临界数据,看程序是否运行稳定、结果是否正确。如一切正常,则一切OK。5 调试修正错误可最怕的是运行结果与预期的不一样,程序产生一些莫名其妙的结果,这是你的程序在算法上出了错,不是语法错。这时就需要对.EXE文件进行调试,以查找错误。常用的调试工具是DEBUG.EXE。第三部分 DEBUG简介1DEBUG的启动格式DEBUG 文件名(回车)说明:文件名指定被调试的文件,包括基本名和

7、扩展名,参数表是被调试文件运行时所需要的参数。被调试的文件可以是系统中的任何文件,但通常它们的扩展名为.EXE或.COM。当DEBUG启动成功后,将显示提示符“-”,这时,可输入各种DEBUG命令。在DEBUG中输入或显示的数据都是十六进制形式。2DEBUG中的标志位标志名称标识符置位状态复位状态溢出 OFOVNV方向 DFDNUP中断 IFEIDI负号 SFNGPL零 ZFZRNZ辅助进位 AFACNA奇偶 PFPEPO进位 CFCYNC3DEBUG的常用命令命令格式功能说明A地址输入8086指令C范围 起始地址对由“范围”指定的区域与“起始地址”指定的同大小区域进行比较,显示不相同的单元D

8、范围 显示指定范围内的内存单元内容E地址 字节表 用字节表中的值替换从“地址”开始的内存单元内容F范围 字节表 用指定的字节表来填充内存区域G=起始地址 断点地址 从起点(或当前地址)开始执行程序,到终点结束H数值1 数值2 显示二个十六进制数值之和、差I端口地址 从端口输入L地址 驱动器号 扇区 扇区数 从磁盘读M范围 地址 把“范围”内的字节值传送到从“地址”开始的单元N文件标识符 文件标识符 指定文件名,为读/写文件做准备O端口地址 字节值 向端口输出P=地址 指令数 按执行过程,但不进入子程序调用或软中断Q 退出DEBUG,不保存正在调试的文件R寄存器名 显示和修改寄存器内容S范围 字

9、节表 在内存区域内搜索指定的字节表。如果找到,显示起始地址,否则,什么也不显示T=地址 指令数 跟踪执行,从起点(或当前地址)执行若干条指令U范围 反汇编,显示机器码所对应的汇编指令W地址 驱动器号 扇区 扇区数 向磁盘写内容,CX为写入字节数,BX为起始地址4DEBUG命令使用说明(1)分隔符命令和参数、参数和参数之间要用空格、逗号或制表符等分隔。(2)地址用“段基址:偏移量”的形式来表示地址,也可用段寄存器来代表“段基址”。如:1000:0,ds:10,es:200,cs:30等。(3)范围用来表示地址范围,从哪个地址开始,到哪个地址结束。它有二种表示方式:a) 地址 地址前者表示起始地址

10、,要用“段基址:偏移量”来表达,后者表示终止地址,只用“偏移量”来表示即可。b) 地址 长度前者表示起始地址,要用“段基址:偏移量”来表达,后者表示该区域的大小,用字母L开头的数值来表示。如:100:50 100表示段基址为100,偏移量从50到100的内存区域。100:50 L100段基址为100,偏移量从50开始的100个字节区域(4)端口地址二位十六进制数值。(5)字节值表由若干个字节组成,也可以是用引号括起来的字符串(6)驱动器号0驱动器A、1驱动器B、2驱动器C、3驱动器D等(7)友情提示第一、在DEBUG中的提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行。第二、命令

11、是单个字母,命令和参数的大小写可混合输入。第三、可用F1、F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令。第四、当命令出现语法错误时,将在出错位置显示“ Error”。第五、可用C或Break来终止当前命令的执行,还可用S来暂停屏幕显示(当连续不断地显示信息时)5示例例1、 启动DEBUG,并装入test.exe文件(假设该文件已存在)。解: 方法1:debug test.exe方法2:debug-n test.exe-l例2、 比较以DS为段基址,偏移量从10到50的内存区域与从地址100:20开始的内存区域。 解: -C DS:10 50 100:20 或 -C DS:1

12、0 L41 100:20例3、 显示以DS为段基址,偏移量从10到50内存区域的单元内容, 然后用abc来填充它。 解: -D DS:10 50 或 -D DS:10 L41 -F DS:10 50 abc例4、 显示十六进制1234与3421之和、差。 解: -H 1234 4321例5、 把数据段区域DS:0-40内的内容传送给从附加段ES:10开始的内存中。 解: -M DS:0 40 ES:10例6、 在数据段区域DS:0-40内查找是否有字符串CIH。 解: -S DS:0 40 CIH第四部分 实验内容实验一 利用DEBUG调试程序实验1.实验目的(1)熟悉DEBUG有关命令的使用

13、方法(2)利用DEBUG掌握有关指令的功能(3)利用DEBUG运行简单的程序段2.实验内容(1)进入和退出DEBUG程序(2)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。(3)利用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。3.实验准备(1)仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。(2)作为例子,准备用A命令,输入在显示器上显示字符“S”的系统调用程序段。(3)阅读将AX左移9位的程序段。4.实验步骤(1)用编辑软件EDIT 编辑一个扩展文件名

14、为ASM的汇编语言源程序。(2)用汇编程序MASM或TASM 汇编上述的汇编语言源程序,形成目标代码文件(扩展名为OBJ)。(3)用连接程序LINK 或TLINK连接目标代码文件,形成可执行文件。(扩展名为EXE)(4)运行可执行文件。观察执行结果,以验证其正确性。(5)详细记录每一步所用的命令,以及查看结果的方法和具体结果。5.实验报告要求(1)如何启动和退出DEBUG程序。(2)整理每个DEBUG命令使用的方法,实际示例及执行结果。(3)启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?实验二 分支程序实验1.实验目的(1)掌握分支程序的设计方法(2)掌握利用DEBUG修改参

15、数、检查结果的方法。(3)掌握汇编语言源程序的编辑、汇编、连接及调试过程。2.实验内容(1)编写一个程序,显示AL寄存器中的两位十六进制数(2)编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。3.实验准备(1)编写实验内容要求的两个程序。(2)写出调试以上程序,即修改程序参数,检查结果的操作方法。(3)熟悉源程序汇编、连接命令的使用方法即要回答的内容。4.实验步骤(1)用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPK

16、EY.ASM。(2)对其进行汇编及连接,产生.EXE文件。(3)对.EXE文件进行调试运行。a.用DEBUG调试运行,学会修改AL内容的方法。b.对DSPKEY.EXE键入不同的字符,分别进行调试。c.在MS-DOS下运行这两个.EXE文件。5.实验报告要求(1)画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。(2)说明本实验是如何利用DEBUG进行调试的。6.参考程序清单(1)显示AL中两位十六进制数程序:;DISPHEX.ASMCODE SEGMENT ASSUME CS:CODESTART: MOV AL,3EH MOV BL,AL MOV DL,AL MOV CL,4 S

17、HR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1: ADD DL,30H MOV AH,2 INT 21H ;显示高位ASCII码 MOV DL,BL AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2: ADD DL,30H MOV AH,2 INT 21H ;显示低位ASCII码 MOV AH,4CH INT 21HCODE ENDS ;返回DOS END START(2)显示键入字符程序;DISPKEY.ASMCODE SEGEMENT ASSUME CS:CODESTART: MOV AH,1 INT 21H ;等待

18、键入字符,送AL CMP AL,0DH ;是否是回车符? JZ DONE ;是则转DONE退出程序 CMP AL,0 JB NEXT CMP AL,9 JA CHARUP MOV DL,AL MOV AH,2 INT 21H JMP STARTCHARUP: CMP AL,41H JB NEXT CMP AL,5AH JA CHRDNDISPC: MOV DL,C MOV AH,2 INT 21HNEXT: JMP STARTCHRDN: CMP AL,61H JB NEXT CMP AL,7AH JA NEXT JMP DISPCDONE: MOV AH,4CH INT 21HCODE: E

19、NDS END START实验三 循环程序实验1.实验目的(1)掌握循环程序的设计方法(2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。(3)学会针对不同的问题,选用不同的组织循环的方法。2.实验内容(1)编写一个程序,显示AL寄存器中的两位十六进制数(2)编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。3.实验准备(1)编写实验内容要求的两个程序。(2)写出调试以上程序,即修改程序参数,检查结果的操作方法。(3)熟悉源程

20、序汇编、连接命令的使用方法即要回答的内容。4.实验步骤(1)用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。(2)对其进行汇编及连接,产生.EXE文件。(3)对.EXE文件进行调试运行。a.用DEBUG调试运行,学会修改AL内容的方法。b.对DSPKEY.EXE键入不同的字符,分别进行调试。c.在MS-DOS下运行这两个.EXE文件。5.实验报告要求(1)画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。(2)说明本实验是如何利用DEBUG进行调试的实验四 子程序实验(一)1实验目的(1)掌握主程序与子程序之间的调用关系及调用方法。(2

21、)掌握子程序调用过程中近程调用与远程调用的区别。(3)掌握通过堆栈转送参数的方法。2实验内容(1)将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。(2)编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).3实验说明(1)第一个实验程序用子程序的近程调用实

22、现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。(2)第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。(3)第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子

23、程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4实验准备(1)预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。(2)熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。5 实验步骤(1)编辑、汇编两个源程序,生成相应的可执行文件(.EXE)(2)用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。(3)检查程序执行的结果是否正确。6实验报告要求 (1)分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有

24、何不同。(2)说明用堆栈传送参数的过程及其具体方法。(3)分析实验结果及所遇到问题,并说明解决的方法。7.参考程序清单 (1)码型转换程序清单:;CONV.ASNDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUFAGAIN: MOV AL, BX CALL HEXASC INC BX LOOP AGAIN MOV AH,4CH INT

25、21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;显示高位HEX数MOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROC CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;显示 RET DISP ENDPCODE ENDS END START(2)统计并显示某键入字符的个数的程序: ;COUNTER.ASMDATA SEGMENTCHAR DB bBUF DB 50H, ? 50H DUP

26、(?)DATA ENDS MCODE SEGMENT ASSUME CS: MCODE, DS: DATASTART: 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 CHECKPOP AX ;统计个数在AL中 MOV DL,CHAR MOV AH,2 INT 21H

27、 MOV DL,AL AND DL, 0FH CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;显示统计个数 MOV AH,4CH INT 21HMCODE ENDSSCODE SEGMENT ASSUME CS:SCODECHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6 XOR AH, AHAGAIN: CMP AL.SI JNE NEXT1 INC AHNEXT1: INC SI LOOP AGAIN MOV AL, AH M

28、OV BP+10,AX POP BP RET 4CHECK ENDP END START实验五 子程序实验(二)1实验目的(1)了解多模块程序设计方法。(2)学会使用PUBLEC和EXTRN 伪指令解决模块间的符号(如变量名,标号等)通信问题。2实验内容(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来,主程序用另一个模块编写。(2)编写一个子程序,将主程序指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。3实验准备(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法。(2)弄清伪指令PUBLIC及EXTRN的功能及用法。4实验步骤(1)分别

29、对实验1和实验2的主、子模块进行汇编,在连接时,将它们装配成一个以 .EXE为扩展名的可执行文件.观察汇编及连接过程中有无错误。(2)对.EXE 文件进行调试及运行。(3)将实验1中的原字符串改为由键盘输入,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于80个字符)。5实验报告要求(1)对源程序清单,画出相应的程序流程图.(2)扼要总结多模块程序的特点和编写方法.6参考程序清单(1)转换字符串小写字母为大写字母的程序清单:;EXCHAR.ASM为主模块的文件名EXCHAR.DNTOUP:FARPUBLIC STRING1,STRING

30、2DATA SEGMENTSTRING1 DBTHIS IS A BOOK,$STRING2 DB 80 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS, AX CALL DNTOUP MOV AH,4CH INT 21HCODE ENDS END START;DNTOUP.ASM为子模块的文件名PUBLICDNTOUPEXTRNSTRING1:BYTE,STRING2:BYTECODE SEGMENTDNTOUP PROC FAR MOV BX,0CYCLE: MOV AL,STRING1B

31、XCMP AL,24H ;是否是STRING1结尾 JZ DONE ;是“$”,转DONECMP AL,61H ;是小写字母么?JB NEXT ;不是转NEXTCMP AL,7AHJA NEXTSUB AL, 20H ;转为大写字母NEXT: MOV STRING2BX,ALINC BXJMP CYCLEDONE: MOV AL。$ MOV STRING2BX,AL ;不一个$ MOV DL,0DH MOV AH, 2 INT 21H MOV DL,0AH INT 21H ;显示回车,换行LEA DX, STRING1 MOV AH,9 INT 21H ;显示源串内容MOV DL,OAHMOV

32、 AH, 2INT 21H ;回车换行MOV DX ,OFFSET STRING2MOV AH,9INT 21H ;显示转换后的大写串RETDNTOUP ENDPCODE ENDSEND(2)找指定字符,并返回地址植的程序清单 ;MAING.ASM为主模块程序名EXTRN FINDC:FARPUBLIC STRNDATA SEGMENTSTRN DB LINK DISPLAY SUBROUTING$ADDR DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H CA

33、LL FINDCMOV ADDR, DIMOV AH,4CHINT 21HCODE ENDSEND START;FINDC.ASM为子模块程序名PUBLIC FINDCEXTRN STRN:BYTECODE SEGMENTLEA DI,STRNAGAIN: CMP BYTE PTRDI,$JZ DONECMP AL,DIJNZ NEXTDONE1: RETNEXT: INC DIJMP AGAINDONE1: MOV DI,0FFFFH ;找不到返回0FFFFHJMP DONE1FINDC ENDPCODE ENDSEND(3)如由键盘输入字符串,则可在程序1 的主模块DATA段中加一行提示信

34、息IMAGE:IMAGE DB INPUT A STRING PLEASE:$然后在主模块的CALL 指令前插入以下程序段。LEA DX,IMAGEMOV AH,9INT 21HLEA DX,STRING2+1MOV AH,0AHINT 21H ;将键入串存入STRING2LEA SI,STRING2+2MOV CL,0LEA DI ,STRING1AGAIN: MOV AL,SIMOV DI,ALINC SIINC DILOOP AGAINMOV BYTE PTRDI,$ ;补一个$说明:此处先将键入字串存入STRING2,然后再将其字串部分传送到STRING1中,当然在定义STRING2时

35、,应为:STRING2 DB 80,?80 DUP(?)。 实验六 字符处理程序实验1. 实验目的 (1) 熟悉串操作指令的功能与应用 (2) 掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。2实验内容 (1) 字符串统计。自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。 (2) 在给定的字符串中,删除重复的字符,其余的字符向前递补。3. 实验准备 (1)熟悉字符处理的方法和字符处理程序的设计; (2)认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。(3)按正常的方法将删除字符程序编成子程

36、序,规定子程序的入口和出口参数。4实验报告要求(1)对照参考程序,画出程序流程图。(2)总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。5参考程序清单(1)统计小写字母个数的程序清单:;COUNTDC.ASMDATA SEGMENTSTRN DB 80 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AXLEA DI, STANMOV CL, 0AGAIN: MOV AH, 1 INT 21HCMP AL,0DHJZ DONEMOV DI,ALINC DIINC DLJMP

37、AGAINDONE: LEA SI,STRNMOV CH,0MOV BL,0CLDCYCLE: LODSB CMP AL,61HCMP AL,7AHJA NEXTINC BLNEXT: LOOP CYCLEMOV AL,BLMOV AH,0MOV CL,10DIV CL ;十位数在AL中,个位数在AH中XCHG AH,AL ;以下显示两位十进制数MOV DL,AHOR DL,30HINT 21HMOV DL,ALOR DL,30HMOV AH,2INT 21HMOV DL,ALOR DL,30HINT 21HMOV DL,ALOR DL,30HINT 21HMOV AH,4CHINT 21HC

38、ODE:ENDSEND START(2)删除字符串中重复字符的源程序清单:;DELD.ASMDATA SEGMENTSTAN DB 80 DUP(?)LEN DB ?DATA ENDSCODESEGMENTASSUME CS: CODE,DS: DATA,ES: DATASTART: MOV AX, DATAMOV DS,AXMOV ES,AXLEA SI,STRNMOV CL,0AGAIN: OV AH,1INT 21HCMP AL,0DHJZ DONEMOV SI,ALINC SIINC CLJMP AGAINDONE:MOV CH,OMOV LEN,CLREPEAT: PUSH SIPU

39、SH CX ;CX为内循环记数PUSH CX ;DX为外循环记数POP DXDEC CX JE NEXT1 ;是最后一个字符,不再查找重复字符MOV AL,SICMP AL,0JE NEXT1COMP: INC SICMP AL,SIJNE GOON ;为非重复字符MOV BUTE PTRSI,0GOON: LOOP COMP;查出与该字符重复的所有字符,并用0替换NEXT1: POP DXPOP SIDEC DXJNZ REPEAT ;对所有重复字符都进行查找 LEA SI,STRN ;删除重复字符MOV CL,LENMOV CH,0CYCLE: MOV AL,SI CMP AL,0 ;是重

40、复字符吗?JNZ NEXT ;不是,查找下一个字符DEC CX ;递补字串长度送CXJZ DONE ;若是最后字符不递补CALL DELE ;删除该空字符并递补DEC SI ;对递补子串从头处理NEXT: INC SILOOP CYCLEMOV AH,4CHINT 21HDELE PROCPUSH SIPUSH CXCLDMOV DI,SI ;空字符处为目的首址INC SI ;下一个地址为源串首址REP MOVSBPOP CXPOP SI RETDELE ENDPCODE ENDSEND START实验七 数据处理实验(一)1. 实验目的练习用汇编语言实现对数据块的求和、求最大值(或最小值)等

41、程序设计方法。2实验内容求给定的十个未压缩的BCD码数之和并将结果显示在屏幕上。3实验准备熟悉8086/8088指令系统中有关算术运算和逻辑运算指令的格式、功能以及对标志位的影响等知识。4实验报告要求对自己完成的程序,画出流程图,写出运行结果。5参考程序清单NAME SUM TO DECIMAL DATA SEGMENTBCDBUF DB 0,1,2,3,4,5,6,7,8,9SUM DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATADISP MACRO OR DL,30HMOV AH,2 INT 21H ENDMSTART: MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,10 XOR AX,AXCIR0: ADD AL,BCDBUFSIAAA INC SILOOP CIR0MOV SUM,AX MOV DL,BYTE PTR SUM+1 ;先输出高位DISP MOV DL,BYTE PTR SUM ;再输出低位DISP MOV AH,4CH INT 21H CODE ENDS END START6需要自己完成的程序(1)将BCDBUF数据区的未压缩的BCD码数改为压缩的BCD码数,求和后输出。(2)将BCDBUF数据区的BCD码数改成带符号字节数据,编制这些数比较大小的程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论