汇编实验7:数值运算与数据输出

1、实验目的:掌握通过键盘输入接收字符串、乘法运算、2/16进制数与ASCII码之间相互转换以及数据显示输出的程序设计方法。
2、实验内容:从键盘输入2个0–99之间的整数,对其做乘法运算,在屏幕上显示出该乘积对应的二进制和十六进制数。
3、实验要求:
(1)在屏幕提示:“please input the first number(0–99): ”后,输入一个0–99之间的整数。
若所输入的数不在此范围内,或输入其它字符,则屏幕提示:“input an invalid number, input again!”;
(2)在屏幕提示:“please input the second number(0–99): ”后,输入一个0–99之间的整数。
若所输入的数不在此范围内,或输入其它字符,则屏幕提示:“input an invalid number, input again!”。
(3)对2个整数做乘法运算。
(4)在屏幕上显示出乘积所对应的二进制和十六进制数和十进制;
(5)显示部分功能要求用子程序实现

DATAS SEGMENT
    ;此处输入数据段代码  
    ;定义缓冲区
    BUFFER DB 5 ;最大字符长度
    	   DB ? ;实际字符的长度
    	   DB 5 DUP(0) ;存访开始输入的字符串
   	TEMP1 DB ?; 存放第一个输入的数
    TEMP2 DB ?; 存放第二个输入的数
    STRING1 DB 'please input the first number(0~99):',0DH,0AH,'$'
    STRING2 DB 0DH,0AH,'input  an  invalid  number, input again!',0DH,0AH,'$'
    STRING3 DB 0DH,0AH,'please input the second number(0~99):',0DH,0AH,'$'
    STRING4 DB 0DH,0AH,'Hexadecimal is',0DH,0AH,'$'
    STRING5 DB 0DH,0AH,'Binary is',0DH,0AH,'$'
    STRING6 DB 0DH,0AH,'Decimal is',0DH,0AH,'$'
    ; 0DH回车 0AH 换行 '$'结尾字符
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS;将dates数据段地址送往DS寄存器
    MOV DS,AX
    ;此处输入代码段代码
    
    MOV DX,OFFSET STRING1;输出string1字符串	
    ; DX为字符串的偏移地址
	JMP START1
START2:    
    MOV DX,OFFSET STRING2;输出sting2字符串
START1:
    MOV AH,09H
    INT 21H 
    
    MOV DX,OFFSET BUFFER; 输入第一个数
    MOV AH,0AH
    INT 21H
    
 	MOV AL,BUFFER[1] ; 长度大于2肯定不合理
   	CMP AL,02H
   	JA START2
   	
   	MOV AL,BUFFER[2]; 第一个字符必须为'0'~'9'
   	CMP AL,'0'
   	JB START2
   	CMP AL,'9'
   	JA START2

	MOV AL,BUFFER[1]; 长度为1则不要继续判断
	CMP AL,01H
	JE START3

   	MOV AL,BUFFER[3];第二个字符必须为'0'~'9'
   	CMP AL,'0'
   	JB START2
   	CMP AL,'9'
   	JA START2
   	JMP START4
START3:; 一位数
	SUB BUFFER[2],'0';减去'0'
	MOV AL,BUFFER[2]
	MOV TEMP1,AL
	JMP OP1
START4:; 二位数
	SUB BUFFER[2],'0'
	SUB BUFFER[3],'0'
	MOV AL,BUFFER[2]
	MOV BL,10D
	MUL BL
	ADD AL,BUFFER[3];(buffer[2]-'0')*10D+buffer[3]
   	MOV TEMP1,AL

OP1:   	
   	 
 	MOV DX,OFFSET STRING3
	JMP START5
START6:    
    MOV DX,OFFSET STRING2
START5:
    MOV AH,09H
    INT 21H
    
    MOV DX,OFFSET BUFFER
    MOV AH,0AH
    INT 21H
    
 	MOV AL,BUFFER[1] ; 长度大于2肯定不合理
   	CMP AL,02H
   	JA START6
   	
   	MOV AL,BUFFER[2]
   	CMP AL,'0'
   	JB START6
   	CMP AL,'9'
   	JA START6

	MOV AL,BUFFER[1]; 长度为1则不要继续判断
	CMP AL,01H
	JE START7

   	MOV AL,BUFFER[3]
   	CMP AL,'0'
   	JB START6
   	CMP AL,'9'
   	JA START6
   	JMP START8
   	
START7:; 一位数
	SUB BUFFER[2],'0'
	MOV AL,BUFFER[2]
	MOV TEMP2,AL
	JMP OP2
START8:;两位数
	SUB BUFFER[2],'0'
	SUB BUFFER[3],'0'
	MOV AL,BUFFER[2]
	MOV BL,10D
	MUL BL
	ADD AL,BUFFER[3]
   	MOV TEMP2,AL
OP2:   
   	; 相乘
   	MOV AL,TEMP1
   	MOV BL,TEMP2
   	MUL BL
   	MOV BX,AX; 最后结果存BX
   	
   	MOV DX,OFFSET STRING4; 十六进制调用函数
   	MOV AH,09H
   	INT 21H 
   	CALL PR1
   	
  	MOV DX,OFFSET STRING5; 二进制调用函数
   	MOV AH,09H
   	INT 21H 
   	CALL PR2
   	
   	MOV DX,OFFSET STRING6; 十进制调用函数
   	MOV AH,09H
   	INT 21H 
   	CALL PR3
   	
    MOV AH,4CH
    INT 21H
    

PR1 PROC 
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
    MOV CX,04D;最多四位数
	MOV	AX,0F000H;与1111 0000 0000 0000 AND
AGAIN1:
   	MOV DX,BX
   	AND DX,AX
   	SHR AX,01D;每次AX右移4位
   	SHR AX,01D
   	SHR AX,01D
   	SHR AX,01D
   	JMP CHU1
CHU2:
	SHR DX,01D
	SHR DX,01D
	SHR DX,01D
	SHR DX,01D    
CHU1:
   	CMP DX,0FH;如果答案大于0FH,则右移4位,本质是把位数移到最后四位
    JA CHU2
    
    PUSH AX;保护AX值
    
    ADD DL,'0'
    CMP DL,'9'
    JA ASC
    
    JMP NUM
ASC	:;字母
    ADD DL,07H
NUM :; 数字
    MOV AH,02H
    INT 21H
    
	POP AX
	
    LOOP AGAIN1
    
    POP DX
	POP CX
	POP BX
	POP AX
    RET
PR1 ENDP
 
 
PR2 PROC; 二进制函数
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
    MOV CX,16D;最多16位数
	MOV	AX,08000H;以0001 0000 0000 0000 为起点
AGAIN2:
   	MOV DX,BX
   	AND DX,AX
   	SHR AX,01D;每次右移一位
   	JMP CHU3
CHU4:
	SHR DX,01D  
CHU3:
   	CMP DX,01H;让答案移动最后一位
    JA CHU4
    
    PUSH AX;保留AX值
    
    ADD DL,'0'
    MOV AH,02H
    INT 21H
    
	POP AX;与pop对应
	
    LOOP AGAIN2
    
    POP DX
	POP CX
	POP BX
	POP AX
	RET
PR2 ENDP

PR3 PROC; 十进制函数
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
	MOV AX,BX
	MOV BX,10D
	MOV DX,0D
	MOV CX,04H
	
; 把所有位数放入堆栈
AGAIN3 : ;最多四位数,所以循环四次
	DIV BX; 每次除10
	PUSH DX; 答案放入堆栈
	MOV DX,0 ;使得DX.AX中的DX清空
	LOOP AGAIN3
	
; 把所有位数压出堆栈输出
	MOV CX,04H
AGAIN4 : 	
  	POP DX
  	ADD DL,'0';加上'0'的ascii码
  	MOV AH,02H
  	INT 21H
  	lOOP AGAIN4
 
    POP DX
	POP CX
	POP BX
	POP AX
	RET
PR3 ENDP 

CODES ENDS
    END START 
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14209621.html