Forum: Compiler & IDEs rlwinm Knoten im Kopf


von Flip B. (frickelfreak)


Lesenswert?

Ich versuche gerade hier durchzusteigen, aber so wie der Disassembler 
das präsentiert, müsste doch alles nach links rausgeshiftet werden 
(<<32). oder ist das lediglich eine komische schreibweise was Ghidra da 
raushaut? welche bits werden maskiert? Mir raucht der Kopf!
1
ulonglong can_check_permission_FUN_000b90a8(void)
2
3
{
4
  return ((ulonglong)can_chk_perm_DAT_40000cbd << 32) >> 35;
5
}

Assembler:
1
**************************************************************
2
*                          FUNCTION                          *
3
**************************************************************
4
             undefined can_check_permission_FUN_000b90a8()
5
                               assume r13 = 0x40008004
6
             undefined         <UNASSIGNED>   <RETURN>
7
             undefined4        Stack[0x4]:4   local_res4              
8
             undefined4        Stack[-0x10]:4 local_10
9
                             can_check_permission_FUN_000b90a8                
10
        000b90a8 94 21 ff f0     stwu       r1,DAT_fffffff0(r1) 
11
        000b90ac 7c 08 02 a6     mfspr      r0,LR
12
        000b90b0 90 01 00 14     stw        r0,local_res4(r1)
13
        000b90b4 3d 80 40 00     lis        r12,0x4000
14
        000b90b8 88 6c 0c bd     lbz        r3,offset can_chk_perm_DAT_40000cbd(r12)
15
        000b90bc 54 63 ee fe     rlwinm     r3,r3,0x1d,0x1b,0x1f
16
        000b90c0 80 01 00 14     lwz        r0,local_res4(r1)
17
        000b90c4 7c 08 03 a6     mtspr      LR,r0
18
        000b90c8 38 21 00 10     addi       r1,r1,0x10
19
        000b90cc 4e 80 00 20     blr

ISA-Manual_
https://www.nxp.com/docs/en/user-guide/BOOK_EUM.pdf
https://math-atlas.sourceforge.net/devel/assembly/ppc_isa.pdf

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Flip B. schrieb:

> Ich versuche gerade hier durchzusteigen, aber so wie der Disassembler
> das präsentiert, müsste doch alles nach links rausgeshiftet werden
> (<<32).

Nein, wird ja auf ulonglong gecastet. Effektiv passiert hier wohl nix 
anderes als:

return (ulonglong)(can_chk_perm_DAT_40000cbd >> 3);

Warum ghidra das so komisch dekompiliert hat erschließt sich mir 
allerdings auch nicht wirklich. Allerdings habe ich mit PPC auch Null 
Erfahrung. Hatte ich nie mit zu tun.

von Flip B. (frickelfreak)


Lesenswert?

Danke, so hatte ich es mir auch zusammengereimt - mit Erfolg!

von Detlef W. (detlefr)


Lesenswert?

Mit dem hin- und her-shiften werden auch die oberen 32 Bit genullt.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Detlef W. schrieb:
> Mit dem hin- und her-shiften werden auch die oberen 32 Bit genullt.

Nein, das passiert im "Original" schon allein dadurch, dass die wohl 
32bittige Variable auf 64Bit erweitert wird, bevor an ihr überhaupt 
rumhantiert wird. Hätte sie von vonherein 64Bit, müsste der 
Assemblercode ganz anders aussehen. Und dann würde auch das Ergebnis der 
des ghidra-Decompilers ganz anders aussehen.

von Joerg W. (joergwolfram)


Lesenswert?

Dass bei PowerPC (Big Endian) Bit 0 msb und Bit 63 lsb ist, macht die 
Sache nicht unbedingt einfach.
Man muss halt dazu wissen, dass can_chk_perm_DAT_40000cbd eine 8-Bit 
Variable ist. Darauf deutet auch das "lbz r3..." hin.

Also:

* Die unteren 32 Bits von R3 (32..63) werden um 0x1d = 29 nach links 
rotiert, das entspricht um 3 nach rechts.

* Die Maske geht von Bit 0x3B bis 0x3F, ist also 0x1F. Das sind die 
restlichen 5 Bits die übrig bleiben, wenn ein Byte um 3 nach rechts 
verschoben wird.

* Die oberen 32 Bits werden durch das lbz auf 0 gesetzt und dann nicht 
mehr angerührt,da durch rlwinm nur die unteren 32 Bits (32..63) 
beeinflusst werden.

Jörg

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.