汇编语言实验讲义_第1页
汇编语言实验讲义_第2页
汇编语言实验讲义_第3页
汇编语言实验讲义_第4页
汇编语言实验讲义_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言实验讲义汇编语言实验学时分配表实验学时序号 实验项目名称课内 课外 实验报告或作业1 汇编语言程序上机过程以及调试 2 2 12 顺序程序设计 2 2 13 循环程序设计 2 2 14 分支程序设计 2 2 15 子程序设计 2 2 16 I/O 程序设计 2 2 17 实验七 综合程序设计 2 2 1合计 14 14 7实验一 汇编语言程序上机过程以及调试一、预习内容1. 工具软件MASM、LINK的使用2. 常用DEBUG命令的使用: G,D,R,T,U,Q3. 完整程序设计方法的格式。二、目的要求1. 掌握常用工具软件MASM、LINK的使用2. 掌握常用DEBUG命令: G,D,R,T,U,Q 能灵活使用这些命令调试程序3. 掌握完整程序设计方法的格式,能正确书写数据段,代码段等。三、实验内容比较两个字符串string1和string2所含的字符是否相同,如果相同则显示Match否则显示 No match.请读程序,并将程序补充完整。DSEG SEGMENTstring1 db Move the cursor backward.string2 db Move the cursor backward.mess1 db Match.,13,10,$mess2 db No match.,13,10,$DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:DSEG,MAIN PROC FAR start: mov ax, dsegmov ds, axmov es, axlea si ,string1cldrepz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx,mess1disp: mov ah,09hint 21hmov ax, 4c00h int 21hMAIN ENDPCSEG ENDSend start实验步骤:1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在c:masm50下,注意保存时将文件扩展名改为.asm(如lab1.asm)。2)打开桌面的“命令提示符” 程序进入dos命令操作,先用 cd masm50 命令改变路经,接着用 ”masm + 文件名” (如 masm lab1,这里文件名可以不带扩展名 ) 对源文件进行汇编,产生.obj文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3)用 ”link + 文件名” (如 link lab1) 将.obj文件连接成可执行的.exe文件(lab1.exe)。4)在DOS状态下直接运行link产生的.exe文件(如 lab1),即在屏幕上显示Match.5)用debug调试程序,熟悉debug命令的使用:(1)打 debug lab1.exe 进入debug 控制,显示提示符 _ 。(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。(4)用命令g+地址设置断点,如g06,表示将断点设置在代码段的偏移地址为 06h的指令前,并执行到该断点前。其中,命令中的地址项可以从上条命令u的运行结果获得。(5)用命令r查看各寄存器的情况。(6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。(7)用命令 e+地址的方式修改数据区的字符串,其中地址指需要修改的数据段内存单元偏移地址,可根据上条d0命令获得。如e29 表示从偏移地址29h开始修改数据。试用此命令将数据段变量string1的内容修改为Move the cursor forward.(8)再次用命令g执行程序,查看执行结果。(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及解决办法。3思考:1) 上述实验中用e修改数据段的内容,是否改变原文件lab1.asm的内容?2) 用单步执行命令t运行程序, 运行到mov ax, 4c00h, int 21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?附:DEBUG 使用:1打 DEBUG 进入 DEBUG,显示提示符 _ 。2退出DEBUG命令:Q3显示内存命令:D 起始地址 结束地址4修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。5检查寄存器命令:R标志位显示 1 0CF CY NCZF ZR NZSF NG PLAF AC NAOF OV NVPF PE PODF DN UPIF EI DI6修改寄存器命令:R 寄存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令:U 起始地址 结束地址9文件命名命令:N 盘号:文件名10读文件命令:L 内存地址11写文件命令:W 内存地址10读扇区命令:L 内存地址 盘号(0-A:,1-B:) 扇区号 扇区数11写扇区命令:W 内存地址 盘号 扇区号 扇区数12运行命令:G=起始地址 结束(断点)地址13单步命令:T=起始地址 运行指令数,进入子程序内部。14单步命令:P=起始地址 运行指令数,不进入子程序内部。15内存搬家命令:M 起始地址 结束地址 目的地址标志位显示 1 0CF CY NCZF ZR NZSF NG PLAF AC NAOF OV NVPF PE PODF DN UPIF EI DI6修改寄存器命令:R 寄存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令:U 起始地址 结束地址9文件命名命令:N 盘号:文件名10读文件命令:L 内存地址11写文件命令:W 内存地址10读扇区命令:L 内存地址 盘号(0-A:,1-B:) 扇区号 扇区数11写扇区命令:W 内存地址 盘号 扇区号 扇区数12运行命令:G=起始地址 结束(断点)地址13单步命令:T=起始地址 运行指令数,进入子程序内部。14单步命令:P=起始地址 运行指令数,不进入子程序内部。15内存搬家命令:M 起始地址 结束地址 目的地址实验二 顺序程序设计一、预习内容1常用工具软件MASM、LINK和DEBUG的使用2完整程序设计方法的格式3汇编语言顺序结构程序的设计方法二、目的要求1继续熟悉常用工具软件MASM、LINK和DEBUG的使用2继续熟悉完整程序设计方法的格式3学习与掌握汇编语言顺序结构程序的设计方法三、实验内容编程实现datax双字除以字datay(用div) ,并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定) 。并且用debug 查看程序的运行结果,检查程序运行结果的正确性。DSEG SEGMENTdatax dd 956123hdatay dw 123hquotient dw ?remainder dw ?DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGstart: mov ax, dsegmov ds, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21hCSEG ENDSend start实验步骤:1用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在c:masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。2用masm对源文件进行汇编,产生.obj(如lab2.obj)文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3用 link将.obj文件连接成可执行的.exe文件(lab2.exe)。4直接运行link产生的.exe文件。5用debug调试程序,单步执行程序,并记录黑体部分单步执行后ax,dx,cs,ip寄存器以及标志寄存器的值.6在debug状态下,用“a+偏移地址”的方式将程序的div 改为idiv再单步执行黑体部分,对比步骤5的结果,查看有何变化,并记录。7修改源程序实现双字datax 与字datay的无符号乘法。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3步骤5的结果记录。4步骤6的结果记录,并分析发生变化的原因。5思考:1) 指令 mov dx,datax2 改写成 mov dx,datax+2 经过汇编后,二者是否相同,为什么?2) 如何实现双字 datax 与字 datay 的乘法,写出完整的源程序。实验三 循环程序设计一、预习内容1多重循环程序和排序程序设计方法。2带符号数的比较转移指令:JL,JLE,JG,JGE二、目的要求1掌握多重循环程序和排序程序设计方法。2掌握带符号数的比较转移指令:JL,JLE,JG,JGE三、实验内容建立学生名次表,以grade为首地址的数组中保存了学生的成绩,其中 grade+i 保存学号为i+1 的学生的成绩。要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank 数组中,其中rank+i的内容是学号为i+1学生的名次(提示:一个学生的名次等于成绩高于该学生的人数加1)DSEG SEGMENTgrade dw 88,75,95,63,98,78,87,78,90,60rank dw 10 dup(?)DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGstart: mov ax, dsegmov ds, axmov di,10mov bx,0loop:mov dx,1mov cx,10next:cmp ax,sijge no_countinc dxno_count:add si,2loop nextadd bx,2jne loopmov ax, 4c00h int 21hCSEG ENDSend start实验步骤:1输入,汇编并连接此程序。2在DEBUG下运行此程序,记录运行结果。3将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及解决办法。3记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE 时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。4思考:如果想外循环也用 loop 实现,应该怎样修改程序?实验四 分支程序设计一、预习内容1分支程序设计方法。2利用转移指令jl、jmp实现多岔分支的方法。二、目的要求1掌握分支程序设计方法。2掌握利用转移指令jl、jmp实现多岔分支的方法。三、实验内容统计学生成绩result。设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、6069分、7079分、8089分、9099分及100分的人数,并分别存放到s5、s6、s7、s8、s9及s10单元中DSEG SEGMENTgrade dw 56,69,84,82,73,88,99,63,100,80s5 dw 0s6 dw 0s7 dw 0s8 dw 0s9 dw 0s10 dw 0DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGstart: mov ax, dsegmov ds, axmov cx,10mov bx,offset gradecompare:mov ax, bxcmp ax,60jl fivecmp ax,70jl sixcmp ax,80jl sevencmp ax,90jl eightcmp ax,100jne ninenine:inc s9jmp short change_addreight:inc s8jmp short change_addrseven:inc s7jmp short change_addrsix:inc s6jmp short change_addrfive:inc s5change_addr:mov ax, 4c00h int 21hCSEG ENDSend start实验步骤:1阅读程序,将程序补充完整。2输入,汇编并连接此程序。3在DEBUG下运行此程序,记录运行结果。4单步运行程序,记录前五次执行转移指令后寄存器cs ip的值。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3每次执行转移指令时寄存器cs ip的值。4、最终运行结果,即s5、s6、s7、s8、s9及s10 的值。5、思考:如何修改程序使源程序先统计 s10,然后依次统计 s9,s8,s7,s6,s5?实验五 子程序设计一、预习内容1子程序调用方法和参数传递方式。2过程调用伪指令: PROC,ENDP和NEAR。3子程序调用中堆栈的用法。4简化格式程序设计方法。二、目的要求1掌握子程序调用方法和参数传递方式。2掌握过程调用伪指令: PROC,ENDP和NEAR。3理解子程序调用中堆栈的用法。4熟悉简化格式程序设计方法。三、实验内容显示学生名次表rank。要求接收从键盘输入的一个班的学生成绩,并存放于 10字的grade数组中,其中grade+i保存学号为 i+1的学生的成绩。然后根据grade中的学生成绩,把学生名次填入10字的rank数组中,其中rank+i的内容是学号为i+1学生的名次。再按学号把名次从终端显示出来。源程序如下,模块层次如图所示,源程序已经完成了mian, input, rankp, output, bindec和dec_div模块的编写,模块decbin和crlf需要自己完成。.model small.stack.data grade dw 10 dup(?)rank dw 10 dup(?)count dw ?mess1 db Grade?,$mess2 db 13,10,Iput Error!,13,10,$mess3 db Rank:,$.codemain proc farstart : mov ax, datamov ds, axcall input call rankpcall outputmov ax, 4c00h int 21hmain endpinput proc nearmov dx,offset mess1mov ah,09int 21hmov si,0mov count,0enter:call decibininc countcmp dl,je storecmp dl,13 ;is it return?je exit2jne errorstore:mov gradesi,bxadd si,2jmp enter error:lea dx,mess2mov ah,09int 21hexit2:mov gradesi,bxcall crlfretinput endprankp proc nearmov di,countmov bx,0loop1:mov ax,gradebxmov word ptr rankbx,0mov cx,countlea si,gradenext:cmp ax,sijg no_countinc word ptr rankbxno_count:add si,2loop nextadd bx,2dec dijne loop1retrankp endpoutput proc nearlea dx,mess3mov ah,09int 21hmov si,0mov di,countnext1:mov bx,ranksicall binidecmov dl,mov ah,02int 21hadd si,2dec dijnz next1call crlfret output endpdecibin proc neardecibin endpbinidec proc nearpush bx ;push cx ;push si ;push di ;mov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1call dec_divpop di ;pop si ;pop cx ;pop bx ;retbinidec endp dec_div proc nearmov ax,bxmov dx,0div cxmov bx,dxmov dl,aladd dl,30hmov ah,02hint 21hretdec_div endpcrlf proc nearcrlf endpend main11三、实验步骤1认真阅读程序,自己编写十进制到二进制转换子程序decibin和输出回车换行子程序crlf,将程序补充完整,然后汇编、链接、生成可执行文件。2用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用和进出栈指令前后(带;的语句)的SP和堆栈内容,如记录执行call input,call rankp,call output三条指令后sp,bp以及sp的值。3记录数据段各变量的最后结果。四、实验报告或作业1画出input,output和rankp模块的流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3记录执行call input ,call rankp,call output三条指令后sp,bp以及sp的值,并指出sp指向哪条指令。4画出堆栈满时堆栈存储区域的示意图。5记录最后的输出结果。6思考: 如果想用堆栈传递参数,源程序应做何修改?实验六 I/O 程序设计一、预习内容1程序直接控制 I/O 方式。2I/O程序设计方法。3子程序设计方法二、目的要求1掌握程序直接控制 I/O 方式。2熟悉I/O程序设计方法。3继续熟悉子程序设计方法。三、实验内容用位触发方式(也即程序直接控制输出控制寄存器(I/O端口为61h)的第一位,使该位按所需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)模拟枪响程序。程序如下,但其中有些语句错误,需要修改后才能正确运行。code segmentmain proc farassume cs:codestart: mov cx,50d new_short:push cxcall shootmov cx,0f000hsilent:loop silentpop cxloop new_shortmov al,48hout 61h,almov ax,4c00hint 21hmain endpshoot proc nearmov dx,140h12mov bx,20hin al,61hand al,11111100bsound:xor al,2out 61h,aladd dx,9248hmov cl,3ror dx,clmov cx,dxand cx,1ffhor cx,1000hdelay: push cxwait:loop waitpop cxloop delaydec bxjnz soundand al,11111100bout 61h,alretshoot endpcode endsend start实验步骤1认真阅读程序,将源程序中的错误找出后修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论