Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ inline assembler
Import-Script
11.03.2004, 18:04
Aus übungsgründen hab ich mal ein kurzes C++ Programm geschrieben mit inline assembler (im Visual Studio.net). Doch wenn ich einen Interrupt auslösen will, kommt die Fehlermeldung: <BR> <BR><i>Unbehandelte Ausnahme bei 0x0041b548 in test5.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xffffffff.</i> <BR> <BR>Hab es mit den schreibweisen 0x21 sowie 21h versucht, er will einfach nicht. <BR> <BR>Code: <BR> <BR>int kap(void){ <BR> short cap=0; <BR> _asm{ <BR> mov ah, 0x36 <BR> mov dl, 0x3 <BR> int 0x21 <BR> mov cap, ax <BR> mov ax, bx <BR> mul cap <BR> mov ax, cx <BR> mul cap <BR> } <BR> return cap; <BR>} <BR> <BR>Kann mir jemand sagen, was ich falsch mache??} <BR>
Import-Script
11.03.2004, 18:52
Ja: Fehler: Du hast nur einen 32bit Rechner <BR> <BR>ax = cap(16Bit) <BR>bx = irgendwas(auch 16Bit) <BR>mul ... macht 32 Bit <BR>cx = auch_noch_dazu <BR>mul??? macht 48Bit minimum oder was soll der Akt? <BR> <BR>real kap <BR>{ <BR>... <BR>} <BR>wäre gut <BR> <BR>weil unsigned superlongintnochmallong {void}...<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
11.03.2004, 19:05
lieber 48bit als gar keines... <BR> <BR>OK, ja das mag ja sein, aber leider kommt das Programm nicht so weit, weil er mir schon beim <i>int 0x21</i> abbricht. Assembler macht doch keinen Spass ohne interrupts... <BR>Wo könnte hier das Problem liegen?
Import-Script
11.03.2004, 19:16
Im Protected Mode(Windows) is nich mit Interrupts... (Treiberschreiber mal aussen vor) <BR>Alternative: DOS-Assembler verwenden, da geht das noch einigermaßen.
Import-Script
11.03.2004, 21:51
versuch mal, den interuptvektor in nen zeiger/pointer zu laden (GetIntVec ($21,int21proc) in pascal, keine ahnung ob's in C auch sowas gibt) das brauchst du nur einmal in deinem proggi irgendwo zu machen (am anfang, am besten *g*) <BR> <BR>und dann _statt_ dem int 0x21, einfach nen <BR>pushf ; <BR>call dword ptr int21proc ; <BR> <BR>das pushf um nen interruptaufruf zu 'simulieren' in wirklichkeit wird aber direkt hingesprungen (die interruptvektoren stehen im speicher an adresse 0-255, aber unter win kannst du da warscheinlich nicht drauf zugreifen? oder?, naja probiers einfach mal mit so ner getintvec routine) <BR> <BR>LameM
Powered by vBulletin® Version 4.1.7 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.