📄 stdio.inc
字号:
;--------------------------------------------------------------
;**************** stdio.inc *********************************
; standard input/output macro libray
;==============================================================
; pause -- pause runing program
; course(cury,curx) -- set cursor position
; println -- turn next line
; printspc(n) -- print <space>
; n--the number of the <space>
; puts(addr) -- output string which end by '$'
; addr--start address of the string
; putsln(addr) -- output string which end by '$' in new line
; addr--start address of the string
; gets(addr) -- input string which end by 'enter'
; addr--start address of the buffer to storage the string
; addr--storaged the max lenght of the string
; addr+1--storaged the real length of the string
; addr+2--start position of the string
; putdu(addr) -- output as decimal unsigned number
; addr--start address of the data
; putds(addr) -- output as decimal signed number
; addr--start address of the data
; getd(addr) -- input decimal data which end by 'D' or <Enter>
; addr--start address of the buffer to storage the data
; puth(addr) -- output as hex data
; addr--start address of the data
; geth(addr) -- input hex data which end by 'H' or <Enter>
; addr--start address of the buffer to storage the data
;---------------------------------------------------------------
pause macro
mov ah,01h
int 21h
endm
;----------------------------------------------------------------
course macro cury,curx
push ax
push bx
push dx
mov ah,2
mov dh,cury
mov dl,curx
mov bh,0
int 10h ;10h号中断可准确定位光标。
pop dx
pop bx
pop ax
endm
;---------------------------------------------------
println macro
push ax
push bx
push cx
push dx
mov ah,3
mov bh,0
int 10h
inc dh
mov dl,0
mov ah,2
int 10h
pop dx
pop cx
pop bx
pop ax
endm
;---------------------------------------------------
printspc macro n
local NEXT
push ax
push cx
mov cx,n
mov ah,0eh
mov al,32
NEXT:
int 10h
loop NEXT
pop cx
pop ax
endm
;---------------------------------------------------
puts macro addr
push dx
push ax
lea dx,addr
mov ah,09h
int 21h
pop ax
pop dx
endm
;--------------------------------------------------
putsln macro addr
push dx
push ax
mov dl,10
mov ah, 02h
int 21h
lea dx,addr
mov ah,09h
int 21h
pop ax
pop dx
endm
;--------------------------------------------------
gets macro addr
cmp byte ptr addr,0
je next
push dx
push ax
push bx
push si
lb1:
lea dx,addr
mov ah,0ah
int 21h
xor dx,dx
mov dl,byte ptr addr+1
add dx,2
mov si,dx
lea bx,addr
mov byte ptr [bx][si],'$'
pop si
pop bx
pop ax
pop dx
next: ;string length = 0
endm
;--------------------------------------------------
putdu macro addr
local NEXT, T1, LB2, T2, LB4, T3, CALCU, CALCU2, LAST1, LAST2, LAST3, EXIT
push ax
push bx
push cx
push dx
push si
xor ax,ax
xor dx,dx
mov si,offset addr
NEXT:
mov ch,type addr
cmp ch,1
jne LB2
mov al,byte ptr [si]
jmp CALCU
LB2:
cmp ch,2
jne LB4
mov ax,word ptr [si]
jmp CALCU
LB4:
cmp ch,4
jne exit
mov ax,word ptr [si]
mov dx,word ptr [si+2]
jmp CALCU2
CALCU:
mov cl,0
mov bx,10
LAST1:
div bx
push dx
xor dx,dx
inc cl
cmp ax,0
jnz LAST1
mov ah,02h
LAST2:
pop dx
add dl,30h
int 21h
dec cl
jnz LAST2
jmp EXIT
CALCU2:
mov cl,0
mov bx,10
LAST3:
push ax
mov ax,dx
mov dx,0
div bx
mov bx,ax ;bx作中间变量,用于过度,用完后恢复bx的值
pop ax
push bx
mov bx,10
div bx
mov bx,dx ;bx作中间变量,用于过度,用完后恢复bx的值
pop dx
push bx ;saved the remainer
inc cl
mov bx,10
cmp dx,0
jne LAST3
jmp LAST1
EXIT:
pop si
pop dx
pop cx
pop bx
pop ax
endm
;--------------------------------------------------
putds macro addr
local NEXT, T1, LB2, T2, LB4, T3, CALCU, CALCU2, LAST1, LAST2, LAST3, EXIT
push ax
push bx
push cx
push dx
push si
xor ax,ax
xor dx,dx
mov si,offset addr
NEXT:
mov ch,type addr
cmp ch,1
jne LB2
mov al,byte ptr [si]
cmp al,0
jnl T1
mov ch,-1 ;负数标志
neg al
jmp CALCU
T1:
mov ch,0 ;正数标志
jmp CALCU
LB2:
cmp ch,2
jne LB4
mov ax,word ptr [si]
cmp ax,0
jnl T2
mov ch,-1 ;负数标志
neg ax
jmp CALCU
T2:
mov ch,0 ;正数标志
jmp CALCU
LB4:
cmp ch,4
jne exit
mov ax,word ptr [si]
mov dx,word ptr [si+2]
cmp dx,0
jnl T3
mov ch,-1 ;负数标志
not ax ;32位数取负
not dx
add ax,1
adc dx,0
jmp CALCU2
T3:
mov ch,0 ;正数标志
jmp CALCU2
CALCU:
mov cl,0
mov bx,10
LAST1:
div bx
push dx
xor dx,dx
inc cl
cmp ax,0
jnz LAST1
mov ah,02h
cmp ch,0 ;判断正负
je LAST2
mov dl,'-'
int 21h
LAST2:
pop dx
add dl,30h
int 21h
dec cl
jnz LAST2
jmp EXIT
CALCU2:
mov cl,0
mov bx,10
LAST3:
push ax
mov ax,dx
mov dx,0
div bx
mov bx,ax ;bx作中间变量,用于过度,用完后恢复bx的值
pop ax
push bx
mov bx,10
div bx
mov bx,dx ;bx作中间变量,用于过度,用完后恢复bx的值
pop dx
push bx ;saved the remainer
inc cl
mov bx,10
cmp dx,0
jne LAST3
jmp LAST1
EXIT:
pop si
pop dx
pop cx
pop bx
pop ax
endm
;--------------------------------------------------
getd macro addr
local LB2, LB4, CONT, WAIT_IN, OPT, NGT, NEXT1, NEXT2, NEXT3, NEXT4, BEL, EXIT
push ax
push bx
push cx
push dx
xor dx,dx
mov bx,10
mov ch,type addr
cmp ch,4
je LB4
cmp ch,1
jne LB2
mov byte ptr addr,0
jmp CONT
LB2:
mov word ptr addr,0
jmp CONT
LB4:
mov word ptr addr,0
mov word ptr addr+2,0
CONT:
mov ah,08h
int 21h
cmp al,'-'
jne OPT
mov dx,1 ;负数标志
mov ah,0eh
int 10h
OPT:
push dx
WAIT_IN:
mov ah,08h
int 21h
mov cl,al
cmp cl,'0'
jb BEL
cmp cl,'9'
ja BEL
sub cl,30h
mov ah,0eh
int 10h
cmp ch,1
jne NEXT1
mov al,byte ptr addr
mul bl
add al,cl
mov byte ptr addr,al
jmp WAIT_IN
BEL:
cmp al,'d'
je NGT
cmp al,13
je NGT
mov ah,0eh
mov al,7
int 10h
jmp WAIT_IN
NEXT1:
mov ax,word ptr addr
mul bx
cmp ch,4
jne NEXT2
mov word ptr addr,ax
push dx
mov ax,word ptr addr+2
mul bx
mov word ptr addr+2,ax
mov ch,0
pop dx
add word ptr addr,cx
adc word ptr addr+2,dx
mov ch,type addr
jmp WAIT_IN
NEXT2:
mov ch,0
add aX,cx
mov word ptr addr,aX
mov ch,type addr
jmp WAIT_IN
NGT:
pop bx
cmp bx,1
jb EXIT
mov ch,type addr
cmp ch,4
jne NEXT3
not word ptr addr+2
not word ptr addr
add word ptr addr,1
adc word ptr addr+2,0
jmp EXIT
NEXT3:
cmp ch,2
jne NEXT4
neg word ptr addr
jmp EXIT
NEXT4:
neg byte ptr addr
jmp EXIT
EXIT:
pop dx
pop cx
pop bx
pop ax
endm
;---------------------------------------------------
puth macro addr
local LB4, NEXT, CONT, LAST, DISP, EXIT
push ax
push bx
push cx
push dx
xor ax,ax
xor bx,bx
xor cx,cx
mov ch,type addr
add ch,ch ;The max length of the data is 2*(type addr)
cmp ch,8
je LB4
cmp ch,2
jne NEXT
mov bh,byte ptr addr
jmp NEXT
LB4:
mov bx,word ptr addr+2
NEXT:
cmp ch,4
jne CONT
mov bx,word ptr addr
CONT:
mov dl,0
mov cl,4
LAST:
sal bx,1
rcl dl,1
dec cl
jnz LAST
cmp dl,9
jna DISP
add dl,7 ;9与A之间隔了7个字母
DISP:
add dl,30h
mov ah,02h
int 21h
dec ch
jnz NEXT
mov ah,02h
mov dl,'H'
int 21h
EXIT:
pop dx
pop cx
pop ax
endm
;---------------------------------------------------
geth macro addr
local T2, T1, WAIT_IN, CONT, NEXT, LAST, TURN, CYC1, CYC2, CYC3, LB1, LB2, LB4, BEL, TAIL, EXIT
push ax
push bx
push cx
push dx
xor ax,ax
xor bx,bx
xor cx,cx
mov ch,type addr
add ch,ch ;The max length of the data is 2*(type addr)
cmp ch,8
jne T2
mov word ptr addr,0
mov word ptr addr+2,0
jmp WAIT_IN
T2:
cmp ch,4
jne T1
mov word ptr addr,0
jmp WAIT_IN
T1:
mov byte ptr addr,0
WAIT_IN:
mov ah,08h
int 21h
mov dl,al
mov dh,al
cmp dh,'0'
jb BEL
cmp dh,'9'
jna NEXT
cmp dh,'A'
jb BEL
cmp dh,'F'
ja CONT
sub dh,7
CONT:
cmp dh,'a'
jb BEL
cmp dh,'f'
ja BEL
sub dh,39
NEXT:
sub dh,30h
mov ah,02h
int 21h
sal dh,4
mov cl,4
LAST:
sal dh,1
rcl bx,1
dec cl
jnz LAST
cmp ch,5
jne TURN
mov word ptr addr,bx ;addr为dword变量,先将已输入的4位数存入低字
xor bx,bx
TURN:
dec ch
jnz WAIT_IN
jmp TAIL
BEL:
cmp dl,'H'
je TAIL
cmp dl,'h'
je TAIL
cmp dl,13
je TAIL
mov ah,02h
int 21h
mov al,7
int 10h
jmp WAIT_IN
TAIL:
mov cl,type addr
cmp cl,4 ;addr为byte变量
jne LB1
cmp ch,0 ;又输入了dword的后四位
je LB4
CYC1:
sal bx,4
dec cl
dec ch
jnz CYC1
CYC2:
mov ch,4
CYC3:
sal bx,1
rcl word ptr addr,1
rcl word ptr addr+2,1
dec ch
jnz CYC3
dec cl
jnz CYC2
jmp EXIT
LB4:
mov dx,word ptr addr
mov word ptr addr+2,dx
mov word ptr addr,bx
jmp EXIT
LB1:
cmp cl,1
jne LB2
mov byte ptr addr,bl
jmp EXIT
LB2:
mov word ptr addr,bx
EXIT:
pop dx
pop cx
pop bx
pop ax
endm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -