您的当前位置:首页正文

《汇编语言程序设计》实验教学大纲

2021-10-07 来源:客趣旅游网
《汇编语言程序设计》实验教学大纲

课程号: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

AF: AND AL,1101 1111B ;转换为大写字母 CMP AL,41H ;又JB INPUT ;不是\"A~F\"的数重新输入 CMP AL,46H ;>F吗?

JA INPUT ;不是\"A~F\"的数重新输入 AND AL,0FH ;转换为1010B~1111B ADD AL,9

BINARY: OR BL,AL ;将键盘输入的数进行组合

DEC CH JNZ INPUT

MOV CX,16 ;将16位二进制数一位位地转换成ASCII码显示 DISP: MOV DL,0 ROL BX,1 RCL DL,1 OR DL,30H

MOV AH,2 ;进行显示 INT 21H LOOP DISP STOP: RET

2.上机编辑源程序,并汇编、连接、调试运行,查看结果。 3.写出实验报告。

实验五、分支程序设计

实验目的:

1.加深对分支程序的理解,掌握分支程序的结构。熟悉运算类指令对标志位的状态影响以及标志位状态的表示方法;掌握条件转移、无条件转移指令的使用方法。

2. 掌握分支程序设计、编写、调试和运行的方法。 实验内容:

1.试编写小程序:对键盘输入的小写字母用大写字母显示出来。 参考程序段如下:

Begin:MOV AH,1 ;从键盘输入一个字符 INT 21H

CMP AL,'a' ;输入字符<'a'吗? JB STOP

CMP AL,'z' ;输入字符>'z'吗? JA STOP

SUB AL,20H ;转换为大写字母或AND AL,1101 1111B也可以 MOV DL,AL ;显示一个字符 MOV AH,2 INT 21H JMP Begin STOP: RET

2.编制程序统计学生成绩。要求如下:

设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数存放到s5、s6、s7、s8、s9及s10单元中。

这一题目的算法很简单,成绩分等部分采用分支结构,统计所有成绩则用循环结构完成。

实验主要步骤:

1.根据要求,画出程序框图如下图所示,然后写出汇编源代码。

开 始 初始化计数单元 初始化循环计数值 初始化首地址 取一个成绩

S5+1 Y Y Y <60? <70? <80? N S6+1 N N S7+1 Y <90? N S8+1 N =100? Y S9+1 S10+1 修 改 地 址 N 循环结束? Y 结 束 程序框图

2.上机编辑源程序,并汇编、连接、调试运行,查看结果。 参考程序如下:

;PROGRAM TITLE GOES HERE――result

;************************************ datarea segment ;define data segment

grade dw 56,69,84,82,73,88,99,63,100,80 s5 dw 0 s6 dw 0 s7 dw 0 s8 dw 0 s9 dw 0 s10 dw 0 datarea ends

;************************************ prognam segment ;define code segment ;----------------------------

main proc far ; main part of program assume cs:prognam, ds:datarea

start: ; starting execution address ; set up stack for return

push ds ; save old data segment sub ax,ax ; put zero in AX push ax ; save it on stack ; set DS register to current data segment

mov ax,datarea ; datarea segment addr mov ds,ax ; into DS register ; MAIN PART OF PROGRAM GOES HERE

mov s5, 0 ; initialize counter mov s6, 0 mov s7, 0 mov s8, 0 mov s9, 0 mov s10, 0

mov cx, 10 ; initialize loop count value mov bx, offset grade ; initialize first addr compare:

mov ax, [bx] ; get a result cmp ax, 60 ; <60? jl five

cmp ax, 70 ; <70? jl six

cmp ax, 80 ; <80? jl seven

cmp ax, 90 ; <90? jl eight

cmp ax, 100 ; =100? jne nine inc s10

jmp short change-addr nine: inc s9

jmp short change-addr eight: inc s8

jmp short change-addr seven: inc s7

jmp short change-addr six: inc s6

jmp short change-addr five: inc s5 change-addr:

add bx, 2 loop compare

ret ; return to DOS

main endp ; end of main part of program ; ------------------------------ prognam ends

;*************************** end start ; end assembly

3.写出实验报告。

实验六、子程序设计

实验目的:

1.掌握子程序设计方法,能合理划分子程序。

2.掌握汇编子程序的定义、调用、返回、参数传递等有关问题的实现,以及运行过程中的堆栈、标志位变化情况。

实验内容:

1. 编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。

主程序BANDO:把整数变量VAL1存入堆栈,并调用子程序PAIRS; 子程序PAIRS:从堆栈中取出VAL1,调用二进制显示子程序OUTBIN,显示出与其等效的二进制数;输出8个空格;调用八进制显示子程序OUTOCT显示与其等效的八进制数;调用输出回车及换行符子程序。

实验主要步骤:

1.画出程序流程图,合理划分子程序,正确区分主程序与各子程序的功能与关系。

2.编制主程序与子程序的源代码。 参考程序如下:

DATA SEGMENT VAL1 DW ?

CRLF DW 0DH,0AH,'$' DATA ENDS CODE SEGMENT

BANDO PROC FAR ;主程序BANDO ASSUME CS:CODE,DS:DATA START: PUSH DS ;设置返回DOS SUB AX,AX PUSH AX MOV AX,DATA

MOV DS,AX ;给DS赋值 PUSH VAL1

CALL PAIRS RET BANDO ENDP

PARIS PROC NEAR ;PARIS子程序 PUSH BP MOV BP,SP PUSH BX

MOV BX,[BP+4] ;从堆栈中取出VAL1 CALL OUTBIN ;调用二进制显示子程序 MOV CX,8 ;显示8个空格 SPACE: MOV DL,' ' MOV AH,2 INT 21H LOOP SPACE

CALL OUTOCT ;调用八进制显示子程序 CALL DISP_CRLF POP BX POP BP RET 2 PARIS ENDP

OUTBIN PROC NEAR ;二进制显示子程序 PUSH BX MOV CX,16 ONEBIT:ROL BX,1 MOV DX,BX AND DX,1

OR DL,30H ;转换为ASCII码 MOV AH,2 INT 21H LOOP ONEBIT

POP BX RET OUTBIN ENDP

OUTOCT PROC NEAR ;八进制显示子程序

ROL BX,1;16位二进制数包含6位八进制数,最高位仅1位 MOV DX,BX AND DX,1

OR DL,30H ;转换为ASCII码 MOV AH,2 INT 21H

MOV CX,5 ;余下还有5位八进制数 NEXT:PUSH CX

MOV CL,3 ;1位八进制数包含3位二进制数 ROL BX,CL MOV DX,BX AND DX,07H

OR DL,30H ;转换为ASCII码 MOV AH,2 INT 21H POP CX LOOP NEXT RET OUTOCT ENDP

DISP_CRLF PROC NEAR ;显示回车换行子程序 LEA DX,CRLF MOV AH,09H INT 21H RET DISP_CRLF CODE ENDS

END START

3.上机编辑源文件,并汇编、连接、调试运行,随时查看堆栈的变化。 4.编写实验报告。

实验七、I/O程序设计

实验目的:

1.熟悉BIOS、DOS中断调用情况,学会如何利用系统功能控制外设的I/O操作

实验内容:

1.分别利用BIOS、DOS中断服务,编程实现对键盘、显示器等的控制。 2.实验编程:在AX中存放着压缩BCD的十进制数,编程实现把AX中的四位十进制数按照从高位到低位的顺序在屏幕上显示出来(例如若AX=0010001101000101B,则在屏幕上显示“2345”)。

实验主要步骤:

1.根据要求编写汇编源代码,核心代码参考如下: MOV BX,AX MOV CL,4 SHR AH,CL ADD AH,30H MOV DL,AH MOV AH,2

INT 21H ‘显示“2” MOV AH,BH AND AH,0FH ADD AH,30H MOV DL,AH MOV AH,2

INT 21H ‘显示“3” MOV AL,BL MOV CL,4 SHR AL,CL ADD AL,30H MOV DL,AL MOV AH,2

INT 21H ‘显示“4” MOV AL,BL AND AL,0FH ADD AL,30H MOV DL,AL MOV AH,2

NT 21H ‘显示“5”

2.上机编辑源文件,汇编、连接、调试运行,查看结果。 3.编写实验报告。

因篇幅问题不能全部显示,请点此查看更多更全内容