【发布时间】:2025-12-22 10:45:16
【问题描述】:
我无法理解这个汇编 x86 代码(AT&T 表示法)。我需要能够理解它(编写编译为该代码的 C++ 函数)并在考试中解决类似的练习。 你能向我解释一下哪个部分做什么以及约定是什么?
f:
pushl %ebp ; 1
movl %esp, %ebp; 2
pushl %ebx ; 3
subl $36, %esp; 4
movl 8(%ebp), %edx ; 5
movl 12(%ebp), %eax ; 6
movl (%eax), %eax ; 7
movl %edx, 8(%esp) ; 8
leal 16(%ebp), %edx ; 9
movl %edx, 4(%esp) ; 10
movl %eax, (%esp) ; 11
call f; 12
movl %eax, -12(%ebp) ; 13
movl 16(%ebp), %edx ; 14
movl 12(%ebp), %eax ; 15
movl %edx, (%eax) ; 16
movl 12(%ebp), %eax ; 17
movl (%eax), %edx ; 18
movl -12(%ebp), %eax ; 19
movl %edx, 8(%esp) ; 20
leal 8(%ebp), %edx ; 21
movl %edx, 4(%esp) ; 22
movl %eax, (%esp) ; 23
call f; 24
movl %eax, %ebx; 25
movl 16(%ebp), %edx ; 26
movl -12(%ebp), %eax ; 27
movl %edx, 8(%esp) ; 28
movl 12(%ebp), %edx ; 29
movl %edx, 4(%esp) ; 30
movl %eax, (%esp) ; 31
call f; 32
movl %eax, %edx; 33
movl 16(%ebp), %eax ; 34
movl %edx, 8(%esp) ; 35
leal 8(%ebp), %edx ; 36
movl %edx, 4(%esp) ; 37
movl %eax, (%esp) ; 38
call f; 39
movl %ebx, 8(%esp) ; 40
leal -12(%ebp), %edx ; 41
movl %edx, 4(%esp) ; 42
movl %eax, (%esp) ; 43
call f; 44
addl $36, %esp; 45
popl %ebx ; 46
popl %ebp ; 47
ret; 48
没有跳转,但是有几个'call f',是不是意味着有死循环?
【问题讨论】:
-
这显然是您真正应该在寻求帮助之前发布“您的最佳尝试”的情况之一,因为这将告诉我们您需要帮助的级别。
-
到目前为止你是怎么翻译的? (顺便说一句,在调试器中逐步执行将回答您的第二个问题......)
-
@Adriano:我能想到很多这样的例子是不可行的。即使在这种情况下,也可能需要很长时间才能得出结论。
-
您只需要快速查看前 12 条指令,就可以确定它将耗尽堆栈空间并崩溃! :-)
-
@MatsPetersson 是的,当然编译后的代码会很快真的很复杂,但是:1)这是一个考试文本。 2)我没有看到任何试图了解发生了什么的尝试......
标签: c++ assembly x86 decompiling