일단 문제는 + 연산에서 교환법칙이 성립하지 않는 경우를 표현하는것 입니다.
기존 제 생각은 이렇습니다.
연산이 왼쪽에서 오른쪽으로 진행될경우
x = g_value + fun(0);
eax 에 g_Value 값이 저장되고 그 후에
함수를 불러 g_Value 값이 바뀌지만 eax는 영향을 받지 않고
add eax, 4
하게 되어 100 +4 = 104 가 될줄 알고있었습니다.
밑에 경우는
y = fun(0) + g_value ;
함수가 먼저 호출되어 g_value 의 값이 변하고
eax 에 함수의 리턴 값인 4가 저장되고 그 후에
add eax, g_value
하게 되어 4 + 1000 이어 1004 가 될줄 알고있었습니다만 ..
디스 어셈블리로 직접 관찰하니 그게 상관없이
함수를 먼저 호출한다는것을 알게 되었습니다.
으악!
+ 오퍼레이터가 좌항을 먼저 Eval할지 우항을 먼저 Eval할지는 표준에 정의되어 있지 않음 (Platform-Dependent한 동작). 비쥬얼 스튜디오에서는 함수를 먼저 호출하지만 gcc나 clang같은 컴파일러에선 다른 동작을 할 수도 있음.
고맙습니다! 오늘 많은걸 배워가네요^^
덧셈을 할 수 있도록 eval depth를 맞추는게 우선.
미리 레지스터를 할당했다 대피해야되면 낭비니까 그렇게 하진 않아
그리고 지금 gcc에서 최적화 옵션 다양하게 주고 컴파일해 보니까 정말 되도않는 어셈들이 생성됨, 예를들면 fun 함수를 그냥 인라이닝해서 +4로 만들어 버린다던가...이런 최적화의 여지를 남기려고 표준에서 정의하지 않은듯?
*i += 5; 지우고 return (*i) += 5;로 바꾸면 됨. *i += 5;는 *(i+=5)와 마찬가지.
이런것이 c언어 중급자부터 기본적인 어셈블리어를 알아야 하는 이유
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.