1
实验一基本程序编程和程序调试
一、实验目的
1、掌握数码转换等基本程序设计的技巧和方法。
2、熟悉DEBUG命令。
3、学会和掌握用DEBUG调试程序的方法。
二、实验设备
PC机一台,装有DOS基本系统
三、实验内容及步骤
用DEBUG建立、汇编和运行调试程序的操作。DEBUG是DOS系统支持的用于汇编语言源程
序调试的系统软件。它共有19条命令完成相应的功能,命令及其格式可参阅附录一。
(一)DEBUG操作练习
1)实验调试程序
程序的功能是从3500H内存单元开始建立0-15共16个数据。程序如下:
地址(H)机器码(H)助记符
2000BF0035MOVDI,3500
2003B91000MOVCX,0010
2006B80000MOVAX,0000
20099ESAHF
200A8805MOVBYTE[DI],AL
200C47INCDI
200D40INCAX
200E27DAA
200FE2F9LOOP200A
2011F4HLT
2)实验步骤:
(1)输入与修改
①启动DOS,在DOS提示符下输入DEBUG后回车,屏幕立即显示DEBUG提示符“—”,
表明已进入DEBUG状态,可以执行DEBUG的各种命令。
②用DEBUG中的汇编命令“语言文字工作总结 A地址”将程序建立在内存单元中。在提示符“—”下键入:
2
“A2000”此时显示器上将会显示程序的段地址CS和偏移地址IP,你就可以输入以上的程序
了。即
显示169C:2000键入MOVDI,3500
169C:2003MOVCX,0010
169C:2011HLT
:::
③用反汇编命令“U地址”检查程序
在提示符“—”下,键入“U2000”,将从2000内存单元开始的内容反汇编,屏幕上显示
169C:2000BF0035MOVDI,3500
169C:2003B91000MOVCX,0010
169C:2006B8000MOVAX,0000
:::
:::
169C:2011F4HLT
当发现程序有错时,可用汇编命令“A地址”进行修改,如要修改200A单元中的指令,则键入
“A200A”,屏幕显示169C:200A,然后再键入MOVBYTE[DI],AL,就把错误的程
序改正了。
(2)显示和修改数据
①用修改内存单元命令“E地址”在指定内存单元中存入一个数。
如要在3500为首址的单元中存入14H和25H两个数据,可在提示符“—”下,键入:“3500”
3
显示169C:3500.键入14,按空格键
.25,按空格键
②用显示内存命令“D地址”检查指定单元的内容
在提示符“—”下,键入“D3500”
显示1489:35„„„„
1489:3510********„„„„
::
::
1489:3570********„„„„
若某单元内容有错则可用命令:“E地址”进行修正。
③用显示和修改命令“R”或“R寄存器名”显示寄存器或修改其内容
在提示符“—”下,键入“R”
显示AX=0000BX=0000CX=0000DX=0000SP=FFEE„„„„„„„„
DS=169CES=169CSS=169CCS=169CIP=2000„„„„„„„„„
要修改IP的内容时,键入命令“RIP”后,显示IP2000,在2000之后键入新内容。
(3)程序运行
程序的运行方式有单步运行、断点运行和连续运行几种方式。
①单步运行
输入DEBUG跟踪命令“T”或“T=地址”或“T=地址指定次数”,可从指定地址处运行该单元
中的一条指令,以后只要连续输入“T”命令就桃花怎么画 能连续执行一条一条指令。
如在提示符“—”下,键入“T=2000”
显示:
AX=0000BX=0000CX=001DDX-0000SP=FFEEBP=0000SI=0000DI=0000
DS=169CES=169CSS=169CCS=169CIP=2000NV„„„
169C:2003B91000MOVCX,0010
4
②断点运行
用运行命令“G=地址地址断点地址断点„”执行指定地址的程序
在提示符“—”下,键入“G=20002011”
显示169C:2011F4HLT表示这段程序已经执行完毕。
③连续运行
5
输入DEBUG命令“G=地址”,执行指定地址的程序
(4)用显示内存命令检查运行结果
在提示符“—”下,键入命令“D地址”,根据其中的内容判断程序运行是否正确。
如检查以上程序执行后的结果,在提示符“—”下,键入“D3500”,可显示
169C:35„„15
169C:3510
(二)数码转换程序及其调试
1、将ASCII码表示的十进制数转换为二进制数
1)程序设计的算法及其程序
十进制数据可表示为:
D
I
代表十进制数1,2,3,„9,0
上式可转换为:
由式(2)可归纳十进制数转换为二进制数的方法:从十进制的最高位Dn开始乘10加次位的操
作,将结果再乘10再加下一次位,如此重复,则可求出二进制数结果来。程序流程及参考程序如图
1-1。这里我们规定:被转换的ASCII码十进制数存放在3500H——3504H单位中。而转换结果存放
在3510H——3511H单元中。
2)实验步骤
)(
i
n
i
i
n
n
n
n
DDDD
)())))((
DDDDDD
nnn
i
n
i
i
(
6
(1)输入程序并检查无误。
(2)在3500H——3504H单元存入十进制数12的ASCII码,即E3500H↙,并输入3030303132H。
(3)G=2000↙,运行程序,并用CTRL+C来中断程序返回监控状态。
(4)用D3510↙来查看结果,应为:35100C00
(5)反复试几组数,考查程序的正确性。
地址(H)助记符注释
2000MOVSI,3500;源地址
2003MOVDI,3510;结果地址
2006MOVBX,000A;乘数10
2009MOVCX,0004;计数
200CMOVAH,00;AH清零
200EMOVAL,[SI];取被转换数
2010SUBAL,30;ASCII码变十进制数
2012IMULBX;高位(AX)*(BX)送AX
2014ADDAL,[SI+01];取下一位
7
1017SUBAL,30;ASCII码减30变十进制数
2019INCSI;源地址指针+1
201ALOOP2012;CX-1,若CX不等于零则继续
201CMOV[DI],AX;若CX等于零则存结果
201EINT3
图1-1
2将十进制数的ASCII码转换为BCD码
1)程序流程和程序
设从键盘输入的五位十进制数的ASCII码已存放在3500H起始的内存单元内,把它转换成BCD
码后,再按位分别存入350AH起始的内存单元内。若输入的不是十进制数的ASCII码,则对应存放
结果的内容为“FF”。一字节ASCII码取其低四位即变为BCD码,程序流程图及考程序如图1-2所
示。
2)实验步骤
(1)输入程序并检查无误。
(2)在3500H——3504H单元中存入五位十进制数的ASCII码,即
E3500↙,并输入31,32,33,34,35。
(3)G=2000↙,运行以上程序。
(4)D350A↙,显示结果为:
0000:350ACC„
8
(5)反复试几组数,考查程序的正确性。
地址(H)助记符注释
2000MOVCX,0005;循环计数器赋初值
2003MOVDI,3500;ASCII码首址
2006MOVBL,FF;错误标志送BL
2008MOVAL,[DI];送ASCII码至AL
200ACMPAL,3A;比较AL与3AH
200CJNB2014;不低于3A则转2014
200ESUBAL,30;低于3A则取ASCII码的低四位
2010JB2014;低于30则转2014
2012MOVBL,AL;否则AL内容送BL,取代FF
2014MOVAL,BL;结果或错误标志送AL
2016MOV[DI+0A],AL
2019INCDI
9
201ALOOP2006
201CINT3
图1-2
3将十六位二进制数转换为ASCII码表示的十进制数
1)程序及其流程
十六位二进制数的值域为0——65535,最大可转换为五位十进制数。
算法:五位十进制数可表示为:
Di:表示十进制数0——9。
因此,将十六位二进制数转换为五位ASCII码表示表示的十进制数,就是求D
1
——D
4
,并将它
化为ASCII码。程序流程图如图1-3所示,设源数据存于3500——3501H单元中,结果数存于3510
——3514H单元中。
2)实验步骤
(1)输入程序并检查无误。
(2)在3500——3501H单元中存放0C00,运行程序并检查结果,应看到3510——3514H单元中
的数依次为3高压海参 030303132。
DDDDDN
D
10
(3)反复试几组数,并运行程序、观察结果。
地址(H)助记符注释
2000MOVDX,[3500];取二进制数
2004MOVSI,3515;目标首址在3510
2007DECSI
2008MOVAX,DX
200AMOVDX,0000
200DMOVCX,000A
2010DIVCX;;除10
2012XCHGAX,DX
2014ADDAL,30
2016MOV[SI],AL
2018CMPDX,0000
201BJNE2007
201DCMPSI,3510;填余下高位为0
11
2021JZ202A;
2023DEC世界最大的城市广场 SI
2024MOVAL,30
2026MOV[SI],AL
2028JMP201D
202AINT3
图1-3
4、十六进制数转换为ASCII码
1)程序及其流程
经过CPU处理后的十六进制数存放在起始地址为3500H的内存单元中,把它们转换成ASCII
码之后,再分别存入起始地址为350AH的内存单元中。
从表2-1中可知,十六进制数加30H即可得到0H——9H的ASCII码,而要得到AH——FH的
ASCII码,则需再加7H。程序流程图及参考程序如图1-4所示。
2)实验步骤
(1)输入程序并检查无误。
(2)在3500——3501H单元中存入四位十六进制数203B,即
E3500↙,并输入3B,20。
(3)G=2000↙,运行以上程序
(4)D350A↙,显示结果为:
0000:350A42333032CC„
输入数据与结果ASCII码对应顺序相反。
12
(5)反复试几组数。考查程序的正确性。
地址(H)助记符注释
2000MOVCX,0004
2003MOVDI,3500
2006MOVDX,[DI]
2008MOVAX,DX
200AANDAX,000F;取低四位值
200DCMPAL,0A;;判是否“0”-“9”
200FJB2013;是“0”-“9”转2013
2011ADDAL,07;是“A”-“F”,加7
2013ADDAL,30;转换为ASCII码
2015MOV[DI+0A],AL
2018INCDI
2019PUSHCX;保护循环计数器内容
13
201AMOVCL,04;移位次数送CL
201CSHRDX,CL
201EPOPCX
201FLOOP2008
2021INT3
图1-4
5BCD码转换为二进制数
1)程序及其流程
设四个二位十进制数的BCD码存放在起始地址为3500H的单元中,转换出的二进制数码存入
起始地址为3510H的内存单元中,程序流程图及参考程序如图1-5所示。
地址(H)助记符注释
2000MOVCX,0004
2003MOVDI,3500
2006MOVAL,[DI]
2008ADDAL,AL;乘2
200AMOVBL,AL
2锦的成语 00CADDAL,AL;乘2
200EADDAL,AL;乘2
2010ADDAL,BL;乘10
2012INCDI
2013MOVAH,00
2015ADDAL,[DI];BCD码十位与个位加
2017MOV[DI+0F],AX;存结果图1-5
201AINCDI
201BLOOP2006
201DINT3
2)实验步骤
(1)输入程序并检查无误。
14
(2)在3500——3507单元中存入四个十进制数(12,34,56,78)的BCD码,即E3500↙输
入01,02,03,04,05,06,07,08。
(3)G=2000↙,运行以上程序。
(4)D3510↙,显示结果为35100CE00
(5)反复试几组数,考查程序的正确性。
15
实验二程序设计和PC机上程序调试操作实验
一、实验目的
1.掌握常用程序设计的基本技巧和方法。
2.学会和熟悉使用MASM汇编程序和LINK连接程序。
3.掌握使用PC机上编程和调试程序的方法。
二、实验设备
PC机一台,装有DOS基本系统和MASM宏汇编软件
三、实验内容及步骤
16
(一)按要求编写程序并在DEBUG下建立、汇编和调试程序
1、四字节二进制数的加法
1)程序设计要求
两个字的被加数存放于3500H-3503H单元,加数存于3504H-3507H单元(存放格式为
高位存高地址单元,低位存低地址单元),两数之和(如不超过四字节)存放于3508H-350BH单元。
2)实验步骤
(1)编写程序。
(2)在DEBUG下输入程序并检查(程序可存放于2000H-8000H单元)。
(3)在3500H-3507H单元中存入被加数014527和加数146758。
(4)运行程序后,检查3508H-350BH单元中内容。
(5)反复选择几组被加数和加数,检查结果,验证程序正确性。
0BB0:2000BE0035MOVSI,3500
0BB0:2003BF0835MOVDI,3508
0BB0:20068B04MOVAX,[SI]
0BB0:2008034404ADDAX,[SI+04]
0BB0:200B8905MOV[DI],AX
0BB0:200D8B440坚持不懈的例子 2MOVAX,[SI+02减龄刘海 ]
0BB0:2010134406ADCAX,[SI+06]
0BB0:20138905MOV[DI+2],AX
0BB0:2015CCINT3
17
DATASEGMENT
FIRSTDD014527
SECONDDD146758
THIRDDD?
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
CODESEGMENT
ASSUMEDS:DATA,CS:CODE
START:MOVAX,DATA
MOVDS,AX
MOVAX,WORDPTRFIRST
ADDAX,WORDPTRSECOND
MOVWORDPTRTHIRD,AX
MOVAX,WORDPTRFIRST+2
ADCAX,WORDPTRSECOND+2
MOVWORDPTRTHIRD+2,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
18
03000000FEFF0000
2、数据块的搬移
1)程序设计思想和要求
将内存中一数据区中数据(源数据块)传送到另一数据区(目的数据块)。
源数据块和目的数据块区在内存中的位置有两种情况:两区重叠和不重叠,如下图所示。
对于两个数据块不重叠的情况,数据的传送可从数据块的首址开始,也可从数据块的末址开始;
对于两个数据块重叠的情况,则要加以分析,否则重叠部分会因搬移而遭破坏。处理方法可以是:
在源数据块首址>目的数据块首址时,从数据块的首址开始传送,在数据块首址<目的数据块首址
时,从数据块的末址开始传送。
若源数据块首址存放于SI中,目的数据块首址存放于DI中,块字节数存放于CX中。要求设
计的程序能够实现不同情况下的数据块传送。
源数源
19
据块数
据目的
块数
据
目的数块
据块
2)实验步骤
(1)编写程序。
(2)在DEBUG下键入程序并检查(程序可存放于2000H-8000H单元)。
(3)确定源数据块和目的数据块区不重叠时的首址,确定数据块个数为16个。并在源数据区送
入任意16个数据。
0BB0:2000BE0035MOVSI,3500
0BB0:2003B91000MOVCX,0010
0BB0:20068A04MOVAL,[SI]
0BB0:2008884410MOV[SI+10],AL
0BB0:200B46INCSI
0BB0:200CE2F8LOOP2006
0BB0:200ECCINT3
(4)运行程序后,检查目的数据区的内容。
20
(5)确定源数据块和目的数据块区重叠时,源区首址>目的区首址时的首址,以及数据块个
数为16个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。
0BB0:2000BE0C35MOVSI,350C
0BB0:2003B91000MOVCX,0010
0BB0:20068A04MOVAL,[SI]
0BB0:20088844F4MOV[SI-0C],AL
0BB0:200B46INCSI
0BB0:200CE2F8LOOP2006
0BB0:200ECCINT3
从350A开始输入12131415,得到
(6)确定源数据块和目的数据块区重叠时,源区首址<目的区首址时的首址,以及数据块个
数为16个,并在源数据区送入任意16个数据。运行程序后,检查目的数据区的内容。
0BB0:2000BE0035MOVSI,3500
21
0BB0:2003B91000MOVCX,0010
0BB0:20068A440FMOVAL,[SI+0F]
0BB0:200988441BMOV[SI+1B],AL
0BB0:200C4EDECSI
0BB0:200DE2F7LOOP2006
0BB0:200FCCINT3
从3500开始输入12131415,运行程序,得到:
3、无序数据块的递增排序
1)程序设计思想和要求
在首址为3000H的数据区中存放着一组无符号数,数据的长度存于3500H单元内,要求用冒
泡法对该区中的数据按递增次序排列。
冒泡法的基本思想是从最后一个数(或从第一个数)开始,依次把相邻两个数比较,即第N个
数与第N-1个数比较„,若大则交换,否则不交换,直到N个数都比较完为止。此时,其中最小
数排在最前列。然后将剩下的N-1个数再按前述方法进行,找到N-1个数中最小的数。以后重复进
行,直到全部按序排列。
2)实验步骤
(1)编写程序。
(2)在DEBUG下键入程序并检查(程序可存放于2000H-8000H单元,只要不与数据区重叠
即可)。
(3)确定数据个数并输入3500H单元中,在首址为3500H的数据区中存入任意无符号数。
(4)运行程序并检查运行结果。
(6)反复修改数据个数和数据区中的数,运行程序、观察结果,验证程序的正确性。
DATASEGMENT
ARRAYDB89,67,10,1,29,100,98,45
COUNTEQU8
22
FLAGDB-1
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
CODESEGMENT
ASSUMEDS:DATA,CS:CODE
SORT:MOVAX,DATA
MOVDS,AX
MOVBX,COUNT
LP1:CMPFLAG,0
JEEXIT
DECBX
MOVCX,BX
MOVSI,0
MOVFLAG,0
LP2:MOVAL,ARRAY[SI]
CMPAL,ARRAY[SI+1]
JBENEXT
XCHGAL,ARRAY[SI+1]
MOVARRAY[SI],AL
MOVFLAG,-1
NEXT:ADDSI,1
LOOPLP2
JMPLP1
EXIT:MOVAH,4CH
INT21H
CODEENDS
ENDSORT
23
4、求数的平方根
1)程序设计思想和要求
减奇数法是一种求取近似平方根和平方根的整数部分的方法。有公式:
n(2K-1)=N
2
k=1
若要求数S的平方根S,则可以从S中减去奇数1、3、5„直到减为零或不够减下一个奇数
为止,然后统计减去的奇数个数,它就是S的近似平方根。
被开方数为一个足够大的二进制数,存于首址为4000H的单元内,它的方根存放在以4500H
为首的单元内。
2)实验步骤
(1)编写程序。
DAT桃树嫁接时间和方法 ASEGMENT
ORG4000H
SDW12345;3039H,开方后约为111(6FH)
DB4FEHDUP(?)
SQDW?
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
24
CODESEGMENT
ASSUMEDS:DATA,CS:CODE
START:MOVAX,DATA
MOVDS,AX
MOVCX,0000H
MOVBX,0001H
MOVAX,S
LP:SUBAX,BX
ADDBX,2
INCCX
CMPAX,0000H
JEEXIT
CMPAX,BX
JLEEXIT
JMPLP
EXIT:MOVSQ,CX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)在DEBUG下输入程序并检查(程序可存放于2000H-8000H单元,和数据存放单元不要
重叠)。
(3)在4000H为首的单元中存入一个任意大的数。
(4)运行程序并检查运行结果。
(6)反复修改被开方数,运行程序、观察结果,验证程序的正确性。
实验三DOS系统功能调用及模块化程序设计
一、实验目的
2、熟悉DOS系统中基本功能子程序的作用及其调用方法。
3、结合DOS系统中键盘和显示功能子程序的调用和汇编语言源程序结构设计有关程序。
4、掌握复杂程序的设计思想—模块化程序设计的方法。
25
二、实验设备
PC机一台,装有DOS基本系统和MASM宏汇编软件。
三、实验内容及步骤
(一)DOS键盘、显示基本功能子程序调用
DOS提供了许多系统功能子程序可由程序设计者调用,其中最基本的是键盘和显示操作功能
的调用,具体调用的方法可参阅教科书。
1、显示缓冲区的字符串
1)实验程序:
DSEGSEGMENT
STRINGDB'WelcometoDONGHUAUniversity!',0dH,0aH,'$'
DSEGENDS
STACKSEGMENTPARASTACK'STACK'
DB256DUP(?)
STACKENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG,SS:STACK
START:PUSHDS
MOVAX,0
PUSHAX
MOVAH,9
MOVDX,SEGSTRING
MOVDS,DX
MOVDX,OFFSETSTRING
INT21H
RET
MAINENDP
CSEGENDS
ENDSTART
2)实验步骤:
(1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
(3)运行执行程序,输入不同字母,观察结果。
26
2、键盘输入小写字母,显示器显示大写字母
1)实验程序:
CSEGSEGMENT
ASSUMECS:CSEG
MAINPROCFAR
START:PUSHDS
MOVAX,0
PUSHAX
BEGIN:MOVAH,1
INT21H
CMPAL,'a'
JBSTOP
CMPAL,'z'
JASTOP
SUBAL,20H
MOVDL,AL
MOVAH,2
INT21H
JMPBEGIN
STOP:RET
MAINENDP
CSEGENDS
ENDSTART
2)实验步骤:
(1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
(3)运行执行程序,输入不同字母,观察结果。
27
3、从键盘输入一个二位十进制的月份数(01-12),显示相应月份的英文缩写名
1)程序及其结构
程序采用子程序的结构形式,子程序有:将输入的二位月份数转换为二进制数的子程序;从字符
表中查找相应的英文缩写的子程序;将月份的英文字母显示在屏幕上的子程序。
%程序运行存在问题,只要第一个数字不为0,则当输入的第二个数字为1或2时就会对应输出NOV
和DEC
程序如下:
DATASGSEGMENTPARA'DATA'
THREEDB3
MONINDB3,4DUP(?)
ALFMONDB'???','$'
MONTABDB'JAN','FEB','MAR','APR','MAY','JUN'
DB'JUL','AUG','SEP','OCT','NOV','DEC'
DATASGENDS
STACKSEGMENTPARASTACK'STACK'
STADB100DUP(?)
STACKENDS
CODESGSEGMENTPARA'CODE'
ASSUMECS:CODESG,DS:DATASG,ES:STACK
MAINPROCFAR
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATASG
MOVDS,AX
28
MOVES,AX
CALLINPUT
CALLLOCATE
CALLDISPLAY
RET
MAINENDP
INPUTPROCNEAR;键盘输入并将ASCⅡ码转换二进制数的子程序
PUSHDX
MOVAH,0AH;键盘输入月份数
LEADX,MONIN
INT21H
MOVAH,MONIN+2;将月份数字的ASCⅡ码取入AH和AL
MOVAL,MONIN+3
XORAX,3030H;将ASCⅡ码转换为BCD码
CMPAH,00
JZRETURN
SUBAH,AH
ADDAL,10
RETURN:POPDX
RET
INPUTENDP
LOCATEPROCNEAR;将月份数字转换为英文缩写字母的子程序
PUSHSI
PUSHDI
PUSHCX
LEASI,MONTAB
DECAL
MULTHREE
ADDSI,AX
MOVCX,03
CLD
LEADI,ALFMON
REPMOVSB
POPCX
POPDI
POPSI
RET
LOCATEENDP
DISPLAYPROCNEAR;屏幕显示子程序
PUSHDX
LEADX,ALFMON
29
MOVAH,09
INT21H
POPDX
RET
DISPLAYENDP
CODESGENDS
ENDMAIN
(二)采用DOS功能调用设计源程序,并运行调试程序
1、十进制加法和结果显示程序(自行设计)
1)程序设计要求
将数据段DSEG中的ADDOP1定义的双字变量的4位十进制数和附加段ESEG中的ADDOP2
定义的双字变量的4位十进制数相加,和存放于数据段DSEG中的SUM中,采用DOS显示功能调
用将和显示在屏幕上。
DSEGSEGMENT
ADDOP1DD1234
SUMDD?
DSEGENDS
ESEGSEGMENT
ADDOP2DD2345
ESEGENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
CODESEGMENT
ASSUMEDS:DSEG,CS:CODE,ES:ESEG
START:MOVAX,DSEG
MOVDS,AX
MOVAX,ESEG
MOVES,AX
MOVAX,WORDPTRADDOP1
30
ADDAX,WORDPTRADDOP2
MOVWORDPTRSUM,AX
MOVAX,WORDPTRADDOP1+2
ADCAX,WORDPTRADDOP2+2
MOVWORDPTRSUM+2,AX
MOVBX,WORDPTRSUM+2
CALLDISPLAY
MOVBX,WORDPTRSUM
CALLDISPLAY
MOVAH,4CH
INT21H
DISPLAYPROCNEAR
MOVCX,10000D;DIVIDEBY10000
CALLDEC_DIV
MOVCX,1000D;DIVIDEBY1000
CALLDEC_DIV
MOVCX,100D;DIVIDEBY100
CALLDEC_DIV
MOVCX,10D;DIVIDEBY10
CALLDEC_DIV
MOVCX,1D;DIVIDEBY1
CALLDEC_DIV
RET;RETURNFROMBINIDEC
DEC_DIVPROCNEAR;;--------从位取出数字显示
MOVAX,BX;NUMBERLOWHALF
MOVDX,0;ZEROOUTHIGHHALF
DIVCX;DIVIDEBYCX
MOVBX,DX;REMAINDERINTOBX
MOVDL,AL;QUOTIENTINTODL
;PRINTTHECONTENTSOFDLONSCREEN
ADDDL,30H;CONVERTTOASCII
MOVAH,2H;DISPLAYFUNCTION
INT21H;CALLDOS
RET;RETURNFROMDEC_DIV
DEC_DIVENDP
;;------------------------------------------------------------------
DISPLAYENDP
31
CODEENDS
ENDSTART
2)实验步骤:
(1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
(3)运行执行程序,输入不同的加数和被加数,观察结果。
2、十进制加法和算式显示程序(自行设计)
1)程序设计要求
在以上十进制数加法要求的基础上,将加法算式及和在显示器上显示。
如ADDOP1中存放1234H,在ADDOP2中存放6789H,执行程序后显示器上显示:
1234+6789=8023
2)实验步骤:
(1)建立源程序文件。
DSEGSEGMENT
ADDOP1DD1234
JIAHAODB'+','$'
DENGHAODB'=','$'
tendw10
SUMDD?
DSEGENDS
ESEGSEGMENT
ADDOP2DD6789
ESEGENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
32
CODESEGMENT
ASSUMEDS:DSEG,CS:CODE,ES:ESEG
START:MOVAX,DSEG
MOVDS,AX
MOVAX,ESEG
MOVES,AX
MOVAX,WORDPTRADDOP1
ADDAX,WORDPTRADDOP2
MOVWORDPTRSUM,AX
MOVAX,WORDPTRADDOP1+2
ADCAX,WORDPTRADDOP2+2
MOVWORDPTRSUM+2,AX
MOVBX,WORDPTRADDOP1+2
CALLDISPLAY
MOVBX,WORDPTRADDOP1
CALLDISPLAY
MOVAH,09H
MOVDX,OFFSETJIAHAO
INT21H
MOVBX,WORDPTRADDOP2+2
CALLDISPLAY
MOVBX,WORDPTRADDOP2
CALLDISPLAY
MOVAH,09H
MOVDX,OFFSETDENGHAO
INT21H
MOVBX,WORDPTRSUM+2
CALLDISPLAY
MOVBX,WORDPTRSUM
CALLDISPLAY
MOVAH,4CH
INT21H
DISPLAYPROCNEAR
MOVCX,10000D;DIVIDEBY10000
CALLDEC_DIV
MOVCX,1000D;DIVIDEBY1000
CALLDEC_DIV
MOVCX,100D;DIVIDEBY100
33
CALLDEC_DIV
MOVCX,10D;DIVIDEBY10
CALLDEC_DIV
MOVCX,1D;DIVIDEBY1
CALLDEC_DIV
RET;RETURNFROMBINIDEC
DEC_DIVPROCNEAR;;--------从位取出数字显示
MOVAX,BX;NUMBERLOWHALF
MOVDX,0;ZEROOUTHIGHHALF
DIVCX;DIVIDEBYCX
MOVBX,DX;REMAINDERINTOBX
MOVDL,AL;QUOTIENTINTODL
;PRINTTHECONTENTSOFDLONSCREEN
ADDDL,30H;CONVERTTOASCII
MOVAH,2H;DISPLAYFUNCTION
INT21H;CALLDOS
RET;RETURNFROMDEC_DIV
DEC_DIVENDP
;;------------------------------------------------------------------
DISPLAYENDP
CODEENDS
ENDSTART
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
(3)运行执行程序,输入不同的加数和被加数,观察结果。
3、键盘输入加数和被加数进行十进制数加法,显示结果程序(自行设计)
1)程序设计要求
34
采用DOS的键盘功能调用和显示功能调用,将键盘输入的4位十进制被加数和4位加数相加,
和存入有关内存单元,并将算式及和显示在显示器上。
要求采用子程序的设计方法设计程序,例如设计一个从键盘读入输入数据的子程序和将数据显
示的子程序。
DSEGSEGMENT
ADDOPDW2DUP(?)
ADDOP1DD?
JIAHAODB'+','$'
D国家安全手抄报图片 ENGHAODB'=','$'
TENDW10
SUMDD?
GODB'PLEASEINPUTTWONUMBER:$'
GOODB'THESUMIS:$'
TISHIDB'THENUMBERYOUINPUTISNOTRIGHT,MUST<10000,PLEASEINPUTAGAIN!
$'
DSEGENDS
ESEGSEGMENT
ADDOP2DD?
ESEGENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?)
STACKENDS
CODESEGMENT
ASSUMEDS:DSEG,CS:CODE,ES:ESEG
START:MOVAX,DSEG
MOVDS,AX
MOVAX,ESEG
MOVES,AX
TS:MOVSI,0
MOVCX,2;循环5次
LEADX,GO;PRINTGO
MOVAH,09
INT21H
AGAIN:PUSHCX
CALLINPUT
CMPAX,10000
JLRIGHT
POPCX
CALLCRLF
MOVDX,OFFSETTISHI
35
MOVAH,09H
INT21H
CALLCRLF
JMPTS
RIGHT:MOVADDOP[SI],AX
;ADDSUM,AX
INCSI
INCSI
POPCX
LOOPAGAIN
CALLCRLF
LEADX,GOO;PRINTGOO
MOVAH,09
INT21H
MOVSI,0
MOVBX,ADDOP[SI]
MOVWORDPTRADDOP1,BX
MOVWORDPTRADDOP1+2,0
INCSI
INCSI
MOVBX,ADDOP[SI]
MOVWORDPTRADDOP2,BX
MOVWORDPTRADDOP2+2,0
PUSHAX
MOVAX,WORDPTRADDOP1
ADDAX,WORDPTRADDOP2
MOVWORDPTRSUM,AX
MOVAX,WORDPTRADDOP1+2
ADCAX,WORDPTRADDOP2+2
MOVWORDPTRSUM+2,AX
POPAX
;显示算式
MOVBX,WORDPTRADDOP1+2
CALLDISPLAY
MOVBX,WORDPTRADDOP1
CALLDISPLAY
MOVAH,09H
MOVDX,OFFSETJIAHAO
INT21H
MOVBX,WORDPTRADDOP2+2
36
CALLDISPLAY
MOVBX,WORDPTRADDOP2
CALLDISPLAY
MOVAH,09H
MOVDX,OFFSETDENGHAO
INT21H
MOVBX,WORDPTRSUM+2
CALLDISPLAY
MOVBX,WORDPTRSUM
CALLDISPLAY
MOVAH,4CH
INT21H
;-----------------------------------------------------------跳到下一行
CRLFPROCNEAR
MOVDL,0AH;换行
MOVAH,02H
INT21H
MOVDL,0DH;从头开始
MOVAH,02H
INT21H
RET
CRLFENDP
;------------------------------------------------------------接受数字函数
INPUTPROCNEAR
MOVAX,0
PUSHAX
AGAIN1:MOVAH,01H;键盘输入
INT21H
CMPAL,30H;当输入不是数字的时候(如空格),跳出,一个
数字输入完成,
JLEXIT
CMPAL,39H
JGEXIT
SUBAL,30H;将ASCII码值转化为数值
MOVBL,AL
MOVBH,0
POPAX
CWD
37
IMULTEN;将已有的数乘10,加上新输入的数
ADDAX,BX
PUSHAX
JMPAGAIN1
EXIT:POPAX
RET
INPUTENDP
DISPLAYPROCNEAR
MOVCX,10000D;DIVIDEBY10000
CALLDEC_DIV
MOVCX,1000D;DIVIDEBY1000
CALLDEC_DIV
MOVCX,100D;DIVIDEBY100
CALLDEC_DIV
MOVCX,10D;DIVIDEBY10
CALLDEC_DIV
MOVCX,1D;DIVIDEBY1
CALLDEC_DIV
RET;RETURNFROMBINIDEC
DEC_DIVPROCNEAR;;--------从位取出数字显示
MOVAX,BX;NUMBERLOWHALF
MOVDX,0;ZEROOUTHIGHHALF
DIVCX;DIVIDEBYCX
MOVBX,DX;REMAINDERINTOBX
MOVDL,AL;QUOTIENTINTODL
;PRINTTHECONTENTSOFDLONSCREEN
ADDDL,30H;CONVERTTOASCII
MOVAH,2H;DISPLAYFUNCTION
INT21H;CALLDOS
RET;RETURNFROMDEC_DIV
DEC_DIVENDP
;;------------------------------------------------------------------
DISPLAYENDP
CODEENDS
ENDSTART
2)实验步骤:同上
38
(三)模块化程序设计
模块化程序设计是指将一个较大的功能分解成几个独立功能的子模块,每个子模块独立编缉各
自建立一个文件,通过单独的汇编生成各个独立的目标文件,然后由LINK程序将各个目标文件
链接在一起,形成一个完整的执行文件。
1)实验程序的设计思想及其实现功能
程序实现键盘输入十进制数,以十六进制数形式在屏幕上显示的功能。程序分成两个模块,模
块A为主程序,负责从键盘输入一个十进制数,处理后存入指定内存单元。模块B主要实现屏幕提
示和将十六进制数转换及显示的功能。
实验程序参见教科书“微型计算机原理及应用”(吴宁主编)P185页上模块化程序设计例1。
EXTRNPROMPT:FAR,BINHEX:FAR
PUBLICDEC_NUM,KEY_IN
SSEGSEGMENTPARASTACK'STACK'
DB100DUP(?)
SSEGENDS
DSEG1SEGMENT
DEC_NUMDW?
DSEG1ENDS
CSEG1SEGMENT
ASSUMECS:CSEG1,DS:DSEG1
START:MOVAX,DSEG1
MOVDS,AX
PUSHDS
JMPFARPTRPROMPT
KEY_IN:CALLDECBIN
MOVDEC_NUM,BX
CALLFARPTRBINHEX
39
MOVAH,4CH
INT21H
DECBINPROCNEAR
MOVBX,0
GETCHAR:MOVAH,1
INT21H
SUBAL,30H
JLEXIT
CMPAL,09H
JGEXIT
MOVAH,0
XCHGAX,BX
MOVCX,0AH
MULCX
XCHGAX,BX
ADDBX,AX
JMPGETCHAR
CALLCRLF
EXIT:RET
DECBINENDP
;-----------------------------------------------------------跳到下一行
CRLFPROCNEAR
MOVDL,0AH;换行
MOVAH,02H
INT21H
MOVDL,0DH;从头开始
MOVAH,02H
INT21H
RET
CRLFENDP
CSEG1ENDS
ENDSTART
EXTRNDEC_NUM:WORD,KEY_IN:FAR
PUBLICPROMPT,BINHEX
SSEGSEGMENTPARASTACK'STACK'
DB200DUP(?)
40
SSEGENDS
DSEG2SEGMENT
MSGDB'PLEASEINPUT:$'
DSEG2ENDS
CSEG2SEGMENTPARA
ASSUMECS:CSEG2,DS:DSEG2
PROMPT:MOVAX,DSEG2
MOVDS,AX
LEADX,MSG
MOVAH,09H
INT21H
POPDS
JMPFARPTRKEY_IN
BINHEXPROCFAR
CALLCRLF
MOVBX,DEC_NUM
MOV行政是什么 CH,04H
ROTATE:
MOVCL,04H
ROLBX,CL
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,07H
PRINTIT:
MOVDL,AL
MOVAH,02H
INT21H
DECCH
JNZROTATE
RET
BINHEXENDP
;-----------------------------------------------------------跳到下一行
CRLFPROCNEAR
MOVDL,0AH;换行
MOVAH,02H
INT21H
MOVDL,0DH;从头开始
41
MOVAH,02H
INT21H
RET
CRLFENDP
CSEG2ENDS
END
2)实验步骤:
(1)输入模块A程序和模块B程序,各产生一个文件。
(2)汇编两个程序生成两个目标文件。
(3)用LINK文件名1+文件名2命令链接为一个可执行文件。
(4)运行程序,输入不同的十进制数,观察结果。
五、试验报告要求
写出(二)1、2、3自行设计的采用DOS功能调用设计源程序的程序清单。
本文发布于:2023-03-18 20:02:53,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1679140974302536.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:d3500.doc
本文 PDF 下载地址:d3500.pdf
留言与评论(共有 0 条评论) |