[ASM] Znaki podane jako parametr uruchomieniowy

0

Witam wszystkich asemblerowych wyjadaczy...
Od razu do rzeczy: niedawno zaczalem sie bawic tym jezykiem i co krok napotykam na glupie problemy:] Potrafie zczytywac znaki podane jako parametr uruchomieniowy ale nie potrafie zapisac tego parametru jako zmiennej moge jedynie nadpisywac dana zmienna kolejnym znakiem. A chcialbym aby podany parametr tworzyl plik o tejze nazwie...
Ogolnie schemat programy prezentuje sie nastepujaco:

.model small
.286
.stack 512
.code
assume ds:nothing
start:
mov bx, 80h ; adres bloku PSP
mov cl, ds:[bx] ; dlugosc parametrow
xor ch, ch
or cx, cx
jz koniec
petla:
inc bx
mov dl, ds:[bx] ; pobiez znak
mov ah, 02h
int 21h ; wyswietl znak
loop petla
koniec:
mov ax, 4C00h
int 21h

end start

Jezeli zainicjuje jakies dane w segmencie .data to bede musial przypisac do mov ax, @dane mov ds, ax. To chyba spowoduje ze nie bede mogl pobierac znakow poprzez ds:[bx]? W jaki sposob dolozyc jakas zmienna text db "?" ktora pomiesci w sobie kolejne znaki z ds:[bx]?

Stosy i kolejki... poszukam. Ogolnie chcialbym polaczyc poprzedni program z tym ponizej, tak aby nazwa pliku z drugiego programu (text_file) wprowadzany byl jako parametr uruchomieniowy. Ponizszy program tworzy plik o zadeklarowanej juz nazwie i zapisuje do niego glupotki poki nie ctr z. Moje proby z przydzieleniem ds'owi @data powodowaly ze nie zczytywal znakow z parametru... wiec moze jakas rotacja miedzy ds dla segmentu danych a ds:[bx] dla czytania kolejnego znaku... aha, jak sie zapisuje poszczegolne znaki aby zlepic je w jedna zmienna?

.model small
.stack 512
.data
text_file db "copy.txt", 0
character db ?
handle dw ?
.code
assume ds:@data
start:
mov ax, @data
mov ds, ax
mov ah, 3Dh ; otworz plik
mov al, 1
mov dx, offset text_file
int 21h
jnc otwarty
mov ah, 3Ch ; utworz plik
mov dx, offset text_file
mov cx, 0
int 21h
jc koniec
otwarty:
mov handle, ax
mov ah, 42h ; do konca pliku
mov bx, handle
xor cx, cx
xor dx, dx
mov al, 2
int 21h
petla:
mov ah, 08h
int 21h ; czytaj znak
or al, al
jnz ok
mov ah, 08h
int 21h
jmp petla
ok:
cmp al, 1Ah ; Ctrl-Z - koniec
je zamnknij
mov character, al
mov ah, 02h
mov dl, al
int 21h ; wyswietl znak
mov ah, 40h ; zapisz znak
mov bx, handle
mov dx, offset character
mov cx, 1
int 21h
jmp petla
zamnknij:
mov ah, 3Eh
mov bx, handle
int 21h
koniec:
mov ax, 4C00h
int 21h
end start
0

Witam

Uzupełniłem ten kod tak żeby pobierał nazwe pliku z linii komend. Oto on:

.model small
.stack 512
.data
character db ?
handle dw ?
.code
assume ds:@data
start:
mov ah, 3Dh ; otworz plik
mov al, 1
mov bx, 81h
add bl, ds:[80h]
mov byte ptr [bx],0
mov dx, 82h
int 21h
jnc otwarty
mov ah, 3Ch ; utworz plik
mov cx, 0
int 21h
jc koniec
otwarty:
mov bx, @data
mov ds, bx
mov handle, ax
mov ah, 42h ; do konca pliku
mov bx, handle
xor cx, cx
xor dx, dx
mov al, 2
int 21h
petla:
mov ah, 08h
int 21h ; czytaj znak
or al, al
jnz ok
mov ah, 08h
int 21h
jmp petla
ok:
cmp al, 1Ah ; Ctrl-Z - koniec
je zamnknij
mov character, al
mov ah, 02h
mov dl, al
int 21h ; wyswietl znak
mov ah, 40h ; zapisz znak
mov bx, handle
mov dx, offset character
mov cx, 1
int 21h
jmp petla
zamnknij:
mov ah, 3Eh
mov bx, handle
int 21h
koniec:
mov ax, 4C00h
int 21h
end start

Może zaczne od tych większych zmian.

  • Ustawie wartości ds po przez kod
mov bx, @data
mov ds, bx

przesunąłem za etykiete "Otwarty" i użyłem w nim rejestru bx ponieważ w ax w tym momęcie znajduje się uchwyt. W momęcie kiedy ds nie zawiera jeszcze wartości segmentu @data można na nim działać jak w pierwszym programie który podałeś. Reszta kodu którą wstawiłem modeluje troszke ten ciąg znaków pobrany z lini komend tak żeby się nadawał do podania jako parametr do przerwania otwierającego plik.

Jednak ten prosty kod nie jest odporny na pewne błędy. Zakładam że to oczywiste iż nie będzie ktoś wpisywał głupich znaków jako parametr.
Jako parametr nalezy podać poprawną nazwe pliku i musi to być jedyny podany parametr.
No, ale jak przeanalizujesz te niewielkie zmiany jakie zrobiłem to na pewno zrobisz z tego jakiś lepszy program.

1 użytkowników online, w tym zalogowanych: 0, gości: 1