어셈블리

대소관계

파아랑새 2017. 9. 23. 10:17

# include <stdio.h>

void sameFunc(int v1, int v2) {

char* prompt = "(%d == %d) \n";

__asm {

push v2; // (" ", , v2);

push v1; // (" ", v1, v2);

push prompt; // ("%d is %d same \n", v1, v2);

call dword ptr[printf]; // printf("%d is %d same \n", v1, v2);

pop ebx; // printf("%d is %d same \n", v1, );

pop ebx; // printf("%d is %d same \n", , );

pop ebx; // printf( , , );

}

} // end of sameFunc 


void notSameFunc(int v1, int v2) {

char* prompt = "(%d != %d) \n";

__asm {

push v2; // (" ", , v2);

push v1; // (" ", v1, v2);

push prompt; // ("%d is %d same \n", v1, v2);

call dword ptr[printf]; // printf("%d is %d same \n", v1, v2);

pop ebx; // printf("%d is %d same \n", v1, );

pop ebx; // printf("%d is %d same \n", , );

pop ebx; // printf( , , );

}

} // end of notSameFunc


void aboveFunc(int v1, int v2) {

char* prompt = "(%d > %d) \n";

__asm {

push v2; // (" ", , v2);

push v1; // (" ", v1, v2);

push prompt; // ("%d is %d same \n", v1, v2);

call dword ptr[printf]; // printf("%d is %d same \n", v1, v2);

pop ebx; // printf("%d is %d same \n", v1, );

pop ebx; // printf("%d is %d same \n", , );

pop ebx; // printf( , , );

}

} // end of aboveFunc


void NotAboveFunc(int v1, int v2) {

char* prompt = "(%d < %d) \n";

__asm {

push v2; // (" ", , v2);

push v1; // (" ", v1, v2);

push prompt; // ("%d is %d same \n", v1, v2);

call dword ptr[printf]; // printf("%d is %d same \n", v1, v2);

pop ebx; // printf("%d is %d same \n", v1, );

pop ebx; // printf("%d is %d same \n", , );

pop ebx; // printf( , , );

}

}

int main(void) {

int v1 = 0;

int v2 = 0;

char* prompt_1 = "v1 Write : ";

char* prompt_2 = "v2 Write : ";

char* prompt_3 = "%d";

__asm {

//*********************************************************

/* v1 에 대하여 */

push prompt_1; // ("v1 Write : ");

call dword ptr[printf]; // printf("v1 Write : ")

pop ebx;

lea eax, v1; // eax = &v1

push eax; // ( , &v1)

push prompt_3; // ("%d", &v1);

call dword ptr[scanf];

pop ebx; // 나중에 들어온 "%d" 문자열 제거 

pop ebx; // $v1 제거

//*********************************************************

/* v2 에 대하여 */

push prompt_2; // ("v2 Write : ");

call dword ptr[printf]; // printf("v2 Write : ")

pop ebx; // prompt_2 에 관한 문자열삭제 


lea eax, v2; // eax = &v2

push eax; // ( , &v2)

push prompt_3; // ("%d", &v2);

call dword ptr[scanf];

pop ebx; // 나중에 들어온 "%d" 문자열 제거 

pop ebx; // $v2 제거

//*********************************************************

/* 대소 비교에 관하여 */

mov eax, v1;  // eax = v1

mov ebx, v2;  // ebx = v2

cmp eax, ebx; // cmp == compara

//*********************************************************

je Same; // if eax == ebx jump equal, goto 문장 

//*********************************************************

jne NotSame; // jump if not same 

//*********************************************************

Same:

push ebx;

push eax;

call dword ptr[sameFunc];

pop ebx;

pop ebx;

jmp EndLabel;

    //*********************************************************

NotSame:

ja Above;

jna notAbove;

//*********************************************************

Above:

push ebx;

push eax;

call dword ptr[aboveFunc];

pop ebx;

pop ebx;

jmp EndLabel;

//*********************************************************

notAbove:

push ebx;

push eax;

call dword ptr[NotAboveFunc];

pop ebx;

pop ebx;

jmp EndLabel;

//*********************************************************

EndLabel:


xor eax, eax; // mov eax, 0

leave;

retn;

}

}