인라인 어셈블리 계산기(사칙연산 완성)
# include <stdio.h>
int __FuncAdd__(int nParam_1, int nParam_2)
{
int result = 0;
__asm
{
mov eax, nParam_2;
add eax, nParam_1;
mov result, eax;
}
return result;
}
int __FuncSub__(int nParam_1, int nParam_2)
{
int result = 0;
__asm
{
mov eax, nParam_2;
sub eax, nParam_1;
mov result, eax;
}
return result;
}
int __FuncMul__(int nParam_1, int nParam_2)
{
int result = 0;
__asm
{
mov eax, nParam_2;
mul nParam_1;
mov result, eax;
}
return result;
}
int __FuncDiv__(int nParam_1, int nParam_2)
{
int result = 0;
__asm
{
xor edx, edx;
mov eax, nParam_2;
div nParam_1;
mov result, eax;
}
return result;
}
int main(void)
{
int choice = 0;
int resultValue = 0;
int value_1 = 0;
int value_2 = 0;
char* prompt = "data input : ";
char* pValue_1 = "value_1 input : ";
char* pValue_2 = "value_2 input : ";
char* Input = "%d";
__asm
{
// ----------------------------------------------------------------------------
push pValue_1; // "value_1 input : "
call dword ptr[printf];
pop ebx;
lea edx, value_1; // edx = &value_1
push edx;
push Input; // "%d"
call dword ptr[scanf]; // scanf("%d", &value_1)
// ----------------------------------------------------------------------------
push pValue_2; // "value_2 input : "
call dword ptr[printf];
pop ebx;
lea edx, value_2; // edx = &value_2
push edx;
push Input; // "%d"
call dword ptr[scanf]; // scanf("%d", &value_2)
// ----------------------------------------------------------------------------
push prompt; // "data input : "
call dword ptr[printf];
pop ebx;
lea edx, choice; // scanf("%d", &choice)
push edx;
push Input;
call dword ptr[scanf];
push ebx;
push ebx;
// ----------------------------------------------------------------------------
push value_2;
push value_1;
cmp choice, 1;
je add_; // jump equal
jne Re_choice_; // jump not equal
add_:// if (choice == 1)
call dword ptr[__FuncAdd__]; // int __FuncAdd__(pValue_1, pValue_2)
mov resultValue, eax;
pop ebx;
pop ebx;
jmp E_;
Re_choice_: // else // choice != 1
cmp choice, 2;
je sub_; // if (choice == 2)
jne Re_choice2_; // else // choice != 2
sub_:
call dword ptr[__FuncSub__]; // int __FuncSub__(pValue_1, pValue_2)
mov resultValue, eax;
pop ebx;
pop ebx;
jmp E_;
Re_choice2_:
cmp choice, 3;
je mul_; // if (choice == 3)
jne Re_choice3_; // else // choice != 3
mul_:
call dword ptr[__FuncMul__]; // int __FuncMul__(pValue_1, pValue_2)
mov resultValue, eax;
pop ebx;
pop ebx;
jmp E_;
Re_choice3_:
cmp choice, 4;
je div_; // if (choice == 4)
jne E_;
div_:
call dword ptr[__FuncDiv__];
mov resultValue, eax;
pop ebx;
pop ebx;
jmp E_;
}
E_:
printf("%d \n", resultValue);
return 0;
}
'어셈블리' 카테고리의 다른 글
어셈블리 계산기(더하기, 빼기, 나누기, 곱하기) (0) | 2017.07.30 |
---|---|
hello world (0) | 2017.07.20 |
nasm (0) | 2017.07.01 |
어셈블리어_TEST (0) | 2017.06.23 |
어셈블리 step_3_mov [대충정리 -> 차후 계속 수정] (0) | 2017.06.23 |