微机原理实验三 编程实现子程序调用.docx
《微机原理实验三 编程实现子程序调用.docx》由会员分享,可在线阅读,更多相关《微机原理实验三 编程实现子程序调用.docx(12页珍藏版)》请在冰豆网上搜索。
微机原理实验三编程实现子程序调用
实验二编程实现循环程序
**************************************************************************************
一、题目内容
**************************************************************************************
•编程实现:
•1.主程序由键盘输入一个数(<10),用子程序1实现DATA段以这个数为首连续十个整数填充字节数组buf。
譬如显示提示:
”Pleaseinputanumber:
”,键盘输入3,执行子程序1后bufdb3,4,5,6,7,8,9,10,11,12。
•2.主程序实现十个数求和,调用另一子程序2实现将和逐位转为ASCII码显示:
”Sumis:
xx”。
•提示:
和不会超过十进制3位数,所以将和除以10,逐位转换,再加上30H即分别可以得它们的ASCII码。
**************************************************************************************
2、流程图**************************************************************************************
**************************************************************************************三、程序代码
**************************************************************************************
stacksegmentstack'stack'
dw32dup(0)
stackends
;==========================
datasegment
TIP1DB'Plesaseinputanumber(0$'
BUFDB10DUP(?
)
TIP2DB'Fromnton+10istheresultofthe:
$'
SUMDW0
dataends
;==========================
STACSEGMENT;用于变量定义予置的堆栈空间
STADB100DUP(?
)
STACENDS
;==========================
codesegment
;===================
MAINprocfar
assumess:
stack,cs:
code,ds:
data
pushds
subax,ax
movax,data
movds,ax
;===========
MOVDX,OFFSETTIP1;显示提示语
MOVAH,9
INT21H
XORAX,AX;键入并显示一个字符,把字符的ASCII码存入AL中
MOVAH,1
INT21H
MOVDL,0AH;换行
PUSHAX
MOVAH,2
INT21H
POPAX
MOVDI,OFFSETBUF;取BUF的首址存入DI中
XORCX,CX
CALLAddNum;—1—调用子程序FUZHI实现DATA段以这个数为首连续十个整数填充字节数组buf
XORAX,AX
MOVCX,0AH;给LOOP2循环赋初值10
MOVDI,OFFSETBUF
AGAIN2:
ADDAX,[DI];主程序实现求上述十个数的和,存入AX中
INCDI
LOOPAGAIN2;循环10次
CALLDELAY1S;—2—调用子函数延时1S
PUSHAX
CALLTransf;—3—调用另一子程序ZHUANG实现将和逐位转为ASCII码显示
POPAX
;MOVAH,4CH;返回DOS,不用这个,对话框会一闪而退
;INT21H
;RET
movah,1;这个的话对话框会暂停
int21h
MAINENDP
;/***************************************************************************/
;子程序名:
AddNum
;功能:
实现DATA段以输入的那个数为首连续十个整数填充字节数组buf
;入口参数:
;DS:
DI←待填充的数组buf的首地址
;AL←输入的那个数
;出口参数:
【DI】←填充结果
;/***************************************************************************/
AddNumPROC
PUSHCX
SUBAL,30H;将AL转为十进制
MOVCX,0AH;给LOOP循环赋初值10
AGAIN1:
MOV[DI],AL;将AL存入BUF中
INCDI;DI+1,即数组BUF中的地址单元+1
INCAL;AL+1
LOOPAGAIN1
POPCX
RET;返回主程序
AddNumENDP
;/***************************************************************************/
;子程序名:
Transf
;功能:
实现将和逐位转为ASCII码显示
;入口参数:
;DS:
DI←数组buf的首地址
;AX←和的十进制数
;出口参数:
AX←和的ASCII码
;/***************************************************************************/
TransfPROC
PUSHF
PUSHAX
PUSHBX
PUSHCX
PUSHDX
XORBX,BX
PUSHAX
XORAH,AH
CMPAX,64H
JNBSANWEI
POPAX
XORAH,AH
MOVBL,10;将除数赋值为10
DIVBL;将和AX除以10,商存入AL中,所以AL为十位数。
余数存入AH中,所以AH为个位数。
PUSHAX
MOVDX,OFFSETTIP2;显示结果提示语句
MOVAH,9
INT21H
POPAX
XORDX,DX
MOVDL,AL
ADDDL,30H;将十进制的十位数加上30H,得到它的ASCII码
PUSHAX
MOVAH,2
INT21H
POPAX
XORDX,DX;将十进制的个位数加上30H,得到它的ASCII码
MOVDL,AH
ADDDL,30H
MOVAH,2
INT21H
JMPL
SANWEI:
XORDX,DX
MOVBX,10;将除数赋值为10
DIVBX;将和AX除以10,商存入AL中,所以AL为十位数。
余数存入AH中,所以AH为个位数。
PUSHDX
PUSHAX
MOVDX,OFFSETTIP2;显示结果提示语句
MOVAH,9
INT21H
POPAX
POPDX
MOVBL,10;将除数赋值为10
DIVBL;将和AX除以10,商存入AL中,所以AL为十位数。
余数存入AH中,所以AH为个位数。
PUSHDX
MOVDL,AL
ADDDL,30H;将十进制的百位数加上30H,得到它的ASCII码
PUSHAX
MOVAH,2
INT21H
POPAX
POPDX
PUSHDX
XORDX,DX;将十进制的个位数加上30H,得到它的ASCII码
MOVDL,AH
ADDDL,30H
MOVAH,2
POPDX
ADDDL,30H
MOVAH,2
L:
POPDX
POPCX
POPBX
POPAX
POPF
RET;返回主程序
TransfENDP
;/***************************************************************************/
DELAY1SPROC;延时1S子程序
PUSHF
PUSHBX
PUSHCX
MOVBX,3E8H
LP2:
MOVCX,176H
LP1:
PUSHF
POPF
LOOPLP1
DECBX
JNZLP2
POPCX
POPBX
POPF
RET
DELAY1SENDP
;===================
codeends
;==========================
endMAIN
**************************************************************************************四、操作截图**************************************************************************************
**************************************************************************************五、实验分析或经验总结**************************************************************************************
这个程序自己实在调不出来,只能很大程度地参考网上类似的题目,可见自己的基础太薄弱了,必须抓紧查漏补缺。
1、编译汇编文件:
先在记事本里输入代码后,再用汇编编译器编译。
具体过程如下:
1)、编辑:
用编辑软件(EDIT.EXE或记事本)形成源程序(.ASM),如:
LX.ASM;
2)、汇编:
用汇编程序(MASM.EXE)对源程序进行汇编,形成目标文件(.OBJ),格式如下:
MASMLX.ASM;
3)、连接:
用连接程序(LINK.EXE)对目标程序进行连接,形成可执行文件(.EXE),格式如下:
LINKLX.OBJ;
4)、执行:
如果结果在屏幕在显示,则直接执行可执行文件。
5)、调试:
用调试程序(LINK.EXE)对可执行文件进行调试,格式如下:
DEBUGLX.EXE
2、代码用英文格式输入状态,否则出错。
3、注意关键词输入正确性。
4、返回DOS,不用这个,对话框会一闪而退
MOVAH,4CH
INT21H
RET
这个的话对话框会暂停
movah,1
int21h