我想从用户模式堆栈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调试器有问题,或者我解释代码的方式错了吗?
非常感谢。你可以看看这个 - http://stackoverflow.com/questions/15542360/pass-by-reference-in-assembly – 2013-04-10 17:22:31