C I';我试图解释这个IA32汇编语言代码
我有一个IA32汇编语言代码,我正试图转换成常规的C代码C I';我试图解释这个IA32汇编语言代码,c,assembly,C,Assembly,我有一个IA32汇编语言代码,我正试图转换成常规的C代码 .globl fn .type fn, @function fn: pushl %ebp #setup movl $1, %eax #setup 1 is in A movl %esp, %ebp #setup movl 8(%ebp), %edx # pointer X is in D cmpl $1, %edx # (*x > 1) jle
.globl fn
.type fn, @function
fn:
pushl %ebp #setup
movl $1, %eax #setup 1 is in A
movl %esp, %ebp #setup
movl 8(%ebp), %edx # pointer X is in D
cmpl $1, %edx # (*x > 1)
jle .L4
.L5:
imull %edx, %eax
subl $1, %edx
cmpl $1, %edx
jne .L5
.L4:
popl %ebp
ret
我遇到的麻烦是决定正在进行什么样的比较。我不知道程序是如何进入L5缓存的。L5似乎是一个循环,因为其中有一个比较。我也不确定返回的是什么,因为似乎大部分工作都是在%edx寄存器中完成的,但不会返回到%eax进行返回
到目前为止,我所拥有的:
int fn(int x)
{
}
在我看来,这就像是在计算阶乘。忽略堆栈帧操作等,我们只剩下:
movl $1, %eax #setup 1 is in A
将1放入eax
movl 8(%ebp), %edx # pointer X is in D
subl $1, %edx
cmpl $1, %edx
jne .L5
将参数检索到edx中
imull %edx, %eax
将eax乘以edx,将结果放入eax
movl 8(%ebp), %edx # pointer X is in D
subl $1, %edx
cmpl $1, %edx
jne .L5
如果edx!=一,
换句话说,这大致相当于:
unsigned fact(unsigned input) {
unsigned retval = 1;
for ( ; input != 1; --input)
retval *= input;
return retval;
}
我将从生成英特尔格式的汇编代码开始,这样您至少可以从可读性有一半的代码开始。谢谢,这很有意义。发生在
jle
上的事情不应该有input@user3395013:这在循环的顶部有一个测试,在循环的底部有另一个测试。你可以把它翻译成一个if
,里面有一个do
/while
,但是像for
或者while
这样的循环会更常见。顶部的测试仅用于控制循环的第一次迭代。其他迭代由底部的测试控制。