2014-04-04 1 views
0

미래에 언젠가 컴파일러 나 JIT 컴파일러를 쓰고 싶기 때문에 x86 (-64) 기계 코드를 배우려고합니다. 나는 잠시 동안 어셈블리를 작성 했으므로이 맹인으로 가지 않을 것입니다. 단지 상당히 복잡한 것 같아서 x86 명령어 인코딩/형식을 배우려고합니다. 필자는 테이블을보고 기사와 자료를 읽었습니다 (인텔 매뉴얼 중 일부는 읽었습니다).누군가이 기계 코드에 주석을 달 수 있습니까?

그래서 나는 이해하기 시작했습니다. 그래서 나는 기본 명령 세트와 그 결과 기계 코드를 분해하려고 결심했습니다. 이 코드는 (리눅스/POSIX) syscall (sys_exit)을 만들기 때문에 테스트가 쉽다는 생각이 들었습니다.

mov rax, 60 
mov rdi, 0 
syscall 

내가 NASM과 함께이 조립 :

nasm test.asm -fbin 

나는 그래서 출력 원시 이진 내가 쉽게 검사 할 수있는 것 -fbin을 사용 여기 x86-64에 코드입니다.

다음 바이트 시리즈

그것은 출력 :

0xB8 0x3C 0x00 0x00 0x00 0xBF 0x00 0x00 0x00 0x00 0x0F 0x05 

나는 몇 친구들이 각 바이트 수단, 우리는 다음과 같은 생각을 찾아이 해부하려고했습니다 :

  • 0xB8 인 먼저 mov 명령.
  • 0x3C (60)은 rax로 이동 된 첫 번째 인수입니다.
  • 0x00은 rax를 의미합니까? (이것은 우리가 어렴풋이되는 곳이다)
  • 다음 두 0x00은 방금 과다한 출력이다. 의 xD
  • 0xBF, 다음 mov
  • 0x00는 첫 번째 인수입니다 나머지 0x00
  • 0x0F 콜에
  • 단서 0?
  • 0x05 우둔한.

저는 초심자이며 (분명히)이 기계 코드를 해부하는 데 도움을 주실 것입니다. 어떤 도움이 크게 이해 될 것입니다 이해가 많이 x86 명령어 형식 이해에 도움이 될 것입니다 미리 감사드립니다!

편집 : 레지스터가 명령어 opcode로 지정 될 가능성이 있습니까?

답변

1

나는 전문가가 아니지만, 참조로 http://ref.x86asm.net/coder64.html#x05을 가지고, 나는 다음과 같은 설명을 함께 넣어 :

0xB8 - first mov 
0x3C 0x00 0x00 0x00 - 32bit argument (60), little endian byte order 
0xBF - second mov 
0x00 0x00 0x00 0x00 - 32bit argument (0) 
0x0F - 0x0F instruction prefix 
0x05 - syscall in the "0x0F space" 

그리고 그래, 옵 코드 바이트 값이 레지스터와 인수의 형태에 따라 변경합니다. movs 및 jmps의 일부 유형에는 0x0F 접두사가 필요합니다.

+0

답변 해 주셔서 감사합니다. 그 말은 많은 의미가 있습니다. 저는 32 비트 인수에 대해 생각하지 않았습니다 ... 레지스터가 opcode와 쌍을 이루는 것을 의미합니까? 좀 더 살펴볼 것입니다. 도움 m8 다시 주셔서 감사합니다. – APott

+0

x86 디자인 자체는 시작하기에 꽤 혼란 스럽습니다.내가 올바르게 기억한다면, 인텔의 문서는 인수 코드를 설명 할 때 매우 뛰어 났고 인수 유형을 지정할 때 다루어야 할 모든 문제를 설명했다. ref.x86asm.net의 종류는 이미 모든 것을 알고 있다고 가정합니다. – Ivarpoiss

+0

오, 알겠습니다 ... 고마워요. 테이블에서 추가 검사를 수행하면 opcode가 작동하는 레지스터가 지정되어 많은 도움이됩니다. 도움에 다시 한번 감사드립니다. – APott