컴파일한 다음 추출된 텍스트 코드를 사용하는 간단한 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진수로 되어 있습니다.
또한 추가 참고 사항으로 상대 점프 연산 코드의 피연산자는 일반적으로 서명됩니다. 이 두 가지 예에서는 앞으로만 점프하지만 이전 위치로 점프할 수도 있습니다.