Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Crash...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 30.07.2006, 20:00    Titel: Crash... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 30.07.2006, 20:33    Titel: Antworten mit Zitat

Hi,
es dürfte jetzt zwar immer noch nicht laufen, aber es hat einige logische Fehler zwinkern:
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. zwinkern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 30.07.2006, 20:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 30.07.2006, 20:53    Titel: Antworten mit Zitat

Er hat offensichtlich in einen Bereich des Betriebssystem geschrieben, mit, nuja, recht dummen Zufallswerten. durchgeknallt
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. zwinkern

Ok,
Grüße,
Mao
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 30.07.2006, 21:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 31.07.2006, 08:56    Titel: Antworten mit Zitat

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 zwinkern
_________________
Meine sämtlichen QB Projekte findet ihr hier
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 31.07.2006, 20:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 01.08.2006, 11:35    Titel: Antworten mit Zitat

Hallo A.K.

Also, die Adresse in der DTA ist richtig, bei einem anderen Programm (das ich hier leider nicht veröffentlichen darf zwinkern ) 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 zwinkern

Danke auf jeden Fall.

MfG,

rezk
_________________
Meine sämtlichen QB Projekte findet ihr hier
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz