ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Assembly] 특정 메모리에 값을 쓰거나 읽기
    Programming/Assembly 2008. 11. 21. 10:15


    void Mm(int *, char);     // 첫번째 인자의 메모리주소에 두번째 char형을 write
    char Md(int *);            // 첫번째 인자의 메모리주소에 있는 char형 값을 리턴



    #include <stdio.h>

    void Mm(int *, char);      // Memory Modify func
    char Md(int *);            // Memory Display func


    int main()
    {
      char cTemp1;
      char cTemp2;

      Mm( (int *)0x0012FF00 , 'A' );       // 0x0012FF00  번지에 'A' set
      Mm( (int *)0x0012FF04 , 'B' );      // 0x0012FF04  번지에 'B' set

      cTemp1 = Md( (int *)0x0012FF00 );  // 0x0012FF00  번지에 있는 값 가져오기
      cTemp2 = Md( (int *)0x0012FF04 );  // 0x0012FF00  번지에 있는 값 가져오기

      return 0;
    }



    PUBLIC    _Mm  ; // Mm함수를 외부에서 사용할수있게 set
    PUBLIC    _Md  ; // 어셈블리는 함수이름앞에 _를 붙인다


    .386
    .MODEL    FLAT
    .CODE


    // Mm 정의   Memory Modify
    _Mm  PROC  NEAR32
        push  ebp
        mov  ebp, esp



        mov  eax, esp       ; // 스텍포인터의 이동을 위해 잠시 eax에 넣어둔다

        mov  esp, [ebp+8]   ; // 스텍포인터에 첫 번째 인자값 대입
        add  esp, 4         ; // 스텍포인터를 0x0012FF04로 옮긴후 
        push  [ebp+12]      ; // 두 번째 인자를 push 

        mov  esp, eax       ; // eax에 들어있던 원래 ESP의 값을 돌려놓는다
        


        mov  esp, ebp
        pop  ebp
        ret
    _Mm  ENDP




    // Md 정의   Memory Display
    _Md  PROC  NEAR32
        push  ebp
        mov  ebp, esp

        push  ebx            ; // ebx를 잠시쓰기위해 push
        mov  ebx, esp        ; // ESP를 ebx에 잠시 넣어놓는다 

        mov  esp, [ebp+8]    ; // 첫 번째 인자의 주소를 ESP에 대입
        mov  eax, [esp]      ; // 현재 스텍포인터가 가리키는곳을 eax에 넣는다(자동리턴)

        mov  esp, ebx        ; // 스텍포인터를 원래대로 돌려 놓는다
        pop  ebx             ; // 저장해놓았던 ebx값을 되돌려 놓는다

        

        mov  esp, ebp
        pop  ebp
        ret
    _Md  ENDP


    END




    댓글

Designed by Tistory.