|
楼主 |
发表于 2011-2-22 23:03:49
|
显示全部楼层
感谢ffxx 详细的解释 !!!
还有以下问题
不知道thumb2指令集和arm的一样不一样。
随便找了一个cortex-m3 函数调用的例子(thumb2和arm不一样么? 我没看见保存sp和FP的值啊,而且我已经是O0优化了)。
0x00002320 E92D4FF7 PUSH {r0-r2,r4-r11,lr} //这里怎么没保存SP的值啊?而却也没看到保存FP的值,这样可怎么traceback呀
0x00002324 B082 SUB sp,sp,#0x08
0x00002326 4604 MOV r4,r0
0x00002328 460D MOV r5,r1
553: unsigned short cnt,total_cnt=0,xtra,alloced=0;
554: BYTE i;
555: char ret;
556: dir_entry* entry;
0x0000232A 2700 MOVS r7,#0x00
0x0000232C 2000 MOVS r0,#0x00
0x0000232E 9000 STR r0,[sp,#0x00]
557: if(!f->isopen || !count) return 0; // 文件没打开或数据量为0
0x00002330 7F20 LDRB r0,[r4,#0x1C]
0x00002332 B108 CBZ r0,0x00002338
0x00002334 9804 LDR r0,[sp,#0x10]
0x00002336 B918 CBNZ r0,0x00002340
0x00002338 2000 MOVS r0,#0x00
【引用】这三个寄存器在每次做标准过程调用时都需要最后压栈,即压入栈的最底端。每次标准过程调用时,压入栈的部分称为一帧。一帧的最底端就是上面的三个寄存器。
有以下问题想请教
1 请问到底什么是帧,从上面的程序看,是说PUSH {r0-r2,r4-r11,lr} 压入的 r0-r2,r4-r11,lr叫一帧还是说整个为这个函数开辟的堆栈空间(r0-r2,r4-r11,lr加上后面为局部变量开辟的8个字节)叫一帧。(应该是前面的叫一帧吧)
2 根据理解和您上面讲的,应该有一个帧指针指向PUSH {r0-r2,r4-r11,lr}以后SP的值(我这种理解对么?)但为什么从程序里面看不到呢?thumb2 怎么traceback呢?
3 您能提供一个类似上面的例子么 ,可以看到保存SP和FP的?
问题有点基础,希望ffxx能不吝赐教。感谢 |
|