ldr r0, #0x28
Mitä thw ldr
-ohje antaa? Ladataanko se merkkijono jostakin offsetista? Kuinka löydän tosiasiallisesti ladatun merkkijonon / arvon?
Kommentit
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
#0x28
eikä=#0x28
?