❗️출처: 하이애나 블로그
(특히 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
중간 용어정리
SP
:stack pointerDP
:data pointerrax
: 시스템콜의 실질적 번호, 함수의 결과(리턴)값이 담기는 레지스터rbx
: base register로 메모리 주소를 지정할 때 사용rcx
: 보통 반복문에 사용rdx
: 데이터 레지스터로 연산 수행할 때 rax와 많이 사용함rsi
: 메모리를 이동하거나 비교할 때 출발주소를 가리키는데 사용rdi
: 메모리를 이동하거나 비교할 때 목적지 주소를 가리키는데 사용rbp
: 함수 파라미터나 주소를 가리킬 때 사용rsp
: 중요함, stack의 삽입, 삭제 명령어에 의해 변경되는 스택의 가장 위를 가리키는 포인터rip
: 현재 명령 실행 주소3.4.4 pushing and popping stack
3.5 Arithmetic and Logical operation(산술, 논리 연산)
3.5.1 Load Effective Address
3.5.2 Unary and Binary Operations 단항 및 이항 연산
3.5.2 Shift Operations 쉬프트 연산
3.5.4 discussion
3.5.5 특수 산술 연산
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