www.pudn.com > subpas.rar > test.asm


;generated by subpas Compiler 
TITLE	example 
.286 
.model	small 
 
.STACK	2048 
 
.DATA 
	_x	DW	? 
	_y	DW	? 
 
.CODE 
 
;//////////////////////////////////////////////////////// 
 
_gcd	PROC	NEAR 
; @result stores the return value 
	@result = -2 
; The offset of parameters is: 
	_a$ = 6 
	_b$ = 4 
	push	bp 
	mov	bp,sp 
	sub	sp,2 
	cmp	word ptr _b$[bp],0 
	jne	Lab1 
	mov	ax,word ptr _a$[bp] 
	mov	word ptr @result[bp],ax 
	jmp	Lab2 
	Lab1: 
	push	word ptr _b$[bp] 
	mov	ax,word ptr _a$[bp] 
	mov	dx,0 
	idiv	word ptr _b$[bp] 
	mov	ax,dx 
	push	ax 
	call	_gcd 
	mov	word ptr @result[bp],ax 
	Lab2: 
	mov	ax,word ptr @result[bp] 
	mov	sp,bp 
	pop	bp 
	ret	4 
_gcd	ENDP 
 
;//////////////////////////////////////////////////////// 
 
_readln	PROC	NEAR 
; The offset of parameters is: 
	_x$ = 4 
	push	bp 
	mov	bp,sp 
	mov	dx,0	;number will store here 
	mov	ch,0	;indicate that whether the char is digit 
	mov	cl,0	;indicate that whether the number is positive 
	mov	ah,1 
	int	21h 
	cmp	al,'-' 
	jne	positive$ 
	mov	cl,1 
	newchar$: 
	mov	ah,1 
	int	21h 
	positive$: 
	cmp	al,0dh  ;if enter? 
	je	enter$ 
	cmp	ch,1		;not convert 
	je	newchar$ 
	sub	al,30h	 
	jl	notdigit$	;not digit 
	cmp	al,9 
	jg	notdigit$	;not digit,too 
	imul	dx,10 
	mov	ah,0 
	add	dx,ax	;now handled a digit 
	jmp	newchar$ 
	notdigit$: 
	mov	ch,1 
	jmp	 newchar$ 
	enter$: 
	mov	di,word ptr _x$[bp]	 
	cmp	cl,1 
	jne	next$ 
	neg	dx 
	next$: 
	mov	[di],dx	;save the number 
	mov	dl,10		;打印换行符 
	mov	ah,2 
	int	21h 
	mov	sp,bp 
	pop	bp 
	ret	2 
_readln	ENDP 
 
;//////////////////////////////////////////////////////// 
 
_writeln	PROC	NEAR 
;	The	offset of	parameters is: 
_x$	=	4 
push	bp 
mov	bp,sp 
mov	ax,word	ptr	_x$[bp]	;把数放到ax 
cmp	ax,0 
jge	next1$		;若为负数,则打印负号 
mov	cx,ax 
mov	dl,'-' 
mov	ah,2 
int	21h 
mov	ax,cx 
neg	ax			;负数转为正数 
next1$: 
mov	cx,0		;cx用来保存该正数的位数,即入栈个数 
mov	bx,10		;bx用作除数 
mov	dx,0		;屏蔽高位	 
loop3$: 
div	bx		;将ax:bx中的数除以10,以得到余数和商 
cmp	ax,10 
jb	print$		;如果商只有一位,则打印该数字 
push	dx		;否则,保存余数, 
inc	cx		;并增加保存余数的个数 
mov	dx,0	;屏蔽余数 
jmp	loop3$	;将商继续除以10 
print$: 
push	dx	;将个位数保存 
inc	cx 
cmp	ax,0	;这时ax是最高位,如果为0, 
jz	print_left$	;则不打印,对应该数能被10除尽的情况; 
mov	dl,al	;将al中的数移到dl中 
add	dl,30h	;以打印该数 
mov	ah,2 
int	21h 
print_left$: 
cmp	cx,0	;如果没有保存余数的个数为零, 
jz	exit$	;则退出 
pop	ax	;否则,把余数出栈 
mov	dl,al	;并放到dl中 
add	dl,30h	;打印	 
mov	ah,2 
int	21h 
dec	cx	;保存余数的个数减一 
jmp	print_left$ 
exit$: 
mov	ah,2	;打印回车 
mov	dl,13 
int	21h 
mov	dl,10 
int	21h 
mov	sp,bp 
pop	bp 
ret	2 
_writeln	ENDP 
 
;//////////////////////////////////////////////////////// 
 
_MAIN	PROC	FAR 
; Store return address to OS: 
	push	ds 
	sub	ax,ax 
	push	ax 
; set segment registers: 
	mov	ax,@data 
	mov	ds,ax 
; main instructions 
	lea	si,_x 
	push	si 
	call	_readln 
	lea	si,_y 
	push	si 
	call	_readln 
	push	word ptr _x 
	push	word ptr _y 
	call	_gcd 
	push	ax 
	call	_writeln 
	ret 
_MAIN	ENDP 
 
	END	_MAIN