北京理工大学汇编实验五实验报告文档格式.docx

上传人:b****6 文档编号:21861779 上传时间:2023-02-01 格式:DOCX 页数:27 大小:159.83KB
下载 相关 举报
北京理工大学汇编实验五实验报告文档格式.docx_第1页
第1页 / 共27页
北京理工大学汇编实验五实验报告文档格式.docx_第2页
第2页 / 共27页
北京理工大学汇编实验五实验报告文档格式.docx_第3页
第3页 / 共27页
北京理工大学汇编实验五实验报告文档格式.docx_第4页
第4页 / 共27页
北京理工大学汇编实验五实验报告文档格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

北京理工大学汇编实验五实验报告文档格式.docx

《北京理工大学汇编实验五实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验五实验报告文档格式.docx(27页珍藏版)》请在冰豆网上搜索。

北京理工大学汇编实验五实验报告文档格式.docx

过程名PROC[near/far]过程体

RET

过程名ENDP

2.子程序结构形式一个完整的子程序一般应包含下列内容:

1.)子程序的说明部分

在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.

说明时,应含如下内容:

.子程序名:

命名时要名中见意.

.子程序的功能:

说明子程序完成的任务;

.子程序入口参数:

说明子程序运行所需参数及存放位置;

.子程序出口参数:

说明子程序运行结果的参数及存放位置;

.子程序所占用的寄存器和工作单元;

.子程序调用示例;

2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。

.段内调用与返回:

调用子程序指令与子程序同在一个段内。

因此只修改IP;

.段间调用与返回:

调用子程序与子程序分别在不同的段,因此在返回时,需同时修改

CS:

IP。

3.)子程序的现场保护与恢复保护现场:

在子程序设计时,CPU内部寄存器内容的保护和恢复。

一般利用堆栈实现现场保护和恢复的格式:

过程名PROC[NEAR/FAR]

PUSHAX

PUSHBX

.

PUSHDX

POPDX

POPAX

4.子程序的参数传递方法

1.寄存器传递参数这种方式是最基本的参数传递方式。

2.存储器单元传(变量)递参数

这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;

子程序运行时到约定存储位置读取参数;

子程序执行结束后将结果也放在约定存储单元中。

3.用堆栈传递参数

利用共享堆栈区,来传递参数是重要的的方法之一。

B)字符、字符串输入输出知识要点:

在实际应用中,经常需要从键盘输入数据并将结果等内容显示到屏幕上,方便程序控制及查看结果。

汇编语言的数据输入和输出分成两类,一是单个字符数据的输入输出,一是字符串数据的输入输出。

都可以通过DOS功能调用来实现,下面就分别介绍下用来实现数据输入输出的功能调用的使用方法。

1、单个字符输入

单个字符输入可以利用DOS的1号功能调用来完成,使用方法为:

MOVAH,1

INT21H

这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCII码形式存储在AL寄存器中。

2、单个字符输出

单个字符输出可利用DOS2号功能调用来完成,使用方法为:

MOVDL,’?

MOVAH,2

单个字符输出需要把要输出字符的ASCII码放在DL寄存器中。

3、字符串输入从键盘输入一串字符串可以利用DOS的10号功能调用来完成,使用方法为:

BUFDB50;

预定义可以输入的最大字符个数

DB?

;

实际输入字符个数,根据输入自动统计

DB50DUP(?

);

存放输入字符串数据缓冲区

LEADX,BUF

MOVAH,10

4、字符串输出

字符串输出可由DOS9号功能调用来完成,使用方法为:

STRINGDB‘HELLO$’

LEADX,STRING

MOVAH,9INT21H

C)表的处理知识要点:

表的处理在实际数据处理中应用较为广泛,主要有排序、搜索、插入和删除等操作。

一些常用的冒泡法、对分搜索法等需要掌握。

四、实验内容与步骤

1、从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某一字符或删除某一字符,并显示操作后的字符串。

程序流程图他如下:

源代码如下:

DATASSEGMENT

STR1DB'

inputstrings:

$'

STR2DB'

1toDelete0toinsert:

STR3DB'

inputstring:

STR4DB'

address:

BUF1DB?

BUF2DB?

ADB11

DB?

DB11DUP('

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

mainprocfar

MOVAX,DATAS

MOVDS,AX

LEADX,STR1

CALLoutput

LEADX,A

MOVAH,10

INT21H;

输入字符串保存在A中

callCR

LEADX,STR2

CALLoutput;

MOVAH,01

INT21H

CMPAL,'

0'

JZinsert

JNZdelete

insert:

LEADX,STR3

MOVBUF1,AL;

输入要插入的字符

LEADX,STR4

MOVBUF2,AL;

要插入位置

callinsert1

JMPL1

delete:

MOVBUF2,AL;

要删除的位置

callCR

calldelete1

L1:

LEADX,A[2]

MOVAH,4CH

INT21H

mainendp

CRprocnear

MOVDL,0DH

MOVAH,02H

MOVDL,0AH

ret

CRendp;

回车换行

outputprocnear

MOVAH,9

outputendp;

输出

insert1procnear

MOVBX,0

SUBBUF2,30H

MOVBL,A[1]

MOVSI,BX

INCBX

SUBBL,BUF2

MOVCX,BX

L3:

MOVBL,A[SI+1]

MOVA[SI+2],BL

DECSI

LOOPL3

MOVBL,BUF1

MOVAH,0

MOVAL,BUF2

MOVSI,AX

MOVA[SI+1],BL

insert1endp;

插入子函数

delete1procnear

MOVCX,BX

MOVBL,BUF2

INCSI

L4:

MOVA[SI],BL

INCSI

LOOPL4

MOVA[SI+1],'

delete1endp;

删除子函数

CODESENDS

ENDSTART

选择插入功能,运行结果如下:

选择删除功能,运行结果如下:

2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。

程序源代码和流程图如下:

DATASSEGMENT

num2DB0,0,0,0

num22DW0

tempioDB0

tempDW0

tabDB'

0123456789abcdef'

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

assumeDS:

DATAS,SS:

CODES,CS:

CODES

MOVAX,DATAS

MOVDS,AX

MOVAX,0

LEASI,num2

CALLinput

MOVAL,tempio

SUBAL,'

MOVDS:

[SI],AL

CALLnewline

MOVCX,4

MOVDX,0AH

cmpDS:

[SI],DL

jbL2

MOVAL,DS:

[SI]

SUBAL,7

L2:

loopL2

MOVAH,DS:

shlAH,CL

MOVBL,DS:

ADDAH,BL

shlAL,CL

ADDAL,BL

MOVnum22,AX

MOVDX,0

MOVCX,2710h

DIVCX

MOVtemp,DX

ADDAX,'

MOVtempio,AL

CALLoutput

MOVAX,temp

MOVCX,3e8h

MOVCX,64h

MOVCX,0AH

MOVAH,4ch

int21h

inputprocnear

MOVAH,1

ret

inputendp;

输入函数

newlineprocnear

MOVAH,2

MOVDL,0dh

MOVDL,0AH

newlineendp;

MOVDL,tempio

输出函数

CODESENDS

运行程序如下:

经验证结果正确

3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。

流程图及源代码如下:

DATASSEGMENT

BUFDB40

DB?

DB40DUP(0)

SHUZIDB10DUP(0)

BIAODW0

STRINGDB'

input10numbers:

STACKSSEGMENT

STADW20HDUP(0)

STACKSENDS

STACKS

MOVAX,STACKS

MOVSS,AX

LEABX,STRING;

CALLHUICHE

CALLinput;

输入10个十进制数

CALLchange;

将ASCII码转换

CALLpaixu;

将其排序

LEASI,BUF

ADDSI,5

MOVDI,10

ABC:

MOVAL,[SI]

CALLoutput16;

将16进制数输出

CALLkongge

ADDSI,3

DECDI

JNZABC

outputprocnear;

输出字符串

MOVDX,BX

MOVAH,09H

RET

outputendp

inputprocnear;

输入字符串

LEADX,BUF

MOVAH,0AH

inputendp

HUICHEprocnear;

HUICHEendp

changeprocnear;

ASCII码转换

ADDSI,2

MOVCX,10

ANDBYTEPTR[SI],0FH

LOOPL1;

变成十进制

MOVBL,10

MULBL;

变成实际数字

ADDAL,[SI+1]

MOV[SI],AL

LOOPL2

changeendp

paixuprocnear;

排序

LEADI,BUF

ADDDI,5

MOVDI,CX

MOVBX,2

MOVAL,BUF[BX]

CMPAL,BUF[BX+3]

JBECONTINUE

XCHGAL,BUF[BX+3]

MOVBUF[BX],AL

CONTINUE:

ADDBX,3

MOVCX,DI

paixuendp

output16procnear;

显示16进制数字

MOVCL,4

MOVDL,AL

SHRDL,CL

MOVBIAO,AX

CALLexchange

MOVAX,BIAO

ANDDL,0FH

output16endp

exchangeprocnear

CMPDL,9

JANOTDIG

ORDL,30H

JMPFINAL

NOTDIG:

ADDDL,37H

FINAL:

exchangeendp

konggeprocnear;

输出空格

MOVDL,20H

konggeendp

ENDSTART

运行结果如下:

4、英文人名排序。

从终端键入20个人名,当所有人名都键入后,按字母上升的次序将人名排序,并在屏幕上显示已经排好序的人名。

流程图如下:

buf4DB460dup('

bp4DW20dup(0)

markDB'

@@'

num2DW20

num3DW19

ASSUMEDS:

STACKS,CS:

MOVES,AX

MOVAX,STACKS

MOVSS,AX

LEASI,buf4

LEADI,bp4

MOVCX,20

MOVAL,20

MOVDX,SI

ADDDX,2

MOVES:

[DI],DX

INCDI

CALLgets

ADDSI,23

loopL1

LEASI,bp4

MOVAX,19

MOVnum3,AX

MOVDI,DS:

[SI+2]

MOVtemp,SI

MOVAX,DS:

MOVSI,AX

repecmpsb

jsskip

MOVSI,temp

xchgAX,DS:

[SI],AX

skip:

MOVCX,num3

decCX

MOVnum3,CX

INCCX

loopL3

MOVCX,num2

MOVnum2,CX

MOVtemp,CX

MOVSI,ES:

[DI]

CALLputs

MOVCX,temp

loopL4

int21h

getsprocnear

MOVAH,10

getsendp

putsprocnear

MOVAH,9

putsendp

newlineprocnear

MOVdl,0dh

MOVdl,0AH

newlineendp

五、思考与练习

1.字符串在内存中是如何存储的?

2.屏幕有多个字符串显示时,如何换行?

答:

1.以8位ASCII码的形式连续存储

2.先输出换行符(10),然后输出回车符(13)

六、实验感悟

本次实验难度较大,综合了前几次实验的内容,编程很复杂。

但是综合设计让我们对汇编语言的整体了解有了更大的提升。

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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