У меня есть инструкция по сборке следующим образом
=> 0x00000000004011ed <+53>: cmp $0x35,%ecx
0x00000000004011f0 <+56>: je 0x4011f7 <phase_5+63>
0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
И, насколько мне известно, сравнивает 35 со значением в $ ecx, поэтому я показываю, что находится в регистрах в gdb.
(gdb) i r
rax 0x605106 6312198
rbx 0x605100 6312192
rcx 0x23 35
rdx 0xa 10
rsi 0x4 4
rdi 0x605106 6312198
rbp 0x402500 0x402500 <__libc_csu_init>
rsp 0x7fffffffea10 0x7fffffffea10
r8 0x616aa7 6384295
r9 0x7ffff7fc6700 140737353901824
r10 0x7ffff7fc6700 140737353901824
r11 0x246 582
r12 0x400d00 4197632
r13 0x7fffffffeb00 140737488349952
r14 0x0 0
r15 0x0 0
rip 0x4011ed 0x4011ed <phase_5+53>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
И это 35, поэтому инструкция перехода должна перейти к phase_5 + 63 и пропустить вызов explode_bomb, но это не так.
=> 0x00000000004011f0 <+56>: je 0x4011f7 <phase_5+63>
0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
End of assembler dump.
=> 0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
End of assembler dump.
(gdb)
На самом деле происходит вызов функции explode_bomb.Так что я очень смущен.Спасибо.