【8086】大きな整数階乗

; you may customize this and other start-up templates; 
; the location of this template is c:\emu8086\inc\0_com_template.txt

     
data  segment 
  num dB 1000 dup (-1)
data ends

code  segment      
    assume ds:data, cs:code 
  
start:
    mov  ax, data
    mov  ds, ax
    mov  es, ax
    
    ;两位输入     
    mov ah,1
    int 21h
    sub al,30h
    mov bl,10
    mul bl     
    mov cl,al
    mov ah,1
    int 21h
    sub al,30h
    add cl,al
    mov ch,0 
    
    mov  dl, 0dh    ;回车     
    mov  ah, 2           
    int  21h            
    mov  dl, 0ah    ;换行  
    int  21h 
    
    mov  dx,0           
    mov [di],1    
         
loop1:
    push 0 
    lea  di, num
    inc dx
    cmp dx,cx
    ja loopend
loop2:
    mov al,dl
    mov bl,[di]
    mul bl
    ;低位加进位存放mem
    pop bx
    push ax
    
    mov ah,0
    mov bl ,bh
    mov bh , 0
  
    add ax  ,bx
    ;加法进位
    pop bx
    add bh,ah
    push bx
    
    mov [di],al
    inc di
    mov al,[di]
    cmp al,-1
    jne loop2
    pop ax
    cmp ah,0
    je  NOTSAVE
    mov [di],ah
NOTSAVE:
    jmp loop1
        
loopend:
    ;输出
    lea di,num
findlast:
    inc di
    mov cl,[di]
    cmp cl,-1
    jne findlast    
    
    
    lea cx,num
printloop:
    sub di,1
    ;设置被除数
    mov al,[di]
    mov ah,0
    mov bl,16
    div bl   
    push ax
    mov dl,al
    
    cmp dl,9
    ja  alpha1
    add dl,30h
    jmp num1
alpha1:
    add dl,37h
num1:
    mov ah,2
    int 21h
    pop dx
    mov dl,dh
    cmp dl,9
    ja  alpha2
    add dl,30h
    jmp num2
alpha2:
    add dl,37h
num2:
    int 21h
    cmp di,cx
    jne printloop
    
    mov dl,48h
    int 21h
    
       
    ;程序结束,返回到操作系统系统
    mov ax, 4c00h 
    int 21h  
    end  start
code  ends      
ret

 

おすすめ

転載: blog.csdn.net/saber_jk/article/details/84865265