본문 바로가기
코스웨어/13년 스마트컨트롤러

9월 25일 어셈블리 - 석주원

by 알 수 없는 사용자 2013. 9. 25.
728x90
반응형


추가된 프로시저 


; 반환값이 unsigned char인 프로시져 : 인수로 받은 주소값의 메모리 상태를 보여주는 Memory Display 기능

_MD PROC NEAR32


PUSH EBP ; Entry Code

MOV EBP, ESP


MOV EBX, [EBP+8]

MOV EAX, [EBX]


MOV ESP, EBP ; Exit Code

POP EBP

RET


_MD ENDP


; 메모리 수정 프로시져 : 인수로 받은 주소에다 인수로 받은 값을 삽입하는 기능

_MM PROC NEAR32


PUSH EBP ; Entry Code

MOV EBP, ESP


MOV EBX, [EBP+12] ; char(뒤의 인수부터 스택에 삽입됨)

MOV EAX, [EBP+8] ; int


MOV BYTE PTR [EAX], BL ; 주소값은 4바이트라서?[AL]안됨


MOV ESP, EBP ; Exit Code

POP EBP

RET


_MM ENDP

 






 인수로 받은 바이트 수 만큼 출력하는 hexaview 함수

void hexaview(unsigned char *RData, unsigned int iSize)
{
  unsigned char *ucP = RData;
  int iCnt, iLoop;
  int iBytes = iSize;    // 입력받은 바이트수
  int prtCnt = 0;      // 출력한 문자수를 세는 변수
  int iMax = 16;      // 아스키 코드도 입력된 바이트 수만큼만
              // 출력되도록 제한하는 변수

  printf("-------------------------------------"
   "------------------------------------\n");
  printf("ADDRESS\t\t\t   HEXA\t\t\t\t   ASCII\n");
  printf("\n\t ");
  for (iCnt = 0; iCnt < 16; iCnt++)
    printf("%02X ", iCnt);
  putchar('\n');
  printf("-------------------------------------"
   "------------------------------------\n");
  
  if(0 == iSize%16)
    iSize = iSize/16;
  else
    iSize = (iSize/16) + 1;
    
  for (iLoop = 0; iLoop < iSize; iLoop++)
  {
    // 주소출력
    printf("%08X ", ucP+iCnt);
    
    // 16진수 출력
    for (iCnt = 0; iCnt < 16; iCnt++)
    {
      if (iBytes == prtCnt)
      {
        printf("   ");
      }
      else
      {
        printf("%02X ", MD((int)(ucP + iCnt)));
        prtCnt++;
      }
    }
    
    // 호출시 입력한 바이트 수만큼 출력했을 경우 아스키 문자도 출력제한
    if (iBytes == prtCnt)
    {
      iMax = iBytes%16;
    }

    // 아스키코드 출력
    for (iCnt = 0; iCnt < iMax; iCnt++)
    {
      if (0 == *(ucP+iCnt))
        printf(".");
      else if (32 > *(ucP+iCnt))
        printf(".");
      else if (127 < *(ucP+iCnt))
        printf(".");
      else
        printf("%c", MD((int)ucP + iCnt));
      
    }
    
    putchar('\n');
    ucP += iCnt;
    //lines += iCnt;
    }

} 





< 출력화면 >


728x90