¡¡data_seg ¡¡¡¡segment
¡¡¡¡¡¡¡¡n_v ¡¡¡¡¡¡¡¡¡¡¡¡ dw ¡¡¡¡¡¡?
¡¡¡¡¡¡¡¡result ¡¡¡¡¡¡¡¡¡¡dw ¡¡¡¡¡¡?
¡¡¡¡¡¡data_seg ¡¡¡¡ends

¡¡¡¡¡¡stack_seg ¡¡¡¡segment
¡¡¡¡¡¡¡¡¡¡dw ¡¡¡¡¡¡¡¡¡¡128 ¡¡¡¡¡¡dup(0)
¡¡¡¡¡¡¡¡¡¡tos ¡¡¡¡¡¡¡¡ label ¡¡¡¡word
¡¡¡¡¡¡stack_seg ¡¡¡¡ends

¡¡¡¡; ¶¨Òå´úÂë¶Îcode1
¡¡¡¡¡¡¡¡code1 ¡¡¡¡¡¡segment
¡¡¡¡¡¡¡¡¡¡main ¡¡¡¡¡¡proc ¡¡¡¡¡¡far
¡¡¡¡¡¡¡¡¡¡assume ¡¡¡¡cs:code1,ds:data_seg,ss:stack_seg
¡¡¡¡start:
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ax,stack_seg
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ss,ax
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ sp,offset tos

¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡ds
¡¡¡¡¡¡¡¡¡¡sub ¡¡¡¡¡¡ ax,ax
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡ax
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ax,data_seg
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ds,ax
¡¡¡¡; ³ÌÐòµÄÖ÷Òª²¿·Ö
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ bx,offset ¡¡¡¡result
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡bx ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; resultµ¥ÔªµÄµØÖ·ÈëÕ»
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ bx,n_v
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡bx ; n_vµ¥ÔªµÄÄÚÈÝÈëÕ»
¡¡¡¡¡¡¡¡¡¡call ¡¡¡¡¡¡far ¡¡¡¡¡¡¡¡¡¡ptr fact ¡¡; Ô¶µ÷ÓÃ×Ó³ÌÐòfact
¡¡¡¡¡¡¡¡¡¡ret
¡¡¡¡¡¡¡¡¡¡main ¡¡¡¡¡¡endp
¡¡ code1¡¡ends

¡¡¡¡; ¶¨Òå´úÂë¶Îcode
¡¡¡¡¡¡¡¡¡¡code ¡¡¡¡¡¡segment
¡¡¡¡; ¶¨ÒåframeÖ¡½á¹¹Êý¾Ý
¡¡¡¡¡¡¡¡¡¡frame ¡¡¡¡ struc
¡¡¡¡¡¡¡¡¡¡save_bp¡¡¡¡dw ¡¡¡¡¡¡¡¡¡¡?
¡¡¡¡¡¡¡¡¡¡save_cs_ip dw ¡¡¡¡¡¡¡¡¡¡2 dup(?)
¡¡¡¡¡¡¡¡¡¡n¡¡¡¡¡¡¡¡¡¡dw¡¡¡¡¡¡¡¡¡¡ ?
¡¡¡¡¡¡¡¡¡¡result_addr dw ¡¡¡¡¡¡¡¡ ?
¡¡¡¡¡¡¡¡¡¡frame ¡¡¡¡ ends
¡¡¡¡¡¡¡¡¡¡assume ¡¡¡¡cs:code
¡¡¡¡¡¡¡¡¡¡fact ¡¡¡¡¡¡proc ¡¡¡¡¡¡¡¡far ¡¡¡¡¡¡¡¡; ¶¨Òå×Ó³ÌÐòfact
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡bp
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ bp,sp ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ; bpÓÃÀ´Ö¸ÏòÖ¡½á¹¹
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡bx
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡ax
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ bx,[bp].result_addr ¡¡¡¡ ; ÿ֡ÖÐresult_addrËÍbx
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ax,[bp].n ¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ; ÿ֡ÖÐnËÍax
¡¡¡¡¡¡¡¡¡¡cmp ¡¡¡¡¡¡ ax,0
¡¡¡¡¡¡¡¡¡¡je ¡¡¡¡¡¡¡¡done
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡bx ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; ΪÏÂÒ»´Îµ÷ÓÃresult_addrÈëÕ»
¡¡¡¡¡¡¡¡¡¡dec ¡¡¡¡¡¡ ax
¡¡¡¡¡¡¡¡¡¡push ¡¡¡¡¡¡ax ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; ΪÏÂÒ»´Îµ÷ÓÃn-1ÈëÕ»
¡¡¡¡¡¡¡¡¡¡call ¡¡¡¡¡¡far ptr fact
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ bx,[bp].result_addr
¡¡¡¡¡¡¡¡¡¡mov ¡¡¡¡¡¡ ax,[bx]
¡¡¡¡¡¡¡¡¡¡mul ¡¡¡¡¡¡ [bp].n ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; (ax)= n*result
¡¡¡¡¡¡¡¡¡¡jmp ¡¡¡¡¡¡ short ¡¡¡¡¡¡¡¡return
¡¡¡¡done: mov ¡¡¡¡¡¡ ax,1 ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡; (ax)=1
¡¡return: mov ¡¡¡¡¡¡ [bx],ax ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ; result=(ax)
¡¡¡¡¡¡¡¡¡¡pop ¡¡¡¡¡¡ ax
¡¡¡¡¡¡¡¡¡¡pop¡¡¡¡¡¡¡¡bx
¡¡¡¡¡¡¡¡¡¡pop¡¡¡¡¡¡¡¡bp
¡¡¡¡¡¡¡¡¡¡ret¡¡¡¡¡¡¡¡4
¡¡¡¡¡¡¡¡¡¡fact ¡¡¡¡¡¡endp
¡¡¡¡code¡¡ends
¡¡¡¡end ¡¡start