Der indirekte Funktionsaufruf verwendet eine ungerade Adresse

Wenn der GCC 4.7.3 (20121207) für ARM Cortex-M3 die Adresse einer Funktion übernimmt, erhält er nicht die genaue Adresse der Funktion. Ich kann in diesem Zeiger ein Stück für Stück erkennen.

// assume at address 0x00001204;
int foo() {
  return 42;
}

void bar() {
  int(*p)() = &foo;  // p = 0x1205;
  p();               // executed successfully
  foo();             // assembly: "bl 0x00001204;"
}

Obwohl der Zeiger auf eine ungerade Adresse zeigt, ist die Ausführung erfolgreich. Ich würde an dieser Stelle eine Ausnahme erwarten. Warum braucht es diese seltsame Adresse und warum tut es nicht weh.

Bearbeiten

DasSO Artikel beschreibt einen Unterschied zwischen Daumen und ARM-Modus. Warum ist dieser Offset nicht sichtbar, wenn die Funktion direkt aufgerufen wird, obwohl sich die CPU im selben Modus befindet?Soll die ungerade Adresse beibehalten werden oder würde das Zurücksetzen des Bits 0 schwer tun? (was ich bis jetzt nicht sehen konnte)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage