※이 글은 철저히 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] 이런 식으로 표시한다.
나의 부족한 상식과 지식으로 인해 글은 여기까지 쓰는게 내 한계인듯 하다..
다음에 더 알게된 사실이 있다면 블로그에 보충해서 넣도록 해보겠다.
안녕!

그냥 조이가 너무 예뻐서 넣어보았다.
'바이러스개발을위한어셈블리어' 카테고리의 다른 글
어셈블리어로 사칙연산하기 (0) | 2022.07.24 |
---|---|
칼리리눅스 어셈블리어 코드 작성 (0) | 2022.04.17 |
어셈블리어 기본 (1) | 2021.12.26 |