⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prim.asm

📁 经过修改的PL0编译程序源码
💻 ASM
字号:
; Assembler prolog
;Generated by PL0ASM for MS-DOS 3.X, 4.X, 5.X
        dosseg
        .model  small
;
        .stack  10240
;
        .data
base    dw      0
buffer  db      80 dup (?)
blen    db      80
blank   db      ' $'
minus   db      '-$'
crlf    db      13, 10, '$'
bytecnt dw      ?
pflag   db      ?
;
        .code
start:
        mov     ax, @data
        mov     ds, ax
;
        mov     ax, 0
        push    ax
        mov     [base], sp
        mov     ax, sp
        push    ax
;
        mov     cx, 0
        call    p_sbs     
        push    dx        
        mov     bp, sp    
        mov     ax, [base]
        push    ax        
        mov     [base], bp
        call    pr001
        pop     dx
        mov     [base], dx
        pop     dx
;
        call    endprocess
pr001   proc
        sub     sp, 8
        mov     ax, 1
        push    ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*3], ax
l004:
        mov     bp, [base]
        push    word ptr [bp-2*3]
        mov     ax, 10000
        push    ax
        pop     ax     
        pop     bx     
        cmp     bx, ax 
        jle     m001
        sub     ax, ax
        jmp     m002
m001:   mov     ax, 1
m002:   push    ax
        pop     ax     
        cmp     ax, 0  
        je      m003
        jmp     m004
m003:   jmp     far ptr l050
m004:
        mov     ax, 2
        push    ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*4], ax
        mov     bp, [base]
        push    word ptr [bp-2*4]
        mov     bp, [base]
        push    word ptr [bp-2*3]
        pop     ax     
        pop     bx     
        cmp     bx, ax 
        jl      m005
        sub     ax, ax
        jmp     m006
m005:   mov     ax, 1
m006:   push    ax
        pop     ax     
        cmp     ax, 0  
        je      m007
        jmp     m008
m007:   jmp     far ptr l016
m008:
        mov     ax, 1
        push    ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*6], ax
l016:
        mov     bp, [base]
        push    word ptr [bp-2*6]
        mov     ax, 1
        push    ax
        pop     ax     
        pop     bx     
        cmp     bx, ax 
        je      m009
        sub     ax, ax
        jmp     m010
m009:   mov     ax, 1
m010:   push    ax
        pop     ax     
        cmp     ax, 0  
        je      m011
        jmp     m012
m011:   jmp     far ptr l045
m012:
        mov     bp, [base]
        push    word ptr [bp-2*3]
        mov     bp, [base]
        push    word ptr [bp-2*4]
        mov     bp,sp
        pop     ax   
        pop     ax   
        cwd          
        idiv    word ptr [bp]
        push    ax   
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*5], ax
        mov     bp, [base]
        push    word ptr [bp-2*3]
        mov     bp, [base]
        push    word ptr [bp-2*5]
        mov     bp, [base]
        push    word ptr [bp-2*4]
        pop     ax           
        mov     bp,sp        
        imul    word ptr [bp]
        mov     [bp],ax      
        pop     ax     
        mov     bp,sp  
        sub     [bp],ax
        mov     ax, 0
        push    ax
        pop     ax     
        pop     bx     
        cmp     bx, ax 
        je      m013
        sub     ax, ax
        jmp     m014
m013:   mov     ax, 1
m014:   push    ax
        pop     ax     
        cmp     ax, 0  
        je      m015
        jmp     m016
m015:   jmp     far ptr l034
m016:
        mov     ax, 0
        push    ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*6], ax
l034:
        mov     bp, [base]
        push    word ptr [bp-2*4]
        mov     ax, 1
        push    ax
        pop     ax     
        mov     bp,sp  
        add     [bp],ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*4], ax
        mov     bp, [base]
        push    word ptr [bp-2*4]
        mov     bp, [base]
        push    word ptr [bp-2*3]
        pop     ax     
        pop     bx     
        cmp     bx, ax 
        je      m017
        sub     ax, ax
        jmp     m018
m017:   mov     ax, 1
m018:   push    ax
        pop     ax     
        cmp     ax, 0  
        je      m019
        jmp     m020
m019:   jmp     far ptr l044
m020:
        mov     ax, 0
        push    ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*6], ax
l044:
        jmp     far ptr l016
l045:
        mov     bp, [base]
        push    word ptr [bp-2*3]
        mov     ax, 1
        push    ax
        pop     ax     
        mov     bp,sp  
        add     [bp],ax
        pop     ax   
        mov     bp, [base]
        mov     word ptr [bp-2*3], ax
        jmp     far ptr l004
l050:
        add     sp, 8
        ret
pr001   endp
;
;
; Assembler epilog
;
;  Runtime Support f乺 PL0-Compiler mit
;  Assembler-Code-Generierung
;
p_sbs   proc
;  Base-Adresse des DSA suchen
;   Eingabeparameter:
;   CX  Leveldifferenz
;   Ausgabeparameter:
;   DX  Resultat Base
        mov     dx, [base] 
sbs2:
        cmp     cx, 0
        je      sbs1
        mov     bp, dx
        mov     dx, word ptr [bp]
        dec     cx
        jmp     sbs2
sbs1:
        ret  
p_sbs   endp
;
endprocess  proc
;   Prozess durch DOS-Funktion beenden
        mov     ah, 4Ch
        int     21h
        ret
endprocess  endp
;
printint  proc
;  Integer-Zahl ausgeben
;    Eingabeparameter:  
;    AX  Zahl  
;    CX  Laenge
        mov     bx, offset buffer
        cmp     ax, 32767        
        jbe     prn1
        neg     ax               
        call    number2string    
        mov     bx, offset buffer
        cmp     [bx], byte ptr ' '
        jne     prn5 
        inc     bx   
        mov     cx, 4
prn3:   cmp     [bx], byte ptr ' '
        jne     prn4
        inc     bx
        loop    prn3
prn5:   mov     bx, offset minus
        call    outstring
        jmp     prn6
prn4:   dec     bx
        mov     [bx], byte ptr '-'
        mov     bx, offset blank
        call    outstring
prn6:   mov     bx, offset buffer
        call    outstring
        jmp     prn2
prn1:   call    number2string
        mov     bx, offset blank 
        call    outstring        
        mov     bx, offset buffer
        call    outstring        
prn2:   mov     bx, offset blank
        call    outstring        
        ret
printint  endp
;
number2string  proc
;  Umwandeln einer Dualzahl in einen String
;    Eingabeparameter:
;    AX    Zahl
;    DS:BX Zeiger auf Puffer zum Speichern d. Strings
;    CX    Anzahl der Zeichen
        mov     si, 10  
        mov     di, cx  
        add     bx, cx  
        mov     [bx], byte ptr '$'
        dec     bx      
wandeln:       
        sub     dx, dx  
        div     si      
        add     dl, '0' 
        mov     [bx], dl
        dec     bx      
        loop    wandeln 
        mov     cx, di  
        inc     bx      
        dec     cx      
blanks:        
        cmp     [bx], byte ptr '0'
        jne     fertig  
        mov     [bx], byte ptr ' '
        inc     bx      
        loop    blanks  
fertig:        
        ret            
number2string  endp
;
outstring  proc
;  Ausgabe eines Strings unter MS-DOS oder OS/2
;    Eingabeparameter:
;    DS:BX  Zeiger auf String
        mov     dx, bx
        mov     cx, 0 
anfang:
        inc     cx    
        inc     bx    
        cmp     [bx], byte ptr '$'
        jne     anfang
        mov     ah, 40H 
        mov     bx, 1   
        int     21h     
        ret            
outstring endp
;
string2number  proc
;  Umwandeln einer String in eine Dualzahl
;    Eingabeparameter:
;    DS:BX  Zeiger auf Puffer mit String
;    CX     Anzahl der Zeichen
;    Ausgabeparameter:
;    AX     Zahl
        mov     pflag, 0 
        cmp     [bx], byte ptr '-'
        jne     pos      
        mov     pflag, 1 
        inc     bx       
        dec     cx       
pos:
        mov     si, 10   
        sub     ax, ax   
mult:
        mul     si       
        mov     dh, 0    
        mov     dl, [bx] 
        sub     dl, byte ptr '0'
        mov     di, dx   
        add     ax, di   
        inc     bx       
        loop    mult     
        cmp     pflag, 1 
        je      nega     
        ret
nega:   neg     ax
        ret
string2number endp
;
instring  proc
;  Einlesen eines Strings vom Keyboard (MS-DOS)
;  bzw. von stdin (MS OS/2)
;    Eingabeparameter:
;    DS:BX  Zeiger auf Puffer
;    AL     L刵ge des Puffers
;    Ausgabeparameter:
;    AL     Anzahl der gelesenen Bytes
        mov     ah, 3FH   
        mov     dx, bx    
        mov     bx, 0     
        mov     ch, 0     
        mov     cl, al    
        int     21h       
        ret
instring endp   
;
        end      start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -