汇编语言程序设计实验指导讲义.doc

上传人:飞****2 文档编号:51847768 上传时间:2022-10-20 格式:DOC 页数:15 大小:48.50KB
返回 下载 相关 举报
汇编语言程序设计实验指导讲义.doc_第1页
第1页 / 共15页
汇编语言程序设计实验指导讲义.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《汇编语言程序设计实验指导讲义.doc》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验指导讲义.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验一 汇编语言上机过程一、上机前的软件准备:MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等)文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)汇编程序 (如:MASM.EXE , ASM.EXE,TASM.EXE 等)连接程序 (如:LINK.EXE 等)调试程序 (如:DEBUG.EXE 等)二、汇编程序建立过程: 通过 a.建立汇编源程序b.编译为目标文件d.连接为可执行文件 c.不通过,重新修改(语句错误) f.不正确,用调试工具调试,重新修改(逻辑错误) e运行 正确 g.完成三、现在对(二)的每一个标有字母的过

2、程(PROCEDURE)进行详细说明PROCEDURE a:建立汇编源程序(即:建立 文件名.asm)这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的方法很多,下面将介绍具体方法。1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入:EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:filename.asm ;(其中filename为你起的文件名,由1-8个字符组成),asm 是为汇编

3、程序识别而必须加上去的,不可更改。存盘后在DOS下可用DOS命令DIR来查看,如果看到了所存的文件存在,就可以进行进程b。2.如果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、编辑,如可用c语言和pascal语言的文本编辑器来编辑,最后将文件存为filename.asm的形式即可。PROCEDURE b:编译目标文件(即:编译为.obj .lst .crf文件)这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍具体过程:在DOS提示符下键入MAS

4、M filename回车(注:你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为ASM.EXE时,便将命令变为ASM filename回车。其中filename为你刚才在PROCEDURE a 中建立的文件名)这时汇编程序的输出文件可以有三个(分别:.obj .lst .crf),便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过,就可进行进程c。但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。 MASM f

5、ilename filen (filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。PROCEDURE c:编译不通过,重新修改(错误类型:源程序语句不合法)在执行过PROCEDURE b后,如有出错信息时,就要我们自己按PROCEDURE c去做,而不能跳跃到PROCEDURE d去,如果强行执行PROCEDURE d将无任何有效结果。现在就开现找错吧!首先要清楚,在PROCEDURE b中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。在记录行号后,就应再次执行PROCEDURE a

6、,这时和操作应是打开已编好的源程序(以EDIT为例:在DOS提示符下键入:EDIT filename.asm回车),依据行号进行修改并存盘,再次进行汇编,直至PROCEDURE b通过为止。便可继续向下执行PROCEDURE d。下面给出一些常见出错信息,以便查对:1、Register already defined 汇编内部出现逻辑错误2、Unknown symbol type 在符号语句的类型中,有些不能识别的东西3、Symbol is multi-defined 重复定义一个符号4、Symbol not defined 符号没有定义5、Syntax error 语句的语法与任何可识别的语

7、法不匹配6、Symbol is reserved word企图非法使用一个汇编程序的保留字(例:定义add为一变量)7、Not proper align/combine type SEGMENT参数不正确8、One operand must be const 这是加法指令的非法使用9、Operands must be same or 1 abs 这是减法指令的非法使用10、Already have base register 试图重复基地址11、Illegal size for item 引用的项的长度是非法的,(如:双字移位)12、Illegal register value 指定的寄存器值

8、不能放入“reg” 字段13、Must be AX or AL 某些指令只能用AX或AL14、Improper use of segment reg 段寄存器使用不合法(如:mov ds,0)15、Division by 0 or overflow 给出一个用0作除数的表达式16、Value is out of range 数值大于需要使用的17、CS register illeal usage 试图非法使用CS寄存器18、DUP is too large for linkerDUP嵌套太长,以至于从连接程序不能得到所要的记录PROCEDURE d:连接为可执行文件(即:连接为.exe 或.c

9、om文件)在这个过程中一般没有意外,如果有也就是文件名打错了。形式:在DOS提示符下: LINK filename 回车PROCEDURE e:运行编译好的可执行文件当PROCEDURE d通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽量试一些临界状态,看 程序是否运行稳定、结果是否正确。如一切正常,便可进入PROCEDURE g了。可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不

10、要看计算机,静几分钟(反正时间多得是)。这时就要用到最关键、最常用的一步了,进行PROCEDURE f 。PROCEDURE f:用调试工具调试,重新修改(逻辑错误)在这我将介绍用DOS中自带的调试程序DEBUG.EXE来进行程序调试、检查错误.首先我们要了解DEBUG的基本用法:1、用于调试程序时的输入格式:DEBUG FILENAME.? 回车其中FILENAME是主文件名,?是扩展文件名,例如我们在此前已编译好了一个文件,它的名字为:djx.exe 要对它进行调试时就在DOS提示符下打:DEBUG djx.exe 回车,便可见到 - 提示符,如无任何提示说明正确,可进行调试。2、DEBU

11、G调试过程中用到的DEBUG命令介绍:(注:在指令中用 括起来的内容可缺省)1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段):格式:d地址 从地址指定的内存单元显示128个字节的内容地址缺省时,显示上一个DUMP命令后面的内容d 地址范围 显示指定范围内的内存内容。示例:-d100 显示从DS段100H开始的内容(以十六进制显示)2)E(Enter)修改存储单元内容(一般在DS段)格式:e 地址 数据 用给定的数据代替指定范围的存储单元内容e 地址 修改一个指定内存单元的内容示例:-e ds:200 djxFF00AA 就可将DS段从200开始至205的内容替换为64

12、 6A 78 FF 00 AA3)G(GO)运行命令格式:-g =地址断点地址1 断点地址2 .断点地址10从指定地址开始执行程序(如地址缺省从当前CS:IP开始),运行至断点地址1停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入g,继续执行。示例:-g001a 则执行从当前cs:ip至001a的指令注意:地址设置必须从指令的第一字节设起。4)T(Trace)执行一条语句格式: -t =地址 从指定地址起执行一条语句后停下来,显示所有寄存器内容及标志位的值与下一条指令。如地址缺省则从当前CS:IP开始执行-t =地址value 从指定地址起执行value条指令后停止。5)P

13、(proceed)执行一个循环;一个软中断或call子过程格式:-p =地址n示例: mov ah,02hmov dl,41hint 21h此时用: -p 回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT 21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!6)R(register)显示并可修改寄存器内容格式:-r 显示所有寄存器内容-r 寄存器名 修改指定寄存器内容(可改:AX,BX,CX,DX,SP,BP,SI,DI,CS,DS,ES,SS,PC,IP,F)7)U(Unassemble)反汇编格式:-u 地址 从指定地址反汇编32个字节,若地址缺省

14、则从当前地址汇编32个字节。-u 地址范围 对指定范围内的存储单元进行反汇编以上是在调试程序中可能用到的DEBUG命令解释,DEBUG中还有其它命令,在检查程序中不会用到,就不再介绍了。PROCEDURE g:程序编好,那就一切OK!交卷过关了!大吃、大睡。下面给出一个有病句的程序,希望大家和我一起调试、修改并通过:先执行PROCEDURE a编辑源程序实现功能:在屏幕上显示:Hello worldMy name is DJX文件名:error.asm行号: 源程序代码:1 data segment2 out1 db Hello world3 ax db My name is DJX4 dat

15、a ens56 code segment7 assume cs:code;ds:data8 lea dx,out19 mov ah,210 int 21h1112 mov dl,0ah13 mov ah,214 int 21h15 mov dl,0dh16 moo ah,217 int 21h1819 lea dx,ax20 mov ah,21 int 21h22 code ends在编辑完执行PROCEDURE b用masm进行编译:masm error回车后显示如下:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Micros

16、oft Corp 1981-1985, 1987. All rights reserved.Object filename error.OBJ:Source listing NUL.LST:Cross-reference NUL.CRF:End of file encountered on input fileerror.ASM(23): warning A4085: End of file, no END directiveOpen segments: DATAerror.ASM(3): warning A4016: Reserved word used as symbol: AXerror

17、.ASM(4): error A2105: Expected: instruction or directiveerror.ASM(16): error A2105: Expected: instruction or directiveerror.ASM(19): error A2049: Illegal use of registerEnd of file encountered on input fileerror.ASM(23): warning A4085: End of file, no END directive51566 + Bytes symbol space free2 Wa

18、rning Errors4 Severe Errors说明这个程序有错误,并在第3,4,16,19,23行有错,我们再执行PROCEDURE c去逐一检查第三行:3 ax db My name is DJX它的错误在于AX不能作为变量名,更正:3 out2 db My name is DJX注意刚才我们定义AX为变量时在后面的程序中用过变量AX在第19行19 lea dx,ax在出错报告中也报第19行错,因为不能将AX的有效地址赋给DX,更正:19 lea dx,out2这样一下就解决了两个错误第四行:4 data ens这行为一个段的结束,但语句漏打了字母,更正:4 data ends第十六

19、行:16 moo ah,2这行也是语句打错,更正:16 mov ah,2第二十三行:出错信息:error.ASM(23): warning A4085: End of file, no END directive说明本程序没有结束伪操作,更正:加入:在第七、八行加入地址标志: start:原23 end start执行PROCEDURE a将源程序修改如下:data segmentout1 db Hello worldout2 db My name is DJXdata endscode segmentassume cs:code;ds:datastart:lea dx,out1mov ah,

20、2int 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hlea dx,out2mov ah,9int 21hcode endsend start再次进行PROCEDURE b进行编译,屏幕显示:Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename error.OBJ:Source listing NUL.LST:Cross-reference

21、NUL.CRF:51524 + Bytes symbol space free0 Warning Errors0 Severe Errors本程序在语句上已无错误。再执行PROCEDURE d连接为可执行文件(link error回车),屏幕显示:Microsoft (R) Overlay Linker Version 3.60Copyright (C) Microsoft Corp 1983-1987. All rights reserved.Run File ERROR.EXE:List File NUL.MAP:Libraries .LIB:LINK : warning L4021: n

22、o stack segment这时error.exe可执行文件已存在,可以执行PROCEDURE e来运行看一看是否正确在dos提示符下键入:error回车(小心!)屏幕显示:乱码,并死机。reset My computer!说明程序在逻辑上有错误,并且严重。这是就要用PROCEDURE f,用调试工具调试,查找错误。在DOS提示符下键入:debug error.exe回车屏幕出现 - 提示符,这时就可以用DEBUG的命令来找错误了,我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据

23、段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令:(执行PROCEDURE a)mov ax,datamov ds,ax再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:换行My name is DJX及乱码,并死机。(又要重新启动!)再次执行PROCEDURE a检查程序,发现:1.汇编语言有规定每个字符串应由$结尾2.在输出第一个串的语句中的AH子功能号应为09H将以上两点改正。再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:Hello

24、worldMy name is DJX并死机,不能返回DOS原因分析,在程序中没有返回DOS的指令,更正:用PROCEDURE a来进行编辑:用DOS 21H中断的4cH子功能便可返回DOS,在code ends前加:mov ah,4chint 21h再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:Hello wordMy name is DJX并返回DOS成功!这样一个程序就调试完成,并正确。下面是正确的源程序:data segmentout1 db Hello world$out2 db My name is DJX$data endsco

25、de segmentassume cs:code;ds:datastart:mov ax,datamov ds,axlea dx,out1mov ah,9int 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hlea dx,out2mov ah,9int 21hmov ah,4chint 21hcode endsend start以上这个程序很简单,只是为了说明实现汇编语言的上机编程及调试过程,汇编语言须多练习才能掌握它的特点。实验二 数据传送一、 目的1、 掌握数据传送类指令的用法2、 认识DEBUG调试程序的作用3、 熟悉DEBUG

26、调试程序主要命令的使用方法二、 步骤将数据段1000H和1008H两个字节存储单元的数据进行交换。 源程序: MOV BX ,1000H MOV AL,BX MOV CL,8BX MOV 8BX,AL MOV BX,CL HLT1、 进入DEBUG状态2、 汇编源程序ACS:1000140D:0100 MOV BX,1000140D:0103 MOV AL, BX140D:0105 MOV CL,8BX140D:0108 MOV 8BX,AL140D:010B MOV BX,CL140D:010D INT 3140D:010E C3、 用反汇编列出汇编指令序列 UCS:0100,010D 14

27、0D:0100 BB0010 MOV BX,1000 140D:0103 8A07 MOV AL,BX 140D:0105 8A4F08 MOV CL,8BX 140D:0108 MOV 8BX,AL 140D:010B 880F MOV BX,CL 140D:010D CC INT 34、给内存单元赋值将数据段的1000H和1008H存储单元分别赋给F0H和0FHEDS:1000 F0,00,00,00,00,00,00,00,0F5、单步执行程序,并逐条检查执行指令的结果。T=100三、 思考题按上述步骤,完成以下实训内容。将两个寄存器AX和BX中的数据进行交换。 MOV AX,1234H

28、 MOV BX,5678H XCHG AX,BX HLT实验三 顺序结构程序设计一、 实验目的1. 熟悉汇编语言源程序的结构框架。2. 掌握顺序结构程序设计的基本方法。3. 熟练运用edit,masm,link,debug调试汇编语言的源程序。二、 实验内容1 在屏幕上显示:Hello Bengbu College!参考源程序: DATA1 SEGMENT MESS DB 0DH,0AH,“Hello Bengbu College!$” DATA1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1START:MOV AX,DATA1 MOV DS,AX LEA

29、DX,MESS MOV AH,09H INT 21H MOV AH,4CH INT 21HCODE ENDS END STRAT2 编写程序完成如下功能:从键盘接收一个小写字母,然后找出他的前导字符和后续字符,再按顺序显示这三个字符。参考源程序:CODE SEGMENTASSUME CS:CODESTART: MOV AH,01H INT 21H MOV BL,ALSUB BL,1MOV DL,BLMOV AH,02HINT 21HADD DL,1MOV AH,02HINT 21HADD DL,1MOV AH,02HINT 21HMOV AH,4CHINT 21HCODE ENDSEND ST

30、ART三、 思考题将从键盘输入的小写字母用大写字母显示出来。提示:(1)DOS功能调用(01,02); (2)小写字母与大写字母的ASCII码差值。实验四 分支结构程序设计一 目的1理解和掌握双分支程序中产生条件和判断条件的程序段的设计方法和技巧;2理解和掌握多分支程序的设计原理、方法和技巧。二 内容1比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同,则显示MATCH!,否则显示NO MATCH!。DATA SEGMENTSTRING1 DB ABCDEFGOUT1 DB MATCH!OUT2 DB NO MATCH!DATA ENDSEXTRA SEGMENTSTRI

31、NG2 DB abcdefgEXTRA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRASTART: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV CX,7 LEA SI,STRING1 LEA DI,ES:STRING2 CLD REPE CMPSB JNZ OUTPUT2 LEA DX,OUT1 MOV AH,9H INT 21H JMP EXITOUTPUT2:LEA DX,OUT2 MOV AH,09H INT 21H EXIT:MOV AH,4CH INT 21H CODE ENDS

32、END START2.比较两个无符号整数A和B,若AB则输出“”;若AB则输出“”;若A=B则输出“=”。参考源程序:DATA SEGMENTA DB 12B DB 78DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AX,A MOV BX,B CMP AX,BX JAE NEXT1 MOV DL,EXIT:MOV AH,4CHINT 21HMOV AH,4CHINT 21HCODE ENDSEND START三 思考题1画出程序1,程序2的流程图。2比较两个无符号整数是否相等,如相等则输出

33、“”,否则输出“!”。实验五 循环结构程序设计一、 目的1理解和掌握单循环程序中循环控制条件的选取和设置;理解和掌握多重循环程序中循环控制条件的选取和设置;2掌握单循环程序中循环的初始状态和循环体的设置;掌握多重循环程序中内外层循环的初始状态和循环体的设置;3理解和掌握循环程序的设计原理、方法和技巧;二、 实验内容1编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并把这两个数组中的数据个数统计出来,分别存储于COUNTP 和COUNTN单元中。参考源程序:DATA SEGMENTM DW 1,2,3-6,7,58P DW 20 DUP(?)N DW 20 DUP(

34、?)COUNTP DW ?COUNTN DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AXLEA BX,MMOV SI,0MOV DI,0MOV CX,12MOV COUNTP,0MOV COUNTN,0NEXT:MOV AX,BX CMP AX,0 JL NN MOV PSI,AX ADD SI,2 INC COUNTP JMP PPNN: MOV NDI,AX ADD DI,2 INC COUNTNPP:ADD BX,2 LOOP NEXT MOV AH,4CH INT 21HCODE END

35、SEND START2编写程序,在屏幕上输出如下图形: * * * * * * * * * * * * * * * * * * * * * *参考源程序:DATA SEGMENT M DB 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV BL,1 LOOP1: MOV AL,20 SUB AL,BL CBW MOV CX,AXLOOP3:MOV DL,20H MOV AH,02H INT 21HLOOP LOOP3MOV AL,BLMOV CL,2IMUL CLMOV CX,AXDEC CX

36、LOOP2:MOV DL,*MOV AH,02HINT 21HLOOP LOOP2MOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21HINC BLCMP BL,MJLE LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START三、 思考题有一串20个字符的字符串存储于首地址为STRING的存储区中,要求在字符串中查找空格(ASCII码为20H),如果找到则输出“FOUND SPACE!”,否则输出“NO FOUND SPACE!”。实验六 代码转换一 目的理解代码之间的转换关系。二 实验内容编程,将BX寄存器内

37、的二进制数用十六进制数的形式在屏幕上显示出来。分析:将十六进制数由高到低逐位转换为ASCII码,再进行屏幕显示DOS功能调用。参考子程序如下:HTOA2 PROCPUSH CXPUSH DXXOR AL,ALMOV CH,4LOP: MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRNADD AL,07HPRN: MOV DL,ALMOV AH,02HINT 21HDEC CHJNZ LOPPOP DXPOP CXRETHTOA2 ENDP三 思考题 1画出上面子程序的程序流程图。2二进制数存放在BX中。编程,将二进制数转换为相应ASCII码串,由DI指向转换后的ASCII码串首地址。实验七 中断程序设计一 目的1掌握80X86CPU对中断的处理过程;2掌握编写中断服务程序的方法和一般步骤。二 实验内容编制INT 1CH 定时器报时中断服务程序,完成下列功能:该中断服务程序常驻内存,取代原系统中的中断向量,每隔1分钟响铃一次。(源程序略)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁