xor eax, eax < mov eax, 0

By | 2006/04/02

로냐프씨의 글을 읽고 오랜만에 디스어셈블리를 해보았습니다.

별 생각없이 코드를 읽고 있다가

제가 C 소스를 간단히 짜보았습니다.

전 습관처럼 main함수는 리턴을 int로 잡습니다.

즉, void로 하지 않는다는 것이지요.

처음 배울 때부터 시작한 것이라

지금은 ‘return 0;’를 찍어야지

함수가 끝난 것 같은 느낌이 듭니다.

 

아무튼 디스어셈블리를 해서 나온 어셈코드는 다음과 같습니다.

즉, 0을 만들기 위해 eax 레지스터를 xor연산을 한 것입니다.

왜 ‘mov eax, 0’를 쓰지 않고,

xor eax, eax를 썼을까요?

그 답을 알기 위해 어셈러브를 찾아가봤습니다.

어떤 분이 벌써 질문을 하셨더군요.

해당 글 가기

바보같이 제가 생각했던 방법인

mov eax, 0는 5바이트나 차지하는 것이었습니다.

 

0을 만드는 방법

정말 다양하군요.

4 thoughts on “xor eax, eax < mov eax, 0

  1. SungSaint

    3학년 1학기 컴퓨터구조 수업 들어보셈. 0을 만드는 방법은 내가 아는것만 해도
    1)MOV r1,0
    2)XOR r1,r1
    3)SUB r1,r1
    4)AND r1,0
    이렇게나 많단 말이지…

    Reply
  2. NoSyu

    3학년 1학기면 내가 09년에 들어야할 것이잖아.
    3년 뒤에 배워야 할 것이군. 쿨럭..ㅠㅠ

    Reply
  3. MaseR

    아 저도 요새 디스어셈블리 코드를 보고 있습니다. 0값 리턴에 그런 뜻이 었군요.^^
    근데 1을 리턴하니 mov eax, 1이네요. 잘 배웠습니다.

    Reply
  4. NoSyu

    1을 설정하려면 0으로 만들어서 inc하면 될 듯도 하지만,
    그게 오히려 성능을 떨어뜨리겠죠?
    AoA에서도 가능한 코드 길이는 짧게 하는 것이 성능 향상이 된다면서
    파이프라인과 관련해서 얘기하더군요.^^

    Reply

Leave a Reply