|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 30.07.2006, 20:00 Titel: Crash... |
|
|
Hallo,
ich habe gestern ein wenig angefangen, mit Assembler rumzuspielen und habe folgendes "verbuggte" Programm verbrochen.
Code: | .model tiny
.code
.radix 16
org 100h
START:
mov ah, 4e
xor cx,cx
lea dx, filen
int 21h
mov si ,9e
lea di, kette
anf:
movsb
mov ax, byte ptr si
cmp ax, 0
je raus
inc si
inc di
loop anf
raus:
mov ah,09
lea dx, kette
int 21h
mov ah,4c
int 21
kette DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"$"
filen DB "a:\asm",0
END START
|
Wie gesagt, da es mein erstes Program in ASm seit zwi Jahren war ist es noch sehr verbuggt, der movsb und der mov ax, byte ptr si ist falsch, was mich aber gewundert hat:
Als ich das ganze auf einer FreeDos Startdiskette auf meinem Laptop ausgeführt habe, blieb der Rechner stehen und liess sich nicht einmal mit der Verriegelungs Taste (Not Aus) ausschalten.
Beim zweiten Versuch ging der Laptop aus (Prozessorkühler, Bildschirm), das Diskettenlaufwerk war aber noch an und arbeitete hörbar!
Was kann das gewesen sein? Welchen unzulässigen Speicherbefehl steckt in diesem programm?
MfG,
baser _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 30.07.2006, 20:33 Titel: |
|
|
Hi,
es dürfte jetzt zwar immer noch nicht laufen, aber es hat einige logische Fehler :
Code: |
.model tiny
.code
.radix 16
org 100h
START:
mov ah, 4e
xor cx,cx
lea dx, filen
int 21h
; Worauf zeigt die Adresse 9e? Deswegen gibt es wahrscheinlich den Fehler!
mov si ,9e
lea di, kette
anf:
movsb
mov ah, byte ptr si ; benutze nur das AH-Register - ist schneller
cmp ah, 0
je raus
; inc si -> ist überflüssig/bringt Fehler!!! movsb erhöht die Zeiger von SI und DI autoatisch!!
; inc di
;loop anf -> geht auch nicht! CX=0
jmp anf
raus:
mov ah,09
lea dx, kette
int 21h
mov ah,4c
int 21h
kette DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"$"
filen DB "a:\asm",0 ; endet ein Dateiname mit einem 0-Byte? Bin mir nicht sicher...probiers sonst auch mal mit 'nem Dollar-Zeichen! :)
END START
|
Desweiteren würde ich die Präprozessorfunktion "radix" 'rausnehmen. Bringt meiner Meinung nach 'nen schlechten Codingstil und Programme lassen sich nicht mehr so leicht von anderen Codern warten, da sie Zahlen ohne Suffix für dezimale Zahlen halten. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 30.07.2006, 20:49 Titel: |
|
|
Hallo,
vielen Dank fürs anschauen, mao!
Also:
- diese Adresse 9e ist die DAT und zwar genau der Dateiname, der durch die Funktion 4e gefunden wurde und in der Dat abgelegt wurde. Hier liegt der Fehler also nicht.
Vielleicht hat aber die 4e keine Datei gefunden--> keine DAT angelegt und der Verweis geht wirklich ins Nirvana!!
- Das mit dem Loop ist zwar nicht schön, müsste aber wegen dem indirekten Sprung trotzdem gehen, oder?
- Das mit der zeichenkette müsste stimmen. (Nullbyte statt $, $ findet bei 09 verwendung)
Aber wie erkläre ich mir diese "krasse" Folgen?
MfG,
baser _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 30.07.2006, 20:53 Titel: |
|
|
Er hat offensichtlich in einen Bereich des Betriebssystem geschrieben, mit, nuja, recht dummen Zufallswerten.
Was mir jetzt noch so aufgefallen ist: du hast keine Dateinamenserweiterung vergeben. Check das mal.
Sonst, hm...ich hasse das FileHandling mit DOS - was ist die DAT? Oder meinst du damit die Datei und hast (wie oben geschrieben) bloß die Dateiendung in der Konstante vergessen?
Jaja, $ findet bei 0x09 Verwendung - aber im Bereich OS-Dev nimmt man häufig ein 0-Byte (C/C++, Unix, Linux, ...). Und da du dich ja auch schonmal mit befasst hat - manchmal verwechselt man Dinge.
Ok,
Grüße,
Mao _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 30.07.2006, 21:41 Titel: |
|
|
Hi,
versuch mal vor der Sprungmarke "anf:" noch ein "CLD" zu setzen. Dann kannst du sicher sein das movsb auch in die positive Richtung geht.
Und ansonsten auch meinerseits nochmal die Frage: Wie kommst du auf 9Eh für den Pointer der gefundenen Datei? Hab in meinen Interrupt-Unterlagen nichts über diesen Pointer gefunden für die Funktion 4Eh.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
|
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 31.07.2006, 08:56 Titel: |
|
|
Hallo,
gut, danke für die Hilfe.
Also, mit der Funktion 4eh sucht man nach der nächsten Datei, die auf das Pattern passt, dessen offset in dx steht.
Die 4eh erzeugt nun die DTA (Disk Transfer Area) mit Informationen zur gefundenen Datei ab Speicherbereich 80h und legt genau ab 9e die erste gefundene Datei ab, beendet von einem Nullzeichen.
D.h, diese Datei kann man dann öffnen, oder wie ich, versuchen diesen Datenbereich nach kette zu schreiben.
MfG,
baser
@mao: natürlich kenne ich dieses Problem auch bei mir _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
|
A.K.
Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 31.07.2006, 20:38 Titel: |
|
|
Hi,
vllt. stimmt ja auch die Adresse der DTA nicht.
Hab gerade noch ein bischen gestöbert und bin über INT 21h/ 1Ah gestolpert. Mit der Funktion kannst du die genaue Adresse der DTA setzen.
Ansonsten ist noch zu sagen das das Segment der DTA immer das aktuelle Programmsegment ist.
Code: |
MOV ah,1A
'hier DS:DX mit der neuen Adresse laden
INT 21
|
Ansonsten könnte bei deinem jetzigem Programm auch helfen mal die Segmente klar zu definieren. Also ungefähr so:
Code: |
PUSH CS
PUSH CS
POP ES
POP DS
|
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
|
REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 01.08.2006, 11:35 Titel: |
|
|
Hallo A.K.
Also, die Adresse in der DTA ist richtig, bei einem anderen Programm (das ich hier leider nicht veröffentlichen darf ) funktioniert es sehr gut. In 9e liegt der Dateiname, abgeschlossen von einem Nullzeichen.
Das mit den Segmenten müsste eigentlich auch funktionieren, aber da müsste ich mir wirklich eine etwas sauberere Programmierweise angewöhnen
Danke auf jeden Fall.
MfG,
rezk _________________ Meine sämtlichen QB Projekte findet ihr hier |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|