분기 opcode는 무엇을 의미합니까(X86 아키텍처)?

분기 opcode는 무엇을 의미합니까(X86 아키텍처)?

컴파일한 다음 추출된 텍스트 코드를 사용하는 간단한 C 코드가 있습니다.객체 덤프유용. 다음은 덤프 파일입니다(덤프 파일의 일부).

0804841b <main>:
 804841b:   8d 4c 24 04             lea    0x4(%esp),%ecx
 804841f:   83 e4 f0                and    $0xfffffff0,%esp
 8048422:   ff 71 fc                pushl  -0x4(%ecx)
 8048425:   55                      push   %ebp
 8048426:   89 e5                   mov    %esp,%ebp
 8048428:   51                      push   %ecx
 8048429:   83 ec 14                sub    $0x14,%esp
 804842c:   c7 45 f0 00 00 00 00    movl   $0x0,-0x10(%ebp)
 8048433:   c7 45 f4 0a 00 00 00    movl   $0xa,-0xc(%ebp)
 804843a:   8b 45 f4                mov    -0xc(%ebp),%eax
 804843d:   01 45 f0                add    %eax,-0x10(%ebp)
 8048440:   8b 45 f0                mov    -0x10(%ebp),%eax
 8048443:   3b 45 f4                cmp    -0xc(%ebp),%eax

 8048446:   7e 0f                   jle    8048457 <main+0x3c>

 8048448:   83 ec 0c                sub    $0xc,%esp
 804844b:   6a 78                   push   $0x78
 804844d:   e8 be fe ff ff          call   8048310 <putchar@plt>
 8048452:   83 c4 10                add    $0x10,%esp
 8048455:   eb 15                   jmp    804846c <main+0x51>
 8048457:   8b 45 f4                mov    -0xc(%ebp),%eax
 804845a:   3b 45 f0                cmp    -0x10(%ebp),%eax
 804845d:   7e 0d                   jle    804846c <main+0x51>

주소의 명령어 는 기계어가 포함된 명령어 8048446입니다 .jle 8048457 <main+0x3c>7e 0f

<main+0x3c>명령문은 기본 주소에서 이동된 대상 명령어의 위치를 ​​나타냅니다. 즉, 3c는 60과 같습니다. 이는 기본 주소에서 60바이트 후에 명령어가

8048457:   8b 45 f4                mov    -0xc(%ebp),%eax

눕다. 주소 7e 8048446에 있는 명령어의 기계어 코드 7e 0f
는 jle의 기계어 코드입니다.0f란 무엇인가요?

다음과 같은 다른 분기 명령에서는:

 8048455:   eb 15                   jmp    804846c <main+0x51>

15은 무슨 뜻인가요?

답변1

Intel CPU 아키텍처에는 절대 점프/코드 분기와 상대 점프가 있습니다.

우리에게 보여주고 있는 것은 상대 피연산자 opcode 점프입니다. 역사적으로 코드 크기를 절약하는 데 사용되었습니다.

0f가 뭐냐고 물으면 현재 PC로 점프한다는 뜻현재 명령이 끝나면+0f를 실행 중입니다. 따라서 8048448+0f = 8048457이므로 어셈블리 목록에 표시됩니다 jle 8048457(jle은 작거나 같으면 점프를 의미함).

마찬가지로 8048457+15 = 804846c이므로jmp 804846c

모든 값과 수학은 16진수로 되어 있습니다.

또한 추가 참고 사항으로 상대 점프 연산 코드의 피연산자는 일반적으로 서명됩니다. 이 두 가지 예에서는 앞으로만 점프하지만 이전 위치로 점프할 수도 있습니다.

관련 정보