2014-09-11 3 views
-2
0x08048d02 <+0>: push %ebp 
    0x08048d03 <+1>: mov %esp,%ebp 
    0x08048d05 <+3>: push %esi 
    0x08048d06 <+4>: push %ebx 
    0x08048d07 <+5>: sub $0x30,%esp  //minus 48 to esp 
    0x08048d0a <+8>: lea -0x20(%ebp),%eax  //eax = first element in the array 

    0x08048d0d <+11>: mov %eax,0x4(%esp)  // 
    0x08048d11 <+15>: mov 0x8(%ebp),%eax  //input? 
    0x08048d14 <+18>: mov %eax,(%esp)  //esp = eax 
    0x08048d17 <+21>: call 0x804914a <read_six_numbers> 

    0x08048d1c <+26>: cmpl $0x0,-0x20(%ebp)  // first int compare to 0 

    0x08048d20 <+30>: jns 0x8048d27 <phase_2+37> //if not negative, jump 

    0x08048d22 <+32>: call 0x8049108 <explode_bomb> // < 0 

    0x08048d27 <+37>: mov $0x1, %ebx  //set ebx = 1 
    0x08048d2c <+42>: lea -0x20(%ebp),%esi  //set esi to the address of the first element of the array 
    0x08048d2f <+45>: mov -0x4(%esi,%ebx,4),%eax //eax = esi + ebx * 4 - 4 
    0x08048d33 <+49>: sub %ebx,%eax  //ebx = ebx - eax 
    0x08048d35 <+51>: cmp %eax,(%esi,%ebx,4) //eax = (esi + ebx * 4) 

    0x08048d38 <+54>: je  0x8048d3f <phase_2+61> 

    0x08048d3a <+56>: call 0x8049108 <explode_bomb> 

    0x08048d3f <+61>: add $0x1,%ebx  //ebx = 2; 
    0x08048d42 <+64>: cmp $0x6,%ebx  //if (ebx < 6) 
    0x08048d45 <+67>: jne 0x8048d2f <phase_2+45> //do the loop again. 

    0x08048d47 <+69>: add $0x30,%esp  //add 48 to esp. 
    0x08048d4a <+72>: pop %ebx 
    0x08048d4b <+73>: pop %esi 
    0x08048d4c <+74>: pop %ebp 
    0x08048d4d <+75>: ret 

위 어셈블리 코드가 있는데,이 목표는 "explode_bomb"에 도달하지 않는 것입니다. 나는 내 작품에 대해 논평했으며, 6 개의 숫자가 필요하다고 생각한다. 나는 그들이 for 루프를 가지고 있기 때문에 다음 숫자가 항상 이전 숫자 * 4 - 4와 같음을 발견 했으므로 x, 4x-4, 4 (4x-4) 등과 같은 것들을 시도했다. 여기서 x> 0하지만 작동하지 않습니다. 누군가 문제를 지적 할 수 있습니까? 도와 주셔서 감사합니다!어셈블리 코드 이해

답변

1

아, 다시 폭탄. 이 단계를 아직 보지 못했습니다;)

mov -0x4(%esi,%ebx,4),%eaxcmp %eax,(%esi,%ebx,4)으로 혼동을 느낍니다. 산술 연산은 값이 아닌 포인터에 적용됩니다. 기본적으로 첫 번째는 array[i-1]이고 두 번째는 array[i]이며 ebxi (배열 색인)이고 esi은 기본 주소입니다. 4으로 곱한 것은 각 요소가 4 바이트이기 때문입니다. 이와 같이

는 루프는 다음과 같이 진행한다 : 이러한 해결 방안은 0, -1, -3, -6, -10 같이

for(i = 1; i != 6; i++) 
{ 
    if (array[i - 1] - i != array[i]) explode_bomb(); 
} 

첫번째 요소는, 임의의 개수의 0보다 크거나 동일 할 수있다 , -15.

+0

도움에 감사드립니다. 이제 조금 더 잘 이해합니다. 첫 번째가 "array [i-1]"이고 두 번째가 "array [i]"라고 말할 때. 어느 것이 "첫 번째"입니까? – jackhao

+0

'-0x4 (% esi, % ebx, 4)'는 첫 번째 표현식으로'array [i - 1]'입니다. – Jester

+0

정말 고마워요. 이제는 의미가 있습니다. 그래서 % eax는 array [i]를 나타 냅니까? – jackhao