汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(38页珍藏版)》请在冰豆网上搜索。
汇编语言实验报告
实验一汇编程序的汇编及运行
1.实验目的和要求
1、熟悉汇编程序的汇编、连接、执行进程
2、生成LST文件,查看LST文件
3、生成OBJ文件,修改语法错误
4、生成EXE文件
5、执行
2.实验环境
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
一、将数据段输入,取名1.txt,保留在MASM文件夹下。
生成LST文件,(没必要连接、运行)用EDIT查看1.LST文件。
试回答:
DA1,DA2的偏移量别离是多少?
COUNT的值为多少?
DATASEGMENT
ORG20H
NUM1=8
NUM2=NUM1+10H
DA1DB‘IBMPC’
DA2DB0AH,0DH
COUNTEQU$-DA1
DATAENDS
END
2、输入有错误的文件,修改错误语句。
(MASM没有显现错误即可。
没必要连接、运行。
)
DATASEGMENT
VAR1DB0,25,ODH,300
VAR2DB12H,A4H,6BH
VAR3DB’ABCDEF’
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DE:
DATA
BEINGMOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOV[SI],0ABH
MOVAX,VAR1+2
MOV[BX],[SI]
MOVVAR5+4,VAR4
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3、输入正确的程序,汇编、连接、运行
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STRINGDB‘WELCOME!
’,13,10,‘$’
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
4.算法描述及实验步骤
(1)编写源程序。
(2)对源程序进行汇编、连接。
(3)执行程序。
2的正确代码:
DATASEGMENT
VAR1DW0,25,0DH,300
VAR2DB12H,0A4H,6BH
VAR3DB'ABCDEF'
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEGIN:
MOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOVWORDPTR[SI],0ABH
MOVAX,VAR1+2
MOVBX,[SI]
MOVCX,VAR4
MOVVAR5+4,CX
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
5.调试进程
(1)300超过一个字节,将DB改成DW。
(2)A4H改成0A4H。
(3)DE改成DS。
(4)BEGIN后要加冒号。
(5)MOV[SI],0ABH改成MOVWORDPTR[SI],0ABH。
(6)MOV[BX],[SI]改成MOVBX,[SI]。
(7)MOVVAR5+4,VAR4改成MOVCX,VAR4
MOVVAR5+4,CX
(8)ENDSTART改成ENDBEGIN
6.实验结果
(1)
DA一、DA2的偏移量别离是0020H,0026H。
COUNT的值为0008H。
(2)
(3)
7.总结
这次上机实验把握了实际调试程序的能力,熟悉了汇编程序的汇编、连接、执行进程,在生成的文件中修改语法错误。
这次实验不仅验证了讲义的理论,更重要的是使我有了对实践能力的培育。
实验二顺序程序设计
1.实验目的和要求
1.学习利用DEBUG的命令;
2.利用DEBUG命令在数据段中查看程序运行的结果;
3.利用DEBUG运行简单的程序段。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1)输入程序观看寄放器转变
利用DEBUG,将下面的程序段写入内存,逐条执行,观看每条指令执行后,CPU中相关寄放器的内容转变。
注意用T命令执行时,CS:
IP寄放器的内容。
MOVAX,4E20
ADDAX,1416
MOVBX,2000
ADDAX,BX
MOVBX,AX
ADDAX,BX
MOVAX,001A
MOVBX,0026
ADDAL,BL
ADDAH,BL
ADDBH,AL
MOVAH,0
ADDAL,BL
ADDAL,9C
2)以下程序单步运行,注意AL,BX,CX寄放器的转变,并观看数据段字母的转变。
DSEGSEGMENT
MSG1DB’abc’
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
LEABX,MSG1
MOVCX,3
S:
MOVAL,[BX]
ANDAL,11011111B;将AL中的ASCII码的第5位置0,
;变成大写字母。
MOV[BX],AL
INCBX
LOOPS
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
3)程序的跟踪执行操作
在DOS下直接输入文件主名就能够够执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。
那么如何查看程序的运行结果呢?
程序执行进程的跟踪操作步骤如下:
(2)在DEBUG提示符下输入U命令
(3)能够用T命令单步执行指令,执行到MOVAH,4CH时终止,也能够用G命令执行整个程序,输入:
G=B地址(如:
G=0000)
(4)用D命令查看程序执行后数据段的转变
输入:
DK地址:
0(如:
D1260:
0)
在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。
4)编写调试下面的程序,用DEBUG查看数据段中的结果
(1)
,X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。
(无符号数)
(2)X,Y为字节类型数,求
,写出完整的数据段和代码段,不用乘除指令。
(无符号数)
4.算法描述及实验步骤
1)在DEBUG的环境下,用A命令逐条把程序段写入内存,用T命令逐条执行,然后再观看CPU中相关寄放器的内容转变。
2)先用记事本编写源程序,把它寄存到MASM目录下,再把它生成.exe文件,用DEBUG的反汇编U命令,G命令,T命令,单步运行程序,观看AL,BX,CX寄放器的转变,并观看数据段字母的转变。
假设要将大写字母改成小写字母只要将ANDAL,11011111B语句改成ORAL,00100000B(将AL中的ASCII码的第5位置1,变成小写字母)即可。
3)
(1)分析问题:
设X、Y、W的值寄存在字节变量X、Y、W中。
结果寄存在字节变量Z当中。
第一:
初始化;第二:
两数相减,AL-X
第三:
无符号数乘法mul(单操作数)被乘数在BL中,将W-X送入BL中,mul10,将结果送BL。
第四:
无符号数相加送AX,(W-X)*10+5->AX
第五:
无符号数相加,结果存于BH,X+Y->(BH)
第六:
无符号数除法(单操作数),商->Z,余数->Z+1
(2)分析问题:
设X、Y的值寄存在字节变量X、Y中。
结果寄存在字节变量Z当中。
第一:
初始化;第二:
无符号数相加,结果存于AL,即X+Y—>AL。
第二:
两数相乘用SAL指令,左移3位等于乘8,结果存于AL,即(X+Y)*8—>AL。
第三:
无符号数相减,结果存于BL,即X-Y—>BL。
第四:
两数相乘用SAL指令,左移一名即乘2,结果存于BL,即(X-Y)*2—>BL。
第五:
无符号数相减,结果存于AL,即(X+Y)*8-(X-Y)*2—>AL。
第六:
两数相除用SAR指令,右移4位等于除6,结果存于Z,即
((X+Y)*8-(X-Y)*2)/16—>Z。
流程图:
①:
②:
4)
(1)代码如下:
(2)代码如下:
DATASEGMENTDATASEGMENT
XDB2XDB48
YDB10YDB30
WDB20ZDB?
ZDB?
DATAENDS
DATAENDSCODESEGMENT
CODESEGMENTASSUMECS:
CODE,DS:
DATA
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
START:
MOVAX,DATAMOVDS,AX
MOVDS,AXMOVAL,X
XORAX,AX;将AX置0ADDAL,Y
MOVAL,WMOVCL,3
SUBAL,X;W-XSALAL,CL;(X+Y)*8
MOVBL,10MOVBL,X
MULBL;(W-X)*10SUBBL,Y
ADDAX,5;(W-X)*10+5SALBL,1;(X-Y)*2
MOVBH,XSUBAL,BL
ADDBH,Y;X+Y->(BH)MOVCL,4
DIVBH;商AL,余AHSARAL,CL;((X+Y)*8-(X-Y)*2)/16
MOVZ,ALMOVZ,AL
MOVZ+1,AHMOVAL,0
MOVAH,4CHMOVAH,4CH
INT21HINT21H
CODEENDSCODEENDS
ENDSTARTENDSTART
5.调试进程
输入程序并运行,编译结果无误。
6.实验结果
1)
……
通过T命令逐条执行后,AX、BX的内容发生了转变,而CX、DX、SP、BP、SI、DI、DS、ES、SS的内容都没改变,CS也没变成0B01H,IP内容随着用DEBUG的T命令逐条执行后发生了改变。
2)
……
因为有LOOPS语句,循环3次,因此:
AL刚开始为5EH,当执行完MOVAL,[BX]和执行完ANDAL,DF语句后,AL别离为61H,62H,63H;41H,42H,43H;执行完MOVAL,00后为00H;BX为0000H,当执行完INCBX后别离为0001H,0002H,0003H;CX开始为002BH,当执行完MOVCX,3后为0003H,执行完LOOP000C后别离为0002H,0001H,0000H。
大写字母改成小写字母的结果:
3)
(1)
T命令逐条执行后数据段中的结果别离为:
0002H=14,0000H=02,0001H=0A,
0003H=0F,0004H=05。
(2)
T命令逐条执行后数据段中的结果别离为:
0000H=30,0001H=1E,0002H=04。
7.总结
通过这次的实验,已经能够熟练利用DEBUG命令。
同时也学会利用简单的汇编指令编写程序,也了解了顺序程序语句的执行进程。
对讲义知识进一步明白得,收成专门大。
实验三分支循环程序设计
1.实验目的和要求
一、学习调试程序,查找逻辑错误;
二、学习分支语句的编程和调试;
3、学习循环语句的编程和调试。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1.有10个数,统计正数的个数,寄存在变量M中中。
通过汇编后,形成EXE文件。
在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发觉结果不正确。
用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄放器中值的转变是不是正确。
(AL寄放器中寄存正数的个数)
DSEGSEGMENT
MSGDB4,-2,-6,0,5,67,8,-3,5,6
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JBENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
2.数据段中是一组无符号数,将最小数寄存在M单元中。
按上题方式查找一处逻辑错误。
DSEGSEGMENT
MSGDB13,15,7,25,24
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,4
MOVAL,MSG
MOVSI,OFFSETMSG+1
L1:
CMPAL,[SI]
JBNEXT
MOVAL,[SI]
NEXT:
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
3.编程:
在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
4.编程:
,Ai,Bi为字节型无符号数,别离存于NUM1和NUM2开始的持续存储单元中,结果存于REST单元中。
4.算法描述及实验步骤
(1)在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,发觉结果不正确,用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误。
(2)在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,发觉结果不正确,用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误。
(3)代码DSEGSEGMENT(4)DSEGSEGMENT
MSGDB9,-1,-6,0,2,0,8,-5,0,6NUM1DB7,11,24,53,81,30,42,62
RESULTDB?
NUM2DB22,10,77,36,64,51,29,33
DSEGENDSRESULTDW?
CSEGSEGMENTDSEGENDS
ASSUMECS:
CSEG,DS:
DSEGCSEGSEGMENTPARAPUBLIC'CODE'
START:
MOVAX,DSEGASSUMECS:
CSEG,DS:
DSEG
MOVDS,AXSTART:
MOVAX,DSEG
MOVCX,10MOVDS,AX
MOVAL,0MOVCX,8
LEASI,MSGMOVBX,0
L1:
MOVBL,[SI]MOVSI,OFFSETNUM1
CMPBL,0MOVDI,OFFSETNUM2
JNENEXTL1:
MOVAL,[SI]
INCALMULBYTEPTR[DI]
NEXT:
INCSIADDBX,AX
LOOPL1INCDI
MOVRESULT,ALINCSI
MOVAL,0LOOPL1
MOVAH,4CHMOVRESULT,BX
INT21HMOVAL,0
CSEGENDSMOVAH,4CH
ENDSTARTINT21H
CSEGENDS
ENDSTART
(3)流程图:
(4)流程图:
等于0
不等于0
Y
N
5.调试进程
(1)运行程序,发觉结果错误:
发觉结果错误,单步执行,查找错误:
在执行“JBENEXT”命令时,到-2时,为有符号数,可是JBE为无符号数的比较,因此显现了结果错误,应把“JBE”改成“JLE”。
(2)进行编译连接、运行程序,结果如下:
发觉结果不正确。
单步执行,查找错误,结果如下:
发觉一直都是0D和0F两个数在比较,直至推出循环。
指针没有往下跳转,因此得犯错误答案。
在NEXT语句开始部份加上incSI语句,再执行LOOPL1语句。
6.实验结果
(1)
(2)
(3)
(4)
7.总结
通过这次实验,我了解了如何调试程序,查找逻辑错误,学会了一些分支语句的编程和调试和循环语句的编程和调试。
通过实践,对知识进行了巩固,加深了明白得,收成颇多。
实验四DOS功能挪用
1.实验目的和要求
1.学会DOS中关于显示功能挪用指令的用法。
2.领会修改显存方式显示字符。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1、输入一个字符,显示出来
2、输入一个字符串,显示出来
3、buf开始的3个的16位二进制数用十六进制数的形式显示出来
(1)明白得程序
(2)输入程序,汇编,运行(在DOS状态下输入:
文件名.EXE),观看结果。
(3)若是要分行显示,程序要如何修改?
DATASEGMENT
BUFDW4F59H,56A8H,0FF90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
P:
MOVBX,BUF[SI]
MOVCH,4
L:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBNEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZL
INCSI
INCSI
CMPSI,4
JNAP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4、运行以下程序,在屏幕的第1行,会显示一个字符X,明白得程序段
STACKSEGMENT
DB128DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
MOVSP,128
MOVAX,0B800H
MOVES,AX
MOVAH,0;BIOS10H的0号功能,设置80X25的彩色字符模式
MOVAL,03H
INT10H
MOVAH,'X'
MOVES:
[160*1+40*2],AH
MOVAL,0
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
5、显示
*********
*******
*****
***
*
6、编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。
4.算法描述及实验步骤
(1)挪用DOS的1号功能实现。
CODESSEGMENT
ASSUMECS:
CODES
START:
MOVAH,1
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(2)挪用DOS的10号和2号功能来实现字符串的显示。
DATASSEGMENT
BUFDB10,?
10DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVDX,OFFSETBUF
MOVAH,0AH
INT21H
MOVDL,0DH;回车换行
MOVAH,02H
INT21H
MOVDL,0AH;回车换行
MOVAH,02H
INT21H
MOVCL,BUF