我正在为C练习一些汇编代码,需要两个问题的帮助。基于GCC objdump它看起来没问题,但我想确保我可以在没有计算机的情况下完成此操作(仍然是汇编代码的新功能)
问题1:
q1:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
cmpl $0, 8(%ebp)\\ compare variable1 to zero
jle .L2 \\jump if less than or equal to zero
movl $1, -4(%ebp)\\ ?? variable2 = 1??
jmp .L4\\else
.L2:
movl $0, -4(%ebp)\\ variable2 = 0
.L4:
movl -4(%ebp), %eax\\ variable2 = variable1
leave
ret
我得到的是
int main(int x, int z)
{
if (x < 0)
z = 0;
else
z = x;
}
但我不确定movl $1, -4(%ebp)
的目的是什么。
问题2:
fn:
pushl %ebp
movl $1, %eax
movl %esp, %ebp
movl 8(%ebp), %edx
cmpl $1, %edx\\ compare variable1 to 1
jle .L4\\ less than or equal jump.
.L5:
imull %edx, %eax\\ multiply variable1 by variable 2
subl $1, %edx\\ variable1 -1
cmpl $1, %edx\\ compare variable1 with 1
jne .L5 Loop if not equal
.L4:
popl %ebp\\ return value
ret
我如何解释信息
int main(int x)
{
int result;
if (x <= 1){
for (result=1; x != 1; x = x-1)
result *= x;}
else{return result;}
}
不确定我的逻辑是否正确。
答案 0 :(得分:4)
Q1 您在8(%ebp)
有一个参数-4(%ebp)
和一个局部变量。返回值将在%eax
。知道这一点,该功能看起来更像:
int foo(int arg)
{
int local;
if (arg <= 0) {
local = 0;
} else {
local = 1;
}
return local;
}
Q2 popl %ebp // return value
这不是返回值,即恢复已保存的%ebp
调用者(在开头推送)。 此外,循环中的条件应使用您在>
而不是!=
。if (x > 1)
循环周围缺少for
条件。 (感谢Mooing Duck指出这一点。)另外,从技术上讲,这是一个do
- while
循环。否则你就有了这个功能。
int factorial(int x)
{
int result = 1;
if (x > 1) {
do {
result *= x;
x -= 1;
} while(x != 1);
}
return result;
}