汇编程序6
将四个同学学号的后四位(十进制)相加,并用十六进制形式显示输出。(0583是本人的学号,4489、1884是本组成员的学号,另外一个随机)
程序编写:定义了A,B,C,D数据区分别用来存储四个同学的学号后四位,从控制台输入四个同学学号的后四位,最后将相加的结果(AX)转成十六进制(BX)并显示。
;四个后四位(十进制)相加,以十六进制形式输出
DATA SEGMENT
A DB 5 ;为调用10号功能准备的数据区A
DB 0
DB 5 DUP(0)
B DB 5 ;为调用10号功能准备的数据区B
DB 0
DB 5 DUP(0)
C DB 5 ;为调用10号功能准备的数据区C
DB 0
DB 5 DUP(0)
D DB 5
DB 0
DB 5 DUP(0)
SUM DW 0 ;数值结果数据区
TEN DW 10 ;固定值10,用于加倍
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN: MOV AX,DATA
MOV DS,AX
MAIN: CALL INPUT ;主程序
MOV SI,OFFSET A
CALL PROCDP
MOV SI,OFFSET B
CALL PROCDP
MOV SI,OFFSET C
CALL PROCDP
MOV SI,OFFSET D
CALL PROCDP
CALL OUTPUT
MOV AH,4CH
INT 21H
INPUT PROC ;输入两个数,回车换行表示结束
MOV DX,OFFSET A ;10号功能调用输入
MOV AH,10
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV DX,OFFSET B ;10号功能调用输入
MOV AH,10
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV DX,OFFSET C ;10号功能调用输入
MOV AH,10
INT 21H
MOV DL,0AH ;换行
MOV AH,2
INT 21H
MOV DX,OFFSET D ;10号功能调用输入
MOV AH,10
INT 21H
RET
INPUT ENDP
PROCDP PROC ;输入的数转为十进制,并按位直接加到sum,该程序调用两次
ADD SI,2 ;跳过数据区头两个用于指明字符个数的字节
MOV BX,4 ;4位十进制数,从个位开始处理
MOV CX,1 ;倍数,用于按位累加
LOP: DEC BX
MOV AL,[SI][BX] ;基址变址方式寻址
AND AX,00FFH ;AX高位清零
SUB AL,30H ;从ASCII码转为十进制数
MUL CX
ADD SUM,AX ;累加
MOV AX,CX ;CX的值乘10,用于按位加倍
MUL TEN
MOV CX,AX
CMP BX,0 ;如果BX=0,说明已经处理完
JNE LOP
RET
PROCDP ENDP
OUTPUT PROC ;转化成十六进制输出
MOV DL,0AH
MOV AH,2
INT 21H
MOV BX,SUM
MOV CH,4
MOV CL,4
T1: ROL BX,CL ;循环左移4位
MOV AL,BL ;屏蔽高4位
AND AL,0FH
ADD AL,30H ;转换为ASCII码
CMP AL,3AH ;ASCII码与3AH比较,如果大于3AH说明已经到了A~F的范围
JL T2
ADD AL,07H
T2: MOV DL,AL ;不大于3AH说明在0~9范围
MOV AH,2
INT 21H
DEC CH
JNZ T1
MOV DL,48H ;显示字符H,标注结果是十六进制
MOV AH,2
INT 21H
RET
OUTPUT ENDP
CODE ENDS
END BEGIN
运行结果显示: 最后的结果为:0583+4489+1884+1234=5338(1FFE)