본문 바로가기

My Study/Programming&Theory

Intel CPU의 영리함??

아..한 몇 주는 거의 방황상태로 세상을 보낸거 같다 -_-;;
그래도 시간날때마다 조금씩 책 공부라도 하면서 정리를 해야겠다 ㅜㅜ
================================================
저번에 기계어와 C언어에 대해서 문서를 올린 적 있는데 그 부분에서 다음과 같은 그림이 있었습니다.

보통 Opcode(Operand Code)에는 lea,mov,call 등등 이런 명령어들이 옵니다.
그리고 그 전에 보이는 Instruction Prefixes는 있을 수도 있고 없을 수도 있습니다.
보통 있는 경우에 많이 보게되는 명령어 중 하나가 바로 반복명령입니다.
rep,repe,repne같은 명령어를 보신적 있을 것입니다. 해당 명령어는 String을 처리할 때 쓰입니다.

보통 rep가 문자열을 처리할 때 어떻게 하는지 봐보겠습니다. 간단하게 인라인 어셈으로 짜보았습니다.

rep는 ecx가 0이 될 때까지 movs명령어를 반복 할 것입니다.
movs는 esi가 가리키는 값에서 1Byte씩 가져와 edi가 가리키는 곳에 넣을 것입니다.

고로 temp에 ezbeat이 들어가겠지요. 출력 결과를 보시겠습니다.


이렇게 보듯 rep라는 반복문은 문자열을 처리하는데 있어서 필요한 명령어이지만 
단순히 mov명령어에는 아마 필요가 없을 것입니다.

하지만 인라인 어셈으로 rep와 mov를 같이 써도 에러가 나지않으며 정상적으로 컴파일이 됩니다.
그러면 mov명령어를 ecx가 0이 될때까지 반복을 하는 것일까요?? 반복 할 수도 있겠지만 
정말 의미 없는 코드일 것입니다.

예를 들어서 
ecx = 10     ;이건 아님
rep mov eax,ebx
라는 코드가 있다면 ebx를 eax에 10번이나 넣고 있을까요?? 정답은 아닙니다.

일단 테스트 코드와 실행 결과를 봐보도록 하겠습니다.


실행 결과 입니다.


중요한것은 count부분입니다. 0이 아니라 10이라는 값을 그대로 가지고 있습니다.
즉, rep명령어 자체를 무시해 버린 것입니다.

그러면 컴파일 했을 때 rep가 사라진걸까요?? 그것도 아닙니다.
이건 CPU자체에서 무시하는 것이기 때문에 있어도 상관이 없죠.
Windbg에서 해당 코드를 봐보겠습니다.

빨간색 네모친 부분이 문제의 코드 부분입니다.
그리고 rep명령어에 대응하는 기계어 코드인 f3도 존재합니다.

결론은 CPU가 자체적으로 무시해버린다는 것이지요. 영리한건가요?? -.-;;

'My Study > Programming&Theory' 카테고리의 다른 글

SSDT Hooking  (7) 2010.10.20
Driver Load, Unload  (0) 2010.10.17
Visual Studio 2010 ddk 연동 (Window7)  (9) 2010.10.05
Anti Dll Hijacking  (4) 2010.09.25
Create BSOD in usermode  (4) 2010.09.22