微机原理实验课设指导书11110Word格式.docx
《微机原理实验课设指导书11110Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理实验课设指导书11110Word格式.docx(132页珍藏版)》请在冰豆网上搜索。
例2:
用MASM命令汇编源程序
如果MASM命令显示了类似如上的处理结果,那么,表示源文件HELLO.ASM已成功汇编,并已生了其目标文件HELLO.OBJ。
例3:
如果MASM命令显示了类似如上的处理结果,那么,表示源文件有错,没有生成其目标文件。
在本例中,显示第16行有语法错:
非法的指令操作数。
这时,要用编辑器阅读源程序的第16行,看看输入指令时是否有误。
假如源程序有许多错误,很难记住全部出错位置,用列表文件来辅助查错。
例4:
在汇编源程序的同时,生成其列表文件。
列表文件HELLO.LST是一个文本文件,可用编辑器直接阅读,并可看出其错误的位置和原因。
下面是一个列表文件的实例。
三、连接
编译之后生成的OBJ文件,是一个浮动的目标文件,是不能执行的,必须经过连接这一步骤。
连接的过程就是调用连接程序(LINK.EXE)对OBJ文件进行定位、连接,最后生成扩展名为EXE的可执行文件。
如果需要也可以生成MAP文件。
MAP文件是内存分配文件,它列出了各个逻辑段起末的参考地址和段体长度。
通常没有必要生成MAP文件。
当由源文件汇编成功后,即可用连接程序(LINK.EXE)生成其可执行文件。
例5:
查看连接程序(LINK.EXE)的具体选项。
例6:
用连接程序生成EXE执行文件。
方法1:
这种方法需要确认连接过程中的各种文件名,如果使用文件名的默认值,那么直接按“回车”键即可。
在上面四个文件名中,最重要两个文件名是:
执行文件名和库文件名。
一般情况下,无需更换最终生成的执行文件名;
如果在连接过程中需要其它的库文件,则在显示第三行提示时,输入所需要的库文件名。
若HELLO.ASM源程序中没有设置堆栈段或堆栈段定义时没有指出STACK属性,用连接程序生成EXE执行文件时,最后一行显示一个警告信息,提出本程序没有定义堆栈段。
该警告信息可以不必理会,因为该执行文件是可运行的,在操作系统装入时会自动为其添加一个默认的堆栈段。
方法2:
在文件名后面加上分号“;
”,默认使用各类文件的缺省值。
例7:
用连接程序生成COM执行文件。
按照COM文件的汇编格式设计的源程序,按以下方法生成执行文件。
四、调试和运行
连接生成的EXE文件或COM文件可以直接键入文件名运行。
若当前目录下有同名的.EXE文件和.COM文件,键入不带扩展名时,则执行.COM文件。
例8:
运行HELLO.COM文件。
使用DEBUG调试工具能装入可执行文件进行调试。
DEBUG使用说明见附录Ⅰ。
例9:
装载HELLO.EXE,反汇编后,单步执行一次。
1.2实验
实验一汇编语言程序的格式及开发过程
一、实验目的
1)熟悉并掌握汇编语言源程序的编程格式;
2)掌握命令行方式下汇编语言程序的开发过程;
3)掌握MF平台中汇编语言程序的编写、调试方法。
二、实验设备
PC机一台
三、实验内容
分别在命令行方式和MF2KP环境下编辑、汇编、连接及调试给定的五种格式的程序,运行程序并记录运行结果,通过调试工具检查指令执行后相关寄存器的内容,检查程序执行前后各变量的内容。
读懂程序。
1).EXE文件的编程格式
利用程序开发工具,通常生成.EXE结构的可执行程序。
.EXE结构有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段。
(1)简化格式
程序的功能:
计算M-N+P
.MODELSMALL
.DATA
MDB30H
NDB20H
PDB40H
.CODE
.STARTUP
MOVBL,M
MOVAL,BL
SUBAL,N
ADDAL,P
.EXIT0
END
(2)完整格式1
显示10行HELLO
DATASEGMENT
MESGDB'
HELLO!
'
0AH,0DH,'
$'
DATAENDS
STACKSEGMENTPARASTACK'
STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
BEG:
MOVAX,STACK
MOVSS,AX
MOVSP,100
MOVAX,DATA
MOVDS,AX
MOVCX,10
LAST:
MOVAH,9
MOVDX,OFFSETMESG
INT21H
LOOPLAST
MOVAH,4CH
INT21H
CODEENDS
ENDBEG
(3)完整格式2
二进制到十六进制的转换
DATASEGMENT
BUFDW2468H
DATAENDS
MAINPROCFAR
ASSUMECS:
DATA
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVBX,BUF
MOVCH,4
ROTATE:
MOVCL,4
ROLBX,CL
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,07H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
DECCH
JNZROTATE
RET
MAINENDP
CODEENDS
ENDMAIN
2).COM文件的编程格式
.COM程序的所有代码、数据都在一个逻辑段内,不超过64KB。
在程序开发时,.COM文件的编程格式必须符合以下规定:
1.源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;
2.程序使用的数据,可以集中设置在代码段的开始或末尾;
3.在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令;
4.代码段目标块小于64KB。
按键响铃
.modeltiny
.code
.startup
movdx,offsetstring
movah,9
int21h
movah,01h
movah,02h;
响铃
movdl,07h
.exit0
stringdb‘Pressanykeytocontinue!
$’
end
(2)完整格式
统计键入字符‘0’和字符‘1’的个数。
C_SEGSEGMENT
C_SEG,DS:
C_SEG,ES:
C_SEG
ORG100H
BEGIN:
JMPSTART
MANDB?
WOMANDB?
NUMDW6
START:
MOVCX,NUM
MOVDX,0
INPUT:
MOVAH,1
CMPAL,'
1'
JZMANCNT
0'
JZWOMANCNT
JMPINPUT
MANCNT:
INCDL
JMPNEXT
WOMANCNT:
INCDH
NEXT:
LOOPINPUT
MOVMAN,DL
MOVWOMAN,DH
MOVAH,4CH
INT21H
C_SEGENDS
ENDBEGIN
四、实验步骤和要求
1)命令行方式
(1)开机启动计算机,进入DOS环境,键入F:
(CR)后,再键入CDMASM(CR),然后再键入CDBIN(CR)。
【说明:
(CR)表示回车,以下同,不再说明】
(2)键入EDIT,输入源程序。
按<
Alt>
+F,选择SAVE进行保存(扩展名为.ASM)。
+X退出编辑状态。
(3)键入MASM文件名(CR),进行汇编。
(4)键入LINK文件名(CR),进行链接,生成EXE文件。
(5)文件名(CR)执行程序。
(6)COM编程格式的文件键入LINK文件名/t(CR),进行链接,生成COM文件。
2)MF2KP环境
MF2KP使用方法见附录Ⅱ。
3)按实验报告书的要求完成实验及报告。
实验二基本结构程序设计实验
一、实验目的
1)掌握顺序、分支、循环程序结构设计的基本思想;
2)掌握转移指令的使用以及根据实际问题构成程序分支的方法;
3)掌握实现循环控制指令的使用以及根据实际问题构成循环程序结构的方法。
进行顺序、分支、循环三种基本结构的程序设计并调试、运行,要求记录调试过程并记录运行结果。
1)顺序程序设计——查表法实现一位16进制数转换为ASCII码显示。
参考程序:
.modelsmall
.stack256
.data
ASCIIdb30h,31h,32h,33h,34h,35h
db36h,37h,38h,39h
db41h,42h,43h,44h,45h,46h
Hexdb0bh
.code
movbx,offsetASCII
moval,hex
andal,0fh
xlat
movdl,al
movah,2
end
2)分支程序设计——求符号函数Y的值。
符号函数:
XDB-5
YDB?
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
MOVAX,DATA
MOVDS,AX
CMPX,0
JGEA1
MOVY,-1
JMPEXIT
A1:
JGA2
MOVY,0
A2:
MOVY,1
EXIT:
MOVAH,4CH
INT21H
ENDSTART
程序流程图:
3)循环程序设计——冒泡法排序
假设内存中BUF单元开始有若干个单字节无符号数,要求把它们按数值大小,从小到大重新排列。
算法描述:
①排序的关键问题是进行数的比较,首先设置一个交换标志(FLAG单元),每一轮比较开始,首先令交换标志FLAG=O,然后进行若干次相邻两单元的数的比较。
每次比较之后,把小数存入低地址单元,大数存入高地址单元。
只要发生—次数据交换,就令交换标志FLAG=1,如果没有进行数据交换,则FLAG应保持不变。
第一轮比较之后,最大数存入数组的末地址单元。
②每一轮比较结束,检查交换标志位,若FLAG=1进行下一轮比较,FLAG=0表示排序结束。
③N个数,第一轮比较N-1次,第二轮比较N-2次……。
datasegment
flagdb?
bufferdB7,2,9,3,6,1,4,5,8
ctequ$-buffer
dataends
codesegment
assumecs:
code,ds:
data
main:
movax,data
movds,ax
movdi,ct-1
lop1:
movcx,di
movbx,0
movflag,0
lop2:
movaL,buffer[bx]
cmpaL,buffer[bx+1]
jnacont
movflag,1
xchgaL,buffer[bx+1]
movbuffer[bx],aL
cont:
addbx,1
looplop2
cmpflag,0
jzover
decdi
jnzlop1
over:
movax,4c00h
int21h
codeends
endmain
按实验报告书的要求完成实验及报告。
实验三综合程序设计实验
1)掌握子程序的定义、调用与返回;
2)掌握应用子程序进行程序设计的方法;
3)了解模块化程序设计方法。
子程序结构程序设计并调试、运行;
模块化程序的连接及调试运行。
1)子程序设计———数制转换
从键盘输入10个有符号十进制数转换为补码表示的二进制数值送缓冲区。
子程序完成:
输入有符号10进制数,转换为补码表示的二进制数值。
负数用“-”引导,正数直接输入或用“+”引导;
子程序用AX寄存器传递出口参数。
.modelsmall
count=10
arraydwcountdup(0)
movcx,count
movbx,offsetarray
again:
callread
mov[bx],ax
incbx
calldpcrlf
loopagain
readproc
pushbx
pushcx
pushdx
xorbx,bx
xorcx,cx
movah,1
cmpal,’+’
jzread1
cmpal,’-’
jnzread2
movcx,-1
read1:
movah,1
read2:
cmpal,’0’
jbread3
cmpal,’9’
jaread3
subal,30h
shlbx,1
movdx,bx
addbx,dx
movah,0
addbx,ax
jmpread1
read3:
cmpcx,0
jzread4
negbx
read4:
movax,bx
popdx
popcx
popbx
ret
readendp
dpcrlfproc
MOVDL,0DH
MOVAH,02
INT21H
MOVDL,0AH
RET
dpcrlfendp
2)模块化程序设计———菜单程序设计
从程序的结构形式来说,一个模块是由END语句作为结束的一个完整程序。
在多模块程序设计过程中,可对各个源程序模块单独进行汇编产生相应的各目标模块,最后再由连接程序将各目标模块连接来构成一个完整的可执行程序。
为了解决模块间的过程调用和变量引用,汇编程序提供了两个属性伪指令:
外部名引用EXTRN和全局变量说明PUBLIC。
(1)外部名引用伪指令:
EXTRN
格式:
EXTRN标号:
类型[,…]
功能:
用EXTRN伪指令说明的标号,称为外部名,它指示在本模块中使用该标号,但是这个标号的定义是在要连接的其它模块中进行的。
这个标号可以是过程名,也可以是变量名。
类型则是指标号的类型。
一般都放在模块的最前面。
用EXTRN伪指令说明的外部名,必须在另一个模块中用PUBLIC伪指令定义为全局的变量或过程名。
(2)全局变量说明伪指令:
PUBLIC
PUBLIC标号[,…]
在一个模块中只有用PUBLIC说明的标号,才能够被其它模块做为外部名加以引用。
该名字必须在本模块中有定义。
PUBLIC语句可以在模块中的任何一行出现。
菜单程序设计的菜单界面如下:
它有三个选择项,用户键入:
1——在屏幕左上角显示一串字符HELLO
2——在屏幕左上角显示一串字符END
3——返回DOS
设计思路:
本菜单程序分三个模块实现
①主模块(文件名MAIN.ASM)
主模块的功能是在屏幕中央显示菜单界面,并且接受用户选择。
如果用户按下数字键l,即转向第一个子模块的入口SS1;
如果用户按下数字键2,即转向第一个子模块的入口SS2;
如果用户按下数字键3,返回DOS。
②第一个子模块文件名SUB1.ASM
该子模块的功能是:
从标号SSl入口,清屏幕,并且在左上角显示一串字符HELLO;
用户键入任意键后,转主模块标号BEG,重新显示菜单界面。
③第二个子模块文件名SUB2.ASM
从标号SS2入口,清屏幕,并且在左上角显示一串字符END;
;
FILENAMEMAIN.ASM
PUBLICAGAIN,MESG1,MESG2,MESG
EXTRNSS1:
FAR,SS2:
FAR
DATASEGMENT;
定义数据段
MESG1DB'
HELLO'
0DH,0AH,'
MESG2DB'
END'
MESGDB10DUP(0AH),'
Pleasestrikeanykey$'
N=25
TOPDB5DUP(0AH)
DBN+6DUP('
'
),'
MAINMENU'
0DH,0AH
DBNDUP('
---------------------'
|1:
DISPLAYHELLO|'
|2:
DISPLAYEND|'
|3:
RETURNDOS|'
DBN+3DUP('
CHOICE(1,2,3):
$'
DATAENDS;
数据段结束
CODESEGMENTBYTEPUBLIC'
CODE'
ASSUMECS:
MOVDS,AX
AGAIN:
MOVAX,2
INT10H
MOVAH,9
MOVDX,OFFSETTOP
CMPAL,'
JNZNEXT1
JMPSS1
NEXT1:
2'
JNZNEXT2
JMPSS2
NEXT2:
3'
JNZAGAIN
ENDBEG
------------------------------------------------------
FILENAMESUB1.ASM
PUBLICSS1
EXTRNMESG1:
BYTE,NEXT:
NEAR
CODE
SS1:
MOVAX,2
MOVDX,OFFSETMESG1
JMPNEXT
CODEENDS
END
-----------------------------------------------------
FILNAMESUB2.ASM
PUBLICSS2,NEXT
EXTRNMESG2:
BYTE,MESG:
BYTE
EXTRNAGAIN:
SS2:
INT10H
MOVDX,OFFSETMESG2
MOVDX,OFFSETMESG
MOVAH,1
INT16H
JZLAST
MOVAH,0CH
JMPAGAIN
模块化程序编译、连接说明:
分别汇编各模块生成MAIN.OBJ、SUB1.OBJ、SUB2.OBJ后,以“+”连接各模块进行连接,如:
LIN