C 这个可分解的输出与函数源有何关联?
我在C中具有以下功能:C 这个可分解的输出与函数源有何关联?,c,assembly,C,Assembly,我在C中具有以下功能: 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
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);
}
uint myFunction(uint arrayLen,
uint*阵列
)
{
uint i;
uint j;
单位和=0;
对于(i=0;i
这是函数上反汇编命令的输出
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.
函数myFunction的汇编程序代码转储:
0x080486a8:推送%ebp
0x080486a9:mov%esp,%ebp
0x080486ab:低于$0x1c,%esp
0x080486ae:呼叫0x8048418
0x080486b3:movl$0x0,-0x4(%ebp)
0x080486ba:movl$0x0,-0xc(%ebp)
0x080486c1:jmp 0x8048713
0x080486c3:movl$0x0,-0x8(%ebp)
0x080486ca:jmp 0x8048707
0x080486cc:mov-0xc(%ebp),%eax
0x080486cf:shl$0x3,%eax
0x080486d2:添加0xc(%ebp),%eax
0x080486d5:mov(%eax),%edx
0x080486d7:mov-0x8(%ebp),%eax
0x080486da:shl$0x2,%eax
0x080486dd:添加0xc(%ebp),%eax
0x080486e0:mov(%eax),%eax
0x080486e2:cmp%eax,%edx
0x080486e4:jne 0x8048703
0x080486e6:movl$0x6,0x8(%esp)
0x080486ee:mov 0xc(%ebp),%eax
0x080486f1:mov%eax,0x4(%esp)
0x080486f5:mov 0x8(%ebp),%eax
0x080486f8:mov%eax,(%esp)
0x080486fb:呼叫0x8048668
0x08048700:添加%eax,-0x4(%ebp)
0x08048703:添加$0x1,-0x8(%ebp)
0x08048707:mov-0x8(%ebp),%eax
0x0804870a:cmp 0x8(%ebp),%eax
0x0804870d:jb 0x80486cc
0x0804870f:添加$0x1,-0xc(%ebp)
0x08048713:mov 0x8(%ebp),%eax
0x08048716:shr%eax
0x08048718:cmp-0xc(%ebp),%eax
0x0804871b:ja 0x80486c3
0x0804871d:mov 0xc(%ebp),%eax
0x08048720:mov%eax,0x4(%esp)
0x08048724:mov 0x8(%ebp),%eax
0x08048727:mov%eax,(%esp)
0x0804872a:调用0x80485cc
0x0804872f:movl$0x0,-0xc(%ebp)
0x08048736:jmp 0x8048788
0x08048738:movl$0x0,-0x8(%ebp)
0x0804873f:jmp 0x804877c
0x08048741:mov-0xc(%ebp),%eax
0x08048744:shl$0x3,%eax
0x08048747:添加0xc(%ebp),%eax
0x0804874a:mov(%eax),%edx
0x0804874c:mov-0x8(%ebp),%eax
0x0804874f:shl$0x2,%eax
0x08048752:添加0xc(%ebp),%eax
0x08048755:mov(%eax),%eax
0x08048757:cmp%eax,%edx
0x08048759:jne 0x8048778
0x0804875b:movl$0x7,0x8(%esp)
0x08048763:mov 0xc(%ebp),%eax
0x08048766:mov%eax,0x4(%esp)
0x0804876a:mov 0x8(%ebp),%eax
0x0804876d:mov%eax,(%esp)
0x08048770:调用0x8048668
0x08048775:子%eax,-0x4(%ebp)
0x08048778:添加$0x1,-0x8(%ebp)
0x0804877c:mov-0x8(%ebp),%eax
0x0804877f:cmp 0x8(%ebp),%eax
0x08048782:jb 0x8048741
0x08048784:添加$0x1,-0xc(%ebp)
0x08048788:mov 0x8(%ebp),%eax
0x0804878b:shr%eax
0x0804878d:cmp-0xc(%ebp),%eax
0x08048790:ja 0x8048738
0x08048792:mov-0x4(%ebp),%eax
0x08048795:离开
0x08048796:ret
汇编程序转储结束。
我想知道是否有人能帮我阅读汇编指令并将其翻译成上面的C代码。我特别想了解有关代码(arrayLen/2)
中所示的分割部分的解释。我的印象是它会转换成右移指令,但当我在汇编代码中没有看到这一点时,我不确定发生了什么
编辑:我添加了缺少的汇编代码。看起来我也找到了分割部分的解释。这只是开始 第一行是declare变量和循环的条件 这部分
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>
0x080486cc:mov-0xc(%ebp),%eax
0x080486cf:shl$0x3,%eax
0x080486d2:添加0xc(%ebp),%eax
0x080486d5:mov(%eax),%edx
0x080486d7:mov-0x8(%ebp),%eax
0x080486da:shl$0x2,%eax
0x080486dd:添加0xc(%ebp),%eax
0x080486e0:mov(%eax),%eax
0x080486e2:cmp%eax,%edx
0x080486e4:jne 0x8048703
类似于if(%ebp[0xc[2*%ebp[-0xc]])!=%ebp[0xc[%ebp[8]])转到myFunction+91代码>
我猜这是if(array[I*2]==array[j])
它看起来并没有完整的功能,但这里有一个功能分解:
以下3条说明设置堆栈框架:
0x080486a8 <myFunction+0>: push %ebp
0x080486a9 <myFunction+1>: mov %esp,%ebp
0x080486ab <myFunction+3>: sub $0x1c,%esp
0x080486a8:推送%ebp
0x080486a9:mov%esp,%ebp
0x080486ab:低于$0x1c,%esp
我不确定这是干什么用的:
0x080486ae <myFunction+6>: call 0x8048418 <mcount@plt>
0x080486ae:调用0x8048418
这是i和sum被初始化为0(存储在堆栈上):
0x080486b3:movl$0x0,-0x4(%ebp)
0x080486ba:movl$0x0,-0xc(%ebp)
这是外部for循环的开始。通常,部件中的循环从跳到末端开始。本例中的结束已超过程序集列表的结束
0x080486c1 <myFunction+25>: jmp 0x8048713 <myFunction+107>
0x080486c1:jmp 0x8048713
这是j正在初始化为0。它在这里完成是因为每次外部for循环运行时都必须重置它
0x080486c3 <myFunction+27>: movl $0x0,-0x8(%ebp)
0x080486c3:movl$0x0,-0x8(%ebp)
这是内部for循环的开始
0x080486ca <myFunction+34>: jmp 0x8048707 <myFunction+95>
0x080486ca:jmp 0x8048707
通过对数组的地址进行指针运算,将数组按i*2进行索引。首先它将i放入eax,然后左移3(乘以8)。这是对*2的优化,并考虑了数组(4)元素的大小。最后将其添加到数组的地址中,并将结果存储在eax中
0x080486cc <myFunction+36>: mov -0xc(%ebp),%eax
0x080486cf <myFunction+39>: shl $0x3,%eax
0x080486d2 <myFunction+42>: add 0xc(%ebp),%eax
0x080486cc:mov-0xc(%ebp),%eax
0x080486cf:shl$0x3,%eax
0x080486d2:添加0xc(%ebp),%eax
这将获取上面计算的地址指向的值并存储它
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)