📄 prim.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 + -