2022. 12. 12. 16:00ㆍ리눅스
c 파일 컴파일 (gcc -s)
-> 어셈블리어 파일(.s)
->오브젝트 파일(.o) (cpu가 인식할 수 있도록 하는 바이너리 파일)
-> 실행 파일

<어셈블리어로 컴파일 하기>

<오브젝트 코드>
바이너리 인코딩
헥사(16진법)으로 formating 되어있음
문자기반의 명령어가 숫자명령어로 변환
*disaseembled: 바이너리 코드를 어셈블리 형태로 바꾸는 것
disassebler: 오브젝트 코드를 검사하는데 유용한 도구
어셈블리 코드로 변환시켜줌 -> objdump -d p 명령으로
.out(실행파일) 또는 .o(오브젝트 파일)에서 실행 가능
<어셈블리어>
1. movl Source,Dest : 소스에 저장된 값을 데스트로 이동하는 명령어
메모리에서 메모리 이동은 안됨
*피연산자 타입:- $표시: 상수 표시
<addresing modes >
%ecx : 레지스터 ecx반환 // R
(%ecx) : 레지스터ecx에 저장된 주소(예: 0x104)에 저장된 값을 반환 //Mem[Reg[R]]
8(%ebp) : %ebp레지스터 주소에 8만큼 더한 주소에 저장된 값을 반환
*10진수 -> 16진수 변환:
1) 10진수를 16으로 나눈다.
2) 몫과 나머지를 기록한다.
3) 몫이 0이 될때까지 위의 과정을 반복한다.
4) 나머지를 마지막꺼부터 순서대로 쓴다.

-> ecx 레지스터에 저장된 주소로 가서 거기 저장된 값을 eax 레지스터에 저장

-> eax 레지스터에 저장된 값을 edx 레지스터에 저장된 주소에 저장
<Indexed Aderessing Modes>
주소값 계산하는 방법 : D(Rb,Ri,S)-> Mem[Reg[Rb]+S*Reg[Ri]+ D]
//레지스터 Rb에 저장된 주소 + S* 레지스터 Ri에 저장된 주소 + D
* s 없으면 1로 취급
예) 0x8(%edx) //인자 하나면 %edx는 Rb->%edx에 저장된 주소+ 0x8

*레지스터에 주소가 아닌 값이 저장되어 있으면 값끼리 연산
2. leal Src, Dest
// Src: address mode 표현들 ->D(Rb,Ri,S)
//계산한 주소 Src를 Dest로 이동하는 명령어
3. 연산 명령어들

sall : Dest를 Src만큼 왼쪽으로 쉬프트 한 값을 Dest에 저장

<인텔/마이크로소프트와 GAS/GNU 포맷이 다르다>

'리눅스' 카테고리의 다른 글
| 어셈블리어-(3) (0) | 2022.12.12 |
|---|---|
| 어셈블리어 -(2) (0) | 2022.12.12 |
| (리눅스) Makefile (0) | 2022.11.29 |
| gdb 명령어 모음 (0) | 2022.11.28 |
| 디버깅 (0) | 2022.11.26 |