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