c 코드 파일 mstore.c
long mult2(long, long);
void multstore(long x, long y, long *dest) {
long t = mult2(x, y);
*dest = t;
}
GCC로 컴파일러를 실행한 어셈블리 코드 파일 mstore.s
multstore:
pushq %rbx // 레지스터 %rbx가 프로그램 스택에 push되어야 한다.
movq %rdx, %rbs
call mult2
movq %rax, (%rbx)
popq %rbx
ret
- 지역변수, 데이터 타입에 관한 모든 정보는 삭제되었다.
GCC가 코드를 컴파일하고 어셈블한 mstore.o
53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3
- 일련의 인스트럭션을 인코딩한 일련의 바이트이다.
역어셈블러를 통해 만든 코드
0: 53 push %rbx
1: 48 89 d3 mov %rdx,%rbx
4: e8 00 00 00 00 callq 9 <multstore+0x9>
9: 48 89 03 mov %rax, (%rbx)
c: 5b pop %rbx
d: c3 retq
- 기계어 코드와 역어셈블된 표현의 특징 (?)
- 인스트럭션들은 1 ~ 15 바이트 길이를 갖는다.
- 자주 사용되는 인스트럭션 혹은 오퍼랜드가 적은 것들이 짧은 길이를 갖는다.
- 반대의 경우는 좀 더 긴 인스트럭션 길이를 갖는다.
- 주어진 시작위치 에서부터 바이트들을 기계어 인스트럭션으로 유일하게 디코딩 가능하게 설계한다.
- 역어셈블러는 기계어 코드 파일의 바이트 순서에만 전적으로 의존해서 어셈블리 코드를 결정한다.
- 역어셈블러는 GCC가 생성한 어셈블리 코드와는 약간 다른 명명법을 인스트럭션에 사용한다.
- movq → mov, popq → pop
- call→callq, ret→retq
- 접미어 q는 크기를 나타낸다. 생략 가능하다.