Inline Assembler lässt sich net compilieren



  • Hi,

    ich habe den code aus dem FAQ genommen und in eine C++ Funktion eigebaut, doch die will net compilieren. 😞

    void reboot (void)
    {
    	asm
    	{
    		db 0EAh  ;entspr. jmp FFFF:0000 
    		dw 0000h  
    		dw 0FFFFh  
    	};
    }
    
    void shutdown (void)
    {
    	asm 
    	{
    		mov ax,5301h ;Aktiviere RealMode APM Interface 
    		xor bx,bx  
    		int 15h 
    
    		mov ax,530eh ;Waehle APM Version 
    		xor bx,bx  
    		mov cx,0001h ;v.:1.1 
    		int 15h 
    
    		mov ax,530fh ;Aktiviere APM fuer alle Geraete 
    		mov bx,0001h ;ID 1=Alle Geraete 
    		mov cx,0001h ;1=engage 
    		int 15h 
    
    		mov ax,5308h ;Aktiviere automatisches APM fuer alle Geraete 
    		mov bx,0001h ;ID 1=Alle Geraete 
    		mov cx,0001h ;1=enable 
    		int 15h 
    
    		mov ax,5307h ;Setze Geraetezustand 
    		mov bx,0001h ;ID 1=Alle Geraete 
    		mov cx,0003h ;Status 3=Ausgeschaltet 
    		int 15h
    	};	
    }
    

    Ich benutze den GCC!



  • der GCC benutzt einen anderen Inline-Assembler Syntax. Hilfe dazu findest du aussreichend in der FAQ und im GCC Manual.



  • Hi.

    Der GCC verwendet die AT&T-Syntax. Dazu muesstest du den Code entsprechend umschreiben.

    Noch einige Anmerkungen:
    In C++ werden Kommentare nicht durch ein Semikolon eingeleitet 😉
    In 32Bit (Win-Konsole/Windows/Linux o.ae.) Applikationen werden diese Codes nicht funktionieren.



  • na klasse... wieso gibt es denn diese 2 verschiedenen synatxe??? fuck it 😞



  • Ich habe mal gelesen Interrupts würden in Inline-Assembler nicht funktionieren oder gilt das nur für Win-Applikationen?

    =Seraph= schrieb:

    na klasse... wieso gibt es denn diese 2 verschiedenen synatxe??? fuck it 😞

    Es gibt noch mehr, z.B. NASM und wenn du es damit verlgichen hast dann MASM/TASM.

    Code-Hacker



  • Code-Hacker schrieb:

    Ich habe mal gelesen Interrupts würden in Inline-Assembler nicht funktionieren oder gilt das nur für Win-Applikationen?

    Da hast du irgendwas verwechselt. Die aus der DOS-Programmierung gewohnten Interrupts (BIOS, DOS-API usw.) lassen sich im Protected Mode (z.B. in Windows-Programmen) nicht aufrufen, das hat aber absolut nichts mit der Verfügbarkeit der INT-Instruktion im Inline-Assembler zu tun.

    BTW sagt der C++-Standard, das asm-Schlüsselwort habe die Syntax asm ( string-literal ), von daher ist das oben sowieso fragwürdig. Ich weiß, es gibt Compiler, die das so implementieren (Turbo C++ z.B.), aber man sollte nicht davon ausgehen, dass das immer klappt. Ein normaler Präprozessor könnte sich daran schon verschlucken.



  • Bashar schrieb:

    Da hast du irgendwas verwechselt. Die aus der DOS-Programmierung gewohnten Interrupts (BIOS, DOS-API usw.) lassen sich im Protected Mode (z.B. in Windows-Programmen) nicht aufrufen, das hat aber absolut nichts mit der Verfügbarkeit der INT-Instruktion im Inline-Assembler zu tun.

    BTW sagt der C++-Standard, das asm-Schlüsselwort habe die Syntax asm ( string-literal ), von daher ist das oben sowieso fragwürdig. Ich weiß, es gibt Compiler, die das so implementieren (Turbo C++ z.B.), aber man sollte nicht davon ausgehen, dass das immer klappt. Ein normaler Präprozessor könnte sich daran schon verschlucken.

    Ich denke aber nicht das ich das verwechselt habe, es stand da nur (auf irgend ner Seite, dass man die nicht gehen in Inline-Assembler.

    Aber jetzt bin ich ja aufgeklärt, thx!

    Code-Hacker



  • Dann hast du eben was gelesen, was jemand anders verwexelt hat 🙂


Anmelden zum Antworten