南华大学实验名称:汇编语言程序设计实验学院:计算机学院专业班级:本2010 电气信息类03班学号:20104030342姓名:谢志兴指导教师:刘芳菊日期:2012 年 6 月10 日实验一DEBUG的熟悉一、实验目的(1)学习使用DEBUG的命令;(2)使用DEBUG命令在数据段中查看程序运行的结果;(3)利用DEBUG运行简单的程序段。
二、实验内容1)输入程序观察寄存器变化使用DEBUG命令,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。
注意用T命令执行时,CS: IP寄存器的内容。
MOV AX, 4E20ADD AX, 1416MOV BX, 2000ADD AX, BXMOV BX, AXADD AX, BXMOV AX, 001AMOV BX, 0026ADD AL, BLADD AH, BLADD BH, ALMOV AH, 0ADD AL, BLADD AL, 9C2)输入下面的程序,这是一个两个数相与的程序。
结果存放在MSG2单元中,偏移地址为?值为多少?DSEG SEGMENTMSG1 DW 7856H, 2038HMSG2 DW?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV AX, MSG1AND AX, MSG1+2MOV MSG2, AXMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START程序的跟踪执行操作在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。
那么如何查看程序的运行结果呢?程序执行过程的跟踪操作步骤如下:(1)在DOS下输入:DEBUG 文件名.EXE(2)在DEBUG提示符下输入U命令如果程序中有数据段,可以看到反汇编后第一句可执行语句为:A地址:B地址MOV AX, K地址如:1261:0000 MOVAX, 1260其中:K地址就是数据段的段寄存器内容,A地址为代码段段寄存器地址,B地址为程序第一条指令的偏移地址。
(3)可以用T命令单步执行指令,执行到MOV AH, 4CH时结束,也可以用G命令执行整个程序,输入:G=B地址(如:G=0000)(4)用D命令查看程序执行后数据段的变化输入:D K地址:0 (如:D1260:0)在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。
三、实验步骤及运行结果(1)事先先将数据段输入在一个“1-1.txt”的文本文档中,并保存在D盘中。
打开命令提示符,输入:执行后,输入第一小题的代码,结果如下:单步执行t,查看实验结果:从实验结果中可以看出,CS和IP寄存器的内容。
CS的内容一直不变,而IP的内容一直前一步多2。
(2)将第2小题的代码输入到1-2.asmt文档中,将文档置于D盘中。
之后运行该文档。
实验过程如下:创建exe文件,执行结果如下:执行后,生成1-2.exe文件。
再用debug 1-2.exe查看每步执行后,寄存器中的内容:用T命令单步执行指令,执行到MOV AH, 4CH时结束,结果如下:用D命令查看程序执行后数据段的变化:MSG2的偏移地址为0002,值为2038。
四、总结通过这次实验,我懂得了如何使用Debug的命令,并在数据段中查看程序的运行结果,学会了用Debug命令运行简单的程序段,对Debug命令也有了进一步的了解,收获很大。
实验二顺序结构程序一、实验目的(1)熟练使用DEBUG命令。
(2)学习使用简单的汇编指令编写程序。
(3)了解循环语句的执行过程。
二、实验内容1)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。
如果是将小写字母改成大写字母带注释的语句该如何修改?DSEG SEGMENTMSG1 DB'abc'DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXLEA BX, MSG1MOV CX, 3S: MOV AL, [BX]AND AL, 11011111B ;将AL中的ASCII码的第5位置0,;变成大写字母。
MOV[BX], ALINC BXLOOP SMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START2)编写调试下面的程序,用DEBUG查看数据段中的结果:Z=((W-X)*10+5)/(X+Y),X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。
3)编写程序。
X,Y为字节类型数,求Z=((W-X)*8-(X+Y)*2)/16,写出完整的数据段和代码段,不用乘除指令。
三、实验步骤及运行结果(1)将第1小题的代码输入到2-1.asm文档中,将文档置于D盘中。
之后运行该文档,用Debug命令,单步运行。
实验过程如下:进行编译:执行debug命令:实验开始的状态如下:执行进行单步运行,结果如下:运行结束,结果如下:(2)将第2小题的代码输入到2-2.asm文档中,将文档置于D盘中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:执行进行单步运行,结果如下:运行结束,结果如下:(3)将第3小题的代码输入到2-3.asm文档中,将文档置于D盘中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:执行进行单步运行,结果如下:运行结束,结果如下:四、总结通过上次的实验,已经能够熟练使用DEBUG命令。
同时也学会使用简单的汇编指令编写程序,也了解了循环语句的执行过程。
对课本知识进一步理解,收获很大。
五、附录第二题代码:DSeg Segmentx db38hy db20hw db30hz dw?ten db10DSeg endsCSeg Segment para public 'CODE'Assume cs:CSeg,ds:DSeg Start: mov ax,DSegmov ds,axmov bl,xadd bl,ymov al,wsub al,ximul tenadd ax,5idiv blmov z,axmov al,0mov ah,4chint 21hCSeg endsend Start第三题代码:DSeg Segmentx db38hy db20hz db?DSeg endsCSeg SegmentAssume cs:CSeg,ds:DSeg Start: mov ax,DSegmov ds,axmov al,xadd al,ycbwmov cl,3sal ax,cl ;(x+y)*8Mov bx,axmov al,xsub al,ycbwSal ax,1 ;(x-y)*2sub bx, axmov cl,4sar ax,cl ;((x+y)*8-(x-y)*2)/16mov z,almov al,0mov ah,4chint 21hCSeg endsend Start实验三分支结构程序一、实验目的学习分支语句的编程和调试。
二、实验内容编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
三、实验步骤及运行结果程序编写如下:DSEG SEGMENTMSG DB0, -2, -6, 0, 5, 0, 8, -3, 0, 6RESULT DB?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 10MOV AL, 0LEA SI, MSGL1: MOV BL, [SI]CMP BL, 0JLE NEXTINC ALNEXT: INC SILOOP L1MOV RESULT, ALMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START将上面的代码输入到3.asm文档中,将文档置于D盘中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:执行进行单步运行,结果如下:运行结束,结果如下:四、总结通过这次实验,我学习使用分支语句的编程和调试。
通过实践,对知识进行了巩固,加深了理解,收获很大。
实验四循环结构程序一、实验目的学习循环语句的编程和调试。
二、实验内容编程:Y=∑Ai*Bi,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。
三、实验步骤及运行结果程序编写如下:DSeg Segmentnum1 db12,34,56,78,65,02,39,8num2 db98,65,32,74,78,12,03,56result dw?DSeg endsCSeg Segment para public 'CODE'Assume cs:CSeg,ds:DSegStart: mov ax,DSegmov ds,axmov cx,8mov bx,0mov si,offset num1mov di,offset num2again: mov al,[si]mul byte ptr[di]add bx,axinc diinc siloop againmov result,bxmov al,0mov ah,4chint 21hCSeg endsend Start将上面的代码输入到4.asm文档中,将文档置于D盘中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:执行进行单步运行,结果如下:运行结束,结果如下:四、总结通过这次实验,我学习使用循环语句的编程和调试。
通过实践,对知识进行了巩固,加深了理解,收获很大。
实验五子程序设计一、实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。
二、实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
DATA SEGMENTMAG DB'ABC'DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV SI, 0MOV CX, 3LL: MOV DL, MAG[SI]CALL MADDINC SILOOP LLMOV AH, 4CHINT 21HMADD PROCMOV AH, 02HINT 21HRETMADD ENDPCODE ENDSEND START2)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。