这是我第一次与ARM处理器(ARMv6)竞争,在我尝试“翻译”用C ++源代码编写的一组ASM代码时,我需要一些帮助。
原始代码显示:
#ifdef _WIN32
__asm
{
mov eax, var1
xor edx, edx
div var2
mov var1, eax
mov var3, edx
}
#else
__asm__ __volatile__ ( “mov %2, %%eax;”
“xor %%edx, %%edx;”
“divl %3;”
“mov %%eax, %0;”
“mov %%edx, %1;”
: “=m” (var1), “=m” (var3)
: “m” (var1), “m”(var2)
: “%eax”, “%edx”
);
#endif
所以,我可以假设我必须添加一个新行来“让编译器'识别'ARM”,做类似的事情:
#if defined _WIN32
__asm
#elif defined __ARM_ARCH_6__
//here my new code
#else
__asm__ __volatile__
#endif
但是,正如我所说,这是我第一次使用ARM处理器,所以我有一些问题...... 通过这里找到的链接(stackoverflow),我找到了ARM ASM手册,其中有16个注册表(r0-r15),其中(我假设)r4到r8可用于“免费使用”。这是对的吗?
如果这是对的,我可以“翻译”[eax = r4,edx = r5]或类似的东西。但我真的不知道如何宣布这个块;我的意思是,在这种情况下,“__asm__ __volatile__”是一个正确的“签名”吗?另一个是正确的吗?
我怎么放块?括号({})之间?如何引用“var1”,“var2”和“var3”?
任何链接都可以,我不想“翻译”,因为我想知道这个主题......
提前多多感谢
__
编辑:我看得更深(我必须承认,在第一个例子中我只看#ifdef和#else,这太糟糕了)源代码,我发现了这个:
unsigned int var1 = (unsigned int)var0;
for (; i >= 0; i--){
#ifdef __powerpc__
var4[i] = var5[var1 % m_var2];
var1 /= m_var2;
#else
unsigned int var2 = m_var2;
unsigned int var3;
#ifdef _WIN32
__asm
{
mov eax, var1
xor edx, edx
div var2
mov var1, eax
mov var3, edx
}
#else
__asm__ __volatile__ ( "mov %2, %%eax;"
"xor %%edx, %%edx;"
"divl %3;"
"mov %%eax, %0;"
"mov %%edx, %1;"
: "=m"(var1), "=m"(var3)
: "m"(var1), "m"(var2)
: "%eax", "%edx"
);
#endif
var4[i] = var5[var3];
#endif
}
所以,正如我所看到的,“#ifdef powerpc 块在ARM中运行正常,因为它没有使用任何ASM指令,对吧?这是真的,我可以重写
#if defined(__powerpc__) || defined(__ARM_ARC_6__)
//stuff here...
它会起作用吗?
再次尝试Thakns再次编辑:在问之前更好的测试......它有效!但是现在我对链接器有了新的问题......: - (