본문 바로가기

Reverse Engineering/Reversing 이론 설명

[MASM] 어셈블리 언어(MASM)의 기초

  이제 NASM에서 벗어나, MASM으로 들어간다. 문법적 차이는 존재하지만 그렇게 큰 차이는 존재하지 않는다. NASM의 경우 []를 제외한 특수기호가 안 쓰이지만, MASM은 그 규제가 유연하다.

  또한 주소지정 방식에서 차이를 보인다.

 NASM MASM 
● 데이터 저장 時
mov ax, [data]

● 주소 지정 時
mov ax, data
● 데이터 저장 時
mov ax, data

● 주소 지정 時
mov ax, offset data 

  이번 공부는 '09.07.15 당시 한국항공대학교 재학중이던 배건규의 자료를 참고한다. 쩝... 어셈블리 책 하나 사야겠다... 돈이 깨지는 소리가 들리는 군하;;



1. 어셈블리 언어의 기본적인 구성요소

● 산술 연산 우선순위(Precedence) : 수식이 두 개 이상의 연산자를 포함시 연산의 순서

 연산자  이름  우선순위
 ( )   괄호   1 
 +, -  단항 플러스, 마이너스  2
 *, /  곱셉, 나눗셈  3
 MOD  나눔자  4
 +, -  덧셈, 뺄셈  5

● 데이터 표현
  - 정수 상수 [sign] digits[radix]
     h : hexadecimal
     b : binary
     q/o : Octal
 - 실수 상수 [sign]integer.[integer][exponent]

● 문자 상수 : 2진 ASCII 코드로 변환해서 사용

예약어 (Reversed Word)
 - 인텔 프로세서에 의해 실행되는 명령어 니모닉(MOV, ADD, etc)
 - 수식에 사용되는 연산자들
 - BYTE or WORD 같이 변수나 피연산자의 크기나 사용처를 알려주는 속성들
 - MASM에게 어떻게 프로그램을 해야하는지 알려주는 디렉티브

● 식별자(Identifier)
 - 프로그래머가 선택한 이름
 - 1 ~ 247사이의 문자가 가능
 - MASM은 대문자와 소문자를 구별하지 않는다.
 - 첫 번째 문자는 알파벳 중 하나 이거나 _, @, $ 이어야 한다.
 - 예약어를 사용해서는 안된다.

디렉티브(Directive) 
 - 프로그램의 소스 코드를 어셈블링할 때 어셈블러가 인식하고 활용하는 명령어
 - 논리 세그먼트를 정의하거나 메모리 모델을 선택하거나 프로시저를 만들거나 변수정의 시
   사용
 - 디렉티브는 어셈블러 구문으로서 인텔 명령어 집합과는 관계가 없다.

2. 데이터 정의

● 고유의 데이터 타입
 - BYTE : 8비트 부호가 없는 정수
 - SBYTE : 8비트 부호가 있는 정수
 - WORD : 16비트 부호가 없는 정수
 - SWORD : 16비트 부호가 있는 정수
 - DWORD : 32비트 부호가 없는 정수
 - SDWROD : 32비트 부호가 있는 정수
 - FWORD : 48비트 정수(보호 모드에서 Far 포인터)
 - QWORD : 64비트 정수
 - TBYTE : 80비트(10바이트) 정수
 - REAL4 : 32비트(4바이트) IEEE 짧은 실수
 - REAL8 : 64비트(8바이트) IEEE 긴 실수
 - REAL10 : 80비트(10바이트) IEEE 확장 실수

리틀-엔디언(Little-Endian) 순서
 - Intel CPU 아키텍처는 리틀 엔디언 방식을 따른다.
 - 변수의 가장 낮은 유효 바이트가 가장 낮은 주소에 저장되고, 나머지는 다음의 연속적인 메모리 위치에 저장.

cf) 0x12345678h의 경우
78h        56h        34h        12h 순서대로 저장된다.

ps. 너무 복습하는 기분이다...;; 근데 저 FWORD, TBYTE, REAL 시리즈는 처음본다...