Hogyan működik az ldr utasítás az ARM-en?

ldr r0, #0x28 

Mit ad a thw ldr utasítás? Betölti a karakterláncot valamilyen ofszetből? Hogyan találom meg a ténylegesen betöltött karakterláncot / értéket?

Megjegyzések

  • biztos benne, hogy ' s #0x28 és nem =#0x28?

Válasz

Az LDR egy 32 bites konstansot (LDRH (félszó): 16 bites, LDRB (bájt): 8 bit) tölt be a memóriából a megadott célregiszterbe (példájában r0).

Mivel a 32 bites konstansokat nem lehet kódolni 32 bites opkódokban (vagy 16 biteseket a Thumb utasításoknál), az assembler az állandót a szövegszegmensben tárolja a hivatkozási utasítás közelében, majd a ( általában) PC-relatív címzés, azaz valamilyen eltérés az r15-től.

Így az ldr valójában ál utasítás. A következő kódot

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

az összeállító lefordítja

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

Amint lehet lásd, az eredeti ldr utasításban hivatkozott konstans valójában a 0x8 címen tárolódik, nem pedig magában az utasításban. A 0. címen található ldr utasítás ezt követően erre az értékre hivatkozik, PC-relatív címzéssel. A PC eltolódása 0 (8 helyett), mivel a tényleges PC érték mindig az aktuális utasítás címe + 8 – ez a korai ARM processzor folyamatának hatása, amelyet meg kell őrizni a kompatibilitás érdekében.

Válasz

Ez egyszerűen lefordítható:

r0 = 0x28; 

Az ARM összeállításban a # jelöli az azonnali értékeket, a r0, r1, … regiszterek. A ldr utasítás a következő szintaktikai formákat öltheti (a tiéd az első sor):

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 

Válasz

ldr = a PC relatív terhelést hajt végre

Ez a címkékre és a számokra egyaránt igaz.

De természetesen ritkán fogja használni számokat közvetlenül a szerelvényben. Esetleg szétszerelést biztosított címkék nélkül?

A GNU GAS ARMv8 mindkét alábbi munkája. Címkével:

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

eltolással:

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

Mindkettő egyenértékű. Az assembler véletlenül átalakítja a címkét az Ön számára megfelelő korrekcióvá.

GitHub upstream állításokkal .

Az STR nem rendelkezik olyan PC-relatív címzéssel, mint az LDR az ARMv8-ban, csak először regisztrálnia kell a címet: https://stackoverflow.com/questions/28638981/howto-write-pc-relative-adressing-on-arm-asm/54480999#54480999

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük