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

📄 stdio.inc

📁 用汇编语言编写的DOS下的输入输出宏库
💻 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 + -