Ассемблер удаление слов в строке

Тема в разделе "WASM.BEGINNERS", создана пользователем Lili, 31 май 2009.

  1. Lili

    Lili New Member

    Публикаций:
    0
    Регистрация:
    31 май 2009
    Сообщения:
    1
    Необходимо доделать программу срочно по ассемблеру(в коде есть пара ошибок, задача удалить во всех строках текста слова предшествующие словам содержащим заданный набор букв!


    masm
    LengthBuffer EQU 128
    LengthString EQU 16
    True EQU 1
    False EQU 0

    .model small
    .stack 1024
    .data

    MsgFileLoading db 'Enter file name:',0Dh,0Ah,'$' ;0Dh,0Ah - perevod stroki
    MsgFileSaving db 0Dh,0Ah,'Save file as:',0Dh,0Ah,'$'
    MsgSimbolSearch db 'Search chars:',0Dh,0Ah,'$'
    MsgError db 'Error!',0Dh,0Ah,'$'
    bufferList label byte
    maxLen db 80
    actLen db ?
    bufferKeyboard db 80 dup(' ')

    fileRead dw 0
    fileWrite dw 0
    PtrInFileRead dd 0
    PtrInFileWrite dd 0

    SearchChar db 't', 15 dup(0)
    SearchCharCopy db 16 dup(?)

    ReadBuffer db LengthBuffer dup(?)
    WriteBuffer db LengthBuffer dup(?)
    PtrReadBuf dw 0
    PtrWriteBuf dw 0

    LenReadBuf dw 0
    LenWriteBuf dw 0

    StartWord dd 0
    EndWord dd 0
    StartPreWord dd 0
    EndPreWord dd 0
    EnterWord db 0
    EnterPreWord db 0

    .code
    DellWord proc near

    ret
    DellWord endp

    ShiftFilePtr proc near
    push bx
    push dx
    mov bx , word ptr PtrInFileRead ;операнд в памяти интерпретировать размером в слово
    mov dx , word ptr PtrInFileRead + 2
    add bx , LenReadBuf
    adc dx , 0 ;Если был перенос
    mov word ptr PtrInFileRead , bx
    mov word ptr PtrInFileRead + 2 , dx
    pop dx
    pop bx
    ret
    ShiftFilePtr endp

    InBuffer proc near
    push ax
    push bx
    mov ax , LenReadBuf
    mov bx , PtrReadBuf
    cmp ax , bx
    jne MNoRead
    call ReadFileInBuffer
    xor bx , bx
    mov PtrReadBuf , bx
    ret
    MNoRead:
    inc PtrReadBuf
    pop bx
    pop ax
    ret
    InBuffer endp

    NoChar proc near
    cmp al , 20h ;сравнение с пробелом
    je MEndWord
    cmp al , 0dh ; сравнение с переводом строк
    je MEndWord
    cmp al , 0ah ; сравнение с переводом строк
    je MEndWord
    cmp al , 09h ;сравнение с гориз табуляцией
    je MEndWord
    cmp al , 21h
    je MEndWord
    cmp al , 28h
    je MEndWord
    cmp al , 29h
    je MEndWord
    cmp al , 3Fh
    je MEndWord
    call InBuffer
    jmp MNextChar
    MEndWord:
    cmp EnterWord , False
    je NoEnterWord
    mov ax , word ptr PtrInFileRead ;Сохраняем указатель на конец слова
    mov bx , PtrReadBuf
    add ax , bx
    mov word ptr EndWord , ax
    mov ax , word ptr PtrInFileRead + 2
    adc ax , 0
    mov word ptr EndWord + 2 , ax
    call InBuffer
    NoEnterWord:
    Call SaveStartWord
    jmp MNextChar
    ret
    NoChar endp

    ReadFileInBuffer proc near
    push ax
    push bx
    push cx
    push dx
    mov ah , 3Fh
    mov bx , fileRead ;дискриптор файла
    mov cx , LengthBuffer ;размер буффера
    lea dx , ReadBuffer ;начало буфера в памяти
    int 21h
    mov LenReadBuf , ax ;сохраняем длину получ информации
    pop dx
    pop cx
    pop bx
    pop ax
    ret
    ReadFileInBuffer endp

    SaveStartWord proc near
    push ax
    push dx
    push bx
    mov EnterWord , True
    mov ax , word ptr PtrInFileRead ;Сохраняем указатель на начало слова
    mov bx , word ptr PtrInFileRead + 2
    mov dx , PtrReadBuf
    sub ax , LenReadBuf
    sbb bx , 0
    add ax , dx
    adc bx , 0
    mov word ptr StartWord , ax
    mov word ptr StartWord + 2 , bx
    pop bx
    pop dx
    pop ax
    ret
    SaveStartWord endp

    SearchAndDell proc near

    mov al , SearchChar
    mov SearchCharCopy , al

    ;Настройка первого чтения, создание копии искомого набора
    ;cld ;Установка напровления
    ;lea si , SearchChar ;Адрес источника
    ;lea di , SearchCharCopy ;Адрес приемника
    ;mov cx , LengthString ;Кол-во копируемых байт
    ;rep movsb

    MReadBuffer:
    call ReadFileInBuffer
    jc MErrorRead ;если ошибка
    cmp LenReadBuf , 0 ;прочиталось ли инфорация (кол-во байт)
    je MReadZero
    call ShiftFilePtr
    MNextChar:
    mov bx , PtrReadBuf
    mov al , ReadBuffer[bx] ;Очередной символ из буффера
    cld
    lea di , SearchCharCopy
    mov cx , LengthString
    repne scasb ;Поиск символа в наборе
    jz MBeChar
    call NoChar
    jmp MNextChar
    MBeChar:
    ;Символ найден
    ;call BeChar
    mov [di-1] , byte ptr 0
    mov bl , EnterWord
    cmp bl , True
    je EnterWordE
    call SaveStartWord
    EnterWordE:

    mov cx , 16
    repne scasb
    mov EnterWord , True ;Возможно не нужно
    jz AllZero
    cmp bx , LengthBuffer
    call InBuffer
    jmp MNextChar

    AllZero:
    call DellWord
    cld
    lea si , SearchChar
    lea di , SearchCharCopy
    mov cx , LengthString
    rep movsb
    jmp MNextChar
    MErrorRead:
    MReadZero:
    EndReadE:
    ret
    SearchAndDell endp

    main:
    mov ax , @data
    mov ds , ax
    mov es , ax

    nextTry:
    mov ah , 09 ;функция вывода на монитор
    lea dx , MsgFileLoading
    int 21h

    mov ah , 0Ah ;ввод данных с клавиатуры
    lea dx , bufferList
    int 21h

    mov bl , actLen ;выбор последнего+1 символа=0Dh в имени файла и его обнуление
    xor bh , bh
    mov bufferKeyboard[bx] , 0

    mov ah , 3Dh ; чтение из файла
    mov al , 2
    lea dx , bufferKeyboard
    int 21h
    jnc noErrorRead
    mov ah , 09
    lea dx , MsgError
    int 21h
    jmp nextTry
    noErrorRead:
    mov fileRead , ax ;сохранение дескриптора(номера) откр файла

    NextTryCreate:
    mov ah , 09 ;функция вывода на монитор
    lea dx , MsgFileSaving
    int 21h

    mov ah , 0Ah ;ввод данных с клавиатуры
    lea dx , bufferList
    int 21h

    mov bl , actLen ;выбор последнего+1 символа=0Dh в имени файла и его обнуление
    xor bh , bh
    mov bufferKeyboard[bx] , 0

    mov ah , 3Ch ;создание файла
    mov cx , 0
    lea dx , bufferKeyboard
    int 21h
    jnc noErrorCreate
    mov ah , 09
    lea dx , MsgError
    int 21h
    jmp nextTryCreate
    noErrorCreate:
    mov fileWrite , ax

    mov ah , 09 ;функция вывода на монитор
    lea dx , MsgSimbolSearch
    int 21h

    call SearchAndDell

    mov ah , 3Eh ;закрытие файла
    mov bx , fileRead
    int 21h

    mov ah , 3Eh
    mov bx , fileWrite
    int 21h

    mov ax, 4c00h
    int 21h
    end main