본문 바로가기

바이러스개발을위한어셈블리어

어셈블리어 문법

※이 글은 철저히 INTEL cpu에서 사용하는 어셈블리어를 기준으로 서술한 글입니다!!

 

원래는 처음에 문법을 서술하는게 맞지만, 이건 너무 어려워서 코드를 보고봐야 이해할 수 있을것 같다.

(물론 이거 내 기준)

 

코드 한줄을 보고 시작하자.

mov rax, 1

어셈블리어는 코드를 

opcode operand1, operand2로 서술할 수 있다.

 

여기서 opcode는 연산자를 의미하고(더하기 빼기 나누기 곱하기)

operand는 연산을 당하는 피연산자를 의미한다.

(3+5에서 '+'가 연산자/ '3', '5'가 피연산자)

 

그러니까 여기서 opcode는 mov이고

operand는 rax와 1이 된다.

 

rax는 후문에 서술할 레지스터 중 1개이다.

 

여기까지는 INTEL이나 AT&T 둘다 똑같다.(아마..?)

그런데 해석하는 방식에서 차이가 있다.

 

INTEL방식은 operand2가 operand1에 대해 opcode를 수행하는 것이고

AT&T방식은 INTEL 방식의 정반대 방식이라고 볼 수 있다.

 

또한 레지스터와 숫자를 표기하는 방식에서의 차이도 있다.

INTEL: 레지스터와 숫자에 별도의 기호를 붙이지 않음.

AT&T: 레지스터 앞에는 '%'를, 숫자 앞에는 '$'를 붙인다.


레지스터(REGISTER)

 

와 드디어 가장 중요한것 나온다!

접대하는 사람도 아니다. 너네가 생각하는 전류에서의 저항(registor)도 아니다. 

 

여기서 레지스터는 cpu내의 작은 저장공간을 의미한다.

바보같겠지만 난 처음 어셈블리어 시작했을때 레지스터가 저항을 의미하는줄 알았다. ??: 저항에 값을 저장한다고?

실제로 바보이기도 하지만.....ㅠ

 

저장공간의 속도를 보자면

레지스터>캐시(여기까지는 cpu내 저장공간)>메모리(너네가 아는 RAM , 주기억장치)>외부기억장치

순으로 빠르다.(빠를수록 저장공간이 작다.)

 

주로 쓰는 레지스터를 보도록 하자.

 

범용 레지스터: (?)ax, (?)bx, (?)cx, (?)dx

원래 ax, bx, cx, dx는 16bit cpu에서 사용하던 레지스터 인데

32bit 짜리가 등장하면서 앞에 e를 붙여 표현하고

64bit에는 r을 붙여서 표현한다.

참고로 32bit에서는 rax, rbx등의 레지스터를 사용하면 안된다.

 

주소지정 레지스터: edi(extended destination index), esi(extended source index)

 

프로그램 카운터: eip

스택 포인터: esp

스택 프레임 베이스 포인터: ebp

 


opcode

 

opcode의 정의는 위에서 서술했으니 생략하도록 하겠다.

 

opcode로 자주쓰이는 몇가지를 서술해보도록 하겠다.

 

mov: operand2의 인자를 operand1으로 옮기는 것.

add: operand2의 인자와 operand1의 인자를 더하는것

sub: operand2의 인자에서 operand1의 인자를 빼는것

push: stack에 값을 넣는것

pop: stack에 있는 값을 빼는것

푸쉬 팝을 같이 쓰면...? 사탕이름같군

 

lea: operand2의 주소를 넣는것

참고로 operand2의 주소를 표시할때는 [operand2] 이런 식으로 표시한다.


 

나의 부족한 상식과 지식으로 인해 글은 여기까지 쓰는게 내 한계인듯 하다..

다음에 더 알게된 사실이 있다면 블로그에 보충해서 넣도록 해보겠다.

안녕!

 

출처: 아이돌라운지

그냥 조이가 너무 예뻐서 넣어보았다.