>> Edit article
이름
제목
패스워드
호오.. 어셈블리 언어를 모르는데.. 내용을 알고 보니 이해가 되네요 --;; a^=b 라는 과정을... b값에 저장되어 있는 것을 %edx에 저장, a의 위치를 %eax에 저장하고, %edx와 (%eax)로 xor 을 실행하면.. 자동으로 결과 값은 %eax에 저장(a의 위치?)된다.. 라고 이해했는데.. % 질문 추가 --;; % %eax 와 (%eax)의 차이점이 있는 것 같은데.. 맞나요? --;;; % 질문 끝 % 단계의 많고 적음으로 따지면 첫번째 것이 좀더 많은 과정을 거치는 것이 확실하네요. 첫번째는 3단계 과정이 총 3번 반복되고, (movl 3번, leal 3번, xor 3번) 두번째는 2단계 과정이 3 번 반복되는데.. (movl 6번) movl 3번과 {leal, xor} 3번중 어떤 게 더 빠른지는 모르겠습니다. 컴맹인지라 --;; 만일 어셈에서의 명령어 하나마다 동일한 시간으로 처리된다면 당연히 두 번째 것이 빠르겠네요. 그런데.. 두 번째 예의 c를 전역 변수로 지정해본다면 '초기화'과정을 거치지 않을까.. 궁금해지네요. %eax, %edx 의 차이점도 궁금하고... %eax는 왜 마지막에 0을 저장하는지도 궁금해지네요... 다만... %eax가 왠지 포인터같이 느껴지는군요. : <pre>안녕하세요.. : : 임시 변수를 쓰는 것과 xor 연산을 쓰는 것중 어느 것이 더 빠른지에 : 대해 의견이 많네요.. : : 사실 저도 어셈블리어에 대해서는 그다지 아는 게 없어서 자세히는 : 모르겠고요.. : : 다음은 2가지 경우의 c 언어 소스와 그것의 어셈블리 코드입니다. : 어셈블리와 machine instruction에 대해서 잘 아시는 분은 리플 좀 : 부탁드립니다. : : 1) xor 연산의 경우. : ---------------------- C 코드------------------------- : void main(void) { : int a = 5; : int b = 10; : a ^= b ^= a ^= b; : } : : -------------------- assembly code-------------------- : .file "xor.cpp" : .version "01.01" : gcc2_compiled.: : .text : .align 4 : .globl main : .type main,@function : main: : .LFB1: : pushl %ebp : .LCFI0: : movl %esp, %ebp : .LCFI1: : subl $8, %esp : .LCFI2: : movl $5, -4(%ebp) : movl $10, -8(%ebp) : movl -8(%ebp), %edx : leal -4(%ebp), %eax : xorl %edx, (%eax) : movl -4(%ebp), %edx : leal -8(%ebp), %eax : xorl %edx, (%eax) : movl -8(%ebp), %edx : leal -4(%ebp), %eax : xorl %edx, (%eax) : movl $0, %eax : leave : ret : .LFE1: : .Lfe1: : .size main,.Lfe1-main : .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)" : : 2) 임시 변수의 경우 : ---------------------- C 코드------------------------- : void main(void) { : int a = 5; : int b = 10; : int c; : c = a; : a = b; : b = c; : } : : -------------------- assembly code-------------------- : .file "temp_var.cpp" : .version "01.01" : gcc2_compiled.: : .text : .align 4 : .globl main : .type main,@function : main: : .LFB1: : pushl %ebp : .LCFI0: : movl %esp, %ebp : .LCFI1: : subl $12, %esp : .LCFI2: : movl $5, -4(%ebp) : movl $10, -8(%ebp) : movl -4(%ebp), %eax : movl %eax, -12(%ebp) : movl -8(%ebp), %eax : movl %eax, -4(%ebp) : movl -12(%ebp), %eax : movl %eax, -8(%ebp) : movl $0, %eax : leave : ret : .LFE1: : .Lfe1: : .size main,.Lfe1-main : .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)" : : 감사합니다. : : </pre> : : -- : Unfortunately no one can be told what the Chaos Club is.
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved