华科汇编语言程序设计实验4.docx

上传人:b****4 文档编号:12097808 上传时间:2023-04-17 格式:DOCX 页数:35 大小:267.35KB
下载 相关 举报
华科汇编语言程序设计实验4.docx_第1页
第1页 / 共35页
华科汇编语言程序设计实验4.docx_第2页
第2页 / 共35页
华科汇编语言程序设计实验4.docx_第3页
第3页 / 共35页
华科汇编语言程序设计实验4.docx_第4页
第4页 / 共35页
华科汇编语言程序设计实验4.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

华科汇编语言程序设计实验4.docx

《华科汇编语言程序设计实验4.docx》由会员分享,可在线阅读,更多相关《华科汇编语言程序设计实验4.docx(35页珍藏版)》请在冰豆网上搜索。

华科汇编语言程序设计实验4.docx

华科汇编语言程序设计实验4

课程实验报告

课程名称:

汇编语言程序设计实验

实验名称:

实验四输入输出与中断处理程序设计

实验时间:

2017-4-19,14:

00-17:

30实验地点:

南一楼804室74号实验台

指导教师:

班鹏新专业班级:

计算机科学与技术1503班

学号:

U201514558姓名:

刘伟光

同组学生:

余昆刘智博报告日期:

2017年4月19日

原创性声明

 本人郑重声明:

本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。

除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。

特此声明!

学生签名:

日期:

2017.4.19

成绩评定

实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)

报告撰写质量得分(30分)(报告规范、完整、通顺、详实等)

总成绩(100分)

指导教师签字:

                    日期:

目录

1实验目的与要求2

2实验内容2

3实验过程3

3.1任务13

3.1.1设计思想及存储单元分配3

3.1.2流程图3

3.1.3源程序3

3.1.4实验步骤4

3.1.5实验记录4

3.2任务26

3.2.1设计思想及存储单元分配6

3.2.2流程图6

3.2.3源程序6

3.2.4实验步骤9

3.2.5实验记录9

3.3任务311

3.3.1设计思想及存储单元分配11

3.3.2流程图11

3.3.3源程序11

3.3.4实验步骤13

3.3.5实验记录13

3.4任务414

3.4.1设计思想及存储单元分配14

3.4.2流程图14

3.4.3源程序15

3.4.4实验步骤22

3.4.5实验记录22

3.5任务523

3.5.1设计思想及存储单元分配23

3.5.2流程图23

3.5.3源程序23

3.5.4实验步骤23

3.5.5实验记录23

4体会26

参考文献27

 

1

实验目的与要求

(1)掌握中断矢量表的概念;

(2)熟悉I/O访问,BIOS功能调用方法;

(3)掌握实方式下中断处理程序的编制与调试方法。

2实验内容

任务1:

用三种方式获取中断类型码16H对应的中断处理程序的入口地址。

要求:

首先要进入虚拟机状态,然后

(1)直接运行调试工具(TD.EXE),观察中断矢量表中的信息。

(2)编写程序,用16H功能调用方式获取(16H的使用可查阅教材附录),观察功能调用相应的出口参数与“

(1)”看到的结果是否相同(使用TD观看出口参数即可)。

(3)编写程序,直接读取相应内存单元,观察读到的数据与“

(1)”看到的结果是否相同(使用TD观看程序的执行结果即可)。

任务2:

编写一个接管键盘中断的中断服务程序并驻留内存,要求在程序返回DOS操作系统后,键盘上的小写字母都变成了大写字母。

要求:

(1)在DOS虚拟机或DOS窗口下执行程序,中断服务程序驻留内存。

(2)在DOS命令行下键入小写字母,屏幕显示为大写,键入大写时不变。

执行TD,在代码区输入指令“movAX,0”看是否能发生变化。

(3)选作:

另外编写一个中断服务程序的卸载程序,将键盘中断服务程序恢复到原来的状态

任务3:

读取CMOS内指定单元的信息,按照16进制形式显示在屏幕上。

要求:

(1)先输入待读取的CMOS内部单元的地址编号(可以只处理编号小于10的地址单元)。

再使用IN/OUT指令,读取CMOS内的指定单元的信息。

(2)将读取的信息用16进制的形式显示在屏幕上。

若是时间信息,可以人工判断一下是否正确。

3实验过程

3.1任务1

3.1.1设计思想及存储单元分配

用三种方式获取中断类型码10H对应的中断处理程序的入口地址。

1.直接在td中观察指定ds:

58H中的值和ds:

5A中的值。

2.系统功能调用35H,入口参数为AL=16H,取中断信息。

3.直接把主存中的DS:

[58H],DS:

[5AH]赋值给寄存器BX和CX。

3.1.2流程图

3.1.3源程序

1.程序名41

.386

STACKSEGMENTUSE16STACK

DB200DUP(0)

STACKENDS

CODESEGMENTUSE16

ASSUMECS:

CODE

START:

XORAX,AX

MOVDS,AX

MOVAX,3516H

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

2.程序名42

.386

STACKSEGMENTUSE16STACK

DB200DUP(0)

STACKENDS

CODESEGMENTUSE16

ASSUMECS:

CODE,SS:

STACK

START:

XORAX,AX

MOVDS,AX

XORBX,BX

XORCX,CX

MOVBX,DS:

[58H]

MOVCX,DS:

[5aH]

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3.1.4实验步骤

1.直接运行td,直接计算16h所调用的中断矢量表的位置的段首址和偏移地址,分别是58h和5Ah。

在数据段中输入ds:

58h,观察其值。

2.将程序41编译、链接,调试直到没有错误。

运行td41,在td中单步调试,观察es与bx的改变情况;

3.将程序42编译、链接,调试直到没有错误。

运行td42,在td中单步调试,观察寄存器的值。

4.总结计算中断指令表的规律和总结错误。

3.1.5实验记录

1.实验环境条件:

16M内存;WINDOWSXP命令行窗口;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。

2.方法一,直接观察ds段,可以观察到从0:

40h开始低2个字节为11E0,高2个字节为F000;观察如图3.1.1所示。

图3.1.1直接观察td中的主存

3.方法二,调用35号系统功能,在TD内观察到es为11E0,bx为11E0;观察如图3.1.2所示。

图3.1.2调用35号功能观察

分析:

可以直接调用35号调用来获取中断入口地址。

4.方法三,将0:

40h开始的低2个字节移至bx,高2个字节移至cx,得到cx为F000,bx为11E0;观察如图3.1.3所示。

图3.1.3通过寄存器观察中断矢量表

5.比较上述三种方法得到的结果,发现它们一致,说明以上方法实施得到的结果准确无误。

6.(思考题)总结分析:

在计算中断矢量表位置时,计算第n个中断指令可用ds:

n*4和ds:

n*4+2分别得到其位置,值得注意的是在TD中使用的是16进制,需要做一些适量转化.。

在这次中总结错误为,如果汇编代码没有执行语句MOVDS,AX的话,其内存中保存的值不会是中断矢量表。

错误如图3.1.4所示:

图3.1.4没有执行MOVDS,AX的主存

3.2任务2

3.2.1设计思想及存储单元分配

设计思想:

修改键盘驱动中断程序(int16h),将中断矢量表0:

58h开始的4个字节修改为新的中断程序的偏移地址和段首址,并保存号旧的键盘驱动中断程序的偏移地址和段首址。

在新的中断程序中,先判断用户调用的是否为键盘驱动中断程序的读入键盘功能,若不是,则直接调用旧的键盘驱动中断程序;若是,则对输入进行处理。

实际上我们改变出口参数中AL的值即是键入字符的ASCII码即可实现。

3.2.2流程图

任务2流程图如图3.2.1所示。

图3.2.1任务2流程图

3.2.3源程序

程序名43接管中断程序

.386

DATASEGMENTUSE16

DATAENDS

CODESEGMENTUSE16

ASSUMECS:

CODE,SS:

STACK

OLD_INTDW?

?

NEW16H:

CMPAH,00H

JEATB

CMPAH,10H

JEATB

JMPDWORDPTROLD_INT

ATB:

PUSHF

CALLDWORDPTROLD_INT

CMPAL,97;比较输入的ascii码

JAENEXT1

JMPQUIT

NEXT1:

CMPAL,122

JBETOBIG

JMPQUIT

TOBIG:

subAL,32

QUIT:

IRET

START:

XORAX,AX

MOVDS,AX

MOVAX,DS:

[16H*4]

MOVOLD_INT,AX;保存偏移部分

MOVAX,DS:

[16H*4+2]

MOVOLD_INT+2,AX;保存段值

CLI

MOVWORDPTRDS:

[16H*4],OFFSETNEW16H

MOVDS:

[16H*4+2],CS

STI

MOVDX,OFFSETSTART+15

SHRDX,4

ADDDX,10H

MOVAL,0

MOVAH,31H

INT21H

CODEENDS

STACKSEGMENTUSE16STACK

DB200DUP(0)

STACKENDS

ENDSTART

程序名44卸载中断指令

.386

DATASEGMENTUSE16

DATAENDS

CODESEGMENTUSE16

ASSUMECS:

CODE,SS:

STACK

OLD_INTDW?

?

NEW16H:

CMPAH,00H

JEATB

CMPAH,10H

JEATB

JMPDWORDPTROLD_INT

ATB:

PUSHF

CALLDWORDPTROLD_INT

CMPAL,97;比较输入的ascii码

JAENEXT1

JMPQUIT

NEXT1:

CMPAL,122

JBETOBIG

JMPQUIT

TOBIG:

subAL,32

QUIT:

IRET

START:

XORAX,AX

MOVDS,AX

MOVAX,DS:

[16H*4]

MOVOLD_INT,AX;保存偏移部分

MOVAX,DS:

[16H*4+2]

MOVOLD_INT+2,AX;保存段值

CLI

MOVWORDPTRDS:

[16H*4],11E0H

MOVWORDPTRDS:

[16H*4+2],F000H

STI

MOVDX,OFFSETSTART+15

SHRDX,4

ADDDX,10H

MOVAL,0

MOVAH,31H

INT21H

CODEENDS

STACKSEGMENTUSE16STACK

DB200DUP(0)

STACKENDS

ENDSTART

3.2.4实验步骤

1.编译,链接。

2.观察提示信息,若出错,则用编辑程序修改错误,修改后再重新编译。

3.在键盘键入小写字母和大写字母,用空格符号分开,观察输出。

4.(思考题)在DOS命令行下键入小写字母,屏幕显示为大写,键入大写时不变。

执行TD,在代码区输入指令“movAX,0”看是否能发生变化。

5.(思考题)编写中断服务程序的终止程序,并做观察。

6.(思考题)同时打开另外一个虚拟DOS窗口,键盘大小写是否被替代。

3.2.5实验记录

1.实验环境条件:

16M内存;WINDOWSXP命令行窗口;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。

2.在键盘键入小写字母和大写字母,用空格符号分开,观察输出

当输入小写的abyz加空格和大写的ABYZ,输出如图3.2.2所示:

图3.2.2执行程序后的输入显示

3.(思考题)通过编写代码发现,将旧的中断程序的偏移地址与首地址保存下来后,可有有两种方式调用旧的中断程序:

Jmpdwordptrold_int;

Calldwordptrold_int;

前一种方式,可直接结束新的(不返回至)中断程序;后一种方式,可返回至新的中断程序。

4.(可选题)运行卸载程序,观察卸载结果,先运行43程序,再运行44程序。

输出如图3.2.3所示:

图3.2.3运行卸载程序之后观察大小写

5.(思考题)在DOS命令行下键入小写字母,屏幕显示为大写,键入大写时不变。

执行TD,在代码区输入指令“movAX,0”,观察其变化。

显示如图3.2.4所示:

图3.2.3运行新的中断程序后再td中输入“movAX,0”

分析:

在DOS虚拟机上运行了改变为新的中断处理程序,在DOS中将小写变为了大写,但是运行了TD,在TD中写语句小写并没有变成大写,可见中断处理程序的影响范围是有限的。

6.(思考题)同时打开另外一个虚拟DOS窗口,观察键盘大小写是否被替代。

图3.2.4观察键盘大小写是否被替代

由观察可知在新的DOS窗口中,其大小写没有改变。

7.错误总结一:

在卸载程序时写了一句MOVWORDPTRDS:

[16H*4+2],F000H,但是编译器给报出错误,分析原因后,是因为以F开头编译器会将其视为变量的名字,所以报出错误,解决方案是在其前面加0。

显示的错误如图3.2.5

图3.2.5将F000H赋予寄存器值时发生错误

3.3任务3

3.3.1设计思想及存储单元分配

1号系统功能调用读入字符,将用户输入转化为数字,作为信息的偏移地址。

然后调用in指令,从指定端口取出数据即可。

3.3.2流程图

任务三流程图如图3.3.1所示。

图3.3.1任务三流程图

3.3.3源程序

程序名47

.386

STACKSEGMENTUSE16STACK

DB200DUP(0)

STACKENDS

CODESEGMENTUSE16

ASSUMESS:

STACK,CS:

CODE

START:

MOVAX,0

MOVDS,AX

loop1:

MOVAH,1;输入读入

INT21H

CMPAL,'a'

JEQUIT

SUBAL,30H;字符转化为十进制

OUT70H,AL

INAL,71H

MOVAH,AL

ANDAL,0FH

SHRAH,4

ADDAX,3030H

MOVBX,AX

movdl,0ah

movah,2

int21h

movdl,0dh

movah,2

int21h

MOVDL,BH

MOVAH,2

INT21H

MOVDL,BL

MOVAH,2

INT21H

movdl,0ah;输出回车换行

movah,2

int21h

subbx,3030H

moval,bh

movcl,10

mulcl

addal,bl

movah,0

movcl,16

divcl

movbh,al

movbl,ah

addbx,3030h

cmpbl,3ah

jaemore

put:

MOVDL,BH

MOVAH,2

INT21H

MOVDL,BL

MOVAH,2

INT21H

MOVDL,'H'

MOVAH,2

INT21H

movdl,0ah

movah,2

int21h

movdl,0dh

movah,2

int21h

jmploop1

more:

addbl,7

jmpput

quit:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3.3.4实验步骤

1.录入源程序renwu64,编译,链接。

2.执行该程序,‘0’~‘9’,然后观察屏幕输出信息,验证是否正确。

3.3.5实验记录

1.实验环境条件:

16M内存;WINDOWSXP命令行窗口;EDIT.EXE2.0;MASM.EXE6.0;LINK.EXE5.2;TD.EXE5.0。

2.取出的信息按照BCD编码进行压缩,分为两部分,分别存储在AL,AH。

比如说当前小时信息是19,则1存储在AH,为0x01,9存储在AL,为0x09。

3.执行程序发现有时输出0x0,屏幕上一次输出当前的时间信息,包括年、月、日、星期、小时、分钟、秒。

图3.3.2任务三运行结果

运行结果与实际时间相符。

3.4任务4

3.4.1设计思想及存储单元分配

在这次的实验当中,我将BUF当做学生信息表,其中每个字节的信息都和密码做循环亦或,input作为输入姓名的输入缓冲区,PWD做密码对比,IN_PWD用作密码的输入缓冲区。

其中密码的加密是减去29h再乘以3。

为了避免跟踪措施,采用了计时反跟踪和中断矢量表修改的两种反跟踪措施。

将一号中断指令和3号中断指令的地址更改,使其无法进行单步调试,之后还有计时工具来避免反跟踪。

3.4.2流程图

任务四流程图如图3.4.1所示。

图3.4.1任务四流程图

3.4.3源程序

程序名422

.386

stacksegmentuse16stack

db200dup(0)

stackends

datasegmentuse16

NEQU4

BUFDB'z'XOR'L','h'XOR'i','a'XOR'u','o'XOR'L',6DUP(0)

DB80XOR'L',100XOR'i',70XOR'u',?

DB'l'XOR'L','i'XOR'i','s'XOR'u','i'XOR'L',6DUP(0)

DB50XOR'L',40XOR'i',40XOR'u',?

DB'g'XOR'L','u'XOR'i','a'XOR'u','n'XOR'L','g'XOR'i',5DUP(0)

DB85XOR'L',85XOR'i',100XOR'u',?

INPUTDB10

DB?

DB10DUP(0)

POINDW0

CRLFDB0dh,0ah,'$'

FUN1DB'Pleaseinputthename:

$'

faildDB'Thestudentisnotexist.','$'

succDB'findwantedstudent.$'

FUN3DB'theaveragescoreis:

$'

FUN4DB'thescorelevelis:

$'

QUITDB'quittheprogram$'

qDW0

B1DB2

STRIDW0,'$'

MIMA1DB'Pleaseinputthepassword:

',0ah,0dh,'$'

wdw0

PWDDB3XOR'C';密码串的长度为3,采用与常数43H异或的方式编码成密文

DB('L'-29H)*3;真实密码为Bat。

采用函数(X-29H)*3对保存的密码进行编码。

DB('i'-29H)*3

DB('u'-29H)*3

DB('L'-29H)*3

DB('i'-29H)*3

DB('u'-29H)*3

DB0A1H,5FH,0D3H;用随机数填充密码区到6个字符,防止破解者猜到密码长度

;

IN_PWDDB7;使用者输入的密码区,最大长度6个字符

DB?

DB7DUP(0)

OLDINT1DW0,0;1号中断的原中断矢量(用于中断矢量表反跟踪)

OLDINT3DW0,0;3号中断的原中断矢量

dataends

codesegmentuse16

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

xorax,ax;接管调试用中断,中断矢量表反跟踪

moves,ax

movax,es:

[1*4];保存原1号和3号中断矢量

movOLDINT1,ax

movax,es:

[1*4+2]

movOLDINT1+2,ax

movax,es:

[3*4]

movOLDINT3,ax

movax,es:

[3*4+2]

movOLDINT3+2,ax

cli;设置新的中断矢量

movax,OFFSETNEWINT

moves:

[1*4],ax

moves:

[1*4+2],cs

moves:

[3*4],ax

moves:

[3*4+2],cs

sti

leadx,MIMA1;输出提示信息

movah,9

int21h

LEADX,IN_PWD;输入密码字符串

MOVAH,10

INT21H

leadx,CRLF;输出回车换行

movah,9

int21h

cli;计时反跟踪开始

movah,2ch

int21h

pushdx;保存获取的秒和百分秒

movah,2ch;获取第二次秒与百分秒

int21h

sti

cmpdx,[esp];计时是否相同

popdx

jzPASS1;如果计时相同,通过本次计时反跟踪

jmpquit1

 

PASS1:

MOVZXCX,IN_PWD+1

MOVSI,0

MOVDL,3

 

PASS2:

MOVZXAX,IN_PWD+2[SI];比较密码是否相同。

把输入的串变成密文,与保存的密文比较

SUBAX,29H

MULDL

CMPAL,PWD+1[SI]

JNZERR2

INCSI

LOOPPASS2

JMPstart1

ERR2:

movebx,OFFSETquit1;当密码不等时,通过地址表计算出OVER(退出)的位置

jmpwordptr[ebx];指向OVER

start1:

movsp,0

leadx,FUN1;输出提示信息

movah,9

int21h

leadx,INPUT;输入学生姓名

movah,10

int21h

leadx,CRLF;输出回车换行

movah,9

int21h

leabp,offsetINPUT

addbp,2

movdl,ds:

byteptr[bp-1]

cmpds:

byteptr[bp-1],0

jestart1

cmpds:

byteptr[bp-1],1

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

当前位置:首页 > IT计算机 > 计算机硬件及网络

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

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