# include <stdio.h>


int main(void) {

char vData[] = { 10, 2, 9, 12, 15, 20 };

char vSmall = vData[0];

char* prompt = "vSmall => %d\n";

__asm {

mov edi, 1;


Nj:

mov al, [vData + edi];

cmp vSmall, al;

jnl below_;

jl notBelow_;


below_:

mov vSmall, al;

jmp flowJ;


notBelow_:

jmp flowJ;


flowJ:

inc edi;

cmp edi, 6;

jne Nj;

je Sj;


Sj:

push         vSmall;

push         prompt;

call         dword ptr[printf];

pop ebx;

pop ebx;

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 크기 비교  (0) 2017.09.27
어셈블리 div  (0) 2017.09.26
어셈블리 배열 출력  (0) 2017.09.26
곱하기 어셈 문제  (0) 2017.09.24
jz ==> zero flag  (0) 2017.09.23

# include <stdio.h>


int main(void) {

char vData[] = { 10, 2, 9, 12, 15,20 };

char vSmall = 0;

char* prompt = "vSmall => %d\n";

__asm {

mov edi, 0;

Nj:

mov al, [vData + edi];

mov vSmall, al;

push vSmall;

push prompt;

call dword ptr[printf];

pop ebx;

pop ebx;

inc edi;

cmp edi, 6;

jne Nj;

je Sj;

Sj:

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 div  (0) 2017.09.26
어셈블리 최소값 추출  (0) 2017.09.26
곱하기 어셈 문제  (0) 2017.09.24
jz ==> zero flag  (0) 2017.09.23
대소관계  (0) 2017.09.23

http://119.201.123.184/30stair/area/area.php?pname=area


# include <stdio.h>


int main(void) {

int v1 = 0;

int v2 = 0;

int v3 = 0;

char* scanfPrompt = "%d %d";

char* printfPrompt = "%d x %d = %d\n";


__asm {

lea eax, v1; // eax = &v1;

lea ebx, v2; // ebx = &v2;


push ebx; // ( , ,&v2);

push eax; // ( ,&v1 ,&v2);

push scanfPrompt; // ("%d %d" ,&v1 ,&v2);

call dword ptr[scanf]; // scanf("%d %d" ,&v1 ,&v2);

pop ebx; // scanf("%d %d" ,&v1, );

pop ebx; // scanf("%d %d" ,  , );

pop ebx; // scanf( ,  , );


mov eax, v1; // eax = v1

imul v2; // eax *= v2

mov v3, eax; // v3 = eax


push v3; // ( , , ,v3);

push v2; // ( , ,v2 ,v3);

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

push printfPrompt; // (%d x %d = %d,v1 ,v2 ,v3);

call dword ptr[printf]; // printf(%d x %d = %d,v1 ,v2 ,v3);

pop ebx;

pop ebx;

pop ebx;

pop ebx;


xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 최소값 추출  (0) 2017.09.26
어셈블리 배열 출력  (0) 2017.09.26
jz ==> zero flag  (0) 2017.09.23
대소관계  (0) 2017.09.23
어셈블리 계산기(더하기, 빼기, 나누기, 곱하기)  (0) 2017.07.30

jz ==> zero flag

어셈블리2017. 9. 23. 22:49

// jz ==> zero flag

# include <stdio.h>


int main(void) {

int v1 = 10;

int v2 = 20;

char* zeroPrompt = "zero flag is zero \n";

char* zeroNPrompt = "zero flag is not zero \n";

__asm {

mov eax, v1; // eax = v1

mov ebx, v2; // ebx = v2

sub eax, ebx; // eax -= ebx

jz zeroJump; // if eax == 0 then zf == 0


zeroNPrompt:

push zeroNPrompt;

call dword ptr[printf];

pop ebx;

jmp End_;


zeroJump:

push zeroPrompt;

call dword ptr[printf];

pop ebx;

jmp End_;


End_:

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 배열 출력  (0) 2017.09.26
곱하기 어셈 문제  (0) 2017.09.24
대소관계  (0) 2017.09.23
어셈블리 계산기(더하기, 빼기, 나누기, 곱하기)  (0) 2017.07.30
hello world  (0) 2017.07.20

대소관계

어셈블리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;

}

}

'어셈블리' 카테고리의 다른 글

곱하기 어셈 문제  (0) 2017.09.24
jz ==> zero flag  (0) 2017.09.23
어셈블리 계산기(더하기, 빼기, 나누기, 곱하기)  (0) 2017.07.30
hello world  (0) 2017.07.20
인라인 어셈블리 계산기(사칙연산 완성)  (0) 2017.07.04

# include <stdio.h>

void _menu_(void)

{

char* addPrompt = "[1] addition \n";

char* subPrompt = "[2] subtraction \n";

char* mulPrompt = "[3] multiplication \n";

char* divPrompt = "[4] dividen \n";

__asm

{

push addPrompt;

call dword ptr[printf];

pop ebx;


push subPrompt;

call dword ptr[printf];

pop ebx;


push mulPrompt;

call dword ptr[printf];

pop ebx;


push divPrompt;

call dword ptr[printf];

pop ebx;

}

}

void _add_(int nParam1, int nParam2)

{

char* addPrompt = "%d + %d = %d \n";

__asm

{

mov eax, nParam1;

add eax, nParam2;

push eax;

push nParam2;

push nParam1;

push addPrompt;

call dword ptr[printf];

pop ebx;

pop ebx;

pop ebx;

pop ebx;

}

} // end of _add_ function


void _sub_(int nParam1, int nParam2)

{

char* subPrompt = "%d - %d = %d \n";

__asm

{

mov eax, nParam1;

sub eax, nParam2;

push eax;

push nParam2;

push nParam1;

push subPrompt;

call dword ptr[printf];

pop ebx;

pop ebx;

pop ebx;

pop ebx;

}

}


void _mul_(int nParam1, int nParam2)

{

char* mulPrompt = "%d x %d = %d \n";

__asm

{

mov eax, nParam1;

imul eax, nParam2;

push eax; // = %d 

push nParam2;

push nParam1;

push mulPrompt;

call dword ptr[printf];

pop ebx;

pop ebx;

pop ebx;

pop ebx;

}

}


void _div_(int nParam1, int nParam2)

{

int que = 0;

int rem = 0;

__asm

{

xor edx, edx;

mov eax, nParam1;

div nParam2;

mov rem, edx;

mov que, eax;

}

printf("remainder => %d\n", rem);

printf("queotiont => %d\n", que);

}

int main(void)

{

int v1 = 0;

int v2 = 0;

int nChoice = 0;

char* ScanfPrompt = "%d";

char* prompt1 = "v1 = ";

char* prompt2 = "v2 = ";

char* PrintF1 = "v1 => %d\n";

char* PrintF2 = "v2 => %d\n";

char* promptChoice = "Write = ";

__asm

{

call dword ptr[_menu_];

// "v1 = " ********************

push prompt1;

call dword ptr[printf];

pop ebx;

lea eax, v1;

push eax; // &v1

push ScanfPrompt; // "%d"

call dword ptr[scanf];

pop ebx;

pop ebx;


// "v2 = " ********************

push prompt2;

call dword ptr[printf];

pop ebx;


lea eax, v2;

push eax; // &v2

push ScanfPrompt; // "%d"

call dword ptr[scanf];

pop ebx;

pop ebx;


// choice

push promptChoice;

call dword ptr[printf];

pop ebx;


lea eax, nChoice; // &nChoice

push eax;

push ScanfPrompt; // "%d"

call dword ptr[scanf];

pop ebx;

pop ebx;


//

cmp nChoice, 0x1;

je addJump;

jne not_addJump;

addJump: 

push v2;

push v1;

call dword ptr[_add_];

pop ebx;

pop ebx;

jmp _EnD;

not_addJump:

cmp nChoice, 0x2; 

je subJump;

jne not_subJump;

subJump:

push v2;

push v1;

call dword ptr[_sub_];

pop ebx;

pop ebx;

jmp _EnD;

not_subJump:

cmp nChoice, 0x3;

je mulJump;

jne not_mulJump;

mulJump:

push v2;

push v1;

call dword ptr[_mul_];

pop ebx;

pop ebx;  

jmp _EnD;

not_mulJump:

push v2;

push v1;

call dword ptr[_div_];

pop ebx;

pop ebx;

jmp _EnD;

}

_EnD:

return 0;

}

'어셈블리' 카테고리의 다른 글

jz ==> zero flag  (0) 2017.09.23
대소관계  (0) 2017.09.23
hello world  (0) 2017.07.20
인라인 어셈블리 계산기(사칙연산 완성)  (0) 2017.07.04
nasm  (0) 2017.07.01

hello world

어셈블리2017. 7. 20. 20:04

section .text ; // .code 

global _start

_start:

mov edx, len

mov ecx, msg 

mov ebx, 1 ;file descriptor

mov eax, 4 ;system call number (sys_write)

int 0x80 ;call kernel


mov eax, 1

int 0x80 

section .data

msg db "Hello, world!", 0xa

len equ $ - msg  ;length of the string



'어셈블리' 카테고리의 다른 글

대소관계  (0) 2017.09.23
어셈블리 계산기(더하기, 빼기, 나누기, 곱하기)  (0) 2017.07.30
인라인 어셈블리 계산기(사칙연산 완성)  (0) 2017.07.04
nasm  (0) 2017.07.01
어셈블리어_TEST  (0) 2017.06.23

# 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

nasm

어셈블리2017. 7. 1. 17:03

section .text

    global _start


_start:

    mov edx, len ;message length

    mov ecx, msg ;message to write

    mov ebx, 1 ; file descriptor (stdout)

    mov eax, 4

    int 0x80 ; call kernel


    mov eax, 1

    int 0x80


section .data

    msg db "hello, world!", 0xa

    len equ $ - msg 

'어셈블리' 카테고리의 다른 글

hello world  (0) 2017.07.20
인라인 어셈블리 계산기(사칙연산 완성)  (0) 2017.07.04
어셈블리어_TEST  (0) 2017.06.23
어셈블리 step_3_mov [대충정리 -> 차후 계속 수정]  (0) 2017.06.23
어셈블리어 STEP_1  (0) 2017.06.23


결과가 0이면 ZERO 플래그는 1이 된다. 

결과가 0이 아니면 ZERO 플래그는 0 이 된다.