我正在写一个简单的,但有点具体方案:使用AT&T的内联汇编程序的GCC
目的:从它计算阶乘
要求:所有的计算必须在GCC内联汇编完成(在&吨语法)
源代码:
#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 。
intel 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
我不是内联汇编专家,但你不必告诉编译器你使用的是哪个寄存器它可以保护那些? –
在MSVC我definitly不是。我试图保存用过的寄存器来堆栈并恢复它。结果是一样的 - SIGSEV。并且不要告诉我我不能使用stack =) – quizzer
@quizzer:在保留内联汇编块中的寄存器(或者通知编译器你不保留哪些寄存器)方面,GCC与MSVC有不同的要求。 –