在ARM处理器中使用ASM指令

时间:2014-02-01 10:54:41

标签: c++ assembly arm armv6

这是我第一次与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


再次编辑:在问之前更好的测试......它有效!但是现在我对链接器有了新的问题......: - (

0 个答案:

没有答案