微机原理加法程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档