Assembler parametr rozruchowy

0

Witam, piszę pewien program i mam problem z zapisaniem parametru do zmiennej. Parametrem będzie jedynie nazwa pliku do otwarcia.
DosBox(TASM) pokazuje błąd: "Operand types do not match". Nie mam pojęcia dlaczego. Jakieś rozwiązania, uwagi czy pomysły ?

print macro m
mov ah,09h
mov dx,offset m
int 21h
endm

Progr           segment
                assume cs:Progr, ds:dane

start:
                mov     AX,dane
                mov     DS,AX

                mov AH, 62H			;PSP
                int 21H
                mov ES,BX
                mov CX,ES:[0080H]
                sub CX,2          ; Usuniecie entera
                xor SI,SI

petla:
                inc SI;
                mov AX,ES:[0081H+SI+1]
                mov [znaki_parametru],AX           ;Tu jest błąd 

                loop petla;
                                 
                print    msg1
                print    znaki_parametru


koniec:         mov    ah,4ch
                mov    al,0
                int    21h


Progr           ends

dane            segment
msg1            db 13,10,"Nazwa pliku: $"
znaki_parametru db 100h DUP (?)
liczba          db ?

dane            ends

end start
2

Abstrahując od tego że będziesz cały czas w tej pętli wpisywał do tego samego miejsca w pamięci to problem polega tutaj na tym, ze mieszasz typy o róznych rozmiarach. ax ma 16 bitów / 2 bajty podczas gdy twoje znaki_parametrudb więc to są obiekty 1 bajtowe. Jeśli chcesz wpisać faktycznie dwa bajty to musisz dać mov word ptr [znaki_parametru],AX a jeśli jednak chcesz tam pisać po jednym bajcie to wpisuj dane do al albo ah a nie do całego ax

0

Wielkie ukłon w Twoją stronę za wskazówki, choć nie wszystkich błędów się ustrzegłem.
Pętla wygląda teraz następująco:

petla:
                inc SI
                mov AX,ES:[0081H+SI+1] ; +1 ponieważ chce pominąć -  przy podawaniu parametru
                mov word ptr [znaki_parametru+SI],AX

                loop petla
                mov word ptr [znaki_parametru+SI+1],"$" 

Niestety przed spodziewanym parametrem pokazuje się tylda, skąd ona się wzięła ?

0

Napisałem ci wyraźnie że w ten sposób wpisujesz po 2 bajty a nie po 1. Znaki ascii które podajesz jako argumenty programu mają najpewniej po 1 bajcie więc nie możesz używać 2 bajtowego ax tylko jego połówki al albo ah. Wtedy też ten word ptr nie będzie potrzebny.

0

Niestety czy zrobię to na AL czy na AH nic to nie zmienia.

0

Ach to akurat dlatego że źle wpisujesz sobie dane ;) Popatrz że OD RAZU zaczynasz od indeksu +1 a indeks 0 co będzie przechowywał? Jakąś losową wartość bo przecież zrobiłeś db 100h DUP (?). inc si powinieneś mieć po tych operacjach a nie przed nimi. I taka rada ode mnie: emu8086 ;)

0

ohh no tak, skoro nie widzę już takich rzeczy to znaczy pora spać :)
Chętnie bym się przesiadł na emu8086 ale, niestety na uczelni mamy DOSBoxa ;)
Jeszcze raz dzięki i miłego wieczoru a raczej nocki :D

0

Emu8086 to debugger i się w nim nie programuje tylko debuguje programy ;) Takie glupoty jak teraz zobaczyłbyś po 5 sekundach na zrzucie pamięci i stanie rejestrów a nie wróżyłbyś z fusów bo wypisanie na ekran pokazuje dziwne znaki ;)

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