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

📄 jiecheng.asm

📁 用16位X86汇编实现32位阶乘
💻 ASM
字号:
;??,????7??????,????
;version 1.0

DATA	SEGMENT
Nin 	DB 13, 10, 13, 10, 'please input: N(0<n<12)= ', '$'
Nerror	DB 13, 10, 13, 10, 'Sorry, Not valuable, please check it.', 13, 10, '$'
Nout	DB 13, 10, 13, 10, 'result is :   N!      = ', '$'
CON	DB 13, 10, 13, 10, 13, 10, 'continue?(y or n):	', '$'
ENDPR	DB 13, 10, 13, 10, 13, 10, 'thanks, program end normally.', '$'
strn	DB 6, 0 , 12 DUP(?)
strout	DB 12 DUP(?)
DATA	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE,DS:DATA
;main	PROC
START:	MOV	AX, DATA
	MOV	DS, AX
;input n
	LEA	DX, Nin
	CALL	puts
	LEA	DX, strn
	CALL	gets
;calc n
	LEA	SI, strn + 2
	CALL	atou16
;calc n!
	CALL	fact
;output 
	LEA	SI, strout
	CALL	u16toa
	LEA	DX, Nout
	CALL 	puts
	LEA	DX, strout
	CALL	puts
ENDPRG:
	LEA	DX, CON
	CALL	puts
	;LEA	DX, strn
	MOV	AH, 1
	INT	21h
	CMP	AL, 'y'
	JE	START
	CMP	AL, 'Y'
	JE	START

	LEA	DX, ENDPR
	CALL	puts
	MOV	AH, 4ch
	INT	21h
;main	ENDP



gets	PROC
	PUSH	AX
	MOV	AH, 10
	INT	21h
	POP	AX
	RET
gets	ENDP

puts	PROC
	PUSH	AX
	MOV	AH, 9
	INT	21h
	POP	AX
	RET
puts	ENDP

atou16	PROC
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	MOV	AX, 0

      MOV	DL, [SI]
	CMP	DL, '0'
	JB	ERROR
	CMP	DL, '9'
	JG	ERROR
next:	MOV	DL, [SI]
	CMP	DL, '0'
	JB	done
	CMP	DL, '9'
	JG	done

	SHL	AX, 1
	MOV	BX, AX
	MOV	CL, 2
	SHL	AX, CL
	ADD	AX, BX
	AND	DX, 0fh
	ADD	AX, DX
	INC	SI
	JMP	next

done:	CMP	AX, 12
	JG	ERROR
      CMP	AX, 0
	JB	ERROR
	JMP	RIGHT
ERROR:
	LEA	DX, Nerror
	MOV	AH, 9
	INT	21H
	JMP	ENDPRG
RIGHT:

	POP	SI
	POP	DX
	POP	CX
	POP	BX
	RET
atou16	ENDP

fact	PROC
	CMP	AX, 0
	JNE	iia
	MOV	AX, 1
      MOV	DX, 0

	RET
iia:	PUSH	AX
	DEC	AX
	CALL	fact
x2:	POP	CX
	;MUL	CX
      ;PUSH      DX
      PUSH      AX
      MOV       AX,DX
      MUL	CX
      ;MOV     CX, 65535
      ;MUL       CX
      MOV       BX,AX
      POP      AX
      ;POP       CX
      ;ADD       AX,CX 
             MUL       CX
      ADD       DX,BX
      
x3:	RET
fact	ENDP
u16toa	PROC
	PUSH	AX
	PUSH	BX
	PUSH	DX
	PUSH	SI


      MOV	BX, 10000
      DIV    BX
      PUSH	DX
	;MOV	AH, 9
	;INT	21h
       MOV	CS:Flag, 0
     	MOV	BX, 10000
next2:	MOV	DL, 0
cont:	CMP	AX, BX
	JB	skip
	SUB	AX, BX
	INC	DL
	JMP	cont
skip:	CMP	CS:Flag, 0
	JNE	store
	CMP	DL, 0
	JZ	jump
	MOV	CS:Flag, 1
store:	OR	DL, 30h
	MOV	[SI], DL
	INC 	SI
jump:	XCHG	AX, BX
	CWD
	DIV	CS:Radix
	XCHG	AX, BX
	CMP	BX, 1
	JNE	next2
              
	CMP	CS:Flag, 0
	JNE	stlast
	CMP	AL, 0
	JZ	o2
	MOV	CS:Flag, 1
stlast:	OR	AL, 30h
	MOV	[SI], AL
      INC       SI 
 o2:                               
      POP    AX        
	MOV	BX, 1000
next3:	MOV	DL, 0
cont3:	CMP	AX, BX
	JB	skip3
	SUB	AX, BX
	INC	DL
	JMP	cont3
skip3:	CMP	CS:Flag, 0
	JNE	store3
	CMP	DL, 0
	JZ	jump3
          
	MOV	CS:Flag, 1
store3:	OR	DL, 30h
	MOV	[SI], DL
	INC 	SI
jump3:	XCHG	AX, BX
	CWD
	DIV	CS:Radix
	XCHG	AX, BX
	CMP	BX, 1
	JNE	next3

	OR	AL, 30h
	MOV	[SI], AL
	MOV	BYTE PTR 1[SI], '$'
	POP	SI
	POP	DX
	POP	BX
	POP	AX
	RET
Radix	DW	10
Flag	DB	0
u16toa	ENDP

CODE	ENDS
	END	START


⌨️ 快捷键说明

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