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하지만 작동하지 않습니다. 누군가 문제를 지적 할 수 있습니까? 도와 주셔서 감사합니다!어셈블리 코드 이해
도움에 감사드립니다. 이제 조금 더 잘 이해합니다. 첫 번째가 "array [i-1]"이고 두 번째가 "array [i]"라고 말할 때. 어느 것이 "첫 번째"입니까? – jackhao
'-0x4 (% esi, % ebx, 4)'는 첫 번째 표현식으로'array [i - 1]'입니다. – Jester
정말 고마워요. 이제는 의미가 있습니다. 그래서 % eax는 array [i]를 나타 냅니까? – jackhao