Advertisement
Guest User

Untitled

a guest
Apr 16th, 2018
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;удалить в строках файла все нечетные слова
  2.  
  3. ;-------------------MACRO-----------------
  4. println MACRO info
  5.     push ax
  6.     push dx
  7.  
  8.     mov ah, 09h
  9.     mov dx, offset info
  10.     int 21h
  11.  
  12.     ;print new line
  13.     mov dl, 10
  14.     mov ah, 02h
  15.     int 21h
  16.  
  17.     mov dl, 13
  18.     mov ah, 02h
  19.     int 21h
  20.  
  21.     pop dx
  22.     pop ax
  23. ENDM
  24. ;-----------------end macro----------------
  25.  
  26. ;Параметр 1: путь к исходному файлу
  27. ;Параметр 2: путь к результирующему файлу
  28. .model small
  29.  
  30. .stack 100h
  31.  
  32. .data
  33. maxCMDSize equ 127
  34. cmd_size db ?
  35. cmd_text db maxCMDSize + 2 dup(0)
  36. sourcePath db maxCMDSize + 2 dup(0)
  37. destinationPath db maxCMDSize + 2 dup(0)
  38.  
  39. sourceID dw 0
  40. destID dw 0
  41.  
  42. maxWordSize equ 50
  43. buffer db maxWordSize + 2 dup(0)
  44.  
  45. spaceSymbol equ ' '
  46. newLineSymbol equ 13
  47. returnSymbol equ 10
  48. tabulation equ 9
  49.  
  50. ASCIIZendl equ 0
  51.  
  52. startText db "Program is started", '$'
  53. badCMDArgsMessage db "Bad command-line arguments. I want only 2 arguments: source path and destination path", '$'
  54. badSourceText db "Cannot open source file", '$'
  55. badDestText db "Cannot open destination file", '$'
  56. fileNotFoundText db "File not found", '$'
  57. errorClosingSource db "Cannot close source file", '$'
  58. errorClosingDest db "Cannot close destination file", '$'
  59. endText db "Program is ended", '$'
  60. errorReadSourceText db "Error reading from source file", '$'
  61. errorWritingDestText db "Error writing to destination file", '$'
  62.  
  63. period equ 2
  64. currWordStartingValue equ 1;чётность
  65. currWordIndex db currWordStartingValue      ;для того, чтобы удалялось, начиная с первого слова
  66.  
  67. .code
  68.  
  69. main:
  70.     mov ax, @data
  71.     mov es, ax
  72.  
  73.     xor ch, ch
  74.     mov cl, ds:[80h]            ;ds еще стоит на начале PSP
  75.     mov cmd_size, cl        ;сохраняем размер строки
  76.     mov si, 81h
  77.     mov di, offset cmd_text
  78.     rep movsb
  79.     ;теперь в cmd_text то, что было записано в командную строку
  80.     ;а в cmd_size - размер
  81.  
  82.     mov ds, ax
  83.  
  84.     println startText
  85.  
  86.     call parseCMD
  87.     cmp ax, 0
  88.     jne endMain             ;Какая-то ошибка - выход
  89.  
  90.     call openFiles
  91.     cmp ax, 0
  92.     jne endMain             ;Какая-то ошибка - выход
  93.  
  94.     call processingFile
  95.     cmp ax, 0
  96.     jne endMain             ;Какая-то ошибка - выход
  97.  
  98.     call closeFiles
  99.     cmp ax, 0
  100.     jne endMain             ;Какая-то ошибка - выход
  101.  
  102. endMain:
  103.     ;exit
  104.     println endText
  105.  
  106.     mov ah, 4Ch
  107.     int 21h
  108.  
  109. ;MACRO HELP
  110. cmpWordLenWith0 MACRO textline, is0Marker
  111.     push si
  112.     mov si, offset textline
  113.     call strlen
  114.     pop si
  115.     cmp ax, 0
  116.     je is0Marker
  117. ENDM
  118. ;end macro help
  119.  
  120.  
  121. ;Result in ax: 0 if all is good, else not
  122. parseCMD PROC
  123.     push bx cx dx
  124.  
  125.     mov cl, cmd_size
  126.     xor ch, ch
  127.  
  128.     mov si, offset cmd_text
  129.     mov di, offset buffer
  130.     call rewriteAsASCIIZWord
  131.  
  132.     mov di, offset sourcePath
  133.     call rewriteAsASCIIZWord
  134.  
  135.     cmpWordLenWith0 sourcePath, badCMDArgs
  136.  
  137.     mov di, offset destinationPath
  138.     call rewriteAsASCIIZWord
  139.  
  140.     cmpWordLenWith0 destinationPath, badCMDArgs
  141.  
  142.     mov di, offset buffer
  143.     call rewriteAsASCIIZWord
  144.  
  145.     cmpWordLenWith0 buffer, argsIsGood
  146.  
  147. badCMDArgs:
  148.     println badCMDArgsMessage
  149.     mov ax, 1
  150.  
  151.     jmp endproc
  152.  
  153. argsIsGood:
  154.     mov ax, 0
  155.  
  156. endproc:
  157.     pop dx cx bx
  158.     ret
  159. ENDP
  160.  
  161. ;ds:si - offset, where needed ASCIIZ string is located
  162. ;RES: ax - length
  163. strlen PROC
  164.     push bx si
  165.     xor ax, ax
  166.  
  167. startCalc:
  168.     mov bl, ds:[si]
  169.     cmp bl, ASCIIZendl
  170.     je endCalc
  171.  
  172.     inc si
  173.     inc ax
  174.     jmp startCalc
  175.    
  176. endCalc:
  177.     pop si bx
  178.     ret
  179. ENDP
  180.  
  181. ;ds:si - offset, where we will find (result stop will be in si too)
  182. ;es:di - offset, where word will be
  183. ;cx - maximum size of word (input)
  184. ;result will be ASCIIZ
  185. rewriteAsASCIIZWord PROC
  186.     push ax cx di
  187.    
  188. loopParseWord:
  189.     mov al, ds:[si]
  190.     cmp al, spaceSymbol
  191.     je isStoppedSymbol
  192.  
  193.     cmp al, newLineSymbol
  194.     je isStoppedSymbol
  195.  
  196.     cmp al, tabulation
  197.     je isStoppedSymbol
  198.  
  199.     cmp al, returnSymbol
  200.     je isStoppedSymbol
  201.  
  202.     cmp al, ASCIIZendl
  203.     je isStoppedSymbol
  204.  
  205.     mov es:[di], al
  206.  
  207.     inc di
  208.     inc si
  209.  
  210.     loop loopParseWord
  211.  
  212. isStoppedSymbol:
  213.     mov al, ASCIIZendl
  214.     mov es:[di], al
  215.     inc si
  216.  
  217.     pop di cx ax
  218.     ret
  219. ENDP
  220.  
  221. ;Result in ax: 0 if all is good, else not
  222. openFiles PROC
  223.     push bx dx
  224.  
  225.     ;open source
  226.     mov ah, 3Dh         ;open source file
  227.     mov al, 20h         ;readonly, block write, other cannot write (DOS 3.0+)
  228.     mov dx, offset sourcePath
  229.     mov cl, 01h         ;readOnly
  230.     int 21h
  231.  
  232.     jb badOpenSource    ;works when cf = 1
  233.  
  234.     mov sourceID, ax    ;save file ID
  235.  
  236.     ;open destination
  237.     mov ah, 3Ch
  238.     mov cx, 00h         ;not readOnly
  239.     mov dx, offset destinationPath
  240.     int 21h
  241.  
  242.     jb badOpenDest      ;works when cf = 1
  243.  
  244.     mov destID, ax      ;save file ID
  245.  
  246.     mov ax, 0           ;return value
  247.     jmp endOpenProc     ;all is good
  248.  
  249. badOpenSource:
  250.     println badSourceText
  251.     cmp ax, 02h
  252.     jne errorFound
  253.  
  254.     println fileNotFoundText
  255.  
  256.     jmp errorFound
  257.  
  258. badOpenDest:
  259.     println badDestText
  260.     cmp ax, 02h
  261.     jne errorFound
  262.  
  263.     println fileNotFoundText
  264.  
  265. errorFound:
  266.     mov ax, 1
  267. endOpenProc:
  268.     pop dx bx
  269.     ret
  270. ENDP
  271.  
  272. ;macro help processing
  273.  
  274. ;bx - ID файла
  275. resetPosInFileToStart MACRO
  276.     push ax bx cx dx
  277.  
  278.     mov ah, 42h
  279.     xor al ,al          ;mov al, 0 - отсчет сначала
  280.     xor cx, cx
  281.     xor dx, dx          ;на 0 байт относительно будет смещаться
  282.     int 21h
  283.  
  284.     pop dx cx bx ax
  285. ENDM
  286.  
  287. readFromFileAndCheckFinish MACRO
  288.     call readFromFile
  289.     cmp ax, 0
  290.     je finishProcessing
  291.  
  292.     mov si, offset buffer
  293.     mov di, offset buffer
  294.     mov cx, ax                  ;save num of symbols in buffer
  295.     xor dx, dx
  296. ENDM
  297.  
  298. divCurrWordIndex MACRO
  299.     mov al, currWordIndex
  300.     xor ah, ah
  301.  
  302.     push bx
  303.     mov bl, period
  304.     div bl
  305.     pop bx
  306.     ;ah - остаток, al - частное
  307.     mov currWordIndex, ah
  308.  
  309.     cmp ah, 0
  310.     je movToSkip
  311.     jmp movToWrite
  312.  
  313. ENDM
  314. ;end macro help
  315.  
  316. processingFile PROC
  317.     push ax bx cx dx si di
  318.  
  319.     mov bx, sourceID
  320.     resetPosInFileToStart
  321.  
  322.     mov bx, destID
  323.     resetPosInFileToStart
  324.    
  325.     readFromFileAndCheckFinish
  326.  
  327. loopProcessing:
  328.     ;dx - how much good symbols in buffer
  329.     ;TODO
  330. writeDelimsAgain:
  331.     call writeDelims
  332.     add dx, bx
  333.     cmp ax, 0
  334.     je notNewLine
  335.  
  336.     mov bl, currWordStartingValue
  337.     mov currWordIndex, bl
  338.  
  339. notNewLine:
  340.     call checkEndBuff
  341.     cmp ax, 2
  342.     je finishProcessing
  343.     cmp ax, 1
  344.     je writeDelimsAgain
  345.  
  346.     divCurrWordIndex
  347.  
  348. movToWrite:
  349.     call writeWord
  350.     add dx, bx
  351.     call checkEndBuff
  352.     cmp ax, 2
  353.     je finishProcessing
  354.     cmp ax, 1
  355.     je movToWrite
  356.  
  357.     jmp endWriteSkip
  358.  
  359. movToSkip:
  360.     call skipWord
  361.     call checkEndBuff
  362.     cmp ax, 2
  363.     je finishProcessing
  364.     cmp ax, 1
  365.     je movToSkip
  366.  
  367.     jmp endWriteSkip
  368.  
  369. endWriteSkip:
  370.     push dx
  371.     mov dl, currWordIndex
  372.     inc dl
  373.     mov currWordIndex, dl           ;we skip/write one word
  374.     pop dx
  375.  
  376.     ;temp: close loop
  377.     ;jmp finishProcessing
  378.  
  379.     jmp loopProcessing
  380.  
  381. finishProcessing:
  382.     mov cx, dx
  383.     call writeToFile
  384.  
  385.     pop di si dx cx bx ax
  386.     ret
  387. ENDP
  388.  
  389. ;Result in ax: 0 if all is good, else not
  390. closeFiles PROC
  391.     push bx cx
  392.  
  393.     xor cx, cx
  394.  
  395.     mov ah, 3Eh
  396.     mov bx, sourceID
  397.     int 21h
  398.  
  399.     jnb goodCloseOfSource       ;cf = 0
  400.  
  401.     println errorClosingSource
  402.     inc cx          ;now it is a counter of errors
  403.  
  404. goodCloseOfSource:
  405.     mov ah, 3Eh
  406.     mov bx, destID
  407.     int 21h
  408.  
  409.     jnb goodCloseOfDest         ;cf = 0
  410.  
  411.     println errorClosingDest
  412.     inc cx          ;now it is a counter of errors
  413.  
  414. goodCloseOfDest:
  415.     mov ax, cx      ;save number of errors
  416.  
  417.     pop cx bx
  418.     ret
  419. ENDP
  420.  
  421. ;ds:si - offset to byte source (will change)
  422. ;es:di - offset to byte destination (will change)
  423. ;cx - max length (will change)
  424. ;RES
  425. ;   bx - num of writing symbols
  426. ;   ax - num of newline symbols it writed in current calling (0 or more)
  427. writeDelims PROC
  428.     push dx
  429.     xor bx, bx
  430.     xor dx, dx
  431.  
  432. startWriteDelimsLoop:
  433.     mov al, ds:[si]
  434.     cmp al, spaceSymbol
  435.     je isDelim
  436.  
  437.     cmp al, tabulation
  438.     je isDelim
  439.  
  440.     cmp al, newLineSymbol
  441.     je isNewLineSymbol
  442.  
  443.     cmp al, returnSymbol
  444.     je isDelim
  445.  
  446.     jmp isNotDelim
  447.  
  448. isNewLineSymbol:
  449.     inc dx
  450. isDelim:
  451.     movsb
  452.     inc bx
  453.     loop startWriteDelimsLoop
  454.  
  455. isNotDelim:
  456.     mov ax, dx
  457.  
  458.     pop dx
  459.     ret
  460. ENDP
  461.  
  462. ;ds:si - offset, where we will find (will change)
  463. ;es:di - offset, where word will be (will change)
  464. ;cx - maximum size of word (will change)
  465. ;bx - num of writing symbols
  466. writeWord PROC
  467.     push ax
  468.     xor bx, bx
  469.  
  470. loopParseWordWW:
  471.     mov al, ds:[si]
  472.     cmp al, spaceSymbol
  473.     je isStoppedSymbolWW
  474.  
  475.     cmp al, newLineSymbol
  476.     je isStoppedSymbolWW
  477.  
  478.     cmp al, tabulation
  479.     je isStoppedSymbolWW
  480.  
  481.     cmp al, returnSymbol
  482.     je isStoppedSymbolWW
  483.  
  484.     cmp al, ASCIIZendl
  485.     je isStoppedSymbolWW
  486.  
  487.     movsb
  488.     inc bx
  489.     loop loopParseWordWW
  490.  
  491. isStoppedSymbolWW:
  492.     pop ax
  493.     ret
  494. ENDP
  495.  
  496. ;ds:si - offset, where we will find (will change)
  497. ;cx - maximum size of word (will change)
  498. ;bx - num of skipped symbols
  499. skipWord PROC
  500.     push ax
  501.     xor bx, bx
  502.    
  503. loopParseWordSW:
  504.     mov al, ds:[si]
  505.     cmp al, spaceSymbol
  506.     je isStoppedSymbolSW
  507.  
  508.     cmp al, newLineSymbol
  509.     je isStoppedSymbolSW
  510.  
  511.     cmp al, tabulation
  512.     je isStoppedSymbolSW
  513.  
  514.     cmp al, returnSymbol
  515.     je isStoppedSymbolSW
  516.  
  517.     cmp al, ASCIIZendl
  518.     je isStoppedSymbolSW
  519.  
  520.     inc si
  521.     inc bx
  522.     loop loopParseWordSW
  523.  
  524. isStoppedSymbolSW:
  525.     pop ax
  526.     ret
  527. ENDP
  528.  
  529. ;reads to buffer maxWordSize symbols
  530. ;RES: ax - how much symbols we read
  531. readFromFile PROC
  532.     push bx cx dx
  533.  
  534.     mov ah, 3Fh
  535.     mov bx, sourceID
  536.     mov cx, maxWordSize
  537.     mov dx, offset buffer
  538.     int 21h
  539.  
  540.     jnb goodRead                    ;cf = 0 - we read file
  541.  
  542.     println errorReadSourceText
  543.     mov ax, 0
  544.  
  545. goodRead:
  546.     pop dx cx bx
  547.     ret
  548. ENDP
  549.  
  550. ;cx - size to write from begin of buffer
  551. ;RES: ax - number of writed bytes
  552. writeToFile PROC
  553.     push bx cx dx
  554.  
  555.     mov ah, 40h
  556.     mov bx, destID
  557.     mov dx, offset buffer
  558.     int 21h
  559.  
  560.     jnb goodWrite                   ;cf = 0 - we read file
  561.  
  562.     println errorWritingDestText
  563.     mov ax, 0
  564.  
  565. goodWrite:
  566.     pop dx cx bx
  567.     ret
  568. ENDP
  569.  
  570. ;save registers in required values
  571. ;RES:
  572. ;   ax = 0 - not end of buffer
  573. ;   ax = 1 - end of buffer
  574. ;   ax = 2 - end of processing
  575. checkEndBuff PROC
  576.     cmp cx, 0
  577.     jne notEndOfBuffer
  578.  
  579.     cmp dx, 0
  580.     je skipWrite
  581.  
  582.     mov cx, dx
  583.     call writeToFile
  584.  
  585. skipWrite:
  586.     call readFromFile
  587.     cmp ax, 0
  588.     je endOfProcessing
  589.  
  590.     mov si, offset buffer
  591.     mov di, offset buffer
  592.     mov cx, ax                  ;save num of symbols in buffer
  593.     xor dx, dx
  594.  
  595.     mov ax, 1
  596.     ret
  597.  
  598. endOfProcessing:
  599.     mov ax, 2
  600.     ret
  601.  
  602. notEndOfBuffer:
  603.     mov ax, 0
  604.     ret
  605. ENDP
  606.  
  607. end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement