汇编语言实验五子程序设计实验.docx

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

汇编语言实验五子程序设计实验.docx

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

汇编语言实验五子程序设计实验.docx

汇编语言实验五子程序设计实验

 

实验五子程序设计实验(设计性实验)

 

一、实验要求和目的

1.熟悉汇编语言程序设计结构;

2.熟悉汇编语言子程序设计方法;

3.熟悉利用汇编语言子程序参数传递方法;

4.熟悉汇编语言字符串处理基本指令的使用方法;

5.掌握利用汇编语言实现字符串的输入输出程序设计方法;

6.掌握数制转换程序实现方法。

二、软硬件环境

1、硬件环境:

计算机系统windows;

2、软件环境:

装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识

A)子程序知识要点:

1.掌握子程序的定义语句;

过程名PROC[near/far]

过程体

RET

过程名ENDP

2.子程序结构形式

一个完整的子程序一般应包含下列内容:

1、)子程序的说明部分

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

说明时,应含如下内容:

.子程序名:

命名时要名中见意.

.子程序的功能:

说明子程序完成的任务;

.子程序入口参数:

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

.子程序出口参数:

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

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

.子程序调用示例;

2、)掌握子程序的调用与返回

在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。

.段内调用与返回:

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

因此只修改IP;

.段间调用与返回:

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

CS:

IP。

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

保护现场:

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

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

过程名PROC[NEAR/FAR]

PUSHAX

PUSHBX.

PUSHDX

POPDX.

POPAX

RET

过程名ENDP

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

1.寄存器传递参数

这种方式是最基本的参数传递方式。

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

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

行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。

3.用堆栈传递参数

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

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

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

及查看结果。

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

符串数据的输入输出。

都可以通过DOS功能调用来实现,下面就分别介绍下用来实现数据输

入输出的功能调用的使用方法。

1、单个字符输入

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

MOVAH,1

INT21H

这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCII

码形式存储在AL寄存器中。

2、单个字符输出

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

MOVDL,’?

MOVAH,2

INT21H

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

3、字符串输入

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

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

DB?

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

DB50DUP(?

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

LEADX,BUF

MOVAH,10

INT21H

4、字符串输出

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

STRINGDB‘HELLO$’

LEADX,STRING

MOVAH,9

INT21H

C)表的处理知识要点:

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

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

四、实验内容与步骤

1、从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某

一字符或删除某一字符,并显示操作后的字符串。

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

3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后

把该数以十六进制形式在屏幕上打印出来。

4、英文人名排序。

从终端键入20个人名,当所有人名都键入后,按字母上升的次序将人名

排序,并在屏幕上显示已经排好序的人名。

注意:

以上各题要求用子程序方法实现,每个题目至少包含2个子程序。

涉及到初始数据

的,同学们自行给出多组数据,反复加以验证各题程序。

五、实验要求与提示

1、实验要求

(1)画出各程序流程图;

(2)列出程序清单,加上适量注释;

(3)回答思考问题;

(4)记录实验结果;

(5)完成实验报告(实验材料上的内容简写,自己的工作要详尽)。

六、思考与练习以及测评标准

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

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

七、程序流程图

八、实验结果

九、思考题

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

2.先输出换行符,然后输出回车符

十、程序代码

datassegment

buf4db460dup('$')

bp4dw20dup(0)

markdb'@@'

num41dw20

num42dw19

num3db20dup(0)

num3tdb10dup(0)

num31dw10

num32dw9

num2db0,0,0,0

num22dw0

tempiodb0

tempdw0

tabdb'0123456789abcdef'

tip1db'Pleaseinput:

$'

tip2db'Pleaseinput10DECnumeralwithspace:

$'

buf1db20

db?

db20dup('$')

num1db0

num1tdb3

db?

db2dup(0)

temp1db''

datasends

stackssegment

stackdw32dup(0)

stacksends

codessegment

assumeds:

datas,ss:

stacks,cs:

codes

start:

movax,datas

movds,ax

moves,ax

movax,stacks

movss,ax

;;;;;;;;;;;;;;;;;;;;1start

leasi,tip1

callputs

callnewline

leasi,buf1

callgets

leasi,num1t

callgets

incsi

incsi

movah,ds:

[si]

incsi

moval,ds:

[si]

movbl,'0'

subah,bl

subal,bl

movbl,al

moval,ah

movah,0

movcl,10

mulcl

addal,bl

movnum1,al

callinput

callnewline

movbl,tempio

movtemp1,bl

leasi,buf1

incsi

incsi

movcx,0

movcl,num1

deccl

jzl11

l1:

moval,ds:

[si]

movtempio,al

calloutput

incsi

loopl1

l11:

moval,temp1

cmpal,0dh

jzl12

movtempio,al

calloutput

decsi

l12:

incsi

callputs

callnewline

callnewline

;;;;;;;;;;;;;;;;;;;;1end

;;;;;;;;;;;;;;;;;;;;2start

movax,0

leasi,num2

callinput

moval,tempio

subal,'0'

movds:

[si],al

incsi

callinput

moval,tempio

subal,'0'

movds:

[si],al

incsi

callinput

moval,tempio

subal,'0'

movds:

[si],al

incsi

callinput

moval,tempio

subal,'0'

movds:

[si],al

callnewline

leasi,num2

movcx,4

movdx,0ah

l2:

cmpds:

[si],dl

jbl21

moval,ds:

[si]

subal,7

movds:

[si],al

l21:

incsi

loopl2

leasi,num2

movah,ds:

[si]

movcx,4

shlah,cl

incsi

movbl,ds:

[si]

addah,bl

incsi

moval,ds:

[si]

movcx,4

shlal,cl

incsi

movbl,ds:

[si]

addal,bl

movnum22,ax

;1

movdx,0

movcx,2710h

divcx

movtemp,dx

addax,'0'

movtempio,al

calloutput

movax,temp

;2

movdx,0

movcx,3e8h

divcx

movtemp,dx

addax,'0'

movtempio,al

calloutput

movax,temp

;3

movdx,0

movcx,64h

divcx

movtemp,dx

addax,'0'

movtempio,al

calloutput

movax,temp

;4

movdx,0

movcx,0ah

divcx

movtemp,dx

addax,'0'

movtempio,al

calloutput

movax,temp

;5

addax,'0'

movtempio,al

calloutput

callnewline

callnewline

;;;;;;;;;;;;;;;;;;;;2end

;;;;;;;;;;;;;;;;;;;;3start

leasi,tip2

callputs

callnewline

leasi,num3

movcx,20

l3:

callinput

movdl,''

cmpdl,tempio

jzl31

moval,tempio

subal,'0'

movds:

[si],al

incsi

deccx

jzl32

l31:

jmpl3

l32:

leasi,num3

leadi,num3t

movcx,10

l33:

movax,0

moval,ds:

[si]

movdl,10

muldl

incsi

addal,ds:

[si]

moves:

[di],al

incsi

incdi

loopl33

;sort

sort31:

leasi,num3t

movax,9

movnum32,ax

sort32:

moval,ds:

[si]

incsi

cmpal,ds:

[si]

jsskip31

xchgal,ds:

[si]

movds:

[si-1],al

skip31:

movcx,num32

decnum32

loopsort32

movcx,num31

decnum31

loopsort31

callnewline

movnum31,10

leasi,num3t

l34:

moval,ds:

[si]

movtempio,al

incsi

callprintnumb

callspace

movcx,num31

decnum31

loopl34

callnewline

callnewline

;;;;;;;;;;;;;;;;;;;;3end

;;;;;;;;;;;;;;;;;;;;4start

leasi,buf4

leadi,bp4

movcx,20

;input

l4:

moval,20

movds:

[si],al

movdx,si

adddx,2

moves:

[di],dx

incdi

incdi

callgets

addsi,23

loopl4

;sort

l41:

leasi,bp4

movax,19

movnum42,ax

l42:

movdi,ds:

[si+2]

movtemp,si

movax,ds:

[si]

movsi,ax

movcx,20

repecmpsb

jsskip41;不需修改

movsi,temp;修改

movax,ds:

[si]

xchgax,ds:

[si+2]

movds:

[si],ax

skip41:

movsi,temp

incsi

incsi

movcx,num42

deccx

movnum42,cx

inccx

loopl42

movcx,num41

deccx

movnum41,cx

inccx

loopl41

;ouput

callnewline

leadi,bp4

movcx,20

l43:

movtemp,cx

movsi,es:

[di]

callputs

callnewline

incdi

incdi

movcx,temp

loopl43

;;;;;;;;;;;;;;;;;;;;4end

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Q:

movah,4ch

int21h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

printnumb:

moval,tempio

movcl,4

shral,cl

leabx,tab

movah,0

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

moval,tempio

movcl,0fh

andal,cl

leabx,tab

movah,0

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

ret

printnum:

;outputtheASCIIintempW

;1

movax,temp

movcx,4

shrah,cl

moval,ah

movah,0

leabx,tab

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

;2

movax,temp

andah,0fh

moval,ah

movah,0

leabx,tab

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

;3

movax,temp

movcx,4

shral,cl

movah,0

leabx,tab

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

;4

movax,temp

andal,0fh

movah,0

leabx,tab

addbx,ax

movdl,ds:

[bx]

movah,2

int21h

ret

gets:

movah,10

movdx,si

int21h

callnewline

ret

pgets:

movcl,ds:

[si]

movch,0

incsi

incsi

lpgets:

moval,ds:

[si]

cmpal,0dh

jzpend

movtempio,al

calloutput

incsi

looplpgets

pend:

ret

puts:

movah,9

movdx,si

int21h

ret

input:

movah,1

int21h

movtempio,al

ret

newline:

movah,2

movdl,0dh

int21h

movah,2

movdl,0ah

int21h

ret

space:

movdl,''

movah,2

int21h

ret

output:

movah,2

movdl,tempio

int21h

ret

codesends

endstart

..

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

当前位置:首页 > 经管营销 > 企业管理

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

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