⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xndex.asm

📁 四则运算
💻 ASM
字号:
;-------------------------------------------------------
;xndex.asm
;simple arithmetic
;-------------------------------------------------------
STACK	SEGMENT PARA STACK 'STACK'
	DB	50 DUP(0)
STACK	ENDS
DATA	SEGMENT
	NUM1	DW ?
	NUM2	DW ?
	RESU1	DW ?
	RESU2	DW ?
	OPAT	DB ?
	WQ10	DW 10000,1000,100,10,1
	MES1	DB 0DH,0AH,0DH,0AH
		DB ' Input 1st number:$'
	MES2	DB 0DH,0AH,' Input operator (+-*/): $'
	MES3	DB 0DH,0AH,' Input 2nd number: $'
	MES4	DB 0DH,0AH,' Result is: $'
	MES5	DB 0DH,0AH
		DB ' *********************************',0DH,0AH
		DB ' *    simple arithmetic (xndex)  *',0DH,0AH
		DB ' * 1. 16 bits precision          *',0DH,0AH
		DB ' * 2. support input a expression *',0DH,0AH
		DB ' * 3. 16 bits number input limit *',0DH,0AH
		DB ' * 4. deal with result overflow  *',0DH,0AH
		DB ' *          by tenudy 12-11-2004 *',0DH,0AH
		DB ' *********************************$'
	MES6	DB 0DH,0AH,0DH,0AH
		DB ' Unknown error',0DH,0AH,'$'
	MES7	DB 0DH,0AH,0DH,0AH
		DB ' Program end',0DH,0AH,'$'
	MES8	DB 0DH,0AH,0DH,0AH
		DB ' Exit program (y/n)?$'
	MES9	DB 0DH,0AH,' Product overflow.$'
	MESA	DB 0DH,0AH,' The low 16bits result is: $'
	MESB	DB 0DH,0AH,' Summation overflow.$'
DATA	ENDS
CODE	SEGMENT
	ASSUME	CS:CODE,DS:DATA
START	PROC	NEAR
	MOV	AX,DATA
	MOV	DS,AX
	LEA	DX,MES5			;显示LOGO
	MOV	AH,9
	INT	21H
MAIN:	LEA	DX,MES1			;输入NUM1
	MOV	NUM1,0
	MOV	BP,1
	LEA	SI,NUM1
	CALL	INCHR
	LEA	DX,MES2			;输入OPAT
	MOV	AH,9
	INT	21H
	CMP	BP,2			;在NUM1中以符号结束
	JE	IN_A1			;跳过输入符号
INOT:	MOV	AH,8
	INT	21H
	CMP	AL,2AH
	JE	IN_A
	CMP	AL,2BH
	JE	IN_A
	CMP	AL,2DH
	JE	IN_A
	CMP	AL,2FH
	JE	IN_A
	JMP	INOT
IN_A:	MOV	OPAT,AL			;有 *+-/ 按键
IN_A1:	MOV	DL,OPAT
	MOV	AH,2
	INT	21H
	LEA	DX,MES3			;输入NUM2
	MOV	NUM2,0
	MOV	BP,0
	LEA	SI,NUM2
	CALL	INCHR
RUMUL:	CMP	OPAT,2AH		;是否 * 乘法
	JNE	RUADD
	MOV	AX,NUM1
	MUL	NUM2
	MOV	RESU1,AX
	JC	RM_1
RM_3:	LEA	DX,MES4			;乘积为16位
	MOV	DI,0
	JMP	RM_4
RM_1:	JO	RM_2
	JMP	RM_3
RM_2:	LEA	DX,MES9			;乘积为32位
	MOV	AH,9
	INT	21H
	LEA	DX,MESA
	MOV	DI,1
RM_4:	MOV	AH,9
	INT	21H
	MOV	AX,RESU1
	CALL	CHDEC	
	JMP	EXOS
RUADD:	CMP	OPAT,2BH		;是否 + 加法
	JNE	RUSUB
	MOV	AX,NUM1
	ADD	AX,NUM2
	MOV	RESU1,AX
	JC	RA_1
	LEA	DX,MES4			;最高位无进位
	MOV	DI,0
	JMP	RA_2
RA_1:	LEA	DX,MESB			;最高位有进位
	MOV	AH,9
	INT	21H
	LEA	DX,MESA
	MOV	DI,1
RA_2:	MOV	AH,9
	INT	21H
	MOV	AX,RESU1
	CALL	CHDEC
	JMP	EXOS
RUSUB:	CMP	OPAT,2DH		;是否 - 减法
	JNE	RUDIV
	LEA	DX,MES4
	MOV	AH,9
	INT	21H
	MOV	AX,NUM1
	SUB	AX,NUM2
	MOV	RESU1,AX
	JC	RS_1
	JMP	RS_2			;最高位无借位
RS_1:	MOV	BX,0			;最高位有借位
	SUB	BX,AX
	MOV	RESU1,BX
	MOV	DL,2DH
	MOV	AH,2
	INT	21H
RS_2:	MOV	DI,0
	MOV	AX,RESU1
	CALL	CHDEC
	JMP	EXOS
RUDIV:	CMP	OPAT,2FH		;是否 / 除法
	JNE	RUERR
	MOV	DX,0
	MOV	AX,NUM1
	DIV	NUM2
	MOV	RESU1,AX
	MOV	RESU2,DX
	LEA	DX,MES4
	MOV	AH,9
	INT	21H
	MOV	DI,0
	MOV	AX,RESU1
	CALL	CHDEC
	MOV	DL,2EH
	MOV	AH,2
	INT	21H
	INT	21H
	INT	21H
	MOV	DI,0
	MOV	AX,RESU2
	CALL	CHDEC
	JMP	EXOS
RUERR:	LEA	DX,MES6			;出现未知错误
	MOV	AH,9
	INT	21H
EXOS:	LEA	DX,MES8			;是否退出程序
	MOV	AH,9
	INT	21H
	MOV	AH,8
	INT	21H
	CMP	AL,59H
	JE	EX_A
	CMP	AL,79H
	JE	EX_A
	CMP	AL,1BH
	JE	EX_A
	JMP	MAIN
EX_A:	LEA	DX,MES7
	MOV	AH,9
	INT	21H
	MOV	AH,4CH			;返回MS-DOS
	INT	21H
START	ENDP
INCHR	PROC	NEAR			;过程,输入16位数字
	MOV	AH,9
	INT	21H
	MOV	DI,0
INR_2:	MOV	AH,8
	INT	21H
	CMP	AL,0DH			;Enter
	JE	INR_1
	CMP	AL,20H			;Space
	JE	INR_1
	CMP	AL,2AH			;*
	JE	INR_6
	CMP	AL,2BH			;+
	JE	INR_6
	CMP	AL,2DH			;-
	JE	INR_6
	CMP	AL,2FH			;/
	JE	INR_6
	CMP	AL,30H
	JB	INR_2
	CMP	AL,39H
	JA	INR_2
	SUB	AL,30H			;AL=30H-39H
	CMP	DI,0
	JNE	INR_5
	CMP	AL,0
	JE	INR_2
	MOV	DI,1			;DI=1 第一个输入不为0
INR_5:	MOV	BL,AL
	MOV	AX,[SI]
	MOV	DX,0AH
	MUL	DX
	JC	INR_3			;JC,JO 乘法是否溢出
INR_4:	MOV	BH,0
	ADD	AX,BX
	JC	INR_2			;JO 加法是否溢出
	MOV	[SI],AX
	MOV	DL,BL
	ADD	DL,30H
	MOV	AH,2
	INT	21H
	JMP	INR_2
INR_3:	JO	INR_2
	JMP	INR_4
INR_1:	MOV	AX,[SI]			;[SI]=0 不能跳出
	CMP	AX,0
	JE	INR_2
	RET
INR_6:	MOV	OPAT,AL
	MOV	AX,[SI]
	CMP	AX,0
	JE	INR_2
	CMP	BP,0
	JE	INR_2			;BP=0 不处理符号
	MOV	BP,2
	RET
INCHR	ENDP
CHDEC	PROC	NEAR			;过程,转为十进制并显示
	LEA	SI,WQ10
	MOV	CX,5
CH_1:	MOV	DX,0
	DIV	WORD PTR [SI]
	MOV	BX,DX
	CMP	DI,0			;DI=0 判断不为0的数
	JNE	CH_3
	CMP	AL,0
	JE	CH_2
	MOV	DI,1			;DI=1 第一个不为0的数
CH_3:	MOV	DL,AL
	ADD	DL,30H
	MOV	AH,2
	INT	21H
CH_2:	ADD	SI,2
	MOV	AX,BX
	LOOP	CH_1
	CMP	DI,0			;没有不为0的数,输出0
	JNE	CH_4
	MOV	DL,30H
	MOV	AH,2
	INT	21H
CH_4:	RET
CHDEC	ENDP
CODE	ENDS
	END	START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -