Assembler Frage ( 2mal hintereinander dieselbe Instruktion )

#6723731
Lesenswert?

Werte Leser,
ich bin mir nicht ganz sicher, ob hier das richtige Forum ist, aber es 
scheint mir das am wenigsten falsche zu sein ;)
Ich habe eine Assemblerstrecke da taucht zweimal direkt hintereinander
dieselbe Instruktion auf. So sieht das aus:

cmp r0,#0
cmp r0,#0

Ich habe auch geguckt, ob da ein Sprunglabel ist. Ist aber nicht.
Was soll so etwas?
Gruß
Espen
Beitrag #6723767 wurde von einem Moderator gelöscht.
#6723790
Lesenswert?

>"Rück halt etwas mehr Kontext raus, deine Salamischeiben sind zu dünn."
Ich hab nur die Codestrecke von __sync_val_compare_and_swap( &lock,0,1 )
1
 8005844:  463a        mov  r2, r7
2
 8005846:  2101        movs  r1, #1
3
 8005848:  f3bf 8f5b   dmb  ish
4
 800584c:  e852 3f00   ldrex  r3, [r2]
5
 8005850:  2b00        cmp  r3, #0
6
 8005852:  d104        bne.n  800585e <main+0x66>
7
 8005854:  e842 1000   strex  r0, r1, [r2]
8
 8005858:  2800        cmp  r0, #0
9
 800585a:  2800        cmp  r0, #0
10
 800585c:  d1f6        bne.n  800584c <main+0x54>
11
 800585e:  f3bf 8f5b   dmb  ish
12
 8005862:  60bb        str  r3, [r7, #8]

Mod: Formatierung angepasst.
Gast #6723978
Lesenswert?

>> Assembler Frage ( 2mal hintereinander dieselbe Instruktion )

Das ist für den Fall, das der Prozessor den Befehl beim ersten Mal nicht 
verstanden hat. Er legt dann die Frage "Hä?!" auf den Datenbus.
#6724917
Lesenswert?

Erstmal besten Dank für die bisherige Unterstützung, wenn ich auch nicht 
immer alles verstehe.
Die obige Codestrecke ist das Kompilat ohne Optimierung.
Wenn ich mit -Os kompiliere, fehlt der doppelte Vergleich und diese 
Codestrecke wird generiert:
1
80039d8:  bf00        nop
2
    val = __sync_val_compare_and_swap( &lock,0,1 );
3
 80039da:  2601        movs  r6, #1
4
 80039dc:  f3bf 8f5b   dmb  ish
5
 80039e0:  e854 2f00   ldrex  r2, [r4]
6
 80039e4:  42aa        cmp  r2, r5
7
 80039e6:  d103        bne.n  80039f0 <main+0x5c>
8
 80039e8:  e844 6300   strex  r3, r6, [r4]
9
 80039ec:  2b00        cmp  r3, #0
10
 80039ee:  d1f7        bne.n  80039e0 <main+0x4c>
11
 80039f0:  f3bf 8f5b   dmb  ish
12
    __ASM( "nop" );
13
 80039f4:  bf00        nop

Das sieht für mich proper aus.
Dies nur zur Info und die nops sind natürlich von mir.

Mod: Formatierung angepasst.
Moderator Persönliche Seite #6726356
Lesenswert?

Espen A. schrieb:
> Wenn ich mit -Os kompiliere, fehlt der doppelte Vergleich und diese
> Codestrecke wird generiert:

Bitte zukünftig die Code-Teile in [ code ] ... [ /code ] (ohne 
Leerzeichen) einpassen, sonst steht das auf Mobilteilen alles in einer 
Zeile und wird dadurch unleserlich.

Ich habe die oben stehenden Beiträge mal angepasst. Bitte zukünftig 
selber machen. Danke.
#6743357
Lesenswert?

Espen A. schrieb:
> Die obige Codestrecke ist das Kompilat ohne Optimierung.
> Wenn ich mit -Os kompiliere, fehlt der doppelte Vergleich

Da hatte der Compiler ursprünglich wohl zwei Codefragmente 
aneinandergekleistert, von denen das erste mit dem CMP aufhört, als 
Vorbereitung darauf was meist folgt, z.B. RET mit gesetzten Flags,
und  einem zweiten Fragment, das mit  der Abfrage auf 0 beginnt, weil 
sofort danach die Verzweigung erfolgt.

Schadet ja nichts.

Der Optimizer hat das dann bemerkt und den ersten CMP entfernt.

P.S.:
Dass die optimierte Version andere Register verwendet, dürfte daran 
liegen, dass der Optimizer vorher schon manche überflüssigen Umladungen 
entfernt hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren