1. 데이터 형식



어셈블리어에서는 데이터 타입에 따라 접미사를 달리한다.

인텔 프로세서가 근본적으로 16비트 구조를 사용하다 32비트로 확장했기 때문에

16비트 데이터 타입을 워드라고 칭한다.

이를 기본으로 32비트는 더블 워드, 64비트는 쿼드 워드로 부르고,

8, 16, 32, 64비트를 어셈블리어 접미사로 각각 b, w, l, q로 표시한다.


C 선언

Intel 데이터 타입

어셈블리어 접미사

사이즈(바이트)

char

Byte

b

1

short

Word

w

2

int

Double word

l

4

long

Quad word

q

8

char *

Quad word

q

8

float

Single precision

s

4

double

Double precision

l

8


ex) mov instruction은 접미사에 따라서

movb, movw, movl, movq의 네 개의 유형으로 구분 가능.



2. 정수 레지스터


x86-64 CPU는 64비트 값의 저장이 가능한 16개의 범용 레지스터를 보유하고 있고,

이들 레지스터는 정수 데이터와 포인터를 저장하는 데 사용한다.



1, 2, 4, 8바이트의 레지스터 값을 가리키고 싶을 때 사용하는 이름이 다른데,

1바이트의 경우 %a1에서 %r15b까지,

2바이트의 경우 %ax에서 %r15w까지,

4바이트의 경우 %eax에서 %r15d까지,

8바이트의 경우 %rax에서 %r15까지의 이름을 사용한다.

보면 %r1에서 %r15까지의 이름 뒤에 원하는 바이트 만큼의 어셈블리어 접미사가 붙는 것을 확인할 수 있다.


1, 2, 4, 8바이트의 값을 복사하고 생성하는 인스트럭션이 있는데,

1 또는 2바이트를 생성하는 경우 8바이트의 나머지 값들은 변경 없이 유지되고

4바이트를 생성하는 경우 8바이트의 상위 4바이트의 값이 0으로 설정된다.


가장 특이한 레지스터는 %rsp(스택 포인터)로, 스택의 끝 부분을 가리킬 때 사용된다.

나머지 15개의 레지스터는 비교적 사용이 자유롭지만, programming convention이 존재한다.


각 레지스터의 관례적 쓰임은 다음 그림과 같다.



3. 오퍼랜드의 형식


오퍼랜드는 연산 수행에 필요한 sourcedestination의 위치를 명시한다.


오퍼랜드에는 3가지 종류가 있다.

1) Immediate: 상수 값을 의미한다.

ex) $38, $0x19


Type

어셈블리어 표기 방식

의미하는 값

Imm

$Imm

Imm


2) Register: 레지스터의 내용을 나타낸다.


Type

어셈블리어 표기 방식

의미하는 값

Reg

r_a

R[r_a]


3) Memory 참조: 계산된 주소에 의해 메모리 위치에 접근한다.


Type

어셈블리어 표기 방식

의미하는 값

Mem

Imm

M[Imm]

Mem

(r_a)

M[R[r_a]]

Mem

Imm(r_b)

M[Imm+R[r_b]]

Mem

(r_b, r_i)

M[R[r_b]+R[r_i]]

Mem

Imm(r_b, r_i)

M[Imm+R[r_b]+R[r_i]]

Mem

(, r_i, s)

M[R[r_i] · s]

Mem

Imm(, r_i, s)

M[Imm+R[r_i] · s]

Mem

(r_b, r_i, s)

M[R[r_b]+R[r_i] · s]

Mem

Imm(r_b, r_i, s)

M[Imm+R[r_b]+R[r_i] · s]



사실 기억하면 되는 건 맨 마지막 행이다. 나머지는 모두 마지막 행의 일반적인 행의 변형이므로..

Imm는 offset, r_b는 베이스 레지스터, r_i는 인덱스 레지스터, s는 scale factor를 의미한다.



4. 출처


  • 레지스터 그림: http://condor.depaul.edu/slytinen/406/ch3_part1.html