[asembler] Jak dodać znaki do łancucha

0

Witam

Na wstepie chce powiedziec ze dopiero raczkuje w Asemblerze

Odczytuje parametry uruchomienia programu znak po znaku w ten sposób

        mov bx, 80h             ; adres bloku PSP
        mov cl, ds:[bx]         ; dlugosc parametrow
        xor ch, ch              
        or  cx, cx
        inc bx                    ;zeby nie czytal pierwszej spacji

petla:
        inc bx
        mov dl, ds:[bx]         ; pobiez znak
        mov ah, 02h
        int 21h                 ; wyswietl znak
        loop petla

i chciałbym wczytane znaki dodac do łańcucha o nazwie np. parametr1

Jak to zorobić [???]

0

Co to znaczy dodać? Możesz po prostu wpisać je do miejsca w pamięci pewnego. Załóżmy że chciałbyś je skopiować do tego miejsca oznaczonego przez parametr1 i zakładając że masz tam tyle miejsca, robisz po prostu odpowiedni mov. Hint: proponuje używać es:[bx] a nie ds:[bx] jako ze one na początku programu wskazują na to samo miejsce, a jednak ds używa się raczej do oznaczenia data segment (czyli tam gdzie jest twój łańcuch do którego chcesz wpisywać).

0
Shalom napisał(a)

Co to znaczy dodać? Możesz po prostu wpisać je do miejsca w pamięci pewnego. Załóżmy że chciałbyś je skopiować do tego miejsca oznaczonego przez parametr1 i zakładając że masz tam tyle miejsca, robisz po prostu odpowiedni mov. Hint: proponuje używać es:[bx] a nie ds:[bx] jako ze one na początku programu wskazują na to samo miejsce, a jednak ds używa się raczej do oznaczenia data segment (czyli tam gdzie jest twój łańcuch do którego chcesz wpisywać).

Dodać to może nie najlepsze słowo.
Chodzi mi o to zeby utworzyć plik o nazwie podanej w parametrze, jeżeli używam mov to nazwą pliku sa jakieś krzaczki, a jak wpisze cos do 'parametr1' (jakaś stałą wartość) to plik sie tworzy.
Dlatego zależy mi na wpisaniu parametru wywołania do zmiennej 'parametr1'

Na razie udało mi sie osiągnąć wyświetlanie parametrów wywołania na ekran, teraz chciałbym bezy posłużyły do nazwy pliku

Macie jakies sugestie jak to zrobic [???]

0

Code or it didn't happen...
A czy pamiętałeś o tym żeby dodać na końcu tych "nazw" znak $?

0
Shalom napisał(a)

Hint: proponuje używać es:[bx] a nie ds:[bx] jako ze one na początku programu wskazują na to samo miejsce, a jednak ds używa się raczej do oznaczenia data segment (czyli tam gdzie jest twój łańcuch do którego chcesz wpisywać).

Oba rejestry przy starcie programu wskazują adres początku PSP (Program Segment Prefix). Jeżeli autor kodu potem ich nie zmieniał to rzeczywiście tak jest, ale tego nie wiadomo ponieważ nie został przedstawiony cały kod programu. Dodatkowo sam wspominasz, że wskazują na to samo miejsce. Po co więc rozpisywać coś na dwa rejestry skoro jednym da się zaadresować w końcu oba adresy są w tym samym segmencie.

0

ogórek:

Utwórz sobie bufor o rozmiarze takim aby zmieścił ci się w nim maksymalny przewidziany string. Dla nazwy wprowadzanej jako parametr może to być maksymalne pole na to przewidziane w nagłówku programu. Potem przekopiuj do tego bufora znaki i dodaj znak końca tak jak wspomina Shalom.

Nie wiem czy masz jakieś doświadczenie z języków wysokiego poziomu, ale asembler jest niski i trzeba zejść z pewnego poziomu abstrakcyjności. Zmienna w asemblerze jest jedynie adresem więc nie ma praktycznie czegoś takiego jak obiekt string do którego można dodać znaki. Nazwa zmiennej oznacza jedynie adres w pamięci pod który sam musisz kopiować znaki stopniowo zwiększając ten adres. Oczywistym jest, że nadpisujesz wszystko to co jest za tym adresem więc wymagane jest zarezerwowanie przy tym odpowiedniego miejsca po tym adresie/etykiecie.

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