2013-05-07 2 views
8

XOR을 사용하여 2 개의 변수를 바꾸는 프로그램을 작성합니다.C 프로그램에서 디코딩 어셈블리 출력

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

나는 86 어셈블리에 익숙하지 않은 나는 ... 나는 어셈블리 형식에서 출력을 얻을

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

다른 사람과 함께 조립 출력을 얻을 수

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 

그것을 컴파일 하지만 난 ARM 어셈블리에서 일해 왔습니다. 숫자는 무엇입니까 및 은 여기에 의미합니까?

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

오프셋 % esp에서 24/28 바이트 (스택 포인터) –

+3

esp (스택 포인터)의 오프셋과 비슷합니다. 일반적으로 스택 포인터의 오프셋을 사용하여 로컬 변수와 매개 변수에 액세스합니다. 스택은 아래쪽으로 커지므로 일반적으로 음수 오프셋을 사용하여 매개 변수에 액세스하고 로컬 변수에 대해서는 양수 값을 사용합니다. –

+3

"XOR을 사용하여 2 개의 변수를 바꾸는 프로그램을 작성합니다." 왜? 어셈블리를 검사하기를 바랍니다. –

답변

9

%esp은 스택 포인터입니다. 24(%esp)는 주소 값을 읽어 %esp + 24

+0

그리고 그 값들 사이에 4의 차이가 있습니다. – ArunMKumar

+1

'4'의 차이는 값이 '4'바이트이고 스택에서 인접하기 때문입니다. – ouah

+0

나는이 일을 지치게했다. 선언하고 초기화하는 동안이 두 가지 사이에 또 ​​다른 정수를 삽입했는데,이 두 가지는 인접 해 있었다. 어떤 최적화 작업이 여기에 있습니까? – ArunMKumar

4

쉽게 혼동을 볼 수 있습니다. 어떤 사람은 저를 고치지 만, 그것은 AT & T 문법입니다. 저는 "%"기호와 괄호를 사용하는 방식이나 방법에 대해 컴파일러 작성자가 원하는만큼 정확하게 할 수 있다고 생각합니다. (그들이 한 일이 마음에 들지 않는다면, 자신의 컴파일러를 작성하고 무료로해라.)

나는 이것을 인텔 구문으로 다시 작성했다. 나는 그들이 그것을 무엇이라고 부르는 지 정확히 잊어 버린다. 그러나 어쨌든, 구문에서 목적지는 명령에서 제일 먼저 나오고 다른 부분은 그것을 따른다. 레지스터 이름 주위의 대괄호는 "이 레지스터가 가리키는 주소에있는 것을 찾을 수 있습니다."레지스터가 많으면 자신의 오프셋을 추가 할 수 있으며 칩에 오프셋이 추가 된 주소가 생성됩니다.

경고하지만이 부분이 맞다고 생각하지만 지금은 잠 들어 있어야합니다. 이 그것에 대해 너무 많이

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; 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) 

을 도움이된다면

어쨌든, 참조하십시오. 몇 가지 어셈블리 언어 과정에서이 문제에 직면 한 경우를 대비하여이 문제는 수년 동안 사람들을 (나를 포함하여) 매료 시켰습니다. 교수님이 찾고있는 부분은 다음과 같습니다. 그건 그렇고, 당신은 실제로 인터넷, 위키 백과에서 찾을 수 있습니다.

이전 11 설명

3 개 지시
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; 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) 

로 감소 될 수있다 마지막으로, 하드웨어 설계자와 구조에 마이크로 프로세서 ...

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ;             ; 
     ; 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

나는이 문장이 완전히 불필요하다고 생각한다. "당신이 한 일이 마음에 들지 않는다면, 자신의 컴파일러를 작성하고 무료로해라." IMHO. – Jack

+0

'xchg reg, reg'는 개념적'xchg mem, mem'을 대신하는 유효한 대체물이 아닙니다. 왜냐하면 그것은 메모리에서 물건을 가져 오는 것을 회피하고 메모리 피연산자가있는 xchg는 대부분의 플랫폼에서 잠금을 받게됩니다. 또한이 스 니펫에는 너무 많은 주석이 있습니다. 마지막으로, Reverse Nolish Potation은 다른 것입니다.) –

+0

@Jack, 너와 광범위한 계약이있는 경우, 그것을 제거하겠다. –