前言
微机原理的学习基本大部分内容都和汇编语言相关,以下是笔者第一次实验的相关实验内容。
一、实验内容
将两个多位十进制数相减,要求被减数,减数均以ASCII码形式按顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
二、实验代码
DATAS SEGMENT
DATA1 DB 33H,39H,31H,37H,38H ;第一个数据(被减数)
DATA2 DB 36H,35H,30H,38H,32H ;第二个数据(减数)
MES1 DB '-','$'
MES2 DB '=','$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,OFFSET DATA1
MOV BX,05 ;循环五次
CALL CHECK ;显示被减数
MOV AH,09H ;DOS功能号,字符串显示
LEA DX,MES1
INT 21H
MOV SI,OFFSET DATA2
MOV BX,05
CALL CHECK ;显示减数
MOV AH,09H
LEA DX,MES2
INT 21H
MOV SI,OFFSET DATA1
MOV DI,OFFSET DATA2
CALL SUBA ;减法运算
MOV SI,OFFSET DATA1
MOV BX,05
CALL CHECK ;显示结果
MOV DL,00H
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CHECK PROC ;显示子功能
P1:
MOV AH,02 ;显示字符串中一字符
MOV DL,[SI+BX-1] ;修改偏移量
INT 21H
DEC BX
JNE P1
RET
CHECK ENDP
SUBA PROC
MOV DX,SI
MOV BP,DI
MOV BX,05
SU1:
SUB BYTE PTR[SI+BX-1],30H
SUB BYTE PTR[DI+BX-1],30H
DEC BX ;将ASCII码表示的数字串
JNZ SU1 ;转化为十六进制的数字串
MOV CX,05 ;包括进位,共5位
CLC ;清除进位位
SU2:
MOV AL,[SI]
MOV BL,[DI]
SBB AL,BL ;带进位相减
AAS ;非组合BCD码减法调整
MOV [SI],AL ;结果送被减数区
INC SI
INC DI ;指向下一位
LOOP SU2 ;循环
MOV SI,DX
MOV DI,BP
MOV BX,05
SU3:
ADD BYTE PTR [SI+BX-1],30H
ADD BYTE PTR [DI+BX-1],30H
DEC BX ;十六进制数字串转化ASCII码表示的数字串
JNZ SU3
RET
SUBA ENDP
CODES ENDS
END START
···
···
三、实验结果
四、注意事项
第一次调试的时候笔者把DOS退出指令放在了程序最末尾,结果导致卡死窗口。还有就是注意循环的控制。
汇编语言由于是低级语言,所以格外要注意程序控制流。