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しかし、それは機能しません。誰かがここで何が問題なのか指摘できますか?助けてくれてありがとう!
ああ、また爆弾。このフェーズはまだ見ていません;)
あなたは混乱しているように見えるmov -0x4(%esi,%ebx,4),%eax
とcmp %eax,(%esi,%ebx,4)
。そこでの算術演算は、値ではなくポインタに適用されます。基本的に、1つ目はarray[i-1]
で、2つ目はarray[i]
で、ebx
はi
(配列インデックス)でesi
あり、ベースアドレスです。による乗算4
は、各要素が4
バイト長であるためです。
そのため、ループは次のようになります。
for(i = 1; i != 6; i++)
{
if (array[i - 1] - i != array[i]) explode_bomb();
}
そのような可能な解決策であるように、第1の要素は、より任意の数の大きいこと、またはゼロに等しくすることができ0
、-1
、-3
、-6
、-10
、-15
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加