IT공부/IT서적

[윤성우 열혈 C프로그래밍] 릴리즈 빌드(최적화 컴파일러 OFF), 어셈블리 코드 - Chapter24, Chapter26, Chapter27

shine94 2025. 2. 11. 17:42
#include <stdio.h>

#define SQUARE(X)	X*X

int main(void)
{
00861080  push        ebp  
00861081  mov         ebp,esp  
00861083  push        ecx  
	int num = 20;
00861084  mov         dword ptr [num],14h  

	// 정상적 결과 출력
	printf("Square of num: %d\n", SQUARE(num));
0086108B  mov         eax,dword ptr [num]  
0086108E  imul        eax,dword ptr [num]  
00861092  push        eax  
00861093  push        863088h  
00861098  call        printf (0861040h)  
0086109D  add         esp,8  
	printf("Square of num: %d\n", SQUARE(-5));
008610A0  push        19h  
008610A2  push        863074h  
008610A7  call        printf (0861040h)  
	printf("Square of num: %g\n", SQUARE(2.5));
008610AC  movsd       xmm0,mmword ptr [__real@4019000000000000 (0862100h)]  
008610B4  movsd       mmword ptr [esp],xmm0  
008610B9  push        863060h  
008610BE  call        printf (0861040h)  
008610C3  add         esp,0Ch  

	return 0;
008610C6  xor         eax,eax  
}
008610C8  mov         esp,ebp  
008610CA  pop         ebp  
008610CB  ret

 

#include <stdio.h>

#define SQUARE(X)	X*X

int main(void)
{
01001080  push        ebp  
01001081  mov         ebp,esp  
01001083  push        ecx  
	int num = 20;
01001084  mov         dword ptr [num],14h  

	// 정상적 결과 출력
	printf("Square of num: %d\n", SQUARE(num));
0100108B  mov         eax,dword ptr [num]  
0100108E  imul        eax,dword ptr [num]  
01001092  push        eax  
01001093  push        10030B4h  
01001098  call        printf (01001040h)  
0100109D  add         esp,8  
	printf("Square of -5: %d\n", SQUARE(-5));
010010A0  push        19h  
010010A2  push        10030A0h  
010010A7  call        printf (01001040h)  
	printf("Square of 2.5: %g\n", SQUARE(2.5));
010010AC  movsd       xmm0,mmword ptr [__real@4019000000000000 (01002100h)]  
010010B4  movsd       mmword ptr [esp],xmm0  
010010B9  push        100308Ch  
010010BE  call        printf (01001040h)  
010010C3  add         esp,0Ch  

	// 비정상적 결과 출력
	printf("Square of 3+2: %d\n", SQUARE(3+2));
010010C6  push        0Bh  
010010C8  push        1003078h  
010010CD  call        printf (01001040h)  
010010D2  add         esp,8  

	// 위의 비정상적 결과 출력 해결책
	printf("Square of (3+2): %d\n", SQUARE((3 + 2)));
010010D5  push        19h  
010010D7  push        1003060h  
010010DC  call        printf (01001040h)  
010010E1  add         esp,8  

	return 0;
010010E4  xor         eax,eax  
}
010010E6  mov         esp,ebp  
010010E8  pop         ebp  
010010E9  ret

 


 

#include <stdio.h>

#define PI				3.14
#define PROUCT(x, y)	((x)*(y))
#define CIRCLE_AREA(R)	(PROUCT((R), (R)) * PI)

int main(void)
{
00BD1080  push        ebp  
00BD1081  mov         ebp,esp  
00BD1083  sub         esp,8  
	double rad = 2.1;
00BD1086  movsd       xmm0,mmword ptr [__real@4000cccccccccccd (0BD2100h)]  
00BD108E  movsd       mmword ptr [rad],xmm0  
	printf("반지름 %g인 원의 넓이: %g\n", rad, CIRCLE_AREA(rad));
00BD1093  movsd       xmm0,mmword ptr [rad]  
00BD1098  mulsd       xmm0,mmword ptr [rad]  
00BD109D  mulsd       xmm0,mmword ptr [__real@40091eb851eb851f (0BD2108h)]  
00BD10A5  sub         esp,8  
00BD10A8  movsd       mmword ptr [esp],xmm0  
00BD10AD  sub         esp,8  
00BD10B0  movsd       xmm0,mmword ptr [rad]  
00BD10B5  movsd       mmword ptr [esp],xmm0  
00BD10BA  push        0BD3060h  
00BD10BF  call        printf (0BD1040h)  
00BD10C4  add         esp,14h  
	return 0;
00BD10C7  xor         eax,eax  
}
00BD10C9  mov         esp,ebp  
00BD10CB  pop         ebp  
00BD10CC  ret

 


 

#include <stdio.h>

#define HIT_NUM		7

int main(void)
{
00C21000  push        ebp  
00C21001  mov         ebp,esp  
#if HIT_NUM == 5
	puts("매크로 상수 HIT_NUM은 현재 5 입니다");
#elif HIT_NUM == 6
	puts("매크로 상수 HIT_NUM은 현재 6 입니다");
#elif HIT_NUM == 7
	puts("매크로 상수 HIT_NUM은 현재 7 입니다");
00C21003  push        0C23060h  
00C21008  call        dword ptr [__imp__puts (0C220B0h)]  
00C2100E  add         esp,4  
#else
	puts("매크로 상수 HIT_NUM은 5, 6, 7은 확실히 아닙니다");
#endif

	return 0;
00C21011  xor         eax,eax  
}
00C21013  pop         ebp  
00C21014  ret