1. 程式人生 > 實用技巧 >彙編——輸入兩個0~99的數字然後以十六進位制和二進位制顯示他們的乘積

彙編——輸入兩個0~99的數字然後以十六進位制和二進位制顯示他們的乘積

使用的是AH的01H,儲存的單個字元

DATAS SEGMENT
    ;此處輸入資料段程式碼  
    
	STR1 DB 0AH,'INPUT NUMBER(0~99):',0DH,0AH,'$'
	STR2 DB 0AH,'INPUT AN INVALID NUMBER,INPUT AGAIN!',0DH,0AH,'$'
	COUNT DB 0B
	PRODUCT DB 1D
    
DATAS ENDS

STACKS SEGMENT
    ;此處輸入堆疊段程式碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此處輸入程式碼段程式碼
    
INPUT:
    ;顯示提示
    MOV AH,09H	
    MOV DX,OFFSET STR1
    INT 21H  
    ;輸入,存到AL
    MOV AH,01H
    INT 21H
    ;將輸入的第一個數放到BH
    MOV BH,AL
    ;輸入第二個數
    MOV AH,01H
    INT 21H
	;第二個數放到BL    
    MOV BL,AL

;判斷    
JUDGE:
	;判斷是不是數字
	CMP BH,30H
	JB NOPE
	CMP BH,39H
	JA NOPE

	CMP BL,0DH
	JE CHAN		;跳轉處理回車鍵即單個數字
	CMP BL,30H
	JB NOPE
	CMP BL,39H
	JA NOPE
	
CONTI:
	;count++
	INC COUNT
	MOV CL,10D
	SUB BH,48D
	SUB BL,48D
	MOV AL,BH
	MUL CL
	ADD AL,BL
	;相乘,MUL立即數是不被允許的,且八位直接和AL相乘
	MUL PRODUCT
	MOV PRODUCT,AL   

COMP:
	;比較count
	CMP COUNT,10B
	;count等於2跳出
	JE EXIT
	;否則繼續輸入
	JMP INPUT
	
CHAN:
	INC COUNT
	SUB BH,48D
	MOV AL,BH	;直接加BH
	MUL PRODUCT
	MOV PRODUCT,AL
	JMP COMP
	


;非法字元	
NOPE:
	LEA DX,STR2
	MOV AH,09H
	INT 21H
	JMP INPUT

EXIT: 
    ;把product給AL,將ax給bx
	MOV AL,PRODUCT
	MOV BX,AX
	;換行
	MOV AH,02H
	MOV DL,0AH
	INT 21H
	
	CALL RESULT16
	MOV DL,0AH
	MOV AH,02H
	INT 21H
	CALL RESULT2
	
    MOV AH,4CH
    INT 21H

RESULT16 PROC NEAR
    	PUSH AX
    	PUSH BX
    	PUSH CX
    	PUSH DX
   		
   		;迴圈4次
   		MOV CX,4
   		
   	NEXT:
   		PUSH CX
   		MOV CL,4
    	MOV DL,BH 
    	;右移4次  
    	SHR DL,CL	
    	;清除標誌位
    	OR DL,30H
    	CMP DL,39H
    	JBE PRINT
    	ADD DL,7
    	
   	PRINT: 
    	MOV AH,02H
    	INT 21H
    	SHL BX,CL
    	POP CX
    	LOOP NEXT
    	
    	POP DX
    	POP CX
    	POP BX
    	POP AX
    	RET
RESULT16 ENDP

RESULT2 PROC NEAR
        PUSH AX
    	PUSH BX
    	PUSH CX
    	PUSH DX
   		
   		MOV CX,16
   		
   	NEXT:
   		PUSH CX
   		MOV CL,7
    	MOV DL,BH   
    	SHR DL,CL	
    	AND DL,01H
    	OR DL,30H
    	
    	MOV AH,02H
    	INT 21H
    	SHL BX,1
    	POP CX
    	LOOP NEXT
    	
    	POP DX
    	POP CX
    	POP BX
    	POP AX
    	RET
RESULT2 ENDP

CODES ENDS
    END START