WebHU - Programozási kérdések és válaszok

A címkék értékként a soron belüli összeállítási makrókban

Azon tűnődöm, hogyan tölthetek be egy regisztert egy címke értékével az inline assemblyben.

Naivan próbáltam így csinálni:

#define inline_macro(a) \
    asm volatile("1: movw %[rega], #:lower16:1b\n" \
                 "   movt %[rega], #:upper16:1b\n" \
                 : [rega] "+r" (a)       \
                 :                       \
                 :                       \
    );

int main(void){
    register int   i     asm("r2");
    register void* value asm("r1");
    i++;
    i += 2;
    inline_macro(value);
    return i;
}

Az objektum kiíratása azonban azt mutatja, hogy ez az összeállítási kód jön létre:

00000000 <main>:
   0:   e52db004    push    {fp}        ; (str fp, [sp, #-4]!)
   4:   e28db000    add fp, sp, #0
   8:   e1a03002    mov r3, r2
   c:   e2833001    add r3, r3, #1
  10:   e1a02003    mov r2, r3
  14:   e1a03002    mov r3, r2
  18:   e2833002    add r3, r3, #2
  1c:   e1a02003    mov r2, r3

00000020 <.L11>:
  20:   e3001000    movw    r1, #0
  24:   e3401000    movt    r1, #0
  28:   e1a03002    mov r3, r2
  2c:   e1a00003    mov r0, r3
  30:   e24bd000    sub sp, fp, #0
  34:   e49db004    pop {fp}        ; (ldr fp, [sp], #4)
  38:   e12fff1e    bx  lr

Azt akarom, hogy a 0x20 érték betöltődik az r1 regiszterbe.


Válaszok:


1

Valójában egy teljes útmutatás található a címke címének regiszterbe vételéhez: ADR.

Mivel PC-n aritmetikailag működik, teljesen pozíciófüggetlen és nincs korlátlan hatótávolsága, de itt egyik sem tűnik problémának – kihasználva az assembler „aktuális utasítás” pszeudocímkéjét ., a kérdésben szereplő példa a következő:

#define inline_macro(a) \
    asm volatile("adr %[rega], . \n"     \
                 : [rega] "=r" (a)       \
                 :                       \
                 :                       \
    );
15.08.2015

2

Nem tudom arm asm, de megpróbálod megkapni a movw utasítás címét? Az ARM-nek valóban két külön 16 bites mov utasításra van szüksége ehhez?

Úgy tűnik, hogy szétszedi a .o elemet, ahol a linker nem cserélte ki a szimbólumhivatkozásokat a tényleges értékükre, és a 0 helyőrzőt látja.

Mivel szerintem a kódod nem függ a regiszter régi értékétől, csak írható kimeneti operandusnak (=r) érdemes használni, nem írás-olvasó operandusnak (+r).

15.08.2015
  • ldr r0, =label is működne, hacsak a literálkészlet nem túl távoli. A mozgatási utasításoknak nincs elég bitje a 32 bites érték regiszterbe való betöltéséhez. Azt is észrevettem, hogy az 1b lecserélése bármilyen más karakterláncra is lefordítható, ezért azt gondolom, hogy a szintaxisom egy kicsit rossz. Gyanítom, hogy a beépített összeállítás nem találja az 1b címkét, és az alapértelmezett értéke 0. 15.08.2015
  • @squirem: lemaradtál a 2. bekezdésemről? Próbáld összekapcsolni, ne csak összeszerelni. Köszönöm az ARM asm-mel kapcsolatos tippet. Annyira hozzászoktam az x86-hoz, hogy nem is gondoltam a 32 bites azonnali nehézségekre egy fix insn hosszúságú ISA-ban. 15.08.2015
  • @squirem Ha az összeszerelő nem találja a címkét, akkor hangosan panaszkodik és megbukik. Ahogy Peter utal rá, az assembler nem tudja, mi lesz az abszolút cím, ezért 0-t kódol, és áthelyezést bocsát ki az objektumban, hogy a linker később kijavítsa – figyelje meg, hogyan kellett az assemblernek generálnia. valódi címke (.L11) a helyi címke helyett. Próbáld ki a objdump -r-t, hogy megnézd a kirakós hiányzó darabját ;) 15.08.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..