课程号:080503101301 课程类别:专业基础课 适用专业:计算机科学与技术专业
课程总学时:34 实验学时:17 大纲编写人:\\\\\\ 编写时间:2010年6月18日 【实验目标要求】
《汇编语言程序设计》是计算机科学与技术专业必修的专业基础课程。汇编语言程序设计实验的目标是学习汇编语言程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,汇编语言程序实验的内容与计算机硬件特性联系紧密。通过上机实验的学习,使学生不仅能加深理解和巩固理论课所学的知识,而且还能了解计算机的底层软件的工作过程,为今后学习后续课程打好良好的基础。
【实验学习要求】
认真阅读《IBM-PC汇编语言程序设计》教材中与实验相关的章节内容,提前做好实验预习,做到在每个实验前明确实验目的、掌握实验的基本内容及操作方法;在实验中正确使用实验设备,认真观察、分析实验结果;实验后要根据要求做好总结,上交实验报告。具体要求如下:
1.上机前,要作好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。
2.上机时,要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序、调试程序)的使用方法;在程序调试过程中,有意识的学习及掌握Debug的各种操作命令,以便掌握程序的调试方法及技巧;程序调试完后,须由实验辅导教师在机器上检查运行结果。
3.上机后,应写出实验报告,及时总结。 4.遵守实验室的规章制度,爱护实验设备。
【实验计划】
实验序号 实验项目内容 学时 3 3 3 2 2 2 2 实验一 IBM-PC寻址方式及DEBUG的使用 实验二 实验三 实验四 实验五 实验六 实验七
熟悉指令系统 建立运行汇编语言程序 循环程序设计 分支程序设计 子程序设计 I/O程序设计 【实验教材及主要参考资料】
教材:
1.《IBM-PC汇编语言程序设计(第二版)》,沈美明、温冬蝉编著,清华大学出版社,2001.8。
2.《IBM-PC汇编语言程序设计实验教程》,沈美明、温冬蝉、张赤红编著,清华大学出版社,2008.2。
【实验任务】
实验一、IBM-PC寻址方式及DEBUG的使用
实验目的:
1.熟悉DEBUG的功能,运行并掌握其常用命令。
2.使用DEBUG,通过数据传送指令观察IBM-PC机各种寻址方式的区别。 实验内容:
1. DEBUG的加载及其常用命令(A、U、R、D、E、T、P、G、Q)的使用情况。(注意:微机进入DEBUG状态下之后,一切立即数和地址数据均被默认为十六进制数,在输入时数的后面不加后缀“H”。)
2.将数据段中的两个数求和,结果保存在数据段中。 源程序、机器语言程序如下: CS:0100 Al 00 00
MOV AX,[0000] ADD AX,[0002] MOV [0004],AX RETF
CS:0103 03 06 02 00 CS;0107 A3 04 00 CS:010A CB 数据段内容如下: DS:0000 2301 2500
;两个已知数
3.在Debug中编制简单的汇编程序片断,并调试运行,得出结果。 实验主要步骤:
1.在DOS或Windows的命令行窗口执行命令Debug.exe,进入Debug程序环境,熟悉Debug各个命令的用法。
2. 实验步骤
(1)用E命令键人上述机器语言程序和数据段的初值。 —E DS:000 2301 2500
—E DS:006 2A 2A 2A (2A为*,是为便于查看数据段内容而设置) —E CS:100 A1 00 00 03 06 02 00 —E CS:107 A3 04 00 CB
(2)用D命令检查数据段、代码段内容。 —D DS:0
—D CS:100
(3)用T命令逐条执行上述程序,注意观察每条指令执行后相应寄存器的变化。
(4)用U命令反汇编本程序。 —U 100 10A
(5)用R命令修改IP的内容为0100重新执行上述程序。 —R IP
显示:IP 010A :0100
(6)用G命令运行程序。 —G =CS:0100 107 观察:IP= AX= —G =CS:0100 10A 观察:IP= AX= 3.自己试着写段程序: -A 100↙
16C6:0100 DB‘1234567890‘↙ 16C6:010A CLD↙
16C6:010B MOV SI,100↙ 16C6:010E MOV DI,200↙ 16C6:0111 MOV CX,A↙ 16C6:0114 REP MOVSB↙ 16C6:0116↙
-G =10A 116↙;运行上述程序(起始地址10AH,结束地址116H)。 -D 100 L A↙;显示DS:100开始10个字节内容 16C6:0100 31 32 33 34 35 36 37 38-39 30 ‘1234567890 -D ES:200 L A↙显示ES:100开始10个字节内容 16C6:0200 31 32 33 34 35 36 37 38-39 30 ‘1234567890 4.写出实验报告。
实验二、熟悉指令系统
实验目的:
1.熟悉8088/8086的指令书写格式、功能。 2.能熟练运用数据传递、算术、逻辑三类指令。 实验内容:
1.用DEBUG调试程序功能编程序计算(W—(X×Y+Z—540))/X。其中X、Y、Z、W均为16位带符号数,要求上式计算结果的商存人AX寄存器中,余数存人DX寄存器。掌握算术指令的用法。
2.用DEBUG编程并查看逻辑指令的运行结果,掌握逻辑指令的用法。 3.熟悉其它几组指令的功能和用法,并区分字、字节操作。 实验主要步骤:
1.预先编制程序片段,实现(W—(X×Y+Z—540))/X,将计算结果的商存人AX寄存器中,余数存人DX寄存器。
参考程序代码如下:
DATA SEGMENT X DW 1200H Y DW 0034H Z DW 0F045H W DW 034AH DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,X
IMUL Y
MOV CX,AX MOV BX,DX MOV AX,Z CWD
ADD CX,AX ADC BX,DX SUB CX,540 SBB BX,0 MOV AX,W CWD
SUB AX,CX SBB DX,BX IDIV X
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.可以在Debug程序中使用E命令为变量X、Y、Z、W设置初值。 3.使用A命令汇编程序片段,并用G或T命令执行,用R或D命令查看结果。
4.使用A命令汇编几条逻辑指令,并运行,查看结果。 5.写出实验报告。
实验三、建立运行汇编语言程序
实验目的:
1.掌握汇编语言程序格式及其它命令的作用。
2.掌握汇编、连接、运行汇编程序的全过程,并能检查修攙程序简单错误。 实验内容:
1.编写程序,比较两个字符串STRINGl和STRING2所含的字符是否相同。若相同,则显示'Match';否则,显示'No match'。
2.编辑、汇编、连接这个汇编语言源程序,形成.EXE文件。 3.通过DEBUG调试运行该可执行文件,查看运行结果。 实验主要步骤:
1.根据要求编制汇编源程序。 参考程序如下:
DATA SEGMENT
STRINGl DB ‘Move the cursor backward.’ STRING2 DB ‘Move the cursor backward.’ MESSl DB ‘Match.’,13,10,‘$’ MESS2 DB ‘NO Match!’,13,10,‘$’ DATA ENDS
PROG SEGMENT
ASSUME CS:PROG,DS:DATA,ES:DATA START:MOV AX,DATA
MOV DS,AX MOV ES,AX
LEA SI,STRINGl LEA DI,STRING2 CLD
MOV CX,25 REPZ CMPSB JZ MATCH
LEA DX,MESS2 JMP SHORT DISP
MATCH: LEA DX,MESSl DISP: MOV AH,09
1NT 21H
MOV AH, 4CH INT 21H
PROG ENDS
END START
2.使用记事本或其它字处理软件(Edit.exe)编辑该源文件。
3.使用Masm、Link程序汇编、连接该文件,形成可执行的.EXE文件。 参考步骤如下:
(1)调用全屏幕编辑程序EDlT建立ASM文件。 C>EDIT
输入实验内容1的源程序并以SAMPLE.ASM为文件名将文件存盘。
(2)用汇编程序MASM 对源文件SAMPLE.ASM 汇编并产生目标文件SAMPLE.OBJ。
C>MASM SAMPLE
如汇编指示有错误,则需重新调用编辑程序修改程序中的错误,直至汇编通过为止。 (3)用连接程序LINK产生执行文件SAMPLE.EXE。 C>LINK SAMPLE (4)执行程序。
可直接从DOS状态执行程序。 C>SAMPLE
显示器上显示出程序的运行结果。 Match.
4.也可以使用Debug调试运行这个.EXE文件,并查看运行结果。对实验内容修改两个字符串的内容,使它们互不相同,再观察程序的运行结果。
5.写出实验报告。
实验四、循环程序设计
实验目的:
1.加深对循环程序的理解。
2.能构造出正确的循环结构并能实现较复杂的算法。 实验内容:
1.编制程序,要求如下:从键盘接收一个四位的16进制数,在终端上显示与它等值的二进制数。
实验主要步骤:
1.根据要求,画出程序框图,写出汇编源代码。 参考程序如下:
Begin: MOV BX,0 ;用于存放四位的16进制数 MOV CH,4 MOV CL,4
INPUT: SHL BX,CL ;将前面输入的数左移4位 MOV AH,1 ;从键盘取数 INT 21H
CMP AL,30H ;<0吗?
JB INPUT ;不是\"0~F\"的数重新输入 CMP AL,39H ; 是\"0~9\"吗? JA AF ;不是,转\"A~F\"的处理 AND AL,0FH ;转换为:0000B~1001B JMP BINARY