C300_039
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> union tagVariant { int i; float d; }; main() { union tagVariant V; V.i = 0; V.d = 5.5; printf("V.i = %d \n", V.i); // V.i = 1085276160 printf("V.d = %f \n", V.d); // V.d = 5.500000 } | cs |
IDA - Layout Graph
IDA - Text View
movss: 4바이트 float 단정도 부동 소수점을 대입(전달)한다.
movsd: SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 저정되는 메모리 주소로 복사한다.
CVTSS2SD(Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value)
단정도 실수형의 스칼라 값을 배정도 실수형의 스칼라 값으로 변환한다.
단정도는 float, 배정도는 double을 의미한다.
처음 C 코드를 보면 union을 이용해 int 와 float가 공통된 메모리를 사용하고 있는것을 볼 수 있다.
하지만 어셈블리로 보면, stack에 올라간 위치를 덮어 쓰면서 같이 사용하는것을 알 수 있다.
pseudo code - 의사코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> main() { int V; double var_C; V=0; xmm0 = 5.5; V = 5.5; eax = V; printf(_Format, eax); xmm0 = V; var_C = xmm0; printf(aVDF, var_C); eax = 0; } | cs |
pseudo code - 최종 의사코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> main() { int V; double var_C; V = 0; V = 5.5; printf(_Format, V); var_C = (double)V; printf(aVDF, var_C); return 0; } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 041 (0) | 2018.07.08 |
---|---|
ASM to C with IDA - 040 (0) | 2018.07.06 |
ASM to C with IDA - 038 (0) | 2018.07.06 |
ASM to C with IDA - 037 (0) | 2018.07.05 |
ASM to C with IDA - 036 (0) | 2018.07.05 |