大学课程汇编语言的实验报告Word文件下载.docx

上传人:b****5 文档编号:16181514 上传时间:2022-11-21 格式:DOCX 页数:37 大小:552.73KB
下载 相关 举报
大学课程汇编语言的实验报告Word文件下载.docx_第1页
第1页 / 共37页
大学课程汇编语言的实验报告Word文件下载.docx_第2页
第2页 / 共37页
大学课程汇编语言的实验报告Word文件下载.docx_第3页
第3页 / 共37页
大学课程汇编语言的实验报告Word文件下载.docx_第4页
第4页 / 共37页
大学课程汇编语言的实验报告Word文件下载.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

大学课程汇编语言的实验报告Word文件下载.docx

《大学课程汇编语言的实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《大学课程汇编语言的实验报告Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。

大学课程汇编语言的实验报告Word文件下载.docx

$'

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1