물론 UB 임. 하지만 많은 컴파일러들이 아래처럼 동작됨.


int some_function()

{

    return value;

}

형식의 함수가 있다면,


대략 아래와 같은 어셈블리 코드로 번역됨


MOV EAX, value

RET


리턴값이 8비트 리턴일땐 AL, 16비트 일땐 AX, 32비트 일땐 EAX, 64비트 일땐 EDX:EAX


조합을 사용함. ( 64비트 컴파일러 에선 물론 이름이 바뀜 r~~ )


즉, 리턴값을 가져다 쓰는쪽이 EAX 를 쓰게 컴파일되는 식임.


따라서,


void some_function()

{

    asm mov EAX, value;

}


를 한다면, 사실상 똑같음.


우연히 대입되었던 EAX 를 조사하는 용도로도 쓸 수 있음.



앞에 질문한 아이의 소스코드가


왜 다른 레지스터도 아니고 EAX를 사용해 계산되었는가는,


EAX, EBX, ECX, EDX 가 A,B,C,D 레지스터라고 해서 Intel CISC 계열의 범용레지스터( GPR ) 로 활용되긴 하지만,

B, C, D 는 각각 옵셋계산, 카운터, 데이타 용도로 약한 특수 목적을 갖고 있다( SPR )는 이유임.


EAX 를 다른말로 어큐뮬레이터 라고 부르는건 EAX 를 경유하는 계산들이 많기 때문.