【发布时间】:2017-07-06 14:18:43
【问题描述】:
我试图通过反汇编程序来理解以下函数的汇编代码。我不明白为什么所有的操作都是相对于基指针的。
为什么
rcx和rdx的寄存器值被移动到偏移10和18的内存位置? (mov 0x10(%rbp),%rax和mov %rdx,0x18(%rbp))。为什么返回值存储在
mov %rax,-0x8(%rbp)
long absdiff(long x, long y)
{
long result;
if (x>y)
result = x-y;
else
result = y-x;
return result;
}
0x00000001004010e0 <+0>: push %rbp
0x00000001004010e1 <+1>: mov %rsp,%rbp
0x00000001004010e4 <+4>: sub $0x10,%rsp
0x00000001004010e8 <+8>: mov %rcx,0x10(%rbp)
0x00000001004010ec <+12>: mov %rdx,0x18(%rbp)
0x00000001004010f0 <+16>: mov 0x10(%rbp),%rax
0x00000001004010f4 <+20>: cmp 0x18(%rbp),%rax
0x00000001004010f8 <+24>: jle 0x100401108 <absdiff+40>
0x00000001004010fa <+26>: mov 0x10(%rbp),%rax
0x00000001004010fe <+30>: sub 0x18(%rbp),%rax
0x0000000100401102 <+34>: mov %rax,-0x8(%rbp)
0x0000000100401106 <+38>: jmp 0x100401114 <absdiff+52>
0x0000000100401108 <+40>: mov 0x18(%rbp),%rax
0x000000010040110c <+44>: sub 0x10(%rbp),%rax
0x0000000100401110 <+48>: mov %rax,-0x8(%rbp)
0x0000000100401114 <+52>: mov -0x8(%rbp),%rax
0x0000000100401118 <+56>: add $0x10,%rsp
0x000000010040111c <+60>: pop %rbp
0x000000010040111d <+61>: retq
【问题讨论】:
-
为什么要减去 10 个字节............
0x10=16..... -
您应该开始识别
x和y在汇编代码中的表示方式。为什么您希望从堆栈指针中减去 8?提示:这是编译为 64 位程序。 -
我建议在编译时启用优化。该程序集将大大更短且更易于理解。
-
@EOF 更短:是的,更容易理解:不一定。
-
@MichaelWalz 我发现它本质上总是更具可读性。然而,这可能对我来说是相当具体的。