我正在编写一个简单但有点具体的程序:
目的:从它的阶乘计算数字
要求:所有计算必须在 gcc 内联 asm 上完成(at&t 语法)
源代码:
#include <iostream>
int main()
{
unsigned n = 0, f = 0;
std::cin >> n;
asm
(
"mov %0, %%eax \n"
"mov %%eax, %%ecx \n"
"mov 1, %%ebx \n"
"mov 1, %%eax \n"
"jmp cycle_start\n"
"cycle:\n"
"inc %%ebx\n"
"mul %%ebx\n"
"cycle_start:\n"
"cmp %%ecx, %%eax\n"
"jnz cycle\n"
"mov %%ebx, %1 \n":
"=r" (n):
"r" (f)
);
std::cout << f;
return 0;
}
此代码导致 SIGSEV。
英特尔 asm 语法(http://pastebin.com/2EqJmGAV)上的相同程序运行良好。为什么我的“AT&T 计划”失败了,我该如何解决?
#include <iostream>
int main()
{
unsigned n = 0, f = 0;
std::cin >> n;
__asm
{
mov eax, n
mov ecx, eax
mov eax, 1
mov ebx, 1
jmp cycle_start
cycle:
inc ebx
mul ebx
cycle_start:
cmp eax, ecx
jnz cycle
mov f, ebx
};
std::cout << f;
return 0;
}
UPD:推入堆栈并恢复使用过的寄存器会产生相同的结果:SIGSEV