微机原理加法程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 加法程序
一.实验目的
学习并掌握数据传送和算术运算指令的用法。编写多位十进制数相加程序。
二.实验内容
将两个多位十进制数28056,47193相加,并在屏幕上显示加数、被加数、和。要求两个操作数均以ASCII 码形式各自顺序存放在DA TA1和DA TA2内存单元中,并将结果送回DA TA1处(低位在前,高位在后)。
三.程序流程图
程序流程如图2.1所示。两操作数在内存中存放的情况如图2.2所示。
四、实验步骤
(1)进入DOS 环境,如果计算机操作系统是在DOS 环境下,则直接进入下一步即可。如果计算机操作系统是在Windows 环境下,则打开“开始”菜单,选“运行”项,在“打开”栏中输入“CMD ”,点击“确定”按钮,进入DOS 环境;
(2)将设计好的汇编语言程序用编辑器编辑;
EDIT *. ASM ,其中* 号代表程序名,为任意1~8个字符,扩展名 .ASM 不可缺省。 进入编辑状态,输入汇编语言源程序,完成后,同时按“Alt+F ”按钮,打开文件菜单,选择“Save ”选项存盘,随后,选择“Exit ”选项,退出编辑状态;
(3)对源程序进行汇编链接;
(4)执行并调试可执行文件。进入DOS 全屏模式,运行可执行文件*.EXE ,调试器运行和调试可执行文件*.EXE 。
五、参考程序
SHOW
MACRO B
;宏定义
MOV DL , B ;B 为要显示字符的ASCII 码
MOV AH , 02H
INT
21H
;2号功能调用,在屏幕上显示一个字符
图2.1 十进制数相加程序流程图 33H 39H 31H 37H 34H
36H 35H 30H
38H
32H
存储器
DATA1
DATA1
图2.2 数据在内存中的存放情况
ENDM
DATA SEGMENT ;数据段
DATA1 DB 33H,39H,31H,37H,34H ;被加数47193的ASCII码(倒序存放)DATA2 DB 36H,35H,30H,38H,32H ;加数28056的ASCII码(倒序存放)DATA3 DB '——— ',0DH,0AH,'$ '
DATA ENDS
STACK SEGMENT STACK ;堆栈段
STA DB 20 DUP (?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
START:MOV AX,DATA ;初始化,取段基址
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DA TA2 ;取DATA2(加数)的偏移地址
MOV BX,05 ;设置地址指针,BX=5 (加数为5位)
SHOW 20H ;宏调用,显示“空格”(ASCII码为20H)
CALL DISPL ;调显示子程序
SHOW 0DH ;宏调用,“回车”
SHOW 0AH ;宏调用,“换行”
MOV SI,OFFSET DA TA1 ;取DATA1(被加数)的偏移地址
MOV BX,05 ;设置地址指针,BX=5 (被加数为5位)
SHOW 2BH ;宏调用,显示“+”(ASCII码为2BH)
CALL DISPL ;调显示子程序
SHOW 0DH ;宏调用,“回车”
SHOW 0AH ;宏调用,“换行”
MOV CL,7 ;CL=7,显示7个“-”,构成直线
S1:SHOW 2DH ;宏调用,显示“-”(ASCII码为2DH)LOOP S1 ;CX-1→CX,CX≠0,转到标号S1
SHOW 0DH
SHOW 0AH
MOV SI,OFFSET DA TA1 ;取DATA1(被加数)的偏移地址
MOV DI,OFFSET DA TA2 ;取DATA2(加数)的偏移地址
CALL ADDA ;调加法程序
MOV SI,OFFSET DA TA1 ;取DATA1的偏移地址,显示两数之和
SHOW 20H
MOV BX,05 ;BX=5,设置地址指针
CALL DISPL ;调显示子程序
MOV AX,4C00H ;返回DOS
INT 21H
DISPL PROC NEAR ;显示子程序
DS1:SHOW [SI+BX-1] ;宏调用,倒序显示数据
DEC BX ;BX←BX-1
JNZ DS1 ;BX≠0,转到标号DS1,继续显示数据
RET
DISPL ENDP
ADDA PROC NEAR ;加法子程序
MOV DX,SI ;DATA1的偏移地址传送给DX
MOV BP,DI ;DATA2的偏移地址传送给BP
MOV BX,05 ;BX=5,设置地址指针
AD1:SUB BYTE PTR [SI+BX-1],30H ;将ASCII码转化为十六进制数,并存入DA TA1 SUB BYTE PTR [DI+BX-1],30H ;将ASCII码转化为十六进制数,并存入DA TA2 DEC BX ;BX←BX-1
JNZ AD1 ;BX≠0,转到标号AD1,继续转换
MOV SI,DX ;SI←DATA1的偏移地址
MOV DI,BP ;DI←DATA2的偏移地址
MOV CX,05 ;CX=5,设置计数常数
CLC ;清除进位表示,CF=0
AD2:MOV AL,[SI] ;AL←DATA1中的低位数
MOV BL,[DI] ;BL←DATA1中的低位数
ADC AL,BL ;带进位相加
AAA ;十进制调整
MOV [SI],AL ;将结果保存到DATA1中
INC SI ;指向下一位
INC DI
LOOP AD2 ;CX-1→CX,CX≠0,转到标号AD2,继续加法
MOV SI,DX ;SI←DATA1的偏移地址
MOV DI,BP ;DI←DATA2的偏移地址
MOV BX,05 ;BX=5,设置地址指针
AD3:ADD BYTE PTR [SI+BX-1],30H ;将十六进制转化为ASCII码
ADD BYTE PTR [DI+BX-1],30H
DEC BX ;BX←BX-1
JNZ AD3 ;BX≠0,转到标号AD3,继续转换
RET
ADDA ENDP
CODE ENDS
END START