Kuinka ldr-ohje toimii ARM: lla?

ldr r0, #0x28 

Mitä thw ldr -ohje antaa? Ladataanko se merkkijono jostakin offsetista? Kuinka löydän tosiasiallisesti ladatun merkkijonon / arvon?

Kommentit

  • oletko varma siitä, että ' s #0x28 eikä =#0x28?

Vastaa

LDR lataa 32-bittisen vakion (LDRH (puolisana): 16-bittinen, LDRB (tavu): 8-bittinen) muistista määritettyyn kohderekisteriin (esimerkissä r0).

Koska 32-bittisiä vakioita ei voida koodata 32-bittisissä opkodeissa (tai 16-bittisissä Thumb-käskyissä), assembler tallentaa vakion tekstisegmenttiin lähellä viittausohjetta ja viittaa arvoon sitten ( yleensä) PC-suhteellinen osoite, ts. jokin siirtymä r15: stä.

Ldr on siis itse asiassa näennäiskäsky. Seuraava koodi

 .code 32 main: ldr r0, =0x12345678 bx lr 

kokoonpanija kääntää

00000000 <main>: 0: e51f0000 ldr r0, [pc, #-0] ; 8 <main+0x8> 4: e12fff1e bx lr 8: 12345678 .word 0x12345678 

Kuten voit katso, alkuperäisessä ldr-käskyssä mainittu vakio on itse asiassa tallennettu osoitteeseen 0x8 itse käskyn sijaan. Osoitteessa 0 oleva ldr-käsky viittaa sitten tähän arvoon käyttämällä PC-suhteellista osoitetta. PC: n siirtymä on 0 (8: n sijaan), koska todellinen PC-arvo on aina nykyisen käskyn osoite + 8 – tämä on varhaisen ARM-prosessoriputken vaikutus, joka on säilytettävä yhteensopivuuden vuoksi.

vastaus

Tämä voidaan kääntää seuraavasti:

r0 = 0x28; 

ARM-kokoonpanossa # merkitsee välittömät arvot ja r0, r1, … ovat rekistereitä. ldr -komennolla voi olla seuraavat syntaktiset muodot (sinun on ensimmäinen rivi):

LDR{type}{cond} Rt, [Rn {, #offset}] ; immediate offset LDR{type}{cond} Rt, [Rn, #offset]! ; pre-indexed LDR{type}{cond} Rt, [Rn], #offset ; post-indexed LDRD{cond} Rt, Rt2, [Rn {, #offset}] ; immediate offset, doubleword LDRD{cond} Rt, Rt2, [Rn, #offset]! ; pre-indexed, doubleword LDRD{cond} Rt, Rt2, [Rn], #offset ; post-indexed, doubleword 

Vastaa

ldr ilman = lataa tietokone suhteellisesti

Tämä pätee sekä tarroihin että numeroihin.

Mutta käytät tietysti harvoin numerot suoraan kokoonpanossa. Ehkä olet toimittanut purkamisen ilman tarroja?

Molemmat seuraavista töistä GNU GAS ARMv8: ssa. Tunnisteella:

 ldr x0, pc_relative_ldr b 1f pc_relative_ldr: .quad 0x123456789ABCDEF0 1: /* x0 == 0x123456789ABCDEF0 */ 

siirtymällä:

 ldr x0, 0x8 b 1f .quad 0x123456789ABCDEF0 1: /* x0 == 0x123456789ABCDEF0 */ 

Molemmat vastaavat. Asentaja muuntaa vain tarran oikeaan offsetiin.

GitHub ylävirtaan väitteillä .

STR: llä ei ole PC-suhteellista osoitetta, kuten LDR ARMv8: ssa, sinun on ensin laskettava osoite rekistereihin: https://stackoverflow.com/questions/28638981/howto-write-pc-relative-adressing-on-arm-asm/54480999#54480999

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *