2013-05-07 10 views
8

Ich schreibe ein Programm, um 2 Variablen mit XOR zu tauschen.Dekodierung Baugruppe Ausgabe in C Programm

var1 = var1^var2; 
var2 = var2^var1; 
var1 = var1^var2; 

ich es Kompilieren Sie die Assembly-Ausgabe zu erhalten zusammen mit anderen

$ gcc Q1.c -save-temps -o Q1 

ich diese Ausgabe in Form Assembly Get ...

movl 24(%esp), %edx 
movl 28(%esp), %eax 
xorl %edx, %eax 
movl %eax, 24(%esp) 
movl 28(%esp), %edx 
movl 24(%esp), %eax 
xorl %edx, %eax 
movl %eax, 28(%esp) 
movl 24(%esp), %edx 
movl 28(%esp), %eax 
xorl %edx, %eax 

Ich bin nicht mit x86-Assembler aber ich habe an der ARM-Montage gearbeitet. Was bedeuten die Zahlen und meinen hier?

movl 28(%esp), %edx 
movl 24(%esp), %eax 
+1

Offset 24/28 Bytes von% esp (der Stapelzeiger) –

+3

Diejenigen aussehen Offsets von esp (Stapelzeiger). In der Regel verwendeten Sie Offsets vom Stapelzeiger, um auf lokale Variablen und Parameter zuzugreifen. Der Stack wächst nach unten, daher verwenden Sie normalerweise negative Offsets für den Zugriff auf Parameter und positive für lokale Variablen. –

+3

"Ich schreibe ein Programm, um 2 Variablen mit XOR zu tauschen." Warum? Hoffentlich nur um die Montage zu überprüfen. –

Antwort

9

%esp ist der Stapelzeiger. 24(%esp) liest den Wert bei der Adresse %esp + 24.

+0

und eine Differenz von 4 zwischen diesen Werten, weil ich mit Ganzzahlen .. richtig? – ArunMKumar

+1

Der Unterschied von '4' liegt darin, dass Ihre Werte' 4' Bytes lang sind und im Stapel nebeneinander liegen. – ouah

+0

Ich habe diese Sache müde, ich habe eine andere ganze Zahl zwischen diesen beiden eingefügt, während ich sie deklarierte und initialisierte, aber diese beiden landeten nebeneinander. jede Optimierung in der Arbeit hier? – ArunMKumar

2

Das sind Versätze, müssen Sie besonders auf den Wert hinzufügen, die reale Adresse zu bekommen

4

Ich kann leicht Ihre Verwirrung sehen. Jemand korrigiert mich, aber das ist AT & T-Syntax, denke ich, und genau wie oder wo sie alle "%" Zeichen und gebrauchte Klammern setzen und so weiter, nun, Compiler-Autoren können tun, was sie wollen. (Wenn Sie nicht mögen, was sie getan haben, schreiben Sie Ihren eigenen Compiler; und tun Sie es kostenlos und so weiter.)

Ich habe dies in Intel-Syntax für Sie neu geschrieben. Ich vergesse genau, wie sie es nennen, aber in der Syntax steht das Ziel in der Anweisung an erster Stelle, und die anderen Teile folgen ihm. Klammern um einen Registernamen bedeuten "Die Sachen, die Sie an der Adresse finden, auf die dieses Register zeigt" Bei vielen Registern können Sie einen eigenen Offset hinzufügen, und der Chip generiert die Adresse mit dem hinzugefügten Offset.

Vorbehalt, ich denke, das ist richtig, aber ich sollte jetzt wirklich zu Hause schlafen.

Wie dem auch sei, ob dies für das

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; Arun's Swap Via Xor Function      ; 
     ;             ; 
     ; Arun is studying C and ASM      ; 
     ;             ; 
     ; On Entry: var1 is at the 24th place in the stack ; 
     ;             ; 
     ;   var2 is at the 28th place in the stack ; 
     ;             ; 
     ;   Both of these are 32 bit numbers which ; 
     ;   is why they are 4 bytes apart   ; 
     ;             ; 
     ; On Exit: var1 is in Eax       ; 
     ;             ; 
     ;   var2 is in Edx       ; 
     ;             ; 
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


Aruns_Swap_Via_Xor_Function: 

     MovL Edx, [Esp + 24]  ;var1 goes into Edx 
     MovL Eax, [Esp + 28]  ;var2 goes into Eax 

     XorL Eax, Edx    ;Xor them and put the result in Eax 

     MovL [Esp + 24], Eax  ;Store the result in var1 on the stack 

     MovL Edx, [Esp + 28]  ;Original var2 goes in Edx this time 

     MovL Eax, [Esp + 24]  ;The bit fiddled var1 is now in Eax 
            ;Be aware, this is not exactly optimized 
            ; but it will work, and this compiler apparently 
            ; doesn't want to take chances. 
            ; The brass tacks are that this instruction 
            ; as it appears here, is a defacto Nop 

     XorL Eax, Edx    ;Now Xor both of those values and put the result in Eax 
     MovL [Esp + 28], Eax  ;That modified value goes into var2 
            ;(Be alert, this is really the original var1) 

     MovL  Edx, [Esp + 24]  ;The original var2 is now in Edx 
     MovL  Eax, [Esp + 28]  ;The modified var2 is now in Eax 

     XorL Eax, Edx    ;Xor those two and put the result in Eax 
            ;Now Eax and Edx hold each other's original contents 
            ; 
            ;(and life goes on) 

So viel hilft. Nur für den Fall, dass Sie in einem Assessment-Sprachkurs konfrontiert werden, hat dieses Problem die Menschen (einschließlich mir) seit Jahren fasziniert. Hiernach suchen Ihre Professoren wahrscheinlich. Übrigens, Sie können dies im Internet finden, Wikipedia, in der Tat.

Die vorherigen 11 Anweisungen kann zur Rettung

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; A slightly optimized swap function    ; 
     ;             ; 
     ; Arun is studying C and ASM      ; 
     ;             ; 
     ; On Entry: var1 is in Eax       ; 
     ;             ; 
     ;   var2 is in Ebx       ; 
     ;             ; 
     ;   Both of these are 32 bit numbers, and ; 
     ;   so we will use 32 bit instructions. ; 
     ;             ; 
     ; On Exit: var1 is in Ebx       ; 
     ;             ; 
     ;   var2 is in Eax       ; 
     ;             ; 
     ;             ; 
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

Slightly_Optimized_Swap_Routine: 


     XorL Eax, Ebx    ;Xor them and put the result in Ebx 
            ;At this point Eax is var1 and Ebx is weird number 

     XorL Ebx, Eax    ;Xor that result with the origial var1 
            ;At this point, Eax is var2 and Ebx is still weird number 

     XorL Eax, Ebx    ;Xor them and put the result in Ebx 
            ;At this point, Eax is var2 and Ebx is Var1 
            ; 
            ;(and life goes on) 

Schließlich Hardware-Designer und Mikroprozessoren 3 Anweisungen reduziert werden ...

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; A slightly better optimized swap function  ; 
     ;             ; 
     ; Brought to you by Clint on Stack Overflow  ; 
     ;             ; 
     ; On Entry: var1 is in Eax       ; 
     ;             ; 
     ;   var2 is in Ebx       ; 
     ;             ; 
     ;   Both of these are 32 bit numbers, and ; 
     ;   so we will use 32 bit instructions. ; 
     ;             ; 
     ; On Exit: var1 is in Ebx       ; 
     ;             ; 
     ;   var2 is in Eax       ; 
     ;             ; 
     ;             ; 
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


Slightly_Better_Swap_Routine: 


     XchgL Eax, Ebx    ;Microprocessor magic, exchange them in one instruction. 
            ; Honest, hardware guys can do stuff like that. The previous 
            ; eleven instructions have been reduced to one. Ta-Da 
            ; 
            ;(and life goes on) 
+0

Ich denke, diese Aussage unnötig total: "Wenn Sie nicht mögen, was sie taten, schreiben Sie Ihren eigenen Compiler; und tun Sie es kostenlos und so weiter." MEINER BESCHEIDENEN MEINUNG NACH. – Jack

+0

'xchg reg, reg 'ist kein gültiger Ersatz für ein konzeptuelles' xchg mem, mem', da es das Auslesen von Daten aus und in den Speicher vermeidet und xchg mit einem Speicheroperanden auf den meisten Plattformen eine Sperre verursacht. Außerdem gibt es zu viele Kommentare in diesen Snippets. Schließlich, Reverse Nolish Potation ist etwas anderes;) –

+0

@Jack, wenn es breite Vereinbarung mit Ihnen gibt, werde ich es entfernen –