NepřihlášenKSP fórum
Fórum Hlavní stránka Nápověda Hledat Přihlásit
Nahoru Téma KSP / Úložky / Konstanty - asm
- - Od Miskin001 (Bronzový hroch) Dne 07. 06. 2018 21:54 Upraveno 07. 06. 2018 22:01
Ahoj,
trochu jsem si začal hrát s konstantami a zjistil jsem nepříjemnou věc. Váš simulátor ukládá konstanty do paměti tak, kam já nemůžu přistoupit:
Příklad:
ldr r0, text
ldrb r1, [r0]

text:
.ASCII "nesmyslny blabol"
.ALIGN 4

A vyhodila se mi chyba: Caught fatal signal 11 -> neoprávněný přístup do paměti
Nadřazený - - Od Medvěd (Org) Dne 07. 06. 2018 22:59
To je tím, že "ldr r0, text" přečte do r0 číslo uložené na adrese dané návěštím text, tedy sestávající se z ASCII kódů písmenek "nesm". Druhá instrukce se pak snaží toto číslo použít jako adresu a přečíst z ní další bajt. Myslím, že chceš použít spiš "ldr r0,=text".
Nadřazený - Od Miskin001 (Bronzový hroch) Dne 08. 06. 2018 19:11
Díky! Jak jste to zmiňovali s tou zkratkou, tak jsem to špatně pochopil.
Nadřazený - Od Pali (Org) Dne 07. 06. 2018 23:05
Ahoj!

Inštrukcia ldr r0, text zoberie slovo (4 bajty) z adresy označenej labelom text a to interpretuje ako adresu, z kade načíta slovo do registru r0. Direktíva .ASCII "nesm" sú 4 bajty a reprezentuje číslo/adresu 0x6d73656e. A tam sa naozaj v našom simulátore pristúpiť nedá.

Ak ale použiješ zápis ldr r0, =text, tak = pred text spôsobí, že sa do registru r0 načíta samotná adresa labelu text a nie jej obsah.

Môžeš si to vyskúšať na nasledujúcom príklade. Konštanta 0x109cc je experimentálne zistená adresa labelu text.

ldr r0, =text
ldr r1, [r0]
ldr r2, text2
ldr r3, [r2]
b end

text:
.ASCII "nesmyslny blabol"
.ALIGN 4

text2:
.word 0x109cc

end:
Nadřazený - - Od Pali (Org) Dne 07. 06. 2018 23:32
V prípade, že chceš zistiť adresu labelu, ktorý je niekde "blízko" a uložiť ju do registru, môžeš k tomu použiť aj pseudo-inštrukciu adr (bez =). Tzn. v svojom príklade iba nahraď ldr za adr.

adr r0, text
ldrb r1, [r0]

text:
.ASCII "nesmyslny blabol"
.ALIGN 4


Pri použití ldr si kompilátor niekde bokom uloží skutočnú adresu labelu text. Potom =text nahradí za adresu, kde sa uložila tá adresa labelu text.

Pseudo-inštrukcia adr funguje trochu inak. Naroziel od ldr, kompilátor nahradí pseudo-inštrukciu adr za inú, ktorá vyráta adresu toho labelu "za behu". Samotná adresa labelu sa nikde v programe už nevyskytuje. V tomto prípade kompilátor nahradí pseudo-inštrukciu adr r0, text za add  r0, pc, #0. Čo do registru r0 vyráta adresu labelu text pomocou pc registra.
Nadřazený - - Od Miskin001 (Bronzový hroch) Dne 08. 06. 2018 19:16 Upraveno 08. 06. 2018 19:48
Díky!
Ale narazil jsem na problém - když mám konstantu:
text:
.ASCII <formát>
.BYTE 0x0
.ALIGN 4

tak pokud do formátu napíšu: "%d\n %d", tak to proběhne
pokud tam napíšu: "%d\n%d", tak mi to vyhodí: Caught fatal signal 11
a pokud tam napíšu: "%d \n %d", tak mi to vyhodí: Assertion failed: !have_tb_lock (/home/buildozer/aports/main/qemu/src/qemu-2.8.1/translate-all.c: tb_lock: 175) Caught fatal signal 11

Vůbec netuším, proč projde jen to první a ne ty ostatní (parametrové registry jsem měl nastavené).

PS. Zapomněl jsem říct, že volám printf a toto je formátovací string.
Nadřazený - - Od Medvěd (Org) Dne 08. 06. 2018 19:53
Pošli mi prosím celý program e-mailem na mj@ucw.cz.
Nadřazený - Od Miskin001 (Bronzový hroch) Dne 08. 06. 2018 19:57
Posláno.
- - Od Miskin001 (Bronzový hroch) Dne 27. 06. 2018 15:20
Ahoj,
1) udělal jsem úkol 5 (úprava printf) akorát se nečíslují všechny řádky (neřádkuje se nadpis - obsah registrů). Ukázka:

0.   Nebudu si číst pod lavicí popis instrukční sady ARMu.
--------------------------------
Obsah registrů na konci programu
--------------------------------
1.   r0 = 59 / 59 / 0x10b78
...
13.   r12 = 4135575614 / -159391682 / 0x10b78

Jen se chci ujistit, že je to takto v pořádku či nikoliv.

2)
u STREX jste napsali: "..zápis do paměti se provede jen tehdy, pokud k adrese mezitím nikdo jiný nepřistoupil..."
a potom jste napsali: "..můžeme zjistit, že se počítadlo během našeho zvyšovaní změnilo, a v takovém případě přečtenou hodnotu zahodit..."

Tak kdy STREX selže? Pokud na tu adresu vůbec přistoupím v druhém vlákně (například si z adresy jen načtu hodnotu pomocí LDREX) nebo hodnotu na adrese opravdu změním?
Já bych se přiklonil k té druhé variantě, ale první variantu mi potvrzuje odstavec před úkolem 1.

Michal
Nadřazený - Od Medvěd (Org) Dne 27. 06. 2018 16:05

> 1) udělal jsem úkol 5 (úprava printf) akorát se nečíslují všechny řádky (neřádkuje se nadpis - obsah registrů).


To je v pořádku.

> Tak kdy STREX selže? Pokud na tu adresu vůbec přistoupím v druhém vlákně
> (například si z adresy jen načtu hodnotu pomocí LDREX) nebo hodnotu na
> adrese opravdu změním?


To první je správně.
Nadřazený - - Od Filip Štědronský (Org) Dne 27. 06. 2018 16:11

> 1) udělal jsem úkol 5 (úprava printf) akorát se nečíslují všechny řádky (neřádkuje se nadpis - obsah registrů).


To je chyba na naší straně, ukazuje se, že Céčkový kompilátor v rámci optimalizací
změnil některá volání printf na puts (přestože optimalizace máme schválně vypnuté).
Už by to mělo být opravené, Tvůj kód už teď očísluje všechny řádky (kromě té
poslední s OK, ale ta pochází od jiného programu, takže to na ní nemůže mít vliv).

Jinak asi to není ze zadání úplně jasné, protože píšeme, že by se měly číslovat
řádky, ale ve skutečnosti stačí číslovat jednotlivá volání printf. Takže pokud by
někdo chtěl vypsat více řádků jedním printf, stačí jedno číslo na začátku. Poctivé
číslování řádek by bylo zbytečně těžké.
Nadřazený - Od Miskin001 (Bronzový hroch) Dne 27. 06. 2018 17:59
Tak to jsem i tu funkci upravil a doufal, že to bude stačit. :)
Nahoru Téma KSP / Úložky / Konstanty - asm

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill