WEB开发网
开发学院软件开发汇编语言 汇编源码系列之cleanf 阅读

汇编源码系列之cleanf

 2008-04-29 09:34:19 来源:WEB开发网   
核心提示:这个都是过去DOS时代的汇编源码,虽然已经过去了,汇编源码系列之cleanf,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究.......

  name  cleanf
  page  55,132
  title  'CLEANF - Filter text file'
;
; CLEANF - a DOS 2.0 filter for word processing document files.
;
; CLEAN.ASM Originally written by Ray Duncan
; Converted to DOS 2.0 filter CLEANF.ASM by Bob Taylor.
;
; This program reads text from the standard input device and writes
; filtered and transformed text to the standard output device.
;
;  1. High bit of all characters is stripped off.
;   2. Tabs are expanded.
;    3. Removes all control codes except for line
;      feeds, carriage returns, and form feeds.
;    4. Appends an end-of-file mark to the text, if
;      none was present in the input stream.
;
; Can be used to make a WordStar file acceptable for
; other screen or line editors, and vice versa.
;
;
cr  equ  0dh    ; ASCII carriage return
lf  equ  0ah    ; ASCII line feed
ff  equ  0ch    ; ASCII form feed
eof  equ  01ah    ; End-of-file marker
tab  equ  09h    ; ASCII tab code
command  equ  80h    ; buffer for command tail
; DOS 2.0 Pre-Defined Handles
stdin  equ  0000    ; standard input file
stdout  equ  0001    ; standard output file
stderr  equ  0002    ; standard error file
stdaux  equ  0003    ; standard auxilliary file
stdprn  equ  0004    ; standard printer file
cseg  segment para public 'CODE'
  assume  cs:cseg,ds:cseg
  org  100H    ; start .COM at 100H
clean  proc  far    ; entry point from PC-DOS.
  push  ds    ; push a long return back
  xor  ax,ax    ; to DOS onto the stack.
  push  ax
clean3:  call  get_char  ; get a character from input.
  and  al,7fh    ; turn off the high bit.
  cmp  al,20h    ; is it a control char?
  jae  clean4    ; no. write it to output.
  cmp  al,eof    ; is it end of file?
  je  clean6    ; yes, go write EOF mark and exit.
  cmp  al,tab    ; is it a tab?
  je  clean5    ; yes, go expand it to spaces.
  cmp  al,cr    ; is it a carriage return?
  je  clean35    ; yes, go process it.
  cmp  al,lf    ; is it a line feed?
  je  clean35    ; yes, go process it.
  cmp  al,ff    ; is it a form feed?
  jne  clean3    ; no. discard it. 
clean35:
  mov  column,0  ; if it's a legit ctrl char,
  jmp  clean45    ; we should be back at column 0.
clean4:  inc  column    ; if it's a non-ctrl char,
clean45:      ; col = col + 1.
  call  put_char  ; write the char to output.
  jnc  clean3    ; if OK, go back for another char.
  mov  bx,stderr  ; not OK. Set up to show error.
  mov  dx,offset err_msg
  mov  cx,err_msg_len  ; error = Disk full.
  mov  ah,40h    ; write the error message
  int  21h    ; to the standard error device. (CON:)
  ret      ; back to DOS.
clean5:  mov  ax,column  ; tab code detected, must expand
  cwd      ; expand tabs to spaces.
  mov  cx,8    ; divide the current column counter
  idiv  cx    ; by eight...
  sub  cx,dx    ; eight minus the remainder is the
  add  column,cx  ; number of spaces to send out to
clean55:      ; move to the next tab position.
  push  cx
  mov  al,20h
  call  put_char  ; send an ASCII blank
  pop  cx
  loop  clean55
  jmp  clean3
clean6:  call  put_char  ; write out the EOF mark,
  ret      ; and return to DOS.
clean  endp
get_char proc near
  mov  bx,stdin    ; get chars from std. input
  mov  cx,1      ; # of chars to get = 1
  mov  dx,offset input_buffer  ; location = input_buffer
  mov  ah,3fh
  int  21h      ; do the function call
  or  ax,ax      ; test # of chars returned
  jz  get_char1    ; if none, return EOF
  mov  al,input_buffer    ; else, return the char in AL
  ret
get_char1:
  mov  al,eof      ; no chars read, return
  ret        ; an End-of-File (EOF) mark.
get_char endp
put_char proc near
  mov  output_buffer,al  ; put char to write in buffer.
  mov  bx,stdout    ; write to std. output
  mov  cx,1      ; # of chars = 1
  mov  dx,offset output_buffer  ; location = output_buffer
  mov  ah,40h
  int  21h      ; do the function call
  cmp  ax,1      ; check to see it was really done.
  jne  put_char1
  clc        ; really done. return carry = 0
  ret        ; as success signal.
put_char1:
  stc        ; not really done. return carry = 1
  ret        ; as error signal (device is full).
put_char endp
input_buffer  db  0    
output_buffer  db  0
column    dw  0
err_msg    db  cr,lf
    db  'clean: Disk is full.'
    db  cr,lf
err_msg_len  equ  (this byte)-(offset err_msg)
cseg  ends
  end  clean


Tags:汇编 源码 系列

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接