【问题标题】:What exactly is this line doing: add -0x4(%esi,%ebx,4),%eax? [duplicate]这条线到底在做什么:add -0x4(%esi,%ebx,4),%eax? [复制]
【发布时间】:2015-03-04 07:14:24
【问题描述】:

我的任务是调试一个二进制炸弹,我想知道这条装配线在做什么,特别是 -0x4(%esi,%ebx,4):

add -0x4(%esi,%ebx,4),%eax

这也是整个代码。其中有一个循环,我想弄清楚。

   0x08048e90 <+0>: push   %ebp
   0x08048e91 <+1>: mov    %esp,%ebp
   0x08048e93 <+3>: push   %esi
   0x08048e94 <+4>: push   %ebx
   0x08048e95 <+5>: sub    $0x30,%esp
   0x08048e98 <+8>: lea    -0x20(%ebp),%eax
   0x08048e9b <+11>:    mov    %eax,0x4(%esp)
   0x08048e9f <+15>:    mov    0x8(%ebp),%eax
   0x08048ea2 <+18>:    mov    %eax,(%esp)
   0x08048ea5 <+21>:    call   0x80493ab <read_six_numbers>
   0x08048eaa <+26>:    cmpl   $0x0,-0x20(%ebp)
   0x08048eae <+30>:    jns    0x8048eb5 <phase_2+37>
   0x08048eb0 <+32>:    call   0x8049351 <explode_bomb>
   0x08048eb5 <+37>:    mov    $0x1,%ebx
   0x08048eba <+42>:    lea    -0x20(%ebp),%esi
   0x08048ebd <+45>:    mov    %ebx,%eax
   0x08048ebf <+47>:    add    -0x4(%esi,%ebx,4),%eax
   0x08048ec3 <+51>:    cmp    %eax,(%esi,%ebx,4)
   0x08048ec6 <+54>:    je     0x8048ecd <phase_2+61>
=> 0x08048ec8 <+56>:    call   0x8049351 <explode_bomb>
   0x08048ecd <+61>:    add    $0x1,%ebx
   0x08048ed0 <+64>:    cmp    $0x6,%ebx
   0x08048ed3 <+67>:    jne    0x8048ebd <phase_2+45>
   0x08048ed5 <+69>:    add    $0x30,%esp
   0x08048ed8 <+72>:    pop    %ebx
   0x08048ed9 <+73>:    pop    %esi
   0x08048eda <+74>:    pop    %ebp
   0x08048edb <+75>:    ret    

编辑: 我最终弄清楚了。谢谢大家!

解决方案是 1 2 4 7 11 16,我通过分析循环以及在比较语句期间分析 %eax 以查看该值应该是什么来计算。

【问题讨论】:

标签: assembly x86


【解决方案1】:

来自图 3.3,CSAPP:

+------------+-------------+---------------------------+---------------+
|    Type    |  Form       |   Operand Value           |   Name        |
+------------+-------------+---------------------------+---------------+
| Memory     |Imm(Eb,Ei,s) |M[Imm + R[Eb]+ R[Ei] * s]  |Scaled indexed |
+------------+-------------+---------------------------+---------------+

所以答案是访问内存位置,它是寄存器 %esi 中的值加上寄存器 %edi 中的值乘以 4 和负 4 的结果。然后将该内存中的值添加到寄存器 %eax。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2017-03-29
    • 2011-01-24
    • 2019-06-14
    相关资源
    最近更新 更多