我在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;
}
}
}
答案 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对于可视化您的特定功能的翻译非常有用。
希望这有帮助!