2014-04-12 5 views
1

안녕하세요 나는 다음과 같은 86-조립 있습니다이해 육각 옵 코드

8048062: 31 c0     xor eax,eax 
8048064: 89 d8     mov eax,ebx 
8048066: b8 01 00 00 00   mov eax,0x1 
804806B: cd 80     int 0x80 

내가 진수-op 코드를 이해하고자합니다. 나는 b889이 mov 인 지침 인 here을 읽었습니다. 그러나 89 d8의 두 번째 부분을 이해하지 못합니다. d8은 무엇입니까? d8 eax 및 ebx입니까? 그래서 d는 eax이고 8은 ebx입니까? 하지만 왜 1 행 eax이고 eax == c0입니까? 그리고 어디 라인 3에 b8 01 00 00 00 등록되어 있습니까?

왜 다음 줄이 맞습니까?

8048066: b8 01 00 00 00   mov eax,0x1 

왜 안 :

b8 00 00 00 01 ? 

EAX가로 나뉩니다

eax 32bit 
ax 16 bit 
ah 8bit 
al 4bit 

왜 올바른 b8 01 00 00 00하지 b8 00 00 00 01입니까? "리틀 엔디 언"의 원인?

내가 "mov al, 0x1"을 사용할 때 헥스 연산 코드는 단지 b8 01 입니다. 나는 조금 혼란 스럽다.

난 당신이 날 도울 수 있기를 바랍니다 :)

+2

Intel 사이트에서 x86 설명서를 다운로드하십시오. 이러한 질문에 대한 포괄적 인 대답은 SO 게시물에 비해 너무 광범위합니다. –

+0

_ "왜 b8 01 00 00 00이 맞고'b8 00 00 00 01'이 아닌가?"_ x86 프로세서는 리틀 엔디안이고 32 비트 값 1의 리틀 엔디안 표현은 '01 00 00 00'. 회신을 위해 – Michael

+0

thx michael. 그래서 나는 옳은 것 같았다. 그런데 왜 opcode 매개 변수 사이에 차이점이 있습니까? @ 500-InternalServerError 읽었지만 이해하지 못했습니다. 이 SIB/MODRM 일 것임 : S – Shibumi

답변

4

는 D8의 EAX와 EBX인가?

예.

so d는 eax이고 8은 ebx입니까? 다르게 sandpile.org/x86/opc_rm

d8 = 11 011 000 
    11   = both operands are registers 
     011  = the 'r' operand is ebx 
      000 = the 'rm' operand is eax 

mov r32, imm32 작품에서 볼 수

번호는 대상 레지스터 여기 000 그래서 eax 옵 코드의 하위 3 비트이며, 더 복잡. 설명서에서 해당 인코딩 유형은 opcode 다음에 + 기호로 쓰여집니다 (예 : B8+rd id).

이것은 모두 설명서에 설명되어 있습니다.

+0

고마워요. . 이것은 내가 찾고있는 설명이다. – Shibumi