计算机体系结构与汇编编程实践_第1页
计算机体系结构与汇编编程实践_第2页
计算机体系结构与汇编编程实践_第3页
计算机体系结构与汇编编程实践_第4页
计算机体系结构与汇编编程实践_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4而大摩

CENTRALSOUTHUNIVERSITY

计算机构成与汇编

课程设计汇报

学生姓名2

指导教师杨希

学院信息科学与工程学院

专业班级计科0802

完毕时间2023年7月

目录

1.设计内容..........................................2

2.设计目日勺..........................................2

3.概要设计..........................................2

4.详细设计..........................................2

5.程序代码..........................................9

6.运行成果.........................................20

7.设计总结.........................................20

参照文献.............................................21

一、设计内容

1.输入20'30之间欧J「值,用递归计算Fibonacci数,以十进制数输出.

2.编写一拷贝程序,规定在命令行指定源文献名和目的文献名.

3.编写一种成绩记录程序,接受一批(最多20个)从键盘录入H勺0-100之间的十进制格

式的分数值,无数据直接回车时结束成绩录入。然后显示录入的总人数,总分,平均分

值(十进制整数格式),显示优秀,良好,中等,及格和不及格人数。(注:90以上优

秀80以上良好70以上中等60以上及格60如下不及格)

4.虚拟平台的模型机试验

二、设计目的

课程设计是计算机原理与汇编语言教学过程中H勺重要环节。本课程设计重要Id的是使计

算机专业学生深入学习计算机原理与汇编语言知识,深入提高学生计算机原理与汇编语言综

合能力和程序设计技能,锻炼运用计算机原理与汇编语言处理实际问题U勺能力。

三、概要设计

1、试验一是Fibonacci数列的求值,可通过递归调用实现。

2、试验二是规定复制文献,通过给出的文献名找到并打开文献,然后将文献内容读入内存,

建立一种新文献,将内存中的内容写入心文献中。

3、试验三规定对学生成绩进行记录,并输出有关信息。可先将输入数据读入一种数组中,每

读入一种数据,计算器家1,将读入的所有数据相加得到总分,并对每个数据进行比较,记

录对应等级。

4、试验三是虚拟试验,规定通过给出的多种芯片和元器件,连接成一种虚拟机,并进行有关

的指令操作。

四、详细设计

1、Fibonacci数列求值

算法思想是先将输入的字符存入数组中,然后将其转化为十进制数,再通过调用递归函数实

现求值,最终将成果转化为字符串后输出。重要代码如下:

数据段II勺定义:

datasegment;数据段

bufdb3,?,3dup(?)

bufldb5dup(?)

db'$'

bufZdbU

flagdb1

messldb'enterthenumber:',$

mess2db13,10,'result:','$'

buf3db1,24dup(0)

buf4db1,24dup(O)

dataends

输入参数并将参数转化为十进制数

leadx,messl;提醒输入

movah,9

int21h

movdx.offsetbuf:输入参数

movah.Oah

int21h

leasi,buf;计算参数E勺值

pushax

moval,0

subbyteptr[si+2],30h

addal.byteptr[si+2]

递归调用日勺子程序

code2segment;子程序

assumecs:code2,ds:data,ss:sseg

sumprocfar

leasi,buf3

cmpdl,buf2

jbsuml

jmpexit

suml:

incdl

leaditbuf4

movex,25

si:

movaI,[si]

movbl,[di]

add[di],al

cmpbyteptr[di],10d

jbs2

subbyteptr[di],10d

addbyteptr[si+l],l

s2:

mov[si],bl

incdi

incsi

loopsi

callsum

exit:ret

sumendp

code2ends

将成果输出

movdl.Odh:输出

movah,2

int21h

movdl.Oah

movah,2

int21h

2、文献复制

文献复制重要算法流程为先将输入的文献名存入一种缓冲区并打开文献,打开文献后,以

512个字节为单位将文献内容读入到内存缓冲区中,懂得源文献末尾。读完文献后,根据输

入的目日勺文献名创立文献,然后同样以512字节为单位将内存缓冲区中的字符串写入目日勺文

献中,写操作完毕后,关闭文献。其重要代码如下:

数据段:

dataSEGMENT

messlDB,Please,inputfilename:,,0DH,0AH,24H

1

mess2DBODH.OAH,'Please,inputdestinationfilename:107H,0DH,0AH)24H

fnfDBODH.OAH;filehasnotexisted!’,07HQDHQAH,24H

fdfDBODH.OAH,1Destinationfilehasexisted!',07H,0DH,0AH,24H

fdeDBODH.OAH.'Destinationpathhasnotexisted!',07H,0DH,0AH,24H

freDB0DH,0AH,'readingerror.',07H,ODH.OAH,24H

fweDBODH.OAH,'writtingerror.',07H,0DH,0AH,24H

fcsDBODH.OAH,'Filecopyedsucceed.,,0DH,0AH,24H

fbufferDB128;缓冲区

DB?

fnameDB128DUP(?);字符串名

fnum_sDW?;源文献号

fnum_dDW?;新文献号

bufferDB512DUP(?);字符串内容

dataENDS

存入文献名称:

fullO:LEADX.messl;提醒信息输出

MOVAH,9

INT21H

CLD

MOVCX,128招文献名存入fname中

MOVAL,0

LEADl.fname

REPSTOSB

字符读入内存:

readf:MOVBX,fnum_s;取源文献号

MOVCX.512;读出512个字符

MOVDX.OFFSETbuffer

MOVAH.3FH

INT21H

JNCwritef;读成功,则写

LEADXJre;不成功,显示错误信息,关闭文献,并结束程序

MOVAH,9

INT21H

JMPexit

字符写入目H勺文献:

writef:MOVBX,fnum_d;取新文献号

MOVCX,AX;按实际读入字数写文献

MOVAH.40H

INT21H

JNCcmpcx;写成功

LEADX.fwe;不成功,显示错误信息,关闭文献,并结束程序

MOVAH,9

INT21H

JMPexit

关闭文献:

exit:MOVAH.3EH:关闭文献

INT21H

MOVBXtfnum_s

MOVAH.3EH

INT21H

MOVAX,4C00H

INT21H

3、成绩记录程序

算法思想是先将键盘输入内字符串成绩转化为十进制后存入内存缓冲区中,读入的同步进行

计数。然后通过循环语句实现成绩的评估记录与累加过程,将总分除以计数器即得平均分。

最终将所得数据转化为字符串后显示出来。重要代码如下:

数据段:

DATASEGMENT

STRING1DB'PleaseInputScore:',"$,

STRING2DB'Thetotalnumber

STRINGSDB'Thesumis:':$,

STRING4DB'*********************',0AH,0DH,$

ENTER1DB0AH,0DH:$,

SCOREDW60DUPi:?);分派存储空间

TMPDB0,0,0,0

S5DW0;定义变量

S6DW0

S7DW0

S8DW0

S9DW0

S10DW0

TOTALSCOREDB0

DATAENDS

输入:

INPUT:输入一种字符

MOVAH,1

INT21H

CMPAL,30H

JBENTER2

CMPAL.39H

JNBINPUT

MOVAH,AL;AB=A*10+B

MOVBH.10

MOVAL.BL

MULBH

MOVBL,AL

JMPINPUT

显示总人数:

NUM:;显示总人数

MOVDX.OFFSETSTRING2;输出"thetotalnumberis:"

MOVAH.09H

INT21H

MOVAX,DI;outputthenuberofstudents

CALLB_TO_D

CALLOUTTMP

计算并显示总分:

SUM:;计算总分

MOVSl,6

MOVBX,SCORE[SI]

ADDAX.BX

SUBSI.2

JNSSUM

LEABX.TOTALSCORE

MOV[BX],AX

;显示总分

CALLB_TO_Djoutputthetotalscore

CALLOUTTMP

4、虚拟平台日勺模型机试验

模型机示意图:

根据上图进行连线,检查无误后开始进行测试,选择菜单中的“工具”,再选择“模型机

调试”,在指令输入窗口中输入如下指令:

000000()0

0001(X)00

00(X)1001

00100000

00(X)1011

00110000

00001011

01000000

()()(X)(X)()()

()()(X)(X)()1

这里做H勺是个加法运算,第一种加数已经存入到内存的0000101()单元中,第二个加数

是需要手工输入的。在试验运行面板中点击“运行”按钮,选择“输入”芯片,设置输入

的数据后,双击连接“输入”芯片的单脉冲,这样第二个加数就设置好了。在试验运行

面板中双击持续脉冲,模型机便开始工作。

五、程序代码

Fibonacci数列求值

datasegment;数据段

butdb3,?,3dup(?)

bufldb5dup(?)

db

buf2db0

flagdb1

messldb'enterthenumber:',$

mess2db13,10,'result:','$'

buf3db1,24dup(0)

buf4db1,24dup(O)

dataends

ssegsegmentstack;堆栈段

dw512dup(?)

ssegends

codelsegment;代码段

assumecs:codel,ds:data,ss:sseg

start:

xordx,dx

movax,data

movds,ax

leadx.messl

movah,9

int21h

movdx,offsetbut

movah.Oah

int21h

leasi.buf;计算参数内值

pushax

moval,0

subbyteptr[si+2],30h

addal,byteptr[si+2]

cmpbyteptr[si+3],30h

jbsuanl

movcl,10

mulcl

subbyteptr[si+3],30h

addal,byteptr[si+3]

suanl:

movbuf2,al

popax

movdl,2

pushsi

leadi,buf4

callfarptrsum

popsi

movdl.Odh;输出

movah,2

int21h

movdl.Oah

movah,2

int21h

leadx,mess2

movah,9

int21h

s3:

cmpflag.l

jnzs5

cmpbyteptr[di],0

jzs6

movflag.O

s5:

movdl,[di]

adddl,30h

movah,2

int21h

s6:

decdi

cmpdi.offsetbuf4

jaes3

movah,4ch

int21h

codelends

code2segment;调用函数

assumecs:code2,ds:data,ss:sseg

sumprocfar

leasi,buf3

cmpdl,buf2

jbsuml

jmpexit

suml:

incdl

leadi,buf4

movex,25

si:

movaI,[si]

movbl,[di]

add[di],al

empbyteptr[di],10d

jbs2

subbyteptr[di],10d

addbyteptr[si+l],l

s2:

mov[si],bl

incdi

incsi

loopsi

callsum

exit:ret

sumendp

code2ends

endstart

文献复制

dataSEGMENT

messlDBPlease.inputfilename:',UDH,0AH,Z4H

mess2DBODH.OAH,'Please,inputdestinationfilename:',07H,0DH,0AH,24H

fnfDBODH.OAH;filehasnotexisted!,,07H,0DH,0AH,24H

fdfDBODH.OAH;Destinationfilehasexisted!1,07H,0DH,0AH,24H

fdeDBODIl,OAI1,'Destinationpathhasnotexisted!,,071l,ODIl,OAI1,2411

freDBODH.OAH.'readingerror.1107H,0DH,0AH,24H

fweDBODH.OAH.'writtingerror.',07H,0DH,0AH,24H

fcsDBODH.OAH,'Filecopyedsucceed.*,ODH,OAH,24H

(bufferDB128

DB?

fnameDB128DUP(?)

fnum_sDW?

fnum_dDW?

bufferDB512DUP(?)

dataENDS

codeSEGMENT

ASSUMECS:code,DS:data

start:MOVAX,data

MOVDS,AX

PUSHDS

POPES

fullO:LEADX.messl

MOVAH,9

INT21H

CLD

MOVCX,128

MOVAL,0

LEADl.fname

REPSTOSB

LEADX.fbuffer

MOVAH.OAH

INT21H

MOVBL,[fbuffer+l],将输入文献名日勺最终一种回车符换成0,由于建立日勺文献名

不能包括不可见字符

XORBH.BH

MOVSI.OFFSETfname

ADDSI.BX

MOVBYTEPTR[SI],0

LEADX,fname

MOVAX,3D00H

INT21H

JNCopen;打开成功

LEADX.fnf

MOVAH,9

INT21H

JMPfullO:重新输入

open:MOVfnum_s,AX;打开成功,保留源文献号

fulll:LEADX,mess2

MOVAH,9

INT21H

CLD;充0,将上次输入的文献名清零

MOVCX,128;文献名最大128字符,包括回车符

MOVAL,0

LEADl.fname

REPSTOSB

LEADX.fbuffer;输入文献名

MOVAH.OAH键盘输入到缓冲区DS:DX二缓冲区首地址

INT21H

MOVBL,[fbuffer+l]

XORBH,BH

MOVSI,OFFSETfname

ADDSI.BX

MOVBYTEPTR[SI],0

LEADX,fname

MOVAX,3D00H

INT21H

JCsetup;打开不成功

LEADX.fdf

MOVAH,9

INT21H

JMPexit

setup:LEADX.fname

MOVAH,3CH;建立新文献

INT21H

JNCsave;建立成功

LEADX.fde

MOVAH,9

INT21H

JMPexit

save:MOVfnum_d,AX;保留新文献号

MOVAX,3D01H;以只写方式打开新文献

INT21H

readf:MOVBX,fnum_s;取源文献号

MOVCX,512读出512个字符

MOVDX.OFFSETbuffer

MOVAH.3FH

INT21H

JNCwritef;读成功,则写

LEADX.fre;不成功,显示错误信息,关闭文献,并结束程序

MOVAH,9

INT21H

JMPexit

writef:MOVBX,fnum_d;取新文献号

MOVCX,AX;按实际读入字数写文献

MOVAH.40H

INT21H

JNCempex;写成功

LEADX,fwe;不成功,显示错误信息,关闭文献,并结束程序

MOVAH,9

INT21H

JMPexit

cmpcx:CMPCX,512;判断实际读入的字数是不是512

JEreadf;假如是512,阐明还没读到文献尾

1

LEADX,fcs;显示‘复制成功’

MOVAH,9

INT21H

exit:MOVAH.3EH;关闭文献

INT21H

MOVBXtfnum_s

MOVAH,3EH

INT21H

MOVAX,4C00H

INT21H

I

codeENDS

ENDstart

成绩记录

DATASEGMENT

STRING1DB'PleaseInputScore:',"$'

STRING2DB'Thetotalnumberis:',,$'

STRING3DB'Thesum

STRING4DB**********************,^AH.ODH.S1

ENTER1DB0AH,0DH,'$,

SCOREDW60DUPi?);分派存储空间

TMPDB0,0,0,0

S5DW0;定义变量

S6DW0

S7DW0

S8DW0

S9DW0

S10DW0

TOTALSCOREDB0

DATAENDS

;STACKSEGMENT;堆栈段

;DW64DUP(O)

;STACKENDS

CODESEGMENT代码段

ASSUMECS:CODE,DS:DATA;,SS:STACK

MAINPROCFAR

MOVAX,DATA

MOVDS,AX

;MOVAX,STACK

;MOVSS.AX

XORBX.BX;寄存器清零

XORCX.CX

XORSI.SI

XORDI.DI

CALLINSCORE

CALLSUMSCORE;

MOVAH.4CH返回DOS

INT21H

MAINENDP

B_TO_DPROCNEAR

PUSHBX

PUSHSI

PUSHCX

MOVCX,03H

INIT:

MOVSI,CX

MOVTMP[SI],0

DECCX

JNSINIT

THOUSAND:

SUBAX.30H

CMPAX,1000

JBHUNDREAD

MOVSI.03H

MOVBH.10

DIVBH

MOVTMP[SI],AH

HUNDREAD:

JBTEN

CMPAX,100

MOVSL02H

DIVBH

MOVTMP[SI],AH

TEN:

CMPAX,10

JBONE

MOVSI,01H

DIVBH

MOVTMP[SI],AH

DECSI

MOVTMP[SI].AL

POPSI

POPBX

POPCX

RET

ONE:

MOVSI,0

MOVTMP[SI],AL

POPBX

POPSI

RET

B—TO—DENDP

OUTTMPPROCNEAR

PUSHs-

PUSHCX

MOVex-3

OUTPUT-

MOVSL3

MOVDL_TMP-S=

MOVAHO2H

-NT21H

LOOPOUTPUT

POPs-

POPCX

RET

OUTTMPENDP

ZSCOREPROCNEAR

PUSHAX

PUSHBX

PUSHDX

PUSHDI

PUSHSI

MOVDX,OFFSETSTRING1输入“pleaseinputthescore"

MOVAH.09H

INT21H

MOVDX,OFFSETENTER1输出“回车”

MOVAH.09H

INT21H

INPUT:;输入一种字符

MOVAH,1

INT21H

CMPAL.30H

JBENTER2

CMPAL.39H

JNBINPUT

MOVAH,AL;AB=A*10+B

MOVBH.1O

MOVALBL

MULBH

MOVBL,AL

JMPINPUT

ENTER2:

CMPAL,0DH;与否为回车键

JZOVER是就跳到OVER

SPACE2:

CMPAL.20H;与否为空格

JZSAVE;是就跳到SAVE

JMPINPUT

SAVE:保留到SCORE中

MOVAL,BL

CBW

MOVSCORE[SI],A:<

ADDSl,2

INCDI

JMPINPUT

OVER:;保留最终一种数据,并寄存到SCORE中

MOVAL.BL

CBW

MOVSCORE[SI],AX

INCDI

MOVDL.OAH

MOVAH.02H

INT21H

NUM:;显示总人数

MOVDX,OFFSETSTRING2;输出“thetotalnumberis:"

MOVAH.09H

INT21H

MOVAX,DI;outputthenuberofstudents

CALLB_TO_D

CALLOUTTMP

MOVDX,OFFSETENTER1:输出“回车”

MOVAH.09H

INT21H

POPAX

POPBX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论