GNU Assembler 메모.

Posted by Ho95

Assembly language 종류

1.GAS(GNU Assembler)

-GNU 프로젝트에서 사용된다.(Linux) ,AT&T 스타일

2.NASM(NetWide Assembler)

-인텔 x86용 어셈블러(Windows) ,intel 스타일

문법

1)레지스터(피연산자)는 %로 시작한다. 인텔스타일은 붙이지 않는다.

2)명령어 형식은 Source(출처) Destination(목적지)순으로 온다. 인텔 스타일은 목적지, 출처 순으로 온다.

1
ex) movl $4, %eax, 인텔은 movl eax, 4

3)명령어의 마지막 글자로 연산 크기를 결정 한다.

1
2
b(byte,8bit) w(word,16bit) l(long,32bit)
ex) movl $4, %eax, movw $4, %eax, movb $4, %eax

4)직접 값을 넣을려면 $를 붙힌다.

1
ex) movl $5, %eax

5)피연산자 앞에 아무것도 붙지 않으면 주소를 의미한다.

1
2
ex) movb $abc, %eax -> abc 값.
movb abc, %eax -> abc 주소에 있는 값.

6)인덱싱과 간접주소(indirection)는 괄호로 표시된다.

1
2
ex) testb $0x80, 7(%ebp) ->ebp가 가리키는 주소값으로부터 7번째
위치에 있는 바이트값의 최상위 비트를 테스트 함.

7)주석은 #으로 표시한다.

1
ex) movb $5, %eax # 5를 eax에 할당한다.

8)데이터 형정의는 .long, .int, .byte, .ascii, .string등을 사용

어셈블리어 코드 작성 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#텍스트 세그먼트 시작 (어셈블리어 코드 시작)

.section .text (섹션은 변수들 선언)

var1: #정수 40

.int 40

var2:

.string “Hello World!\n” #문자열

.globl _start

#프로그램 진입점 (실제 시작 되는 부분.)

_start:

#시스템 호출을 위한 코드 번호 지정

movl $1, %eax

#반환값

movl $2, %ebx

#운영체제 호출 (리눅스에서 쓰이는 종료 콜)

int $0x80

끝~