亲们,可以花几分钟帮我解释一下这句汇编的含义吗,阿里嘎多

2019-08-14 04:22发布

    PUSH {lr}
    LDR     R0, =0x1FFFF000
    LDR     SP,[R0, #0]
    LDR     R0,[R0, #4]
    BX      R0
    OP {PC}






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
灼灼其华
1楼-- · 2019-08-14 07:13
本帖最后由 灼灼其华 于 2017-8-30 07:50 编辑

PUSH    {LR}; 将LR保存在堆栈里面LDR      R0, =0x1FFFF000 ;R0 = 0x1FFFF000
LDR      SP, [R0, #0] ;SP = *R0
LDR      R0, [R0, #4] ;R0 = *(R0 + 4)
BX       R0; 跳转到R0所在的地址去执行代码
POP     {PC}; 将栈顶的值赋给PC,即上面的PC = LR, 程序将返回


翻译成C语言应该就是
uint32_t *p = (uint32_t *) 0x1FFFF000 ;
void (*func)(void) = ( void (*)(void) ) (*(p + 1));
SP = *p;
func();
return;












2018
2楼-- · 2019-08-14 12:40
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-08-14 12:52
帮顶
2018
4楼-- · 2019-08-14 14:40
灼灼其华 发表于 2017-8-30 07:42
PUSH    {LR}; 将LR保存在堆栈里面LDR      R0, =0x1FFFF000 ;R0 = 0x1FFFF000
...

先阿里嘎多,嘎嘎。我自己在整理下。第一行就是将0x1FFFF000这个串口bootloader首地址给了R0
lvkanger
5楼-- · 2019-08-14 19:26
灼灼其华 发表于 2017-8-30 07:42
PUSH    {LR}; 将LR保存在堆栈里面LDR      R0, =0x1FFFF000 ;R0 = 0x1FFFF000
...

大神!

一周热门 更多>