私は単純ですが少し具体的なプログラムを書いています:
目的:階乗から数値を計算する
要件:すべての計算は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を引き起こします。
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