• 汇编实验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 
    
  • 相关阅读:
    hdfs小文件处理 flume
    离线数仓集群配置?每天处理的数据量多大?有多少张表?事实表和维度表各自占比?最多的表有多少个字段?
    你想负责哪一块?遇到难度最大的问题是什么?
    一、设计模式七大原则
    组合聚合
    ImportError:libgeos3.6.2.so:无法打开共享对象文件:没有此类文件或目录
    logger
    pycurl
    详解连接池参数设置(边调边看)
    gozero微服务实战系列(三、API定义和表结构设计)
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14209621.html
Copyright © 2020-2023  润新知