2013-03-04 94 views
1

我想从用户模式堆栈PSP调用SVC。我观察对LPC 1769(皮质立方米)调试代码以下错误-------为“g_pfnVectors()在为0x0” IDE将其我使用没有可用的源是CODE RED LPC的XpressO与LPC 1769从嵌入艺术家。LPC 1769(皮层立方米)红色代码IDE ---为g_pfnVectors没有可用的源()at0x0

这里是汇编代码

 .syntax unified 
     .cpu cortex-m3 
     .thumb 
     .align 2 
     .global Start 
     .thumb 
     .thumb_func 
    Start: 
// LDR r0,=0xf00d //initial value of r0 which has to be changed in svc handler 
    PUSH {lr} 


    MOV r0,#0x2  // set stack to PSP now. Set CONTROL[1]=1 
    MSR CONTROL,r0 
    ISB    // Instruction memory barrier – ensures that the above is executed 


    MOV r0,#0x3   //change to user level 
    MSR CONTROL, r0 
    ISB 

    MOV r0,#0x2 
    MOV r2,#0x2 
exp: 
    MUL r0,r0 
    SUBS r2,#1 
    BNE exp 

    SVC 1 //print in hex 

    MOV r0,#0x4 //print in decimal 
    SVC 2 

    MOV r0,#'A' 
    SVC 3   //print character 

    MOV r1,0x0 
    MSR CONTROL,r1 
      ISB 


    POP {lr} 
    BX lr 

内部SVC,我堆栈检查和对应的功能要求在控制台上打印。 这里是SVC代码:

__attribute__ ((section(".after_vectors"))) 
void SVCall_Handler(void) 
{ 
    while(1) 
    { 
    __asm(
      "TST lr, #4   \n" 
      "ITE eq   \n" 
      "MRSEQ r0, MSP  \n" 
      "MRSNE r0, PSP  \n" 
      "LDR r0,[r0,#0]  \n" 
      "LDR r1, [r0, #24] \n" 
      "LDRB r1, [r1, #-2] \n" 
      //immediate data in r1 and input parameter in r0 

      //"PUSH {LR}   \n" 
      "CBNZ r1,svc_hex   \n" 
      "B svc_end   \n" 

      "svc_hex:   \n" 
      "CMP r1,#1   \n" 
      "BNE svc_decimal    \n" 
      " BL printhex    \n" 
      "B svc_end   \n" 

      "svc_decimal:    \n" 
      "CMP r1,#2   \n" 
      "BNE svc_character   \n" 
      "BL printdecimal   \n" 
      "B svc_end   \n" 

      "svc_character:    \n" 
      "CMP r1,#3   \n" 
      "BL printcharacter   \n" 
      "B svc_end   \n" 

      "svc_end:   \n" 
      "MOV r0,#0x0    \n" 
      "MSR CONTROL,r0    \n" 
      "ISB    \n" 
      "BX LR    \n" 
    ); 
    } 
} 

的printhex/printcaharacter/printdecimal是用于在控制台上打印各自的值的功能。

在调试,单步模式,所述SVC指令之后,存在错误没有可用的“g_pfnVectors()在为0x0”源。

的原因和错误的到来颇为意外。 gdb调试器有问题,或者我解释代码的方式错了吗?

回答

2

这可能是有点晚了你,但也许这是对别人有用。

g_pfnVectors(或任何在位置0x0),是中断/异常向量表。 SVC会调用SVC异常,其函数指针应位于g_pfnVectors。看来,是不是在你的代码的情况下,这样PC跳到0x0,这是偶然也是g_pfnVectors

+0

非常感谢。你可以看看这个 - http://stackoverflow.com/questions/15542360/pass-by-reference-in-assembly – 2013-04-10 17:22:31

相关问题