1、汇编语言程序设计实验指导书实验一 汇编语言上机过程和 Debug 常用调试命令一实验目的:学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法。二实验题目:熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等) 的使用方法。在调试过程中,学习及掌握 debug 程序的各种操作命令。三问题描述:试编写一程序:比较两个字符串 string1 和 string2 所含的字符是否相同,若相同则显示match; 否则,显示 no match。四方法说明:a) 使用 ws、tc 或 EDIT 编辑程序来建立源文件,然后存盘,使系统返回 DOS。b) 用汇编程序
2、masm(或 asm)对源文件汇编产生目标文件 obj如:汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。c) 用连接程序 link 产生执行文件 EXE.d) 执行程序,可直接从 DOS 执行程序。e) 使用 debug 程序调试程序的方法。五实验步骤:1 调用字处理程序 EDIT 建立以 sample.asm 文件datarea segment string1 db move the cursor backward.string2 db move the cursor backward.mess1 db Match,13,10,$mess2 db No match!,13,10
3、,$datarea endsprognam segmentmain proc farassume cs:prognam,ds:datarea,es:datareastart:push dssub ax,axpush axmov ax,datareamov ds,axmov es,axlea si,string1lea di,string2cldmov cx,25repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx, mess1disp:mov ah,09int 21hret main endpprognam endsend start
4、2 对源文件汇编产生目标文件 objD:masm 文件名。 Asm3用连接程序 link 产生执行文件 exeD:link 文件名。 Obj4执行程序D: 文件名5. 使用 debug 程序调试程序的方法。ddebug 文件名.exe_1. 用 G 命令运行程序2. 用 U 命令显示程序3. 学会设置断点。4. 学会查看数据段的内容情况5. 用 E 命令修改数据区的字符串。6. 用 A 命令把数据区的内容恢复原状7. T 命令逐条跟踪程序的执行8. 学会使用 F 命令、R 命令、 Q 命令等等实验二 循环程序设计 1循环结构是控制重复执行某一程序段的基本程序结构. 在汇编语言程序设计中, 循环
5、程序的地位也是极为重要,从本质上来看 , 循环程序结构是分支程序结构的一种手特殊形式, 也是使用条件转移指令来控制执行循环的.一.实验目的:学会用循环结构进行程序编程。二.实验题目:设计一个按表格形式显示 ASC|码为 10H100H 的所有字符的程序。三.实验要求:按 15 行*16 列的表格形式显示 ASC|码为 10H-100H 的所有字符,即以行为主的顺序及 ASC|码递增的次序依次显示对应的字符。每 16 个字符为一行,每行中的相邻两个字符之间用空白符(ASC|为 0)隔开。四方法说明:(1) 显示每个字符可使用功能号为 02 的显示输出功能调用,使用方法如下:mov ah,02hm
6、ov dl,输出字符的 ASC|码int 21h本题中可把 dl 初始化为 10H, 然后不断使其加 1(用 INC 指令) 以取得下一个字符的 ASC|码。(2) 显示空白符时,用其 ASC|码 0 置入 dl 寄存器,每行结束时,用显示回车(ASC|为 0dh)和换行符(ASC|为 oah)来结束本行并开始下一行。(3) 由于逐个显示相继的 ASC|字符时,需要保存并不断修改 dl 寄存器的内容,而显示空白、回车、换行符时也需要使用 dl 寄存器,为此可使用堆栈来保存相继的 ASC|字符。具体用法是:在显示空白或回车,换行符前用指令 push dx 把 dl 的内容保存到堆栈中去。在显示空
7、白或回车,换行符后用指令 pop dx 恢复 dl 寄存器的原始内容。五.选作题目:(1) 设有 50 个从 1 开始连续的数,编程序统计它们的偶数和,最后将结果存放在名字为 sum 的字存储单中。 (2) 将以 buf1 为起始地址的字节存储区中的内容传送到以 buf2 为起始地址的字节存储区中实验三 循环程序设计 2一.实验目的:学会用循环程序设计进行程序编程。二.实验题目:设计查找匹配字符串 SEARCH 的程序。三.问题要求:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示no match;如果句子中包含关键字则显示match,且把该字在句子中的位置用十六进制数显
8、示出来,要求程序的执行过程如下:enter keyword :abcenter sentence :we are studying abcmatch at location :11H of the sentence enter sentence: xyz ,ok?no matchenter sentence :c四. 方法说明:程序可由三部分组成:(1 ) 输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。(2) 在句子中查找关键字。1关键字和一个句子中相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内
9、容也有了确定的含义,如下:SI 寄存器为关键字的指针DI 寄存器为句子中正相比较的字段的指针CX 寄存器存放关键字的字母个数(长度)2整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为:(句子长度-关键字长度)+1 在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环中还需要用到 BX 寄存器,它用来保存句子中当前正在比较字段的首地址。(3) 输出信息:用功能调用 09h 分“找到 ”或“找不到”两种情况分别显示不同的信息。在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时 BX 寄存器的内容为匹配字符串的首地址,将此值减到句子的
10、首地址,再将差值加 1 即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。五. 选作题目:已知在数据区中 DATA1 和 DATA2 开始分别存放 N 个字节数据,请编写一个程序检查两数据块中的数据是否相同,若完全一致,则将标志单元 EAG 置FFH,否则置 0.实验四 分支程序设计在实际应用的程序中,通常遇到根据某一条件是否成立来进行逻辑判断,以便确定程序的下一步执行,这就形成了分支结构程序, 在汇编语言程序设计中,分支结构程序设计是一种很重要的程序设计方法.一.实验目的:学会用分支程序设计进行程序编程。二.实验题目:设计一个程序能分类统计字符个数三.实验要求:程
11、序接收用户键入的一行字符(字符个数不超过 80 个,该字符串用回车符结束),并按字母、数字及其它字符分类计数,然后将结果存入以letter、digit 和 other 为名的存储单元中。四.方法说明:程序可采用 0AH 功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数,也可采用 01H 功能调用在接收字符后先分类计数然后再存入缓冲区中。程序需进入 debug 运行并查看计数结果。五.选作题目:(1) 设有 10 个学生的成绩分别为68、63、100、98、88、75、82、80、77 和 56 分。试编制程序分别统计低于 60 分、6069 分、7079 分、80-89 分、90-9
12、9 分及 100 分的人数,并存放到 s5、s6、s7、s8、s9 及 s10 单元中。(2) 设在变量 ADRR 为起始地址的字节存储单元中存放有若干个字符,编写程序分别统计1. 数字字符的个数. 2.大写字符的个数.3. 小写字符的个数. 4.其它字符的个数.(3) 设在变量 ADR 为起始地址的字节存储单元中存放一组有符号数据,编写程序分别统计1. 正数的个数2. 负数的个数3. 0 的个数实验五 子程序设计子程序(过程)是程序设计中常用的方法. 子程序结构是模块化程序设计的重要工具。设计子程序主要考虑参数传递的方法,参数传递是主程序和子程序之间的接口。一 实验目的:学会用子程序设计进行
13、程序编程。二 实验题目:设计一个能查找电话号码 phone 的程序。三 实验要求:i. 要求程序建立一个可存放 50 项的电话号码表,每项包括人名 (20 个字符) 及电话号码(8 个字符 )两部分;ii. 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;iii. 凡有新的输入后,程序应按人名对电话号码表重新排序;iv. 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。name tel* *四 实验提示:程序采用子程序结构,主程序的主要部分如下:. 显示提示符input name:;. 调用子程序 input_name 接收人名;.
14、 调用子程序 stor_name 把人名存入电话号码表 tel_tab 中;. 显示提示符input a telephone number:;. 调用子程序 inphone 接收电话号码,并把它存入电话号码表 tel_tab中;. 如输入已结束则调用 name_sort 子程序对电话号码表按人名排序;. 显示提示符DO you want a telephone number?(y/n);. 回答 N 则退出程序;. 回答 Y 则再显示提示符 name?;. 调用子程序 input_name 接收人名;. 调用子程序 name_search 在电话号码表中查找所要的电话号码;. 调用子程序 printline 按要求格式显示人名及电话号码;. 重复查号提示符直至用户不再要求查号为止。五选作题目:编制一程序,要求接收从键盘输入的一个班的学生成绩,并存放于 50 字的grade 数组中 ,其中 grade+i 保存学号为 i+1 的学生的成绩.然后根据 grade 中的学生成绩,把学生名次填入 50 字的 rank 数组中,其中 rank+I 的内容是学号为I+1 学生的名次 ,再按学号顺序把名次从终端上显示出来.