2014-07-16 7 views
0

Cela peut être une question stupide, mais dans mon code assembleur, pendant le débogage, jePop {} pc dans l'assemblage

pop{r2-r6,pc} 

et je pense qu'il me donne une exception faute dure. Je comprends ce que le pop fait, mais je ne suis pas sûr de ce que signifie la partie pc. Je ne le trouve nulle part sur internet et ce n'est pas une variable dans mon code.

J'utilise Keil sur un STM32 en C++

+0

'pc' est juste un alias pour' r15' dans votre cas, bien que plus généralement voir la réponse de Mike. – OJFord

+0

"Pop PC" est ce qui est généralement utilisé pour mettre en œuvre le retour de fonctions (il apparaît l'adresse de retour de la pile) – sehe

Répondre

1

pc ou r15 est le compteur, le registre programme qui donne l'adresse que le processeur va chercher des instructions à partir. En le changeant à une autre adresse, l'exécution du programme saute à cette adresse.

Dans ce cas, l'adresse est lue dans la pile pour revenir d'un appel de fonction; l'adresse de retour aurait été poussée sur la pile (à partir du registre de liens lr ou r14) au début de la fonction.

Si cela provoque un plantage, c'est probablement parce que l'adresse de la pile a été corrompue. Peut-être que vous écrivez en dehors des limites d'un tableau local, ou que vous débordez de la pile avec un niveau d'appel de fonction trop profond.

+0

Cela aide. Il y a un niveau d'appel de fonction très profond, je vais devoir voir si je peux résoudre ce problème. – Dude

0

Le registre PC est le compteur de programme, il contient l'adresse de l'instruction suivante à exécuter sur une architecture ARM (STM32 utilise l'architecture ARM).

Par défaut, dans ARM, il suffit d'écraser le registre du PC lorsqu'une fonction doit retourner. Ce que vous voyez avec la déclaration pop est juste un moyen direct de retourner, see here.

Le reste de votre question est parfaitement expliqué dans le message de Mike.