15.01.14-0x01

Kail-KM
|2015. 1. 14. 02:25
#C프로그래밍 어셈블리로부터 복구


1. IDIV는 나눗셈을 하는 명령어인데 왜 인자가 하나 뿐인가?
2.CVTPI2PS 는 무엇인가 대체
3.스택에는 어떻게 쌓일까   라는 의문들을 가지게 되었습니다.



1.IDIB는 EAX와 연산을 한다고 Hex님이 이야기를 해주시니 앞뒤가 딱 맞는것 같습니다.
EAX와 연산을 한 후 EAX로 반환한다.

2.여기서 개인적으로 중요하다싶은게 CVTPI2PS 입니다. 
Convert two 32-bit signed integers from MM/Mem to two SP/FP.  라고 구글링 결과 알게 되었는데
생각을 해보니 정수를 저장할때는 그 공간에 그대로 채워 넣으면 되지만 실수를 저장할때는 그 공간을 나누어
소수점윗부분과 아래부분으로 나누어 저장한다는 것이 기억 났습니다.

아래의 두사진을 보면 한곳에는 소수점 윗부분이, 다른 한곳에는 소수점아래부분이 저장된것을 확인가능.






그후 MOVUPS라는 명령에 대하여 알아보았는데

"MOVUPS xmm1, xmm2/m128 는 Move packed single-precision floating-point values from xmm2/m128 to xmm1." 라는 말을 보아 뒤의 인자로부터 앞의 인자로 이동시킨다.
그렇다면 CVTPI2PS로 부터 나누어졋던 두 부분을 다시 합치는 것이라 예상을 하였습니다.





3.아직 스택에 대하여는 잘 모르지만 e가 먼저 스택에 쌓인 이유는 printf 함수에서 %c를 통해 e를 출력하는것이 다른 것보다 후에 일어나기에 e를 가장먼저 스택에 쌓고 그후는 %d에 해당하는 d를 스택에 넣는다. 그리고 가장 먼저 출력될 %lf에 해당하는 c를 나중에 스택에 넣는다고 생각된다.





따라서 >

warming_up.exe


'Study > CodePA' 카테고리의 다른 글

0114_example.exe  (0) 2015.01.16
15.01.14-0x02 XORandShift.exe  (0) 2015.01.16