东华大学微机实验报告复习资料软件3000字.docx

上传人:b****7 文档编号:15599867 上传时间:2023-07-06 格式:DOCX 页数:26 大小:21.04KB
下载 相关 举报
东华大学微机实验报告复习资料软件3000字.docx_第1页
第1页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第2页
第2页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第3页
第3页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第4页
第4页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第5页
第5页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第6页
第6页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第7页
第7页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第8页
第8页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第9页
第9页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第10页
第10页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第11页
第11页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第12页
第12页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第13页
第13页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第14页
第14页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第15页
第15页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第16页
第16页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第17页
第17页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第18页
第18页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第19页
第19页 / 共26页
东华大学微机实验报告复习资料软件3000字.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

东华大学微机实验报告复习资料软件3000字.docx

《东华大学微机实验报告复习资料软件3000字.docx》由会员分享,可在线阅读,更多相关《东华大学微机实验报告复习资料软件3000字.docx(26页珍藏版)》请在冰点文库上搜索。

东华大学微机实验报告复习资料软件3000字.docx

东华大学微机实验报告复习资料软件3000字

实验一debug的启动及其基本命令的使用实验二内存操作数及寻址方法实验三汇编语言程序的调试及运行实验四查表程序设计实验五系统功能调用实验六分支程序设计实验七循环程序设计实验八子程序设计实验九综合程序设计实验心得体会参考文献

实验一debug的启动及其基本命令的使用

源程序:

(指导书中给出)

datasegment

string1dbmovethecursorbackwardstring2dbmovethecursorbackwardmess1dbmatch.,13,10,$mess2dbnomatch.,13,10,$dataends

stacksegmentstackdb40dup(?

)stackends

prognamsegment

assumecs:

prognam,ds:

data,es:

data,ss:

stack

mainprocfarstart:

pushdsxorax,axpushax

movax,datamovds,axmoves,axmovax,stackmovss,ax

leasi,string1leadi,string2cld

movcx,25repzcmpsbjzmatch

leadx,mess2jmpshortdispmatch:

leadx,mess1disp:

movah,09hint21hret

mainendpprognamendsendstart

运行结果:

用debug调试将输出字符串改为‘nomatch’

用e指令修改“backward”为“forward”

再次用d命令查看修改结果。

用g命令运行程序

实验二内存操作数及寻址方法

1、

(1)程序说明:

设堆栈指针sp=2000h,ax=3000h,bx=5000h;请编一程序段将ax和bx的内容进行交换。

请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序。

(2)调试说明:

对sp的地址分配不到2000,计算机自动分配为0000,此时我就人为的把堆栈的首地址定义为2000。

(3)写出源程序清单和执行结果:

源程序:

stacksegmentstackdw100dup(0)stackendscodesegment

assumess:

stack,cs:

codestart:

movax,3000hmovbx,5000hmovsp,2000h

pushax;将ax中的内容压栈movax,bx;bx中的内容给axpopbx

movah,4chint21hcodeends

endstart

用debug调试结果:

 

2、程序说明:

用masm和link对以下程序进行汇编和连接,调试程序在debug调试程序状态下进行。

用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,ax中的内容是什么。

源程序:

datasegmentorg0300h

adb12h,23h,34h,45h,56h,67h,78h,89h,9ahdataends

prognamsegment

assumecs:

prognam,ds:

datastart:

movax,datamovds,ax

movbx,0300h

movax,0300h;立即数寻址

movax,[0300h];存储器寻址方式中的直接寻址方式movax,[bx];寄存器间接寻址movsi,2

movax,0001[bx];基址寻址movax,[bx][si];基址加变址

movax,0001[bx][si];带偏移量的基址加变址movah,4chint21hprognamendsendstart

用debug调试结果:

 

实验三算术运算指令

1、程序说明:

编写三个完整的汇编语言源程序,完成以下计算。

其中x、y、z、r、w均为存放16位带符号数单元的地址。

(1)z←w+(z-x)

(2)z←w-(x+6)-(r+9)

(3)z←(w*x)/(y+6),r←余数

2、调试说明:

当编译完成后,计算机未能生成.obj的文件,经检查错误发生在add使用上,我把两个寄存器操作数同时用在add语句里,结果出错了。

把add语句稍作写该后,程序运行正确。

3、写出源程序清单和执行结果

本实验我们只做前两个,即:

(1)z←w+(z-x);

(2)z←w-(x+6)-(r+9)

源程序:

(1)z←w+(z-x)

datasegment

xdd0001h

zdd0003h

wdd0005h

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movax,x

movbx,z

subbx,ax

movax,w

addbx,ax

movz,bx

movah,4ch

int21h

codeends

endstart

用debug调试结果:

源程序:

(2)z←w-(x+6)-(r+9)

datasegment

xdw0006h

rdw003ah

wdw0110h

zdw?

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movax,x

addax,6

movbx,r

addbx,9

movcx,w

sbbcx,ax

sbbcx,bx

movz,cxmovah,4ch

int21h

codeends

endstart

用debug调试结果:

 

实验四查表程序设计

1、程序说明:

用查表的方法将一位十六进制数转换成及它相应的ascii码,并将结果存放到asci单元中。

2、调试说明:

开始生成.obj文件时,调试不成功,以为是程序编译有误,后经再三检查都未发现错误,这时只好从头做检查,结果发现了错误:

从本实验有的提示语段中拷贝过来的语句书写有误,即符号的书写为中文书写,以至于整个程序未能通过编译。

把中文书写修改为英文书写后,编译成功。

3、源程序清单和执行结果:

源程序:

datasegment

tabledb30h,31h,32h,33h,34h,35h,36h,37h

db38h,39h,41h,42h,43h,44h,45h,46h

hexdb08h

ascidb?

dataends

codesegment

assumeds:

data,cs:

code

start:

movax,data

movds,ax

movbx,offsettable

moval,hex;查找对象的下标存在al中

xlat

movasci,al

movah,4ch

int21h

codeends

endstart

用debug调试结果:

 

实验五系统功能调用

1、程序说明:

试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

2、调试说明:

在debug显示字符窜时,曾显示乱码,未能按预期显示,经检查发现在编译字符窜时出现错误,因为调用21h中断输出一串字符要求用$结尾,我没用上‘$’。

还有,键盘输入字符是被存放在ax内,当要多次使用ax时应该把输入内容另存一地址

3、源程序清单和执行结果:

源程序:

datasegment

db?

dataends

stacksegmentstack

db5dup(0)

stackends

codesegment

assumeds:

data,ss:

stack,cs:

code

start:

movax,data

movds,ax

movah,01h;从输入端读取字符

int21h

subal,20h;小写转换成大写

movdl,al

movah,02h;输出字符到终端

int21h

movah,4ch

int21h

codeends

endstart

运行结果:

实验六分支程序设计

1、实验说明:

假设有一组数据:

5,-4,0,3,100,-51,请编一程序,判断:

每个数大于0,等于0,还是小于0;并输出其判断结果。

即:

1.当x>0当x=0

当x<0

2、调试说明:

在最初的程序中,我使用了movbx,xx等语句,后来发现像这样的语句在实际使用中有些累赘,于是我便做了修改,简化了汇编语言。

其次,在调试中,发现符号无法显示的问题,于是采用两次显示符号的方法,较理想的解决了负号问题。

3

4、源程序清单和执行结果:

源程序:

datasegmentxxdb05h,0fch,00h,03h,64h,0cdh

y1dby=1,0dh,0ah,$

y2dby=0,0dh,0ah,$

y3dby=-1,0dh,0ah,$

dataends

stacksegmentstack

db10dup(0)

stackends

codesegment

assumeds:

data,ss:

stack,cs:

code

start:

movax,data

movds,ax

leasi,xx

movax,0

movcx,6

l1:

moval,[si]

cmpal,0;及0比较

jgbiger

jeequal

movdx,offsety3

movah,09h

int21h

jmpoutput

biger:

movdx,offsety1

movah,09h

int21h

jmpoutput

equal:

movdx,offsety2

movah,09h

int21h

output:

incsi

loopl1

movah,4ch

int21h

codeends

endstart

运行结果:

思考题:

程序中的原始数据是以怎样的形式存放在数据区中的?

请用debug调试程序观察并分析。

以补码形式存放

实验七循环程序设计

实验内容:

1.编制程序计算s=1+2?

3+3?

4+4?

5+?

?

+n(n+1)+?

?

直到n(n+1)大于200为止,并将结果由屏幕上显示出来。

其程序的流程图如图7.1所示。

2.将从3000h内存单元开始的100个字节存储单元全部清0。

本实验要求在debug调试状态下进行,包括汇编程序、运行程序、检查结果。

源程序:

(1)编制程序计算s=1+2?

3+3?

4+4?

5+?

?

+n(n+1)+?

?

直到n(n+1)大于200为止,并将结果由屏幕上显示出来。

datasegment

resultdw?

dataends

stacksegmentstack

db10dup(0)

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movdx,1

movbl,2

lp:

moval,bl

addbl,1

mulbl

adddx,ax;dx中存放sum和

cmpax,200

jgoutput

looplp

output:

movbx,dx

movcx,4

lp2:

rolbx,1;bl存放和,移位,从高到低一位一位显示rolbx,1

rolbx,1

rolbx,1

movax,bx

andax,000fh;取bl中低四位

xordx,dx

addal,30h;十六进制转换成ascii码加30h

cmpal,3ah;0—9数字及a—f的ascii码不连续

jbpit

addal,07h;若比a(10)大,还要再加07h

pit:

movdl,al

movah,02h

int21hlooplp2

movah,4ch

int21h

codeends

endstart

运行结果:

(2)将从3000h内存单元开始的100个字节存储单元全部清0。

本实验要求在debug调试状态下进行,包括汇编程序、运行程序、检查结果。

datasegment

org3000h

xdb100dup(?

dataends

stacksegmentstack

db10dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

leasi,x

movcx,100

lp:

andbyteptr[si],00h

incsi

looplp

movah,4ch

int21h

codeends

endstart

运行结果:

先将内存单元赋值,用debug的e指令赋值,用d指令查看内存中的数据

再运行程序,将内存单元全部清零

实验八子程序设计

1、程序说明:

编制一程序,要求键入一个班的学生成绩,并存放于50字的erade数组中,然后根据erade中的成绩,把学生名次填入50字的rank数组中,再按学号顺序把名次从终端上显示出来。

提示:

①程序main

功能:

根据输入的学生成绩,计算并显示出学生名次。

②子程序input

功能:

接收一个班级学生的成绩,各成绩之间用空格隔开。

③子程序rankp

功能:

计算一个班级学生的名次。

④子程序output

功能:

输出(显示)一个班级的学生名次

⑤子程序decibin

功能:

十进制转换二进制,存入bx

⑥子程序bindec

功能:

十进制转换二进制,并在屏幕上显示。

⑦子程序dec_div

功能:

bx的内容除以cx的内容,并在屏幕上显示一位商。

源程序:

datasegment

gradedw50dup()

rankdw50dup()

enterdbgrades:

24h;提示用户输入成绩

errordb13,10,error!

13,10,24h;用户输入的格式出错showdbrank:

24h

countdw0;统计输入的成绩个数

crdb13,10,24h;换行

dataends

stacksegmentstack

db400dup(0)

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

moves,ax

callinput

callrankp

calloutputmovah,01h

int21h

movax,4ch

int21h

;input程序段

;以学号为序从键盘输入一个班的学生成绩,各个成绩之间用逗号格开,最后以回车符结束。

;然后把一个班的成绩存入grade数组。

inputprocnear

leadx,enter

movah,9

int21h;提示用户输入

movsi,0

movcount,0;将输入用户的输入个数置0

_enter:

;对用户的输入进行监视,对错误输入立即进行出错处理calldecibin;调用decibin;对用户输入进行处理

inccount

cmpdl,,;及,比较,相同则保存成绩,不同出错je_store

cmpdl,0dh;及回车键进行比较,回车则成绩输入结束je_endenter

jne_error;出错处理:

显示出错信息

_store:

;保存成绩

movgrade[si],bx

addsi,2

jmp_enter

_error:

leadx,error

movah,9

int21h

_endenter:

;用户结束成绩输入

movgrade[si],bx

movdx,offsetcr;换行

movah,9

int21h

ret

inputendp

;rankp程序段

;从grade数组取得一个班的成绩,以学号为序计算出该班每个学生的名次存入rank数组。

;算法为:

一个学生的名次等于成绩高于该生的学生人数加1

rankpprocnear

movdi,count

movbx,0

_loop:

movax,grade[bx];取学生成绩

movwordptrrank[bx],0;初始化rank[bx]的值为0movcx,count

leasi,grade;第一个学生的成绩_next1:

cmpax,[si];比较两个成绩

jg_jump;成绩大于被比较的跳过incwordptrrank[bx]

_jump:

addsi,2;取下一个被比较成绩的地址loop_next1

addbx,2;下一个成绩

decdi;未比较成绩个数减1jne_loop

ret

rankpendp

;output程序段

;从rank数组取得一个班的学生名次。

把一个班的学生名次以学号为序在终端显示出来;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.

outputprocnear

leadx,show

movah,09h

int21h

movsi,0

movdi,count

_next2:

movbx,rank[si];将成绩保存到bx中callbinidec;调用binidec

movdl,,

movah,02hint21h;显示,

addsi,02h;取下一个成绩名次decdi

jnz_next2

movdx,offsetcr;换行

movah,9

int21h

ret

outputendp

;decibin程序段

;从键盘取得一个十进制数。

把该数转换成二进制数并存入bx寄存器中。

decibinprocnear

movbx,0

_catch:

movah,01h

int21h

movdl,al

subal,30h

jl_endchange;小于则结束sfvof=1cmpal,39h

jg_endchange;大于则结束

cbw

xchgax,bx;ax及bx值交换movcx,10

mulcx;无符号数乘法指令,(ax)<----(al)*(cx)

xchgax,bx

addbx,ax;(bx)<------(bx)+(ax)jmp_catch

_endchange:

ret

decibinendp

;binidec程序段

;把bx寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。

调用dec_div来作除法运算并显示字符。

binidecprocnear

pushbx

pushcx

pushsi

pushdi;压栈

movcx,10

calldec_div;调用dec_div

movcx,1

calldec_div;调用dec_div

popdi

popsi

popcx

popbx;出栈

ret

binidecendp

;dec_div程序段

;把bx中二进制数除以相应的十的幂,并在屏幕上显示一位商。

余数保存在bx寄存器中。

dec_divprocnear

movax,bx

movdx,0

divcx

movbx,dx

movdl,al

adddl,30h

movah,02h

int21h;显示

ret

dec_divendp

codeends

endstart

运行结果:

1、思考题:

(1)写出4位bcd码转二进制数的算法。

设ax寄存器中存放着4位bcd码

bcdto2procnear

pushbx

pushcx

pushdx

movbx,ax;保存ax中的bcd码到bx

movax,0;结果单元清0

movcx,4;共处理4位bcd码

retry:

pushcx

movcl,4

rolbx,cl;最高1位bcd码移到bx中的低半字节popcx

mulw10;累加和axx10->dx:

axpushbx

andbx,000fh;取出bx中的1位bcd码

addax,bx;累加到ax中

popbx

loopretry

popdx

popcx

popbx

ret

bcdto2endp

(2)写出ax中进二制数转bcd码的算法。

w1000dw1000,100,10,1;十进制数千,百,十,个位权值;入口参数:

ax=二进制数。

出口参数:

ax=压缩bcd码

ax2tobcdprocnear

xorbx,bx;bcd码暂存单元清0

movsi,offsetw1000;权值首地址送si

movcx,4;循环次数4->cx

retry:

pushcx

movcl,4

shlbx,cl

movdx,0;dx:

ax组成被除数

divwordptr[si];除以权值,商,余数在ax,dx中

orbx,ax;压缩bcd码

movax,dx;余数送ax

popcx

addsi,2;地址加2,指向下一权值

loopretrymovax,bx;bcd码由bx->axret

ax2tobcdendp

实验九综合程序设计

设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。

试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。

源程序:

datasegment

s1dbbelow60:

$

s2db60~69:

$

s3db70~79:

$

s4db80~89:

$

s5db90~99:

$

s6db100:

$

xxdb76,69,84,90,73,88,99,63,100,80

countequ$-xx

numberdb6dup(0);存放每个数据段的人数

enterdb0dh,0ah,$;回车换行

dataends

stacksegmentstack

db10dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

callgrade

callshow

movah,4ch

in

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2