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
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
#0x28
és nem=#0x28
?