2017-02-09 5 views
0

objdump의 출력에 대한 문서를 찾지 못했습니다. objdump를 -D 출력에서 ​​ , 나는 ASM 아래를 참조하지만 난 그것을 이해하지 않는다 : 레아를 0x0 (%의 ESI는, 1), % ESI https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax에서AT & T x86 어셈블리 "lea 0x0 (% esi, 1), % esi"

나는 "포인터"4 개 매개 변수가 있습니다 볼 수 있습니다 : 세그먼트 : displacement (기본 레지스터, 오프셋 레지스터, 스칼라 승수)

하지만이 0x0 (% esi, 1)은 무엇을 의미합니까? 스칼라는 0으로 생략됩니까? 그리고 & T asm의 설명서 위치를 안내해 줄 수 있습니까?

감사 스티븐

+2

글쎄, 괄호 밖의 숫자는 변위 일 수 있습니다. 괄호 안의 숫자는 소수 일 수 있습니다. 그래서 ... :) 그냥 objdump가 pedantic입니다. –

+0

단일 레지스터에 스칼라 값 1 (및 변위 0)을 사용하면 지정된 레지스터가 기본이라고 가정합니다. 사실'lea 0x0 (% esi, 1), % esi'는 lea (% esi), % esi와 같은 의미입니다. 'objdump '명령을 사용하여 익숙한 인텔 구문으로 지시 사항을 출력 할 수도 있습니다. '-Mintel '옵션을 추가하면됩니다. –

+2

3 바이트 NOP 인 IIRC입니다. – ninjalj

답변

3

0x0는 변위이며이 제로와 동일 할 때, 그것은 생략 될 수 있다는 것을 의미한다. 1은 척도이고 1과 같으면 생략 할 수 있음을 의미합니다. 따라서이 지침 lea 0x0(%esi,1),%esi은 다음과 같습니다. lea esi,[esi*1+0x00] lea esi,[esi]

+0

고마워, S.MAHDI! 이제 나는 그것이 "lea esi, esi"와 동일하다는 것을 이해합니다. ** base register **가이 경우에 생략된다는 것을 의미합니다. 맞습니까? Margaret과 Michael의 또 다른 코멘트는 생략 된 것이 상쇄되는 것으로 나타났습니다. 이 점에서 흥미로운 것처럼 보입니다 - 다른 사람들은 다른 이해를 가지고 있지만 마침내 같은 결과로갑니다. ;) –

+0

S.MAHDI 외 여러분, 귀하의 도움으로, 나는 내 질문에 GAS_Syntax 페이지를 돌아 보았고, 지금은 더 깊은 이해를 가지고있다. 읽습니다 : ** 숫자 및 레지스터 매개 변수 중 하나 또는 둘 모두가 생략 될 수 있습니다 **. 기본이없는 예는 ** leal 8 (, % eax, 4), % eax **와 같습니다. 그러나이 경우 생략 된 ** 오프셋 **이어야합니다. 고마워요 ~ –

+0

내 대답이 당신을 도왔습니다. –