【发布时间】:2025-12-02 16:05:02
【问题描述】:
do_something(int):
push rbp
mov rbp, rsp
push rbx
sub rsp, 24
mov DWORD PTR [rbp-20], edi
cmp DWORD PTR [rbp-20], 1
jg .L2
mov eax, DWORD PTR [rbp-20]
jmp .L3
.L2:
mov eax, DWORD PTR [rbp-20]
sub eax, 1
mov edi, eax
call do_something(int)
mov ebx, eax
mov eax, DWORD PTR [rbp-20]
sub eax, 2
mov edi, eax
call do_something(int)
add eax, ebx
.L3:
add rsp, 24
pop rbx
pop rbp
ret
【问题讨论】:
-
代码中的所有内容都被隐藏 100% 的代码正在调用您没有提供的其他函数和偏移量,没有人可以帮助您
-
@coderx64:
call do_something(int)正在调用相同的函数;这个问题的问题只是缺乏努力/尝试。这显然是未经优化的g++输出复制/粘贴自godbolt.org。将 demangled 的do_something(int)更改为有效的 asm 符号名称,如do_something,您可以编写一个调用程序,然后组装并运行它,以便您可以单步执行。它是一个自包含的递归函数。 -
@PeterCordes 但有很多 [rbp-20] 我们不知道它是什么。
-
@coderx64:注意
push rbp/mov rbp, rsp堆栈帧设置,然后mov [rbp-20], edi将传入的整数 arg 转储到堆栈。访问相对于帧指针的局部变量(以及每个 C 语句之间的溢出/重新加载)是未优化代码的 100% 标准(“调试”构建,如gcc -O0,gcc/clang 的默认值。)Why does clang produce inefficient asm with -O0 (for this simple floating point sum)?跨度> -
这个问题不会帮助任何偶然发现它的人。 “有人可以解释这是做什么的吗”甚至不是一个问题,因此它不会为社区提供价值。只是你自己。