将C ++代码转换为汇编

时间:2015-06-09 09:49:47

标签: assembly

我在c ++ visual studio中有一个gcd函数,我想把它转换成汇编语言。这是函数:

int GCD(int a, int b)
{
    int  gcd;
    for(int i=1;i<=a&&i<=b;i++)
    {
        if(a%i==0 && b%i == 0 )
        {
             gcd=i;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

有些工具可以自动为您生成可见的汇编代码(例如使用-S-masm=intel标记与gcc/g++编译器),但是如果要将代码转换为汇编代码手动作为学习练习,这里有一些东西可以帮助你开始:

了解调用堆栈

在调用GCD函数之前,调用堆栈看起来像this。 ESP是堆栈指针。它会跟踪调用堆栈的顶部,并在您按下并弹出堆栈中的元素时更改位置。 EBP是基指针。它用作相对引用,用于引用堆栈上方或下方存储的变量一定的偏移量。

作为程序员,您有责任遵循其他程序员已建立的调用约定。这个调用约定要求你在函数的开头设置调用堆栈,这样你就不会搞乱它周围的任何其他东西。这是通过以下汇编代码行完成的:

GCD:
; make new call frame
    push    ebp
    mov     ebp, esp
        ...

第一行通过将其推送到堆栈顶部来保存先前的EBP值,第二行更新EBP以指向它刚刚保存的堆栈的顶部。您在GCD函数中声明的任何局部变量都将放在此新堆栈的顶部。假设您返回gcd变量作为结果,它将被置于上一个EBP之上的堆栈顶部。

调用约定的其余部分要求您清理修改后的堆栈帧。这是通过函数末尾的以下代码行完成的(相当于leave指令):

        ...
; cleanup call frame
    mov     esp, ebp
    pop     ebp

翻译功能正文

正确设置调用堆栈后,您可以开始翻译函数体。这通常需要一些技巧,即使对于像你这样的小功能也需要一段时间才能完成,所以我只需发布一个我之前完成的solution for a similar exercise。您可以绘制比较以帮助您翻译,并且上面评论中链接的assembly.ynh.io对于可视化您的特定功能的翻译非常有用。

希望这有帮助!