Forum: Compiler & IDEs Verständnisfrage zu Decompilat von ARMv7 Code


von Olli Z. (z80freak)


Lesenswert?

Aus einer Firmware erhalte ich folgenden ARM Disassembler-Code:
1
LDR             R1, =off_7CC0
2
LSLS            R0, R0, #2
3
ADDS            R0, R0, R1
4
BX              LR
5
...
6
off_7CC0        DCD 0x40000724

Diese Mini-Subroutine dient dazu um aus einem Index eine absolute 
Speicheradresse zu berechnen. Beim Aufruf ist der Index-Wert in R0 und 
nach Rückkehr befindet sich dort die Speicheradresse.

Aus IDA erhalte ich folgendes Decompilat dazu:
1
void **__fastcall sub_7A9A(int idx)
2
{
3
  return (void **)&byte_40000724[4 * idx];
4
}

Ein Aufruf davon, woanders im Code, sieht dann so aus:
1
signed int __fastcall sub_7AA2(int a1)
2
{
3
  void **v1; // r0
4
  ...
5
  v1 = sub_7A9A(a1);
6
  ...
7
}

Wie passt das denn zusammen? Oben wird der Funktion mit "void" doch ganz 
klar KEIN Rückgabewert bescheinigt. In beiden Aufrufen wird aber genau 
das Gegenteil behauptet.

Im obigen Beispiel wären die Bezeichner "a1" und "v1" eigentlich R0, 
dann würde es wieder passen?

von (prx) A. K. (prx)


Lesenswert?

Olli Z. schrieb:
> KEIN Rückgabewert bescheinigt

"void" ist nicht das Gleiche wie "void **".

von Olli Z. (z80freak)


Lesenswert?

Oh ja, stimmt, 'void **' ist ja ein typenloser Zeiger auf einen Zeiger.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.