汇编语言实现从键盘输入两个4位十进制数 ,求和输出(详解)

程序段目录

  • 题目要求
    • 程序结构
    • 数据段定义
        • 十六进制输出
        • 十进制输出
    • 代码段定义
      • 初始化及主程序
      • 输入
      • 累加
      • 输出
        • 十六进制输出
        • 十进制输出
      • 结束

题目要求

汇编语言实现从键盘输入两个4位十进制数 ,将它们的和存SUM 单元,并输出对应的十进制数 。
汇编语言实现从键盘输入两个4位十进制数 ,将它们的和存SUM 单元,并输出对应的十六进制数 。
用子程序结构完成课程设计

程序结构

数据段定义——程序初始化——输入——累加——输出——结束
十进制和十六进制的处理存在区别,根据需要进行搭配

数据段定义

十六进制输出

DATA SEGMENT
	A DB 5					;为调用10号功能准备的数据区A
    	DB ?
    	DB 5 DUP(?)
	B DB 5					;为调用10号功能准备的数据区B
    	DB ?
    	DB 5 DUP(?)
   	SUM DW ?				;数值结果数据区
   	TEN DW 10				;固定值10,用于加倍
DATA ENDS

十进制输出

DATA SEGMENT
	A DB 5
    	DB ?
    	DB 5 DUP(?)
	B DB 5
    	DB ?
    	DB 5 DUP(?)
   	SUM DW ?					;数值结果数据区
   	TEN DW 10					;固定值10,用于加倍
   	RESULTS DB 5 DUP('0')				;字符结果数据区
		DB '$'
	DIVISORS DW 10000,1000,100,10,1		;除数
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
        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
        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

累加过程是把A、B的值分别按位加到SUM中,并不是俩个值独立转换后再相加

输出

十六进制输出

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

十进制输出

OUTPUT PROC NEAR
		MOV SI,OFFSET DIVISORS
		MOV DI,OFFSET RESULTS
		MOV AX,SUM			;SUM存储着要显示的字符
		MOV CX,5
L1:	MOV DX,0
		DIV WORD PTR [SI] 	;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dx
		ADD AL,30H
		MOV BYTE PTR [DI],AL	;转换成ASCII码后存入结果存储区
		INC DI
		MOV AX,DX
		ADD SI,2
		LOOP L1
		MOV CX,5
		MOV DI,OFFSET RESULTS	;重新回到results的开始
L2:	CMP BYTE PTR [DI],'0'		;不输出前面的0字符,跳过results中的0位
		JNE L3
		INC DI
		LOOP L2
L3:	MOV DL,0AH					;换行
		MOV AH,2
		INT 21H
		MOV DX,DI				;9号功能调用输出
		MOV AH,9
		INT 21H
		RET
OUTPUT ENDP

十进制输出引用自:

https://blog.csdn.net/pfboy/article/details/1549942

结束

CODE ENDS
	END BEGIN

你可能感兴趣的:(汇编语言)