-
-
[分享]不同处理器下的内联汇编
-
发表于: 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)
);
类似 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直播授课
赞赏
他的文章
- [原创]Android安全防御-ELF篇(简单总结) 23683
- [原创]thumb2 BL / BLX指令机器码计算 20339
- [原创]Cydia Substrate Inline Hook若干bug修复方案 38175
- [原创]放一个类似lordPE的elfloader 14288
- [推荐]分享一个开源的工具包 8742
看原图
赞赏
雪币:
留言: