内联装配GCD赢得';行不通 我编写了一个简单的C++程序,它使用汇编来获取2个数字的GCD,并输出作为我所观看的教程中的一个例子。我明白它在做什么,但我不明白它为什么不起作用。 编辑:应该加上当它运行时,它根本不输出任何东西 #include <iostream> using namespace std; int gcd(int a, int b) { int result; _asm { push ebp mov ebp, esp mov eax, a mov ebx, b looptop: cmp eax, 0 je goback cmp eax, ebx jge modulo xchg eax, ebx modulo: idiv ebx mov eax, edx jmp looptop goback: mov eax, ebx mov esp, ebp pop ebp mov result, edx } return result; } int main() { cout << gcd(46,90) << endl; return 0; }

内联装配GCD赢得';行不通 我编写了一个简单的C++程序,它使用汇编来获取2个数字的GCD,并输出作为我所观看的教程中的一个例子。我明白它在做什么,但我不明白它为什么不起作用。 编辑:应该加上当它运行时,它根本不输出任何东西 #include <iostream> using namespace std; int gcd(int a, int b) { int result; _asm { push ebp mov ebp, esp mov eax, a mov ebx, b looptop: cmp eax, 0 je goback cmp eax, ebx jge modulo xchg eax, ebx modulo: idiv ebx mov eax, edx jmp looptop goback: mov eax, ebx mov esp, ebp pop ebp mov result, edx } return result; } int main() { cout << gcd(46,90) << endl; return 0; },c++,visual-c++,assembly,x86,inline-assembly,C++,Visual C++,Assembly,X86,Inline Assembly,编译器将在函数的开头和结尾为您插入以下指令或等效指令: push ebp mov ebp, esp ... mov esp, ebp pop ebp 如果手动添加它们,您将无法通过ebp访问函数的参数,这就是编译器发出警告的原因 删除这4条说明 另外,开始使用调试器。今天。这些不是错误,而是警告。但是,除非您知道自己在做什么,否则不应该弄乱ebp/esp—删除处理这两个寄存器的行。(从技术上讲,您可以将其添加到函数声明中,但不添加,这有点高级。)哦,好的,没有解释为什么它不运行。请注意,只有当

编译器将在函数的开头和结尾为您插入以下指令或等效指令:

push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp
如果手动添加它们,您将无法通过
ebp
访问函数的参数,这就是编译器发出警告的原因

删除这4条说明


另外,开始使用调试器。今天。

这些不是错误,而是警告。但是,除非您知道自己在做什么,否则不应该弄乱ebp/esp—删除处理这两个寄存器的行。(从技术上讲,您可以将其添加到函数声明中,但不添加,这有点高级。)哦,好的,没有解释为什么它不运行。请注意,只有当除法将
edx
变成
0
a
以0开头时,您的代码才会到达
goback
(在本例中,您需要将edx初始化为零,这意味着它将始终返回一个0。尝试了这一点,现在它抛出了一个“gcdTest.exe中0x0040153b处未处理的异常:0xC0000095:整数溢出”错误。我猜您的
edx
idiv
之前没有初始化,要初始化它,您需要使用
cdq
指令将extend
eax
签名为
edx
。发生异常的指令是什么?该地址是什么,0x0040153b?调试器应该能够向您显示对代码进行反汇编。使用它。
push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp