❗️출처: 하이애나 블로그
(특히 3.4 3.7 3.8 잘 읽으라고 함)
185
쪽 ~ 364
쪽3.2 프로그램의 인코딩
gcc -0g -o p p1.c p2.c
3.2.1 machine level code
3.2.2코드 예제
mstore.c
long mult2(long,long);
void multstore(long x, long y, long *dest) {
long t = mult2(x,y)
*dest = t;
}
gcc로 하여금 컴파일러를 실행하도록 해서 어셈블리파일 위의 mstore.s로 만든다
*gcc -Og —S instore. c*
mulstore:
pushq %rbx
movq %rdx, %rbd
call %mult2
movq %rax, (%rbx)
popq %rbx
ret
위의 assembly language의 각 라인 하나는 machine instruction에 대응됨
아래와 같은 커맨드로 직접 볼 수 없는 object code 파일, mstore.o로 만든다
linux> *gcc -Og -c mstore.c*
53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3
위와같은 파일은, 무슨내용인지 알 수없다. 따라서… 역어셈블러라는 프로그램을 돌려야한다. OBJDUMP(object dump)를 아래와 같은 코드로 수행 가능
*objdump -d instore. o*
위와같이 역어셈블된 모습을 볼 수 있다
역어셈블러는 GCC가 생성한 어셈블리 코드와는 약간 다른 명명법을 인스트럭션에 사용함
3.2.3 Note on Formatting
다음 명령을 실행하면 mstore.s를 생성한다
gcc -0g -S mstore.c
.file "010-mstore.c"
.text
.globl multstore
.type multstore, @function
multstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret
.size multstore, .-multstore
.ident "GCC: (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1"
.section .note.GNU-stack,"",@progbits
쩜으로(.) 시작하는 모든 라인은 어셈블러와 링커들을 guiding하기위한 지시어이며, 보통 무시함
void multstore(long x, long y, long *dest)
x in %rdi, y in %rsi, dest in %rdx
1 multstore:
2 pushq %rbx Save %rbx
3 movq %rdx, %rbx Copy dest to %rbx
4 call mult2 Call mult2(x, y)
5 movq %rax, (%rbx) Store result at *dest
6 popq %rbx Restore %rbx
7 ret Return
어셈블리 코드를 C프로그램과 연동하는 방법
3.3 Data Format
인텔프로세서 - 보통 16비트구조, 나중에는 32비트로 확장했음
인텔은 워드라는 단어를 16비트 데이터 타입을 말할 때 사용한다.
3.4 Accessing information
cpu는 16개의 general-purpose register를 보유함
16개의 레지스터는 integer data와 pointer를 저장하는 데 사용됨
맨 왼쪽열의 %r**, %r**들은 모두 %r로 시작되었지만, 진화하면서 계속 이름 바뀌고 확장됨
(위그림에서의 16개의)서로다른 레지스터들은 서로 다른 목적으로 사용됨
3.4.1 Operand Specifiers
immediate
상수값을 말한다
ATT형식의 어셈블리 코드에서, $다음 (C스타일의) 정수를 붙임
ex) $-577, $0x1F 등
register
레지스터의 내용을 나타냄
16개의(64비트, 32비트, 16비트, 8비트)레지스터의 하위 일부분(8바이트, 4바이트, 2바이트, 1바이트)를 가르킴
memory reference
위에서 설명한 3가지Operand
3.4.2 Data Movement Instructions
가장~ 많이 사용되는 인스트럭션은 데이터를 한 위치에서 다른 위치로 복사하는 명령
MOV 클래스
movb
, movw
, movl
, movq
네개로 구성
대부분의 경우 MOV instruction들은 지정된 위치만 업데이트함
아래와 같은 다섯가지 가능한 조합의 소스,
Zero-extending data movement
Sign-extending data movement instructions
중간 용어정리
3.4.4 pushing and popping stack
3.5 Arithmetic and Logical operation(산술, 논리 연산)
3.6 제어문
3.7 Procedures
3.8 배열의 할당과 접근
3.9 Heterogeneous Data Structures
3.10 Combining Control and Data in Machine-Level Programs
3.11 Floating point code
3.12 Summary