3장. 기계어의 구성

  • 프로그램을 작성하고, 컴파일하면 실행파일로 만들어지고 이는 단순한 숫자 형태로 만들어진다. 이런 실행파일이나 이미 실행되어 메모리에 올라와 있는 실행 이미지를 분석하고자 할 때에는 이 숫자를 사람이 보다 이해하기 쉬운 형태인 어셈블리 언어 형태로 바꿔 볼때 사용하는 것이 디버거 또는 디스어셈블러 등이다.

 

  • 기계어 형식 => OP Code, Operand #1, Operand #2 ( Operand 수는 가변적 based on OP Code / operand #2 -> operand #1 으로 주로 조작이 이루어 진다. )

 

  • 명령어 표 보는 법 : m : Memory, r : Register

    • Imm8 : 8Bit - 1Byte
    • Imm16 : 16Bit - 2Byte
    • Imm32 : 32Bit - 4Byte
    • r/m32 : 범용 레지스터 또는 4Byte의 메모리
    • rel8 : 1Byte 사이즈 범위 내의 상대주소

      • JMP rel8 : 1Byte 사이즈 범위 내의 상대주소로 점프
      • CLL rel16 : 16비트 코드 실행 시에 2Byte의 사이즈 범위 내의 상대 주소로 함수 호출

 

  • 번지 지정 방식

    • 이미디어트( Immediate ) 번지 지정 방식

      • MOV EAX, 0x12345678 : EAX에 78 56 34 12 상수 값이 저장, 상수 값을 오퍼랜드로 사용
    • 레지스터 번지 지정 방식

      • MOV EAX, EBX

    • 직접 번지 지정 방식

      • MOV EAX, [0x12345678] : 0x12345678 에 있는 메모리 내용을 4bytes 읽어서 EAX에 저장
    • 레지스터 간접 번지 지정 방식

      • MOV EAX, [EBX] : EBX에 저장된 메모리 주소로 이동해서 메모리 내용을 4bytes 읽어서 EAX에 저장
    • 베이스 레지스터와 변위가 있는 레지스터 간접 번지 지정 방식

      • MOV EAX, [EBX + 0x4 ] : EBX가 base address로 하여 1 바이트 값을 취한다
    • 베이스 레지스터와 인덱스가 있는 레지스터 간접 전지 지정 방식

      • MOV EAX, [EBX + ECX * 2 ] : EBX - base address, BCX - index reg, 스케일 값 - 2
    • 베이스 레지스터와 인데스 그리고 변위가 있는 레지스터 간접 번지 지정 방식

      • MOV EAX, [EBX + ECX * 2 + 0x1234] : EBX - base address, BCX - index reg, 스케일 값 - 2

 


설정

트랙백

댓글