1、汇编语言实验讲义汇编语言程序设计实验指导书计算机系 宋勤 2013-5汇编语言实验学时分配表序号实验项目名称实验学时实验报告或作业课内课外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 能
2、灵活使用这些命令调试程序3.掌握完整程序设计方法的格式,能正确书写数据段,代码段等。三、实验内容用两种方法把字符串mess1复制到mess2串中去;(1) 从左到右的方向复制(2) 从右到左的方向复制data segment mess1 db my name is songqin $data endsEXTRA segment mess2 db 17 dup(?)EXTRA ends;*code segment assume cs:code, DS:DATA, ES:EXTRA start: mov ax,DATA MOV ds,ax mov ax,EXTRA MOV es,ax leA si
3、,mess1 leA di,mess2 mov cx,017 CLD rep movsB ret code ends end start 实验步骤:1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:masm50下,注意保存时将文件扩展名改为.asm(如P77.asm)。2)打开桌面的“命令提示符” 程序进入dos命令操作,先用cd masm50 命令改变路经,接着用 ”masm + 文件名” (如 masm P77,这里文件名可以不带扩展名) 对源文件进行汇编,产生.obj文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3)用 ”link +
4、 文件名” (如 link P77;) 将.obj文件连接成可执行的.exe文件(P77.exe)。4)用debug调试程序,熟悉debug命令的使用:(1)打 debug P77.exe 进入debug 控制,显示提示符 - 。(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。(4)用命令g+地址设置断点,如g06,表示将断点设置在代码段的偏
5、移地址为06h的指令前,并执行到该断点前。其中,命令中的地址项可以从上条命令u的运行结果获得。(5)用命令r查看各寄存器的情况。(6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。(7)用命令 e+地址的方式修改数据区的字符串,其中地址指需要修改的数据段内存单元偏移地址,可根据上条d0命令获得。如e 09 表示从偏移地址09h开始修改数据。(8)再次用命令g执行程序,查看执行结果。(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及解决办法。3
6、思考:1) 上述实验中用e修改数据段的内容,是否改变原文件P77.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 DI
7、6修改寄存器命令: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 N
8、G 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
9、 起始地址 结束地址 目的地址实验二 顺序程序设计一、预习内容1常用工具软件MASM、LINK和DEBUG的使用2完整程序设计方法的格式3汇编语言顺序结构程序的设计方法二、目的要求1继续熟悉常用工具软件MASM、LINK和DEBUG的使用2继续熟悉完整程序设计方法的格式3学习与掌握汇编语言顺序结构程序的设计方法三、实验内容编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。并且用debug查看程序的运行结果,检查程序运行结果的正确性。DSEG SEGMENT datax dd 956123h data
10、y dw 123hquotient dw ?remainder dw ?DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start: mov ax, dseg mov ds, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21h CSEG ENDSend start实验步骤:1用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。2用masm对源文
11、件进行汇编,产生.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汇编
12、,连接及调试时产生的错误,其原因及解决办法。3步骤5的结果记录。4步骤6的结果记录,并分析发生变化的原因。5思考:1) 指令mov dx,datax2 改写成 mov dx,datax+2 经过汇编后,二者是否相同,为什么?2) 如何实现双字datax 与字datay的乘法,写出完整的源程序。实验三 循环程序设计A-A实验A (必做)一、 实验目的:1 掌握循环程序的设计方法2 进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。3 学会针对不同的问题,选用不同的组织循环的方法。二、 实验内容1 编写一个程序,用二进制显示从键盘输入一个字符的ASCII码。2 编写一个程序,记
13、录某个字存储单元数据中1的个数,以十进制形式显示结果。 三、 实验准备1 编写实验内容要求的两个程序。2 写出调试以上程序,即修改程序参数,检查结果的操作方法。3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。四、 实验步骤1 用EDIT或其它编辑软件,编写.ASM源程序,例如Binary.ASM及Statistic.ASM。2 对其进行汇编及连接,产生.EXE文件。3 对.EXE文件进行调试运行。a. 用DEBUG调试运行,学会修改AL内容的方法。b. 对DSPKEY.EXE键入不同的字符,分别进行调试。c. 在MS-DOS下运行这两个.EXE文件。五、 实验报告要求 画出两个程序的流程
14、图,若要独立编写程序,应列出相应的程序清单。六、 参考程序段清单:;Binary.asmmov cx,8 ;CX8(循环次数)again: shl bl,1 ;左移进CF,从高位开始显示mov dl,0 ;MOV指令不改变CFadc dl,30h ;DL030HCF;CF若是0,则DL 0 ;CF若是1,则DL 1 mov ah,2int 21h ;显示loop again;CX减1,如果CX未减至0,则循环;Statistic.ASM ;数据段number dw 1110111111100100B ;代码段 mov bx,number xor dl,dl ;循环初值:DL0again: te
15、st bx,0ffffh ;也可以用cmp bx,0 jz done ;全部是0就可以退出循环,减少循环次数 shl bx,1 ;用指令shr bx,1也可以 adc dl,0 ;利用ADC指令加CF的特点进行计数 jmp againdone: cmp dl,10 ;判断1的个数是否小于10 jb digit ;1的个数小于10,转移 push dx mov dl,1 ;1的个数大于或等于10 mov ah,2 ;则要先显示一个1 int 21h pop dx sub dl,10digit: add dl,0 ;显示个数 mov ah,2 int 21hA-ABB实验 B一、预习内容1多重循环
16、程序和排序程序设计方法。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 SEGMENT grade dw 88,75,95,63,98,78,87,78,90,6
17、0 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 CSEG ENDSend start实验步骤:1输入,汇编并连接此程序。2在DEBUG下运行此程序,记录运行结果。3将转移指令JGE
18、改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及解决办法。3记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE 时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。4思考:如果想外循环也用loop实现,应该怎样修改程序?BB实验四 分支程序设计A-A实验A (必做)一、 实验目的:1 掌握分支程序的设计方法2 掌握利用DEBUG修改参数、检查结果的方法。3 掌握汇编语言源程序的编辑、汇编、连接及调试过程。二、 实验内容1 编写一个程序,显示AL
19、寄存器中的两位十六进制数2 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。三、 实验准备1 编写实验内容要求的两个程序。2 写出调试以上程序,即修改程序参数,检查结果的操作方法。3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。四、 实验步骤1 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。2 对其进行汇编及连接,产生.EXE文件。3 对.EXE文件进行调试运行。a. 用DEBUG调试运行,学会
20、修改AL内容的方法。b. 对DSPKEY.EXE键入不同的字符,分别进行调试。c. 在MS-DOS下运行这两个.EXE文件。五、 实验报告要求 画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。六、 参考程序清单 (1) 显示AL中两位十六进制数程序:;DISPHEX.ASMCODE SEGMENT ASSUME CS:CODESTART: MOV AL,3EH MOV BL,AL MOV DL,AL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1: ADD DL,30H MOV AH,2 INT 21H ;显示高位ASCII
21、码 MOV DL,BL AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2: ADD DL,30H MOV AH,2V AH,2 INT 21H ;显示低位ASCII码 MOV AH,4CH INT 21HCODE ENDS ;返回DOS END START(2) 显示键入字符程序;DISPKEY.ASMCODE SEGEMENT ASSUME CS:CODESTART: MOV AH,1 INT 21H ;等待键入字符,送AL CMP AL,0DH ;是否是回车符? JZ DONE ;是则转DONE退出程序 CMP AL,0 JB NEXT CMP AL,
22、9 JA CHARUP MOV DL,AL MOV AH,2 INT 21H JMP STARTCHARUP: CMP AL,41H JB NEXT CMP AL,5AH JA CHRDNDISPC: MOV DL,C MOV AH,2 INT 21HNEXT: JMP STARTCHRDN: CMP AL,61H JB NEXT CMP AL,7AH JA NEXT JMP DISPCDONE: MOV AH,4CH INT 21HCODE: ENDS END STARTA-ABB实验B (选做)一、预习内容1分支程序设计方法。2利用转移指令jl、jmp实现多岔分支的方法。二、目的要求1掌握
23、分支程序设计方法。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 assume cs:C
24、SEG, 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 change_ad
25、drfive: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,s5?BB实验五 子
26、程序设计A-A实验A(必做)本实验的目的在于让读者掌握同一模块调用的方法。一、 实验目的1 掌握主程序与子程序之间的调用关系及调用方法。2 掌握子程序调用过程中近程调用与远程调用的区别。3 掌握通过堆栈转送参数的方法。二、 实验内容1 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.2 编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符b”的个数.参数
27、传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).三、 实验说明1 第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。2 第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3 第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1