2014-05-20 1 views
-1

이 매개 변수와 함께 호출되고 난'전화'명령은 내가 (연결되지 않은) 간단한 D 스크립트를 분해 한

나의 이해 call에서
call 1e <_Dmain+0x1e> 

는 현재 스택을 밀어 어셈블리의 이상한 조각 (인텔 구문)을 찾을 수 있습니다 기본 포인터를 스택에 넣고 매개 변수로받은 주소로 점프합니다.

call 명령은 2 개의 매개 변수를 사용하는 것처럼 보입니다. 그게 뭐야?

전체 기능 :

0000000000000000 <_Dmain>: 
    0: 55      push rbp 
    1: 48 8b ec    mov rbp,rsp 
    4: 48 83 ec 10    sub rsp,0x10 
    8: c7 45 f8 05 00 00 00 mov DWORD PTR [rbp-0x8],0x5 
    f: c7 45 f8 06 00 00 00 mov DWORD PTR [rbp-0x8],0x6 
    16: 48 89 ef    mov rdi,rbp 
    19: e8 00 00 00 00   call 1e <_Dmain+0x1e> 
    1e: 31 c0     xor eax,eax 
    20: c9      leave 
    21: c3      ret  
    22: 66 0f 1f 44 00 00  nop WORD PTR [rax+rax*1+0x0] 
+1

'<_Dmain+0x1e>'은 디스어셈블러가'1e' 주소가'_Dmain'의 오프셋 0x1e에 해당한다고 말하는 것일뿐입니다. – Michael

+1

이들은 두 가지 인수가 아닙니다. '<_Dmain+0x1e>'은 디버깅 된 실행 파일의 관점에서 해석 된 호출의 주소입니다. –

+0

@DanielKamilKozar 그러면 다음 작업 (1e)을 호출하지 않겠습니까? –

답변

2

호출 명령은 하나의 피연산자를 받아, 그것은 nondescriptive 주소입니다. 디스어셈블러는 전화 대상에 대한 기호를 찾고 멋지게하려고합니다. 주소는 1e입니다. 바로 거기에 심볼이 없기 때문에 디스어셈블러는 가장 가까운 심볼 (_Dmain)을 찾고 그 오프셋을줍니다. 그것은 두 번째 주장이 아닙니다. 그것은 당신에게 힌트입니다.

+0

1e는 다음 작업이 아니겠습니까? –

+0

입니다. 면밀히 살펴보면 CALL 명령 인 코드에서 인라인 오프셋은 모두 0입니다. 오프셋은 CALL 이후의 명령에 상대적입니다. 그 이상한 전화의 요점은 뭐니? 나는 전혀 모른다. 아마도 파이프 라인이 플러시되거나 뭔가있을 것입니다. –

+1

OP는 스크립트가 링크되지 않았 음을 언급하기 때문에 0 오프셋은 재배치를위한 공간을 예약하는 것입니다. 스크립트가 실제로 링크 될 때, 호출되는 어떤 심볼이든'call' 명령에 대한 실제 오프셋을 계산하는 데 사용됩니다. –