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?