汇编语言实验讲义(共13页).doc

上传人:飞****2 文档编号:14180203 上传时间:2022-05-03 格式:DOC 页数:13 大小:219.50KB
返回 下载 相关 举报
汇编语言实验讲义(共13页).doc_第1页
第1页 / 共13页
汇编语言实验讲义(共13页).doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《汇编语言实验讲义(共13页).doc》由会员分享,可在线阅读,更多相关《汇编语言实验讲义(共13页).doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上汇编语言实验讲义汇编语言实验学时分配表序号实验项目名称实验学时实验报告或作业课内课外1汇编语言程序上机过程以及调试2212顺序程序设计2213循环程序设计2214分支程序设计2215子程序设计2216I/O程序设计2217实验七 综合程序设计221合计14147实验一 汇编语言程序上机过程以及调试一、预习内容1.工具软件MASM、LINK的使用2.常用DEBUG命令的使用: G,D,R,T,U,Q3.完整程序设计方法的格式。二、目的要求1.掌握常用工具软件MASM、LINK的使用2.掌握常用DEBUG命令: G,D,R,T,U,Q 能灵活使用这些命令调试程序3.掌握完

2、整程序设计方法的格式,能正确书写数据段,代码段等。三、实验内容比较两个字符串string1和string2所含的字符是否相同,如果相同则显示Match否则显示No match.请读程序,并将程序补充完整。DSEG SEGMENT string1 db Move the cursor backward. string2 db Move the cursor backward. mess1 db Match.,13,10,$ mess2 db No match.,13,10,$DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG, es:DSEG, MAIN

3、PROC FAR start:mov ax, dsegmov ds, axmov es, ax lea si ,string1 cld repz cmpsb jz match lea dx,mess2 jmp short disp match: lea dx,mess1 disp: mov ah,09h int 21h mov ax, 4c00h int 21h MAIN ENDP CSEG ENDSend start实验步骤:1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在c:masm50下,注意保存时将文件扩展名改为.asm(如lab1.asm)。2)打开桌面的“命令提示符”

4、 程序进入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 控制,

5、显示提示符 _ 。(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。(4)用命令g+地址设置断点,如g06,表示将断点设置在代码段的偏移地址为06h的指令前,并执行到该断点前。其中,命令中的地址项可以从上条命令u的运行结果获得。(5)用命令r查看各寄存器的情况。(6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。

6、(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运行程序, 运

7、行到mov ax, 4c00h, int 21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?附:DEBUG 使用:1打 DEBUG 进入 DEBUG,显示提示符 _ 。2退出DEBUG命令:Q3显示内存命令:D 起始地址 结束地址4修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。5检查寄存器命令:R标志位显示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI6修改寄存器命令:R 寄存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令:U 起始地址 结束地址9文件命名命令:N 盘号:文

8、件名10读文件命令:L 内存地址11写文件命令:W 内存地址10读扇区命令:L 内存地址 盘号(0-A:,1-B:) 扇区号 扇区数11写扇区命令:W 内存地址 盘号 扇区号 扇区数12运行命令:G=起始地址 结束(断点)地址13单步命令:T=起始地址 运行指令数,进入子程序内部。14单步命令:P=起始地址 运行指令数,不进入子程序内部。15内存搬家命令:M 起始地址 结束地址 目的地址标志位显示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI6修改寄存器命令:R 寄存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令

9、: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继续熟

10、悉常用工具软件MASM、LINK和DEBUG的使用2继续熟悉完整程序设计方法的格式3学习与掌握汇编语言顺序结构程序的设计方法三、实验内容编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。并且用debug查看程序的运行结果,检查程序运行结果的正确性。DSEG SEGMENT datax dd h datay dw 123hquotient dw ?remainder dw ?DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg

11、 mov ds, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21h CSEG ENDSend start实验步骤:1用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在c:masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。2用masm对源文件进行汇编,产生.obj(如lab2.obj)文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3用 link将.obj文件连接成可执行的.exe文件(lab2.exe

12、)。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 经过汇编后,

13、二者是否相同,为什么?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学生的名次(提示:一个学生的

14、名次等于成绩高于该学生的人数加1)DSEG SEGMENT grade dw 88,75,95,63,98,78,87,78,90,60 rank dw 10 dup(?)DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov di,10mov bx,0loop: mov dx,1mov cx,10 next:cmp ax,sijge no_countinc dxno_count:add si,2loop next add bx,2 jne loopmov ax, 4c00h int 21h

15、CSEG ENDSend start实验步骤:1输入,汇编并连接此程序。2在DEBUG下运行此程序,记录运行结果。3将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及解决办法。3记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE 时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。4思考:如果想外循环也用loop实现,应该怎样修改程序?实验四 分支程序设计一、预习内容1分支程序设计方法。2利用转移指令jl、jmp实现多岔分支的方法

16、。二、目的要求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 SEGMENT grade dw 56,69,84,82,73,88,99,63,100,80s5 dw 0s6 dw 0s7 dw 0s8 dw 0s9 dw 0s10 dw 0DSEG ENDSCSEG SEGMENT a

17、ssume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov cx,10mov bx,offset gradecompare:mov ax, bxcmp ax,60jl fivecmp ax,70jl sixcmp ax,80jl sevencmp ax,90jl eightcmp ax,100jne nine nine:inc s9jmp short change_addreight:inc s8jmp short change_addrseven:inc s7jmp short change_addrsix:inc s6jmp short

18、change_addrfive:inc s5change_addr: mov ax, 4c00h int 21h CSEG 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,s

19、5?实验五 子程序设计一、预习内容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学生的名次。

20、再按学号把名次从终端显示出来。源程序如下,模块层次如图所示,源程序已经完成了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 far start : mov ax, data mov ds, ax

21、 call input call rankp call output mov ax, 4c00h int 21hmain endpinput proc near mov dx,offset mess1 mov ah,09 int 21h mov si,0 mov count,0 enter: call decibin inc count cmp dl, je store cmp dl,13 ;is it return? je exit2 jne error store: mov gradesi,bx add si,2 jmp enter error: lea dx,mess2 mov ah,0

22、9 int 21h exit2: mov gradesi,bx call crlf ret input endprankp proc near mov di,count mov bx,0 loop1: mov ax,gradebx mov word ptr rankbx,0 mov cx,count lea si,grade next: cmp ax,si jg no_count inc word ptr rankbx no_count: add si,2 loop next add bx,2 dec di jne loop1 ret rankp endpoutput proc near le

23、a dx,mess3 mov ah,09 int 21h mov si,0 mov di,countnext1: mov bx,ranksi call binidec mov dl, mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret output endpdecibin proc near decibin endpbinidec proc near push bx ; push cx ; push si ; push di ; mov cx,100d call dec_div mov cx,10d call dec_div mo

24、v cx,1 call dec_div pop di ; pop si ; pop cx ; pop bx ; retbinidec endp dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h int 21h retdec_div endpcrlf proc near crlf endpend main三、实验步骤1认真阅读程序,自己编写十进制到二进制转换子程序decibin和输出回车换行子程序crlf,将程序补充完整,然后汇编、链接、生成可执行文件。2用DEBUG的断点命

25、令和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思考: 如果想用堆栈传递参数,源程序应做何修改?

26、实验六 I/O程序设计一、预习内容1程序直接控制I/O方式。2I/O程序设计方法。3子程序设计方法二、目的要求1掌握程序直接控制I/O方式。2熟悉I/O程序设计方法。3继续熟悉子程序设计方法。三、实验内容用位触发方式(也即程序直接控制输出控制寄存器(I/O端口为61hhh )的第一位,使该位按所需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)模拟枪响程序。程序如下,但其中有些语句错误,需要修改后才能正确运行。code segmentmain proc farassume cs:codestart: mov cx,50d new_short:

27、push cx call shoot mov cx,0f000h silent: loop silent pop cx loop new_short mov al,48h out 61h,al mov ax,4c00h int 21hmain endp shoot proc near mov dx,140h mov bx,20h in al,61h and al,b sound: xor al,2 out 61h,al add dx,9248h mov cl,3 ror dx,cl mov cx,dx and cx,1ffh or cx,1000hdelay: push cxwait: loo

28、p wait pop cx loop delay dec bx jnz sound and al,b out 61h,al retshoot endpcode endsend start实验步骤1认真阅读程序,将源程序中的错误找出后修改。2编译,链接,生成可执行文件,记录编译过程中的错误,并分析原因。3执行程序,调式程序,直到可以清楚听到枪响的声音。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3思考:试将程序中的黑体部分修改为 wait: loop wait,再编译运行程序,是否能听到枪声,为什么? 实验七 综合程序设计一、预习内容1 DOS

29、中断,字符输入输出的方法.2综合程序设计方法二、目的要求1熟悉DOS中断,掌握字符输入输出的方法.2继续熟悉基本程序设计方法,包括循环程序设计,分支程序设计和子程序设计等.3练习综合程序设计方法三、实验内容数据区存放有10个正数,要求自己编写一个完整的程序实现这10个数的排序,具体要求如下:1显示未排序的10个数据;2提示输入排序方法,是按从大到小还是从小到大;3从键盘输入H或者L决定数据是按从大到小还是从小到大的顺序排列,如果从键盘输入H,则按从大到小顺序排列,如果输入L,则按从小到大顺序排列,否则提示输入错误,请重新输入;4显示最后的排序结果。三、实验内容1认真阅读实验要求,编写源程序;2

30、编译,链接,生成可执行文件,记录编译过程中的错误,并分析原因;3编译通过后,调式程序,直至得到正确的结果。四、实验报告或作业1写出源程序,画出程序流程图;2汇编,连接及调试时产生的错误,其原因及解决办法;3写出你认为在编写汇编程序中应该注意的地方和你的编程经验;4写出你对汇编实验的意见或者建议。 参考书目1. IBM-PC 宏汇编语言程序设计(第二版),韩宗芬 编著,华中理工大学出版社,1996年版。2. IBM PC Assembly Language and Programming (Fourth edition),Peter Abel,Prentice-Hall International, Inc(清华大学影印版)。3. Pentium/80486实用汇编语言程序设计,艾德才等编著,清华大学出版社,1997年版。4. Windows环境下汇编语言程序设计,蓝琚成、肖金秀编著,地质出版社,2001年版。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com