大学课程汇编语言的实验报告Word文件下载.docx
《大学课程汇编语言的实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《大学课程汇编语言的实验报告Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。
$'
dataends
stacksegmentparastack'
stack'
db50dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movdx,offsetmessage
movah,9
int21h
again:
movah,1
cmpal,1bh
jeexit
cmpal,61h
jcnd
cmpal,7ah
jand
andal,11011111b
nd:
movdl,al
movah,2
jmpagain
exit:
movah,4ch
codeends
endstart
实验步骤:
1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。
2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3.用TYPE命令显示1产生的.LST文件。
4.用LINK将.OBJ文件连接成可执行的.EXE文件。
5.在DOS状态下运行LINK产生的.EXE文件。
即在屏幕上显示标题并提示你按键。
每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。
按ESC键可返回DOS。
若未出现预期结果,用DEBUG检查程序。
六、思考题
1、若在源程序中把INT21H的'
H'
省去,会产生什么现象?
代码编译连接均为正常,但是运行时无法输入与输出,也无法退出。
2、把INT21H4CH号功能改为INT20H,行不行?
更改后,编译链接均正常,输入输出也正常,但是按下ESC退出时会出现错误,错误如下:
七、参考资料
《IBM-PC汇编语言程序设计》
《汇编语言实验指导书》
---
(2)字符串处理实验
2011.11.20/21实验成绩:
___
一.实验目的
1.熟悉串操作指令的功能与应用;
2.掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。
二.实验内容
1.字符串统计。
自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
2.在给定的字符串中,删除重复的字符,其余的字符向前递补。
三.实验要求
1.认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。
2.按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。
四.实验环境
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。
程序每次执行,都能得到不同的结果。
;
COUNTDC.ASM
DATASEGMENT
STRNDB80DUP(?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADI,STRN
MOVCL,0
AGAIN:
MOVAH,1
INT21H
CMPAL,0DH
JZDONE
MOV[DI],AL
INCDI
INCCL
JMPAGAIN
DONE:
LEASI,STRN
MOVCH,0
MOVBL,0
CLD
CYCLE:
LODSB①
CMPAL,61H
MPAL,7AHC
JANEXT
INCBL
NEXT:
LOOPCYCLE
MOVAL,BL
MOVAH,0
MOVCL,10
DIVCL
XCHGAH,AL
PUSHAX
MOVDX,0DH
MOVAH,2
MOVDX,0AH
POPAX
MOVDL,AH
ORDL,30H
MOVAH,2
PUSHAX
INT21H
POPAX
MOVDL,AL
1ORDL,30H
1INT21H
ORDL,30H
MOVAH,2
MOVAH,4CH
CODEENDS
ENDSTART
编译源程序:
如下,发现地29行有错误。
用EDIT命令找到错误地方,并进行修改,如下图所示:
修改后保存程序,重新编译:
重新编译后程序没有错误,用反汇编查看指令代码:
如下图所示:
运行程序,验证程序设计结果的正确性。
从键盘上输入字符串“ADKJjkdjfljdeowekdjg”,共二十个字符,其中小写字母十六个,显示结果如下:
由运行结果可知,程序运行正确,实现了设计要求。
②实验2课参考教材第五章练习10的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补。
删除字符串中重复字符的源程序清单:
REPEAT:
PUSHSI②
PUSHCX
PUSHCX;
CX为内循环计数
POPDX;
DX为外循环计数
DECCX
MOVAL,[SI]
CMPAL,0
JENEXT1;
若为空字符,则跳过
COMP:
DECSI
CMPAL,[SI]
MOVBYTEPTR[SI],0
GOON:
LOOPCOMP;
查出与该字符重复的所有字符,并用0
NEXT1:
POPDX
POPSI
DECDX
MOVCX,DX
JNZREPEAT;
对所有重复字符都进行查找
LEASI,STRN;
删除重复字符
MOVCL,LEN
MOVCH,0
MOVAL,[SI]
CMPAL,0;
是重复字符吗?
JNZNEXT;
不是,查找下一个字符
DECCX;
递补子串长度送CX
JZALLDONE
CALLDELE;
删除该空字符并递补
DECSI
INCSI③
LOOPCYCLE
ALLDONE:
MOVDL,0AH
MOVDL,0DH
LEADX,STRN
MOVAH,9
MOVAH,4CH
INT21H
DELEPROC
PUSHSI
PUSHCX
CLD
MOVDI,SI;
空字符处为目的首址
INCSI;
下一个地址为源串首址
REPMOVSB
POPCX
POPSI
RET
DELEENDP
DELEENDP
CODEENDS
ENDSTART
编译源程序,检查程序的正确性,如下图所示:
源程序在27行有错误,有提示的消息可知,此处需要用到变址或基址寄存器,用EDIT命令找到错误的地方,并改正:
修改程序保存再编译以检查是否还有错误:
有上图编译可知,程序修改正确,接下来连接成目标程序:
生成的目标程序名为DELD.EXE
用反汇编命令查看程序代码:
运行程序,检验程序设计的正确性:
执行程序,输入字符串”DKJKLDKEIOWEJDLJAHNVL”,根据编写要求,显示的结果为“KIOWEDJAHNVL“,既删除字符串中重复的字符。
如上图所示。
---(3)子程序实验
2011.12.8/15实验成绩:
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符”b”的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符”b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;
熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
实验内容1流程图:
主程序子程序HEXASC
子程序DISP
实验内容1结果:
实验内容2流程图:
主程序子程序
实验内容2结果:
实验内容1代码:
DATASEGMENT
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
MOVAX,DATA
MOVDS,AX
LEABX,BUF
MOVCX,0AH
LOP:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPLOP
MOVAH,4CH
HEXASCPROCNEAR
MOVDL,AL
MOVCL,4
SHRDL,CL
CALLDISP
ANDDL,0FH
POPCX
RET
HEXASCENDP
DISPPROCNEAR
CMPDL,9
JBENEXT
ADDDL,7
ADDDL,30H
DISPENDP
ENDSTART
实验内容2代码:
CHARDB'
b'
BUFDB50H,?
50HDUP(?
MCODESEGMENT
MCODE,DS:
LEADX,BUF
MOVAH,10
MOVDL,0AH
MOVAH,2
LEASI,BUF
MOVCL,[SI+1]
MOVCH,0
INCSI
MOVAL,CHAR
MOVAH,0
PUSHSI
PUSHAX
CALLFARPTRCHECK
POPAX
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JBEJ1
ADDDL,7
J1:
ADDDL,30H
ANDDL,0FH
JBEJ2
J2:
INT21H
MCODEENDS
SCODESEGMENT
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
JNENEXT1
INCAH
INCSI
LOOPAGAIN
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
ENDSTART
分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。
答:
在近程调用中CS值不变,而在远程调用中CS值发生改变;
近程调用中SP+2,远程调用中SP+4。
---(4)中断程序设计实验
2011.12.11/16实验成绩:
一、实验目的:
1.加深对中断程序的理解,掌握中断程序结构
2.掌握中断程序的设计,调试方法
二、实验内容:
编制程序:
程序开始时要有输入数字的提示,通过键盘输入一个十进制数(0-65535),
用中断程序调用来读取键盘输入的字符、显示该字符。
如果输入0~9以外的字符不显示
该字符,并且继续输入的0~9紧跟在前面的字符后面,在屏幕上面要以十六进制形式显
示;
当用户按下回车键时可以再次输入一个十进制数,当用户按下空格键时程序结束。
三、实验环境
四、实验步骤
1.编写编辑、汇编源程序,生成相应的可执行文件(.EXE),得源程序如下:
COUNTDW1
MESSDB'
Haha!
0DH,0AH,'
CODE,DS:
DATA,ES:
DATA
JMPGO
DW100DUP(?
OLD_IPDW?
OLD_CSDW?
GO:
MOVAX,CS
MOVDS,AX
MOVSS,AX
MOVSP,OFFSETOLD_IP
MOVAL,9H;
取中断向量
MOVAH,35H
MOVOLD_CS,ES;
存原中断向量段址
MOVOLD_IP,BX;
存原中断向量偏移量
PUSHDS
MOVDX,OFFSETMYINT9;
新偏移量送DX
MOVAX,SEGMYINT9
MOVDS,AX;
新段址送DS
MOVAL,9H
MOVAH,25H
INT21H;
写入新的中断向量
POPDS
JMPNEXT
MYINT9PROCFAR
PUSHDX
INAL,60H
TESTAL,80H
JNZEXIT
;
以下输出输入字符的键盘扫描码
SHRAL,1
CMPAL,9
JBEADD30H
ADDAL,7
ADD30H:
ADDAL,30H
ANDAL,0FH
JBEADD_30H
ADD_30H:
输出回车换行
MOVDL,0AH
MOVDL,0DH
EXIT:
MOVAL,20H
OUT20H,AL
IRET
MYINT9ENDP
文件命名为:
INT9H.EXE
此源程序段没有采用调用原来键盘中断程序,若要调用则在结尾处改为:
JMPDWORDPTROLD_IP
2.运行INT9H.EXE,得结果如下:
①没有采用调用原来键盘中断程序:
在键盘上依次输入:
q、w、e、r、t、y、u、i、o、p、a、s、d、f……
2调用原键盘中断程序:
在键盘重复依次输入得结果如下:
所得结果是相同的。
---(5)C++调用汇编子程序
电Ⅲ104
2011.12.17/18实验成绩:
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验环境
四.实验步骤
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
3.检查程序执行的结果是否正确。
五.实验结果
实验程序:
1.DATASEGMENT
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
ASSUMECS:
CODE,DS:
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
LOOPAGAIN
MOVAH,4CH
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
P