main 함수의 인자



-int main();

-int main( int argc, char *argv[ ] );


주소냐 메모리냐 구분만 잘해주면 된다.


  #> ./a.out hello

  hello

      * 위 내용은 hello라는 인자를 받아서 그 인자의 내용인 hello를 출력하는 프로그램이다.


  - 포인터 배열 사용

  - 포인터 배열: 배열인데 주소를 원소로 하는

  - 배열 포인터: 포인터인데 배열을 나타내는



* int argc 인자의 경우 argument의 갯수를 나타낸다.

* 실행 프로그램의 이름도 argument로 친다. ( 첫번째 인자 )

* char *argv[]의 시작 주소를 가져올때는 [ebp+12] 위치에서 가져온다.



먼저 C 언어로 확인해 보면


1).인자가 없는 경우


int main( int argc, char *argv[] )

{

   printf("argc: %d\n", argc);  // 인자의 개수, 최소는 arg1, null 이다

   printf("argv: 0x%08x\n", argv);  // argv의 주소

   printf("*argv: 0x%08x\n", *argv);  // 주소의 메모리 호출 거기에도 주소가 들어있음.   [argv]

   printf("*argv[]: %c\n", **argv);  // 메모리의 첫번째 문자  [[argv]] 

   printf("*argv[]: %s\n", argv[0]); // 첫번째 인자의 메모리. 문자열을 출력한다

   printf("%s\n", argv[1]);  // 두번째 인자의 문자열을 호출

   return 0;

}






어셈블리


extern printf


segment         .data

prompt_hex      db      'address:0x%08x',10,00

prompt_chr      db      'memory: %c',10,00

prompt_int      db      'argc: %d',10,00


segment         .text

global  main


main:


        push    ebp

        mov     ebp,    esp


        push    dword [ebp+8]

        push    prompt_int

        call    printf

        add     esp,    8



        mov     eax,    [ebp+12]

        push    eax

        push    prompt_hex

        call    printf

        add     esp,    8


        mov     eax,    [ebp+12]

        mov     ebx,    [eax]

        push    ebx

        push    prompt_hex

        call    printf

        add     esp,    8


        mov     eax,    [ebp+12]

        mov     ebx,    [eax]

        mov     ecx,    [ebx]

        push    ecx

        push    prompt_chr

        call    printf

        add     esp,    8


        xor     eax,    eax


        leave

        ret



문자를 넘겨줄때는 주소를 넘겨줘야 %s로 온전히 출력이 가능하다



   push    ebp

        mov     ebp,    esp


        push    dword [ebp+8]

        push    prompt_int

        call    printf

        add     esp,    8


[ebp + 8] 에는 argc 값이 들어 있다. 

따라서 printf 하면 argc 값이 들어가 있을것이다



   mov     eax,    [ebp+12]

        push    eax

        push    prompt_hex

        call    printf

        add     esp,    8


[ebp+12] 에는 argv 의 주소 값이 들어가 있다

따라서 printf 하면 argv의 주소 값이 출력된다




   mov     eax,    [ebp+12]

        mov     ebx,    [eax]

        push    ebx

        push    prompt_hex

        call    printf

        add     esp,    8



[ebp+12] 에 한번더 [] 를 씌우면 그 주소가 나타내는 포인터 배열이 한번더 출력된다  그 값은 주소 값이다




mov     eax,    [ebp+12]

        mov     ebx,    [eax]

        mov     ecx,    [ebx]

        push    ecx

        push    prompt_chr

        call    printf

        add     esp,    8



[[[ebp+12]]]  이렇게 되면 이제 메모리 값이 출력된다

그 값은 인자의 첫번째 글자 일것이다.


 









+ Recent posts