首页
社区
课程
招聘
[分享]不同处理器下的内联汇编
发表于: 2014-8-12 18:54 4154

[分享]不同处理器下的内联汇编

2014-8-12 18:54
4154
最近在做***测试的时候,发现调用了一个函数后,IDA跑出来一个__aeabi_ldivmod函数,代码中没有调用其余API,纯运算而已。最后发现原因:

类似 a[i%j] 这种代码,编译器会在.text节自动生成一个build-in函数__aeabi_ldivmod。对此为了防止其生成有两种办法。第一使用temp变量传递。temp = i%j; a[temp]。

第二种方法是使用一个求余的内联汇编。在C下一般表示为 i%j,但是在ARM下是没有取余指令的。X86还好。现在弄一个通用的方法。

1.        ARM

int j = 0;
int out = 256;
__asm__ volatile(
                "mov r11, %1 \n"
                "lsr r11, r11, #8 \n"
                "mov r10, #0x100 \n"
                "mul r11, r11, r10 \n"
                "sub %0, %1, r11 \n"
                :"=r"(j)
                :"r" (out)
        );
LOGI("j = %d", j);
意思就是取out的值放入r11寄存器,然后将r11寄存器的值右移8位,然后将0x100存入r10,r11*r10存入r11, 用out的值减去r11中的值即为余数。在这儿只适合2的N次方的数。

2.        x86(INTEL)
int j = 0;
int ID = 257;

        __asm{
                push eax
                push ebx
                mov eax, ID
                shr eax, 8
                mov ebx, 100H
                imul eax, ebx
                mov j, eax
                sub ID, eax
                mov eax, ID       
                mov j, eax
                pop ebx
                pop eax
        }

3.        x86(AT&T)
int j = 0;
int ID = 257;

__asm__ volatile(
                        "movl %1, %%edi  \n"
                        "movl %1, %%eax \n"
                        "shrl $8, %%eax \n"
                        "movl $0x100, %%ebx \n"
                        "mul %%ebx \n"
                        "subl %%eax, %%edi \n"
                        "movl %%edi, %0 \n"
                        :"=r"(j)
                        :"r" (ID)
);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//