南昌大学微型计算机原理与接口技术实验报告Word文档下载推荐.docx
《南昌大学微型计算机原理与接口技术实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《南昌大学微型计算机原理与接口技术实验报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
datasegment;
definedatasegment
source_bufferdb40dup('
a'
dataends
extrasegment;
defineextrasegment
dest_bufferdb40dup(?
extraends
codesegment;
definecodesegment
mainprocfar;
mainpartofprogram
assumecs:
code,ds:
data,es:
extra
start:
;
startingexecutionaddress
;
setupstackforreturn
pushds;
saveolddatasegment
subax,ax;
putzeroinAX
pushax;
saveitonstack
setDSregistertocurrentdatasegment
movax,data;
datasegmentaddr
movds,ax;
intoDOSregister
setESregistertocurrentextrasegment
movax,extra;
extrasegmentaddr
moves,ax;
intoESregister
MAINPARTOFPROGRAMGOESHERE
leasi,source_buffer;
putoffsetaddrofsource
bufferinSI
leadi,dest_buffer;
putoffsetaddrofdest
bufferinDI
cld;
setDFflagtoforward
movcx,40;
putcountinCX
repmovsb;
moveentirestring
ret;
returntoDOS
mainendp;
endofmainpartofprogram
codeends;
endofcodesegment
endstart;
endassembly
上机调试结果如下:
1、输入指令masmex_movs输出结果如下:
2、用LINK产生exe文件
3、程序的执行,用反汇编命令U来确定所要设定的断点地址
4、用G命令使程序运行,查看运行结果
实验心得:
通过此次实验,了解了汇编语言的上机环境以及上机过程,同时学会了如何通过指令来处理调试程序以及查找、修改程序中的错误,最终得到我们想要的实验结果。
实验二、BCD数运算与十进制调整
1、熟悉BCD码的基本知识
2、熟悉汇编语言BCD码多字节加减法基本指令的使用方法;
3、掌握BCD码调整指令的使用方法。
实验原理:
BCD码也叫8421码就是将十进制的数以8421的形式展开成二进制。
BCD码的运算规则:
BCD码是十进制数,而运算器对数据做加减运算时,都是按二进制运算规则进行处理的。
这样,当将BCD码传送给运算器进行运算时,其结果需要修正。
修正的规则是:
当两个BCD码相加,如果和等于或小于1001(即十进制数9),不需要修正;
如果相加之和在1010到1111(即十六进制数0AH~0FH)之间,则需加6进行修正;
如果相加时,本位产生了进位,也需加6进行修正。
这样做的原因是,机器按二进制相加,所以4位二进制数相加时,是按“逢十六进一”的原则进行运算的,而实质上是2个十进制数相加,应该按“逢十进一”的原则相加,16与10相差6,所以当和超过9或有进位时,都要加6进行修正。
4位BCD码相加,实验程序如下:
STACKSEGMENTSTACK
DB100DUP(?
STACKENDS
DATASEGMENT
X1DB4DUP(?
X2DB4DUP(?
X3DB5DUP(?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
MAINPROC
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETX1
MOVCX,4
NEXT1:
CALLINPUT
ANDAL,0FH
MOV[BX],AL
INCBX
LOOPNEXT1
MOVAH,2
MOVDL,'
+'
INT21H
MOVBX,OFFSETX2
NEXT2:
LOOPNEXT2
='
MOVSI,OFFSETX1+3
MOVDI,OFFSETX2+3
MOVBX,OFFSETX3+4
ORCX,CX
NEXT3:
MOVAL,[SI]
ADCAL,[DI]
AAA
DECSI
DECDI
DECBX
LOOPNEXT3
MOVAL,0
ADCAL,AL
MOVCX,5
NEXT4:
MOVDL,[BX]
ADDDL,30H
LOOPNEXT4
MOVAH,4CH
MAINENDP
INPUTPROC
AGAIN:
MOVAH,8
CMPAL,'
0'
JBAGAIN
9'
JAAGAIN
MOVDL,AL
RET
INPUTENDP
CODEENDS
ENDMAIN
调试结果如下:
1235和5689是从键盘中输入的4位非压缩的BCD码,06294为调整后的相加结果。
加深了自己对BCD码得认识,对其运算法则有了更深刻的了解。
巩固了自己的基础理论知识,通过实验,我对汇编语言编程也有了一定的了解,不像以前那样生疏。
实验三、键盘输入与回显
1、熟悉DOS功能的9号功能,从键盘输入并在显示器上显示字符串
2、熟悉DOS功能调用指令INT21H
1、单字符输入
功能号1、7和8都可以接收键盘输入的单字符串,输入字符以ASCII码形式存放在累加器AL中。
其中7号和8号功能无回显。
2、字符串输入
输入字符串可以通过调用DOS功能的0AH号功能实现。
3、单字符显示
在显示器上显示的内容都是字符形式,如果是数字,则一定是其对应的ASCII码。
要将一个字符串送到显示器显示,可调用DOS功能的2、6、9号功能实现。
其中2、6用于显示单个字符,功能9显示一个字符串。
4、字符串显示
要在显示器上显示字符串,可调用DOS功能的9号功能,该功能要求被显示的字符串必须以“$”字符作为结束符,否则会引起屏幕混乱。
5、返回DOS
用4CH号功能返回DOS的程序段:
MOVAH,4CH
INT21H
从键盘读入一串字符,在字符串尾插入一个“$”,并显示该字符。
实验程序如下:
JICUNDB?
ASSUMECS:
DATA
START:
MOVAX,DATA
MOVAH,1
MOVJICUN,AL
ENDSTART
运行结果如下:
在字符串显示的功能调用中,要求被显示的字符串必须以“$”字符结尾,在调试中忽略了这个问题,造成了屏幕混乱。
实验四、字符串匹配
1.掌握变量的基本使用方法。
2.掌握字符串的输入输出方法的使用。
3.掌握数据段的定义方式。
编程接收用户从键盘键入的一个关键字以及一个句子,如果句子中不包含关键字则显示‘Nomatch!
’,如果句子中含有关键字则显示‘Match!
’,并把该字在句子中的位置用十六进制数显示出来。
STR1DB'
NHALLO$'
NEQU$-STR1
MESSDB'
NOMATCH!
$'
DATAENDS
DATA1SEGMENT
STR2DB'
HELLOA$'
MEQU$-STR2
DATA1ENDS
CODESEGMENT
ASSUMECS:
DATA,ES:
DATA1
START:
MOVAX,DATA
MOVDS,AX
MOVAX,DATA1
MOVES,AX
MOVAL,N
CMPAL,M
JNZEXIT
LEASI,STR1
LEADI,STR2
MOVCL,N
MOVCH,0
CLD
REPECMPSB
JNZEXIT
LEADX,STR1
JMPL1
EXIT:
LEADX,MESS
L1:
MOVAH,9
INT21H
MOVAH,4CH
CODEENDS
ENDSTART
本实验中在进行字符串比较时从字符串长度和个对应的字符两方面来比较。
先判断字符串的长度,长度不相同,则字符串不匹配;
若长度相同,再逐个比较相对应的字符,只有两字符串完全相等时,才输出字符串信息,否则显示“NOMATCH!
”
实验五、子程序设计(计算N!
1、通过调用求N!
的子程序求一个数的阶乘
2、掌握子程序的设计方法,调用方法,返回方法
3、学会一种算法:
递归调用
堆栈保护及递归算法,用递归算法计算3!
,实验程序如下:
NDW3
RESULTDW?
STACKSEGSEGMENT
DW128DUP(0)
TOSLABELWORD
STACKSEGENDS
MAINPROCFAR
STACKSEG
MOVAX,STACKSEG
MOVSS,AX
MOVSP,OFFSETTOS
PUSHDS
SUBAX,AX
PUSHAX
MOVBX,N
PUSHBX
CALLFACT
POPRESULT
FACTPROCNEAR
PUSHBP
MOVAX,[BP+6]
CMPAX,0
JNZFACT1
INCAX
JMPEXIT
FACT1:
DECAX
POPAX
MOVDX,[BP+6]
MULDX
EXIT:
MOV[BP+6],AX
POPBP
FACTENDP
程序运行结果如下:
程序中要计算的是3!
,在数据段查看的结果如下图:
查看堆栈段:
这个程序,输入只能是3以下而且输出也是ASCⅡ,所以在算完之后要在屏幕上显示,还要转换成ASCⅡ,否则就是乱码
实验六、中断程序设计
1、熟悉中断的相关知识;
2、熟悉中断向量的功能调用;
3、掌握中断处理程序的设计方法。
编写一个程序实现每10S响铃一次,并在屏幕上显示“Thebellisringing!
DSEGSEGMENT
COUNTDW1
MESSDB‘THEBELLISRINGING!
’,0DH,0AH,’$’
DSEGENDS
CSEGSEGMENT
CSEG,DS:
DSEG
SUBAX,AX
MOVAX,DSEG
MOVDS,AX
MOVAL,1CH
MOVAH,35H
PUSHES
MOVDX,OFFSETRING
MOVAX,SEGRING
MOVDS,AX
MOVAX,251CH
POPDS
INAL,21H
ANDAL,11111110B
OUT21H,AL
STI
MOVDI,2000
DELAY1:
MOVSI,3000
DELAY2:
JNZDELAY2
JNZDELAY1
POPDX
MOVAH,25H
RINGPROCFAR
PUSHCX
PUSHDX
STI
DECCOUNT
JNZEXIT
MOVDX,OFFSETMESS
MOVAH,09H
MOVDL,07H
MOVAH,02H
MOVCOUNT,182
CLI
POPCX
IRET
RINGENDP
CSEGENDS
ENDSTART
本实验做的是中断程序设计,通过此次实验,对中断服务子程序的设计有了更深的了解。
这是我们做的最后一个实验,通过这几次实验,我的运用汇编语言编程的能力有了很大的提高,获益颇丰。