datarea    segment
      n     dw    ?
      result  dw    ?
   datarea    ends

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

   prognam    segment
      main    proc    far
      assume   cs:prognam,ds:datarea,ss:stack_seg
   start:
      mov    ax,stack_seg
      mov    ss,ax
      mov    sp,offset     tos

      push    ds
      sub    ax,ax
      push    ax
      mov    ax,datarea
      mov    ds,ax
   ; 殻會議麼勣何蛍
      mov    bx,n
      push    bx
      call    fact             ; 距喘徨殻會fact
      pop    result
      ret
      main    endp

      fact    proc near           ; 協吶徨殻會fact
      push    ax
      push    bp
      mov    bp,sp
      mov    ax,[bp+6]
      cmp    ax,0
      jne    fact1
      inc    ax
      jmp    exit
   fact1:
      dec    ax
      push    ax
      call    fact
      pop    ax
      mul    word     ptr[bp+6]
   exit: mov    [bp+6],ax
      pop    bp
      pop    ax
      ret
      fact    endp
  prognam ends
      end    start