首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个反汇编输出与函数源有什么关系?

这个反汇编输出与函数源有什么关系?
EN

Stack Overflow用户
提问于 2012-01-19 03:55:50
回答 2查看 1.2K关注 0票数 4

我在C中有以下功能:

代码语言:javascript
复制
    uint    myFunction (uint    arrayLen,
             uint*  array
            )
{
  uint  i;
  uint  j;
  uint  sum = 0;

  for  (i = 0;  i < arrayLen/2;  i++)
    for  (j = 0;  j < arrayLen;  j++)
        if  (array[i*2] == array[j])
          sum += mySumFunction(arrayLen,array,6);

  mySortFunction(arrayLen,array);

  for  (i = 0;  i < arrayLen/2;  i++)
    for  (j = 0;  j < arrayLen;  j++)
        if  (array[i*2] == array[j])
          sum -= mySumFunction(arrayLen,array,7);

  return(sum);
}

下面是函数反汇编命令的输出

代码语言:javascript
复制
 Dump of assembler code for function myFunction:
0x080486a8 <myFunction+0>:  push   %ebp
0x080486a9 <myFunction+1>:  mov    %esp,%ebp
0x080486ab <myFunction+3>:  sub    $0x1c,%esp
0x080486ae <myFunction+6>:  call   0x8048418 <mcount@plt>
0x080486b3 <myFunction+11>: movl   $0x0,-0x4(%ebp)
0x080486ba <myFunction+18>: movl   $0x0,-0xc(%ebp)
0x080486c1 <myFunction+25>: jmp    0x8048713 <myFunction+107>
0x080486c3 <myFunction+27>: movl   $0x0,-0x8(%ebp)
0x080486ca <myFunction+34>: jmp    0x8048707 <myFunction+95>
0x080486cc <myFunction+36>: mov    -0xc(%ebp),%eax
0x080486cf <myFunction+39>: shl    $0x3,%eax
0x080486d2 <myFunction+42>: add    0xc(%ebp),%eax
0x080486d5 <myFunction+45>: mov    (%eax),%edx
0x080486d7 <myFunction+47>: mov    -0x8(%ebp),%eax
0x080486da <myFunction+50>: shl    $0x2,%eax
0x080486dd <myFunction+53>: add    0xc(%ebp),%eax
0x080486e0 <myFunction+56>: mov    (%eax),%eax
0x080486e2 <myFunction+58>: cmp    %eax,%edx
0x080486e4 <myFunction+60>: jne    0x8048703 <myFunction+91>
0x080486e6 <myFunction+62>: movl   $0x6,0x8(%esp)
0x080486ee <myFunction+70>: mov    0xc(%ebp),%eax
0x080486f1 <myFunction+73>: mov    %eax,0x4(%esp)
0x080486f5 <myFunction+77>: mov    0x8(%ebp),%eax
0x080486f8 <myFunction+80>: mov    %eax,(%esp)
0x080486fb <myFunction+83>: call   0x8048668 <mySumFunction>
0x08048700 <myFunction+88>: add    %eax,-0x4(%ebp)
0x08048703 <myFunction+91>: addl   $0x1,-0x8(%ebp)
0x08048707 <myFunction+95>: mov    -0x8(%ebp),%eax
0x0804870a <myFunction+98>: cmp    0x8(%ebp),%eax
0x0804870d <myFunction+101>:    jb     0x80486cc <myFunction+36>
0x0804870f <myFunction+103>:    addl   $0x1,-0xc(%ebp)
0x08048713 <myFunction+107>:    mov    0x8(%ebp),%eax
0x08048716 <myFunction+110>:    shr    %eax
0x08048718 <myFunction+112>:    cmp    -0xc(%ebp),%eax
0x0804871b <myFunction+115>:    ja     0x80486c3 <myFunction+27>
0x0804871d <myFunction+117>:    mov    0xc(%ebp),%eax
0x08048720 <myFunction+120>:    mov    %eax,0x4(%esp)
0x08048724 <myFunction+124>:    mov    0x8(%ebp),%eax
0x08048727 <myFunction+127>:    mov    %eax,(%esp)
0x0804872a <myFunction+130>:    call   0x80485cc <mySortFunction>
0x0804872f <myFunction+135>:    movl   $0x0,-0xc(%ebp)
0x08048736 <myFunction+142>:    jmp    0x8048788 <myFunction+224>
0x08048738 <myFunction+144>:    movl   $0x0,-0x8(%ebp)
0x0804873f <myFunction+151>:    jmp    0x804877c <myFunction+212>
0x08048741 <myFunction+153>:    mov    -0xc(%ebp),%eax
0x08048744 <myFunction+156>:    shl    $0x3,%eax
0x08048747 <myFunction+159>:    add    0xc(%ebp),%eax
0x0804874a <myFunction+162>:    mov    (%eax),%edx
0x0804874c <myFunction+164>:    mov    -0x8(%ebp),%eax
0x0804874f <myFunction+167>:    shl    $0x2,%eax
0x08048752 <myFunction+170>:    add    0xc(%ebp),%eax
0x08048755 <myFunction+173>:    mov    (%eax),%eax
0x08048757 <myFunction+175>:    cmp    %eax,%edx
0x08048759 <myFunction+177>:    jne    0x8048778 <myFunction+208>
0x0804875b <myFunction+179>:    movl   $0x7,0x8(%esp)
0x08048763 <myFunction+187>:    mov    0xc(%ebp),%eax
0x08048766 <myFunction+190>:    mov    %eax,0x4(%esp)
0x0804876a <myFunction+194>:    mov    0x8(%ebp),%eax
0x0804876d <myFunction+197>:    mov    %eax,(%esp)
0x08048770 <myFunction+200>:    call   0x8048668 <mySumFunction>
0x08048775 <myFunction+205>:    sub    %eax,-0x4(%ebp)
0x08048778 <myFunction+208>:    addl   $0x1,-0x8(%ebp)
0x0804877c <myFunction+212>:    mov    -0x8(%ebp),%eax
0x0804877f <myFunction+215>:    cmp    0x8(%ebp),%eax
0x08048782 <myFunction+218>:    jb     0x8048741 <myFunction+153>
0x08048784 <myFunction+220>:    addl   $0x1,-0xc(%ebp)
0x08048788 <myFunction+224>:    mov    0x8(%ebp),%eax
0x0804878b <myFunction+227>:    shr    %eax
0x0804878d <myFunction+229>:    cmp    -0xc(%ebp),%eax
0x08048790 <myFunction+232>:    ja     0x8048738 <myFunction+144>
0x08048792 <myFunction+234>:    mov    -0x4(%ebp),%eax
0x08048795 <myFunction+237>:    leave  
0x08048796 <myFunction+238>:    ret    
End of assembler dump.

我想知道是否有人能帮助我阅读并将汇编指令翻译成上面的C代码。我专门寻找关于代码(arrayLen/2)中的除法部分的解释。我当时的印象是,它会转换成一个正确的移位指令,但当我没有在汇编代码中看到这一点时,我不知道发生了什么。

编辑:,我添加了缺少的程序集代码。看起来我也找到了除法部分的解释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 04:45:02

看起来你并没有整个功能,但这里有一个详细的说明:

这三个指令设置了堆栈框架:

代码语言:javascript
复制
0x080486a8 <myFunction+0>:  push   %ebp
0x080486a9 <myFunction+1>:  mov    %esp,%ebp
0x080486ab <myFunction+3>:  sub    $0x1c,%esp

我不知道这是干什么用的:

代码语言:javascript
复制
0x080486ae <myFunction+6>:  call   0x8048418 <mcount@plt>

这是I和sum被初始化为0(存储在堆栈中):

代码语言:javascript
复制
0x080486b3 <myFunction+11>: movl   $0x0,-0x4(%ebp)
0x080486ba <myFunction+18>: movl   $0x0,-0xc(%ebp)

这是外部for循环的开始。通常,程序集中的循环从跳到尾开始。本例中的结尾超过程序集列表的结束。

代码语言:javascript
复制
0x080486c1 <myFunction+25>: jmp    0x8048713 <myFunction+107>

这是j被初始化为0。之所以在这里这样做,是因为每次外部for循环运行时都必须重新设置它。

代码语言:javascript
复制
0x080486c3 <myFunction+27>: movl   $0x0,-0x8(%ebp)

这是内部for循环的开始。

代码语言:javascript
复制
0x080486ca <myFunction+34>: jmp    0x8048707 <myFunction+95>

通过对数组的地址进行指针运算,通过i*2对数组进行索引。首先,它将i放入eax,然后左移到3(乘以8)。这是对*2的优化,也是对数组(4)元素大小的考虑。最后,将其添加到数组的地址中,将结果存储在eax中。

代码语言:javascript
复制
0x080486cc <myFunction+36>: mov    -0xc(%ebp),%eax
0x080486cf <myFunction+39>: shl    $0x3,%eax
0x080486d2 <myFunction+42>: add    0xc(%ebp),%eax

这将获取上面计算的地址所指向的值,并将其存储在edx中。在这个集合的方言中,x(y)的意思是*(y+x)

代码语言:javascript
复制
0x080486d5 <myFunction+45>: mov    (%eax),%edx

这将以类似的方式计算arrayj,这次将结果存储在eax中:

代码语言:javascript
复制
0x080486d7 <myFunction+47>: mov    -0x8(%ebp),%eax
0x080486da <myFunction+50>: shl    $0x2,%eax
0x080486dd <myFunction+53>: add    0xc(%ebp),%eax
0x080486e0 <myFunction+56>: mov    (%eax),%eax

这将检查上面的两种计算,看看它们是否相等:

代码语言:javascript
复制
0x080486e2 <myFunction+58>: cmp    %eax,%edx

如果检查没有通过(如果它们不相等),跳过if的内部。(这跳过了清单的末尾) jne的意思是“如果不相等的话跳”

代码语言:javascript
复制
0x080486e4 <myFunction+60>: jne    0x8048703 <myFunction+91>

这些指令将mySumFunction的参数加载到适当的位置:

代码语言:javascript
复制
0x080486e6 <myFunction+62>: movl   $0x6,0x8(%esp)
0x080486ee <myFunction+70>: mov    0xc(%ebp),%eax
0x080486f1 <myFunction+73>: mov    %eax,0x4(%esp)

如果清单在这里被切断了,但希望这能给你一个好的总体想法。

票数 7
EN

Stack Overflow用户

发布于 2012-01-19 04:07:09

这只是个开始。

第一行是声明vars和循环的条件。

本部分

代码语言:javascript
复制
0x080486cc <myFunction+36>: mov    -0xc(%ebp),%eax
0x080486cf <myFunction+39>: shl    $0x3,%eax
0x080486d2 <myFunction+42>: add    0xc(%ebp),%eax
0x080486d5 <myFunction+45>: mov    (%eax),%edx
0x080486d7 <myFunction+47>: mov    -0x8(%ebp),%eax
0x080486da <myFunction+50>: shl    $0x2,%eax
0x080486dd <myFunction+53>: add    0xc(%ebp),%eax
0x080486e0 <myFunction+56>: mov    (%eax),%eax
0x080486e2 <myFunction+58>: cmp    %eax,%edx
0x080486e4 <myFunction+60>: jne    0x8048703 <myFunction+91>

就像if (%ebp[0xc[2*%ebp[-0xc]]]!=%ebp[0xc[%ebp[8]]]) goto myFunction+91;,我猜是if (array[i*2] == array[j])

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8920824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档