资源描述
汇编语言实验 实验一 汇编运行环境及方法、简单程序设计一、实验目的:1、熟练汇编语言运行环境和方法。2、了解如何使用汇编语言编制程序。3、熟悉DEBUG常用的命令的使用方法。4、会使用DEBUG命令调试程序。二、实验内容: 1、比较两个字符串STRING1和STRING2所含的字符是否相同,若相同,则输出MATCH,不相同则输出NOMATCH。2、学会对汇编语言程序进行汇编、连接和运行。3、学会用DEBUG中的D命令,E命令,R命令,G命令,F命令,U命令,A命令以及T命令。三、实验要求:1、实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等。2、本实验只要求在DEBUG调试程序状态下进行,包括汇编程序、调试程序和执行程序。四、实验报告:1、程序说明。说明程序的功能、结构。检查两个字符串是否相同2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。运行e28forward3、写出源程序清单和执行结果。实验清单:datarea segmentstring1 db Move the cursor backwordstring2 db Move the cursor backwordmess1 db Match.,13,10,$mess2 db No match!,13,10,$datarea endsprognam segmentmain proc farassume cs:prognam,ds:datarea,es:datareastart: push ds sub ax,dx push ax mov ax,datarea mov ds,ax mov es,ax lea si,string1 lea di,string2 cld mov cx,25 repz cmpsb jz match lea dx,mess2 jmp short dispmatch: lea dx,mess1disp: mov ah,09 int 21hmov ah,4ch int 21hmain endpprognam endsend start实验二 循环程序设计已知学生成绩,求每个学生的名次一、实验目的:1、熟悉循环、DOS功能调用等基本的程序结构。2、熟悉多重循环结构及算法技巧。3、熟练使用DEBUG常用命令查看程序运行结果,以及通过修改代码或数据来改变程序运行结果。二、实验内容:设有十个学生成绩分别是88,75,95,63,98,78,87,73,90和60分。试编制一个程序,求每个学生和名次。三、编程提示:1、定义如下的数据结构:data SEGMENT grade DW 88,75,95,63,98,78,87,73,90,60 rank DW 10 DUP(?)data ENDS2、通过双重循环实现:对于数组的每个元素(学生成绩),查找数组中比该元素值大的元素个数I,则I-1即为该学生的名次,并将名次依次保存在以rank为首地址的字数组中。四、实验报告:1、程序说明。说明程序的功能、结构。功能:将给出的数组每个元素在数组的大小位置找出来,放到rank数组中数据定义块:data segment grade dw 88h,75h,95h,63h,98h,78h,87h,73h,90h,60hrank dw 10 DUP(?)count dw ?data ends代码块:code segmentassume cs:code,ds:datamain proc farstart:mov ax,datamov ds,axxor ax,axmov si,axmov count,ax外层循环:lea1lea1:lea bx,grademov cx,rank-gradesar cx,1xor ax,axlea di,grade内层循环lea2,lea3.lea4lea2:mov dx,dicmp bx+si,dxmov dx,word ptr bx+sijl lea4 add di,2loop lea2lea3:mov si,countmov rank+si,axadd count,2mov si,countcmp count,rank-grade返回语句:je lea5jmp lea1lea4:inc axadd di,2loop lea2jmp lea3lea5:mov ah,4chint 21hmain endpcode endsend start2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果清单:data segment grade dw 88h,75h,95h,63h,98h,78h,87h,73h,90h,60hrank dw 10 DUP(?)count dw ?data endscode segmentassume cs:code,ds:datamain proc farstart:mov ax,datamov ds,axxor ax,axmov si,axmov count,axlea1:lea bx,grademov cx,rank-gradesar cx,1xor ax,axlea di,gradelea2:mov dx,dicmp bx+si,dxmov dx,word ptr bx+sijl lea4 add di,2loop lea2lea3:mov si,countmov rank+si,axadd count,2mov si,countcmp count,rank-gradeje lea5jmp lea1lea4:inc axadd di,2loop lea2jmp lea3lea5:mov ah,4chint 21hmain endpcode endsend start。5、体会和意见。实验三 分支程序设计从键盘输入月份数值,显示月份的英文字母一、实验目的:1、熟悉分支、DOS功能调用等基本的程序结构。2、使用DEBUG的A命令、E命令以及R命令修改内存中程序代码、数据以及寄存器的内容,使得程序输出不同的结果。二、实验内容:从键盘输入月份值,如(1-12),显示月份的英文名称(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC )。三、编程提示:1、定义如下的数据结构monin LABEL BYTE max DB 3 act DB ? mon DB 3 DUP(?) alfmon DB ?,13,10,$ montab DB JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC2、使用DOS系统功能调用实现从键盘输入月份数值(可能是一位也可能是二位),将月份值的ASCII转换成数值,根据此数值确定月份英文名在字符串数组montab中的位置,将该位置连续三个字节拷贝到alfmon单元中,再通过DOS系统功能调用显示alfmon为起始的字符串。四、实验报告:1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果。data segmentplease db please enter the momth:,13,10,$max DB 3act DB ?mon DB 3 DUP(?)alfmon DB ?,13,10,$montab DB JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DECdata endscode segment assume ds:data,cs:code,es:datamain proc farstart:mov ax,datamov ds,axmov es,axlen0:lea dx,pleasemov ah,09hint 21hlea dx,maxmov ah,0ah int 21hmov cl,byte ptr actxor ax,axxor bx,bxxor ch,chlea si,monlen1:mov dl,10mul dlmov bl,byte ptr sisub bl,30hadd ax,bxadd si,1loop len1len2:mov dl,3mul dllea si,montabsub ax,3add si,axlea di,alfmonmov cx,3cld rep movsblea dx,alfmonmov ah,09hint 21hexit:mov ah,4chint 21hmain endpcode endsend start5、体会和意见。实验四 子程序设计从键盘输入一个四位十进制无符号数,并将其从屏幕上显示出来一、实验目的:1、熟悉分支、循环、子程序调用、DOS功能调用等基本的程序结构。2、掌握子程序调用的参数传递。3、掌握综合程序的编制及调试方法。二、实验内容:从键盘输入一个四位的十进制数(如4525D),然后在屏幕上以十六进制形式将其显示出来(11ADH)。三、编程提示:1、采用DOS功能调用从键盘输入一串字符。2、设计一个子程序将键盘缓冲区中的字符转换为数值,即4-4、5-5、2-2、5-5,再将其转化为数值4525保存到BX寄存器中。3、设计一子程序将BX中的二进制数以十六进制形式显示。即用循环依次取BX中四位二进制N 数,将其转化为对应十六进制数的ASCII码,再通过DOS系统调用将其显示出来。四、实验报告:1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果。data segmentplease db please enter the number:,13,10,$answer db the answer is:,13,10,$max DB 5act DB ?mon DB 4 DUP(?)temp db 4 DUP(?),13,10,$tem dw 10hdata endscode segment assume ds:data,cs:code,es:datastart:mov ax,datamov ds,axmov es,axlen0:lea dx,pleasemov ah,09hint 21hlea dx,maxmov ah,0ah int 21hcall change1 call change2lea dx,answermov ah,09hint 21hlea dx,tempmov ah,09hint 21hexit:mov ah,4chint 21hchange1 procmov cl,byte ptr actxor ax,axxor bx,bxxor ch,chlea si,monlen1:mov dx,10mul dxmov bl,byte ptr sisub bl,30hadd ax,bxadd si,1loop len1mov bx,axretchange1 endpchange2 procxor ax,axxor cx,cxxor dx,dxlea si,temp+4mov cx,4mov ax,bxlen4:div temcmp dx,9ja len6add dx,30hjmp len7len6:add dx,40hsub dx,9len7:mov byte ptr si,dlxor dx,dxdec siloop len4retchange2 endpcodeend start5、体会和意见。实验五 综合程序统计不同成绩段学生的人数(2)一、实验目的:1、掌握分支、循环、子程序调用、DOS功能调用等基本的程序结构。2、掌握综合程序的编制及调试方法。二、实验内容:设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序,统计低于60分,6069分,7079分,8089分,9099分和100分的人数,并输出显示统计结果。三、编程提示:1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成,显示统计结果采用DOS功能调用。2、统计学生成绩和显示统计结果两部分内容用子程序结构来完成。四、实验报告:1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果。change macro tempadd temp,30hmov dl,temp mov ah,02hint 21hendmdata segmentgrand db 76,69,84,90,73,88,99,63,100,80sum1 db 0sum2 db 0sum3 db 0sum4 db 0sum5 db 0sum6 db 0sum db 10data endscode segment assume ds:data,cs:codestart:mov ax,datamov ds,axmov es,axcall alu call showmov ah,4chint 21halu procmov si,-1str:cmp sum,0jz exitinc sidec sumcmp grandsi,60jb len1cmp grandsi,70jb len2cmp grandsi,80jb len3cmp grandsi,90jb len4cmp grandsi,100jb len5jmp len6len1:inc sum1jmp strlen2:inc sum2jmp strlen3:inc sum3jmp strlen4:inc sum4jmp strlen5:inc sum5jmp strlen6:inc sum6jmp strexit:retalu endpshow procchange sum1change sum2change sum3change sum4change sum5change sum6retshow endpcode endsend start5、体会和意见。实验六 综合程序输入学生成绩,计算学生名次,按学号顺序显示学生名次(2)一、实验目的:1、掌握分支、循环、子程序调用、DOS功能调用等基本的程序结构。2、掌握综合程序的编制及调试方法。二、实验内容:按学号顺序从键盘输入学生成绩(成绩之间用逗号分隔)保存在成绩数组中,计算每个学生的名次,并按学号顺序存入内存中名次数组,最后,按学号顺序显示每个学生的名次。三、编程提示:1、设计一个子程序INPUT接受键盘输入的每个学生成绩,并存入成绩数组。其中INPUT子程序调用DECIBIN子程序,将每个学生的成绩保存在BX寄存器中。当遇到逗号时将BX内容写入成绩数组,遇到回车表示成绩输入完毕。2、设计RANKP子程序根据成绩数组计算每个学生名次,并将名次写入名次数组(这部分功能请参考实验二)。3、设计OUTPUT子程序输出名次数组中学生名次,注意要将数值形式的名次转换成ASCII码表示后再显示,此功能通过子程序BINDEC实现转换。四、实验报告:1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、画出程序框图。4、写出源程序清单和执行结果。data segmentgrade db 50 dup(?)rank db 50 dup(?)count dw ?ts1 db please enter grade,13,10,$ts2 db the rank is:,13,10,$data endscode segmentassume ds:data,cs:code,es:datastart:mov ax,datamov ds,axmov es,axcall inputcall rank1call outputmov ah,4chint 21hinput proclea dx,ts1mov ah,09hint 21hxor si,sibegin1:xor ax,axxor bx,bxxor cx,cxxor dx,cxbegin:mov cx,axmov dl,10mul dlmov bx,axmov ah,01hint 21hcmp al,je len1cmp al,13je len2xor ah,ahsub al,30hadd bx,axmov ax,bxjmp beginlen1:mov gradesi,clinc siinc countjmp begin1len2:mov gradesi,clinc siinc countexit:retinput endprank1 procxor si,sixor ax,axxor cx,cxxor dx,dxlea1:mov cx,countxor bx,bxxor di,dimov al,gradesilea2:cmp gradedi,aljb lea3inc bxlea3:inc diloop lea2mov ranksi,bl inc sicmp si,countje exit1 jmp lea1exit1: retrank1 endpoutput procxor si,sixor di,dixor ax,axxor bx,bxxor cx,cxxor dx,dxleb1:mov bl,ranksimov ax,bxmov cl,10div cladd al,30hmov dl,almov ah,02hint 21hmov ax,bxdiv cladd ah,30hmov dl,ahmov ah,02hint 21hinc sicmp si,countje exit2jmp leb1exit2:retoutput endpcode endsend start
展开阅读全文