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)
Offset 24/28 Bytes von% esp (der Stapelzeiger) –
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. –
"Ich schreibe ein Programm, um 2 Variablen mit XOR zu tauschen." Warum? Hoffentlich nur um die Montage zu überprüfen. –