PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ inline assembler



Import-Script
11.03.2004, 18:04
Aus &uuml;bungsgr&uuml;nden hab ich mal ein kurzes C&#43;&#43; Programm geschrieben mit inline assembler &#40;im Visual Studio.net&#41;. 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&#40;void&#41;{ <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&#40;16Bit&#41; <BR>bx = irgendwas&#40;auch 16Bit&#41; <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&#40;Windows&#41; is nich mit Interrupts... &#40;Treiberschreiber mal aussen vor&#41; <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 &#40;GetIntVec &#40;$21,int21proc&#41; in pascal, keine ahnung ob&#39;s in C auch sowas gibt&#41; das brauchst du nur einmal in deinem proggi irgendwo zu machen &#40;am anfang, am besten &#42;g&#42;&#41; <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 &#39;simulieren&#39; in wirklichkeit wird aber direkt hingesprungen &#40;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&#41; <BR> <BR>LameM