汇编实验五子程序设计 连晓阳.docx

上传人:b****4 文档编号:5410154 上传时间:2022-12-16 格式:DOCX 页数:14 大小:65.54KB
下载 相关 举报
汇编实验五子程序设计 连晓阳.docx_第1页
第1页 / 共14页
汇编实验五子程序设计 连晓阳.docx_第2页
第2页 / 共14页
汇编实验五子程序设计 连晓阳.docx_第3页
第3页 / 共14页
汇编实验五子程序设计 连晓阳.docx_第4页
第4页 / 共14页
汇编实验五子程序设计 连晓阳.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

汇编实验五子程序设计 连晓阳.docx

《汇编实验五子程序设计 连晓阳.docx》由会员分享,可在线阅读,更多相关《汇编实验五子程序设计 连晓阳.docx(14页珍藏版)》请在冰豆网上搜索。

汇编实验五子程序设计 连晓阳.docx

汇编实验五子程序设计连晓阳

福建农林大学金山学院实验报告

系:

信息与机电工程专业:

电子信息工程年级:

09

姓名:

连晓阳学号:

092230051实验课程:

汇编语言

实验室号:

_605______实验设备号:

j2实验时间:

指导教师签字:

成绩:

实验五子程序设计

1.实验目的和要求

1、学习子程序的编写,主子程序的调用

2、不同模块间程序的调用和调试

2.实验环境

实验的硬件环境是:

IBM—PC机及其兼容机

实验的软件环境是:

操作系统:

DOS2.0以上;调试程序:

DEBUG.COM;文本编程程序:

EDIT.EXE、WPS.EXE;宏汇编程序:

MASM.EXE(或ASM.EXE);连接装配程序:

LINK.EXE;交叉引用程序:

CREF.EXE(可有可无)。

3.实验内容及实验数据记录

1、数据段中的3个字符,调用子程序将其逐个显示出来。

子程序的功能是显示一个字符。

单步执行,观察IP的变化

DATASEGMENT

MAGDB‘ABC’

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVSI,0

MOVCX,3

LL:

MOVDL,MAG[SI]

CALLMADD

INCSI

LOOPLL

MOVAH,4CH

INT21H

MADDPROC

MOVAH,02H

INT21H

RET

MADDENDP

CODEENDS

ENDSTART

2、阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。

具体步骤如下:

MASMS31.ASM(分别汇编)

MASMS32.ASM

LINKS31S32(将两个文件连接成为一个文件名为S31)

S31.EXE(运行)

3、编程:

利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。

(也可以将找到的不相等字符逐个显示,用INT21H的02功能调用)

4、编程:

子程序搜索指定字符缓冲区中是否有n,如果有用y替代。

调用子程序将BUF1,BUF2,BUF3中的n全部用y替代

4.算法描述及实验步骤

1用doss运行改程序,用反汇编跟踪如下

Call指针指向了0019,movah,02

分布跟踪如下

可以看出ret后ip指向了0012,sp又回到了栈底,证实了call调用子程序是通过堆栈保护了现场进入子程序,之后在通过ret恢复了原状。

2.按要求把s31s32分别汇编连接形成一个s31.exe文件,如下

3在doss下运行一下程序

DATASEGMENT

BUF1DB'HapBneVerndan!

'

LEN=$-BUF1

BUF2DB'Happneverndan!

'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,buf1

leadi,buf2

movcx,len

callcmpp

MOVAH,4CH

INT21H

;子程序名cmpp

;功能:

比较两缓冲区中不相等的字符,并输出

;入口参数:

buf1首地址SI,buf2首地址di,循环比较次数CX

;占用寄存器:

dl

cmppPROCNEAR;子程序

l1:

movdl,[si]

cmpdl,[di]

jznext

movah,02h

int21h

next:

incsi

incdi

loopl1

RET;子程序返回

cmppENDP

CODEENDS

ENDSTART

改程序实现了,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。

4.编写一下程序实现子程序搜索指定字符缓冲区中是否有n,如果有用y替代。

调用子程序将BUF1,BUF2,BUF3中的n全部用y替代

DATASEGMENT

BUF1DB'Everndoghashisdan!

',0ah,0dh,'$'

LEN1=$-BUF1

BUF2DB'Happneverndan!

','$'

LEN2=$-BUF2

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,BUF1

MOVCX,LEN1

CALLCMMP

LEASI,BUF2

MOVCX,LEN2

CALLCMMP

MOVAH,4CH

INT21H

;子程序的功能:

搜索字符串中是否有N字符,如果有用Y替代,并显示字符串

;入口参数为字符串偏移地址SI,字符串长度CX

;将要显示的字符串的偏移地址送DX,用于显示字符串。

这句应在子程序的开始,因为下面

;;语句会改变SI的值

CMMPPROC

MOVDX,SI

CMP1:

CMPBYTEPTR[SI],'n'

JNENOTN

MOVAL,'y'

MOV[SI],AL

NOTN:

INCSI

LOOPCMP1

MOVAH,09H;显示字符串

INT21H

RET

CMMPENDP

CODEENDS

ENDSTART

5.调试过程

1编译连接改程序

在u命令反汇编

分步执行

2汇编s31,

汇编s32

Links31s32

形成一个s31.exe的文件

3.编写程序,汇编,连接,运行

6.实验结果

1.输出字符串abc

2输入一个数后面显示了十六进制数

3.显示了BUF1和BUF2缓冲区中不相等的字符

4子程序搜索指定字符缓冲区中是否有n,如果有用y替代。

调用子程序将BUF1,BUF2,BUF3中的n全部用y替代

7.总结

学习子程序的编写,主子程序的调用

不同模块间程序的调用和调试

附录:

附源程序:

NAMES31.ASM

不同模块间的段间调用。

从键盘输入2位非压缩BCD数,存入AX寄存器中。

为了将其转换为二进制数,编写一个子程序TRAN。

显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。

输入数据为00时结束。

EXTRNDISP:

FAR

CODESEGMENTPARA'CODE'

ASSUMECS:

CODE

START:

MOVAH,01H

INT21H

MOVBL,AL

INT21H

MOVAH,AL

MOVAL,BL

CMPAX,3030H

JEEXIT

CALLNEARPTRTRAN

CALLFARPTRdisp

JMPSTART

EXIT:

MOVAH,4CH

INT21H

TRANPROCNEAR;将输入的ASCII码转换成2进制数

ANDAX,0F0FH;将ASCII码转换成非压缩BCD码,

;高位在AL中

MOVBL,AH

MOVCL,10D

MULCL

ADDAL,BL

RET

TRANENDP

CODEENDS

ENDSTART

NAMES32.ASM

PUBLICDISP

CODE1SEGMENTPARA'CODE'

ASSUMECS:

CODE1

DISPPROCFAR

MOVBL,AL

MOVBH,00

MOVCH,4

ROLL:

MOVCL,4

ROLBX,CL

MOVDL,BL

ANDDL,0FH

CMPDL,9

JBENEXT1

ADDDL,07H

NEXT1:

ADDDL,30H

MOVAH,02H

INT21H

DECCH

JNZROLL

RET

DISPENDP

CODE1ENDS

END

3DATASEGMENT

BUF1DB'HapBneVerndan!

'

LEN=$-BUF1

BUF2DB'Happneverndan!

'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,buf1

leadi,buf2

movcx,len

callcmpp

MOVAH,4CH

INT21H

;子程序名cmpp

;功能:

比较两缓冲区中不相等的字符,并输出

;入口参数:

buf1首地址SI,buf2首地址di,循环比较次数CX

;占用寄存器:

dl

cmppPROCNEAR;子程序

l1:

movdl,[si]

cmpdl,[di]

jznext

movah,02h

int21h

next:

incsi

incdi

loopl1

RET;子程序返回

cmppENDP

CODEENDS

ENDSTART

4

DATASEGMENT

BUF1DB'Everndoghashisdan!

',0ah,0dh,'$'

LEN1=$-BUF1

BUF2DB'Happneverndan!

','$'

LEN2=$-BUF2

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,BUF1

MOVCX,LEN1

CALLCMMP

LEASI,BUF2

MOVCX,LEN2

CALLCMMP

MOVAH,4CH

INT21H

;子程序的功能:

搜索字符串中是否有N字符,如果有用Y替代,并显示字符串

;入口参数为字符串偏移地址SI,字符串长度CX

;将要显示的字符串的偏移地址送DX,用于显示字符串。

这句应在子程序的开始,因为下面

;;语句会改变SI的值

CMMPPROC

MOVDX,SI

CMP1:

CMPBYTEPTR[SI],'n'

JNENOTN

MOVAL,'y'

MOV[SI],AL

NOTN:

INCSI

LOOPCMP1

MOVAH,09H;显示字符串

INT21H

RET

CMMPENDP

CODEENDS

ENDSTART

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

当前位置:首页 > 解决方案 > 学习计划

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

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