org 100h section .data bladliczby_str db "Odczytano bledna liczbe! $" bladznaku_str db "Odczytano bledny znak! $" bladzapisu_str db "Blad zapisu! $" bladodczytu_str db "Blad odczytu! $" rozmiarPliku dw 0 ; zmienna rozmiaru plik plikIn db "datain.csv", 0 plikOut db "dataout.csv", 0 section .bss buforInPliku resb 1023 ; bufor pliku wejściowego buforOutPliku resb 255 ; bufor pliku wyjsciowego section .text call readFile ;czytaj caly plik lea si, [buforInPliku] ; ustaw poczatek wejścia lea di, [buforOutPliku] ; ustaw poczatek wyjscia getLine: call calculateOutput ; Rozwiazuje rownanie call saveOutput ; Zapisuje wynik rownania mov ax, si sub ax, buforInPliku ; obliczanie aktualnego bitu cmp ax, [rozmiarPliku] ; sprawdzenie czy koniec pliku jb getLine ; kolejna liczba call saveFile ; zapisz plik call koniec ; zakoncz program ;Funkcje saveOutput: mov ax, dx mov dl, 10 div dl add ah, 48 ; Zamień liczbę na znak add al, 48 ; Zamień liczbę na znak mov byte [di], al ; Zapisz wynik do bufora inc di ; Zwieksz wskaźnik mov byte [di], ah ; Zapisz wynik do bufora inc di ; Zwieksz wskaźnik mov byte [di], 0Dh ; Zapisz znak powrotu karetki inc di ; Zwieksz wskaźnik mov byte [di], 0Ah ; Zapisz znak końca lini inc di ; Zwieksz wskaźnik ret readFile: mov ax,3d00h ; funkcja otworcia pliku tylko do odczytu mov dx, plikIn ; przekazanie nazwy pliku int 21h ; przerwanie jc bladOdczytu ; jesli blad mov bx, ax ; przekazanie uchwytu mov ah, 3fh ; funkcja odczytu z pliku mov dx, buforInPliku mov cx, 1023 ; 1023 bajty int 21h ; przerwanie jc bladOdczytu ; jesli blad mov [rozmiarPliku], ax ; ilosc bitow zaczytanych mov ah,3eh ; funkcja zamkniecia pliku int 21h ; przerwanie ret ; powrot bladOdczytu: mov ah, 9 ; funkcja wypisania ciagu znakow na ekranie mov dx, bladodczytu_str ; przekazanie adresu ciagu int 21h ; przerwanie call koniec ; zakoncz program saveFile: mov ah, 3Ch ; funkcja tworzenia plik mov dx, plikOut ; przekazanie nazwy pliku xor cx, cx ; czyszczenie CX int 21h ; przerwanie jc bladZapisu ; jeśli błąd mov bx, ax ; zapis uchwytu mov ax, 4000h ; funkcja zapisu do pliku mov dx, buforOutPliku ; przekazanie bufor mov cx, 255 ; 255 znakow int 21h ; przerwanie jc bladZapisu ; jeśli błąd mov ah, 3eh ; funkcja zamkniecia pliku int 21h ; przerwanie ret ; powrot bladZapisu: mov ah, 9 ; funkcja wypisania ciagu znakow na ekranie mov dx, bladzapisu_str ; przekazanie adresu ciagu int 21h ; przerwanie call koniec ; zakoncz program sprawdzLiczbe: cmp bx, '0' ; porownaj z 0 jb bladLiczby ; jesli mniejsze blad cmp bx, '9' ; porownaj z 9 jg bladLiczby ; jesli wieksze blad mov ax, bx ; zapisz liczbe sub ax, 48 ; zamien znak na liczbę ret ; powrot bladLiczby: mov ah, 9 ; funkcja wypisania ciagu znakow na ekranie mov dx, bladliczby_str ; przekazanie adresu ciagu int 21h ; przerwanie call koniec ; zakoncz program sprawdzZnak: cmp bx, '+' ; porownaj z + je dodaj ; jesli rowne cmp bx, '-' ; porownaj z - je odejmij ; jesli rowne cmp bx, '*' ; porownaj z * je mnoz ; jesli rowne cmp bx, '/' ; porownaj z / je dziel ; jesli rowne jmp bladZnaku ; jesli zaden znak to blad dodaj: add dx, ax ; dodaj 2 argumenty jmp powrotDzialania ; skok do zapisu i powrotu odejmij: sub dx, ax ; odejmij 2 argumenty jmp powrotDzialania ; skok do zapisu i powrotu mnoz: mul dx ; mnoz AX * DX argumenty mov dx, ax jmp powrotDzialania ; skok do zapisu i powrotu dziel: xchg dx, ax ; zamien wartosci div dl ; dziel AX / DX xor dx, dx mov dl, al ; wynik z ax wpisz do dx jmp powrotDzialania ; skok do zapisu i powrotu powrotDzialania: ret ; powrot z wynikiem w DX bladZnaku: mov ah, 9 ; funkcja wypisania ciagu znakow na ekranie mov dx, bladznaku_str ; przekazanie adresu ciagu int 21h ; przerwanie call koniec ; zakoncz program calculateOutput: xor dx, dx ; Czyszczenie Wyniku xor bx, bx mov bl, byte [si] ; Wczytaj do bx pierwszy znak linii call sprawdzLiczbe ; Sprawdz czy w bx jest liczba inc si ; Zwieksz wskaźnik mov dx, ax ; Pierwszy argumentr jest wynikiem nextArg: cmp byte [si], ';' ; Sprawdz czy kolejny znak to ';' jne bladZnaku ; Jeśli nie to błąd inc si ; Zwieksz wskaźnik xor bx, bx mov bl, byte [si] ; Wczytaj do bx kolejny znak call sprawdzLiczbe ; Sprawdz czy w bx jest liczba inc si ; Zwieksz wskaźnik cmp byte [si], ';' ; Sprawdz czy kolejny znak to ';' jne bladZnaku ; Jeśli nie to błąd inc si ; Zwieksz wskaźnik xor bx, bx mov bl, byte [si] ; Wczytaj do bx kolejny znak call sprawdzZnak ; Sprawdz czy w bx jest liczba inc si ; Zwieksz wskaźnik cmp byte [si], 0Dh ; sprawdzamy CR je koniecLinii ; jeśli nie to kolejny argument cmp byte [si], ';' ; Sprawdz czy kolejny znak to ';' je nextArg ; jesli rowny to koncz linie jne koniecPliku koniecLinii: inc si ; Zwiekszamy wskaznik cmp byte [si], 0Ah ; sprawdzamy CR jne koniec ; jesli nie to blad inc si ; Zwiekszamy wskaznik koniecPliku: ret ; powrot koniec: mov ax, 4c00h ; funkcja zakonczenia progragramu po klawiszu int 21h ; przerwanie