inline asm mit gcc: kein zugriff alle register



  • hi!

    ich versuche gerade eine einfache funktion in inline-assembler zu schreiben. allerdings fummelt gcc an meinem code rum. warum macht der das und wie kann man das abstellen?

    int main()
    {
    	__asm__("xorq 	%rcx, %rcx\n\t"
    			:
    			:
    			: "rcx");
    
    	return 0;
    }
    

    daraus wird:

    .file	"rip.c"
    	.text
    .globl main
    	.type	main, @function
    main:
    .LFB2:
    	pushq	%rbp
    .LCFI0:
    	movq	%rsp, %rbp
    .LCFI1:
    #APP
    	xorq 	cx, cx ; fehler
    
    #NO_APP
    	movl	$0, %eax
    	leave
    	ret
    .LFE2:
    	.size	main, .-main
    

    wieso ersetzt der gcc meine registerangabe, obwohl sogar noch explizit eine größe angegeben ist?

    gcc version ist 4.1.2

    mfg



  • Hmm Sieht allerdings komisch aus.

    Aber in dem entstehendem listing sthet doch xorq cx, cx

    also q für 64 bit. Vllt zeigt es nur aus irgend einem Grund cx statt rcx an, aber es wird schließlich xorq verwendet und net die 16 bit variante ?!?!

    Vergleich mal im hexeditor den assemblierten code.



  • dfgdfg schrieb:

    Vergleich mal im hexeditor den assemblierten code.

    das geht nicht, weil gas den compiliervorgang abbricht. den assembler-code habe ich mit "gcc --save-temps rip.c" erhalten.

    mfg



  • dfgdfg schrieb:

    Hmm Sieht allerdings komisch aus.

    Aber in dem entstehendem listing sthet doch xorq cx, cx

    also q für 64 bit. Vllt zeigt es nur aus irgend einem Grund cx statt rcx an, aber es wird schließlich xorq verwendet und net die 16 bit variante ?!?!

    Vergleich mal im hexeditor den assemblierten code.

    ich glaube ich habe mich da nicht klar genug ausgedrückt: dergcc gibt folgenden fehler aus:

    rip.c: In function 'main':
    rip.c:3: error: invalid 'asm': operand number missing after %-letter
    rip.c:3: error: invalid 'asm': operand number missing after %-letter



  • Im Assemblerforum dürfte es schneller gehen:

    Im Compiler:
    %n : Textersatz des Operanden n
    %%xxx : Register xxx (2 mal 😵

    Der Assembler erwartet nur ein % für Register - weil diese Variante aber durch den Compiler anders interpretiert wird, muss man 2 % benutzen

    %rcx: hier wird vermutlich %r ersetzt - (keine Ahnung wie dumm der Compiler bei diesem Vorgang tatsächlich ist) - zu einem Leerstring, cx bleibt stehen... ist aber nur meine Vermutung


Anmelden zum Antworten