 |
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 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 23.02.2008, 01:50 Titel: Problem mit asm div |
|
|
Hi..
ich habe eine recht n00bige Frage!
Aber warum zum Teufel zickt der div Befehl?! Der Inline Assembler kommt mir schon recht seltsam vor... unter nasm funktioniert alles einwandfrei!
Code: | Dim TestVar1 As UShort = 1234
Dim TestVar2 As UShort = 125
Dim RetVar1 As UByte = 0
Dim RetVar2 As UByte = 0
Asm
mov ax, word[TestVar1]
mov bx, word[TestVar2]
'div bx
mov byte[RetVar1], ah
mov byte[RetVar2], al
End Asm
? "ah: "; RetVar1
? "al: "; RetVar2
Sleep |
Sobald man den div Befehl hinzufügt stürtzt das Programm ab und der nette Doktor Watson erscheint im Taskmanager^^
Gruß Georg _________________ Who is general failure
and why is he reading my harddisk? |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 23.02.2008, 15:56 Titel: |
|
|
Hi Georg,
das kann daran liegen, das du 'div bx' (16Bit DIV) statt 'div bl' (8Bit DIV) verwendest, obwohl bei mir keine Fehlermeldung erscheint.
Code: | Dividend Divisor Quotient Rest
ax 8 Bit al ah
dx:ax 16 Bit ax dx
edx:eax 32 Bit eax edx |
als 16 Bit Division:
Code: | Dim TestVar1 As UShort = 1234
Dim TestVar2 As UShort = 125
Dim RetVar1 As UShort = 0
Dim RetVar2 As UShort = 0
Asm
mov ax, Word Ptr[TestVar1]
mov dx, 0
mov bx, Word Ptr[TestVar2]
div bx
mov Word Ptr[RetVar1], ax
mov Word Ptr[RetVar2], dx
End Asm
? "ax: "; RetVar1
? "dx: "; RetVar2
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
_Gorgon

Anmeldungsdatum: 04.01.2008 Beiträge: 16 Wohnort: Heidelberg
|
Verfasst am: 23.02.2008, 23:52 Titel: |
|
|
dank deinem Code hab ich es jetzt herausgefunden..
Der Fehler im Programm kommt dann, wenn man zuvor dx nicht auf 0 gesetzt hat.
Das kommt wahrscheinlich daher, dass durch dx:ax geteilt wird, was ich einfach vergessen hatte.. kenn Assembler noch nicht so lang..
Ich zitiere aus dem Nasm Tutorial aus Wikibooks:
Zitat: | Da das Ergebnis nur im 16-Bit breiten AX Register gespeichert wird, kann es passieren, dass ein Überlauf stattfindet, weil das Ergebnis nicht mehr in das Register passt. [...] Wenn die CPU auf einen solchen Überlauf stößt, löst sie eine Divide Error Exception aus. Dies führt dazu, dass der Interrupt 0 aufgerufen und eine Routine des Betriebssystems ausgeführt wird. Diese gibt die Fehlermeldung "Überlauf bei Division" aus und beendet das Programm. Auch die Divison durch 0 führt zum Aufruf der Divide Error Exception. |
Gruß Gorgon
PS: Da saß der BUG mal wieder vorm Rechner  _________________ Who is general failure
and why is he reading my harddisk? |
|
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.
|
|