NepřihlášenKSP fórum
Fórum Hlavní stránka Nápověda Hledat Přihlásit
Nahoru Téma KSP / Úložky / Simulátor assembleru
- - Od Miskin001 (Bronzový hroch) Dne 25. 10. 2017 22:37
Ahoj,
je správně, že tento příkaz mi nepřijímá?
MUL r0, #2
Píše mi u toho, že přijímá registry, ale třeba u sčítání nebo oddčítání mi to projde, tak nevím.

Michal
Nadřazený - - Od Filip Štědronský (Org) Dne 25. 10. 2017 23:08
Ano, je to tak správně. Instrukce MUL je trochu divná a mimo jiné umí pracovat pouze s registry. Je tedy třeba si konstantu nejdřív uložit do nějakého registru.
Nadřazený - - Od Miskin001 (Bronzový hroch) Dne 26. 10. 2017 14:32 Upraveno 26. 10. 2017 14:39
Ahoj,
ještě bych se rád zeptal, kdy se nastavuje carry flag? Podle toho co jsem vypozoroval, tak se nastaví, pokud je rozdíl 0 či větší, což by potvrzovalo podmínku HS, ale je to s rozporu (podle mě) s podmínkou HI, kde a > b, pokud zero flag není nastaven a zároveň ani carry flag. Nemělo by tam být, pokud není nastaven zero flag a zároveň je nastaven carry flag? Protože teď jak to je to v té tabulce napsané mi to nedává smysl.
Nadřazený - - Od Medvěd (Org) Dne 04. 11. 2017 20:22
Omlouvám se za pozdní odpověď, úplně jsem Tvůj dotaz přehlédl. Do seriálu se opravdu vloudilo pár chyb okolo chování carry.

Především není vždycky pravda, že carry se nastavuje podle 32. bitu výsledku. To platí při sčítání, ale při odčítání ARM definuje carry opačně, než většina procesorů: nastaví ho na jedničku, pokud odečtení nepřeteče. Díky tomu je podmínka HS totéž, co CS (i když jsem čekal CC).

Popis HI a LS v tabulce je špatně. HI má být C=1 a současně Z=0; LS má být C=0 nebo Z=1.

Zadání opravím.
Nadřazený - - Od Miskin001 (Bronzový hroch) Dne 06. 11. 2017 12:28
To se toho hodně vysvětuje. Ale neměl si spíše namysli, že výsledek bude nezáporný než nepřeteče? Protože potom u těchto dvou příkladů by měl mít registr 2 různé hodnoty (ale nemá).
1)
MOV r0, #1
MOV r1, #4
CMP r0, r1

BVS konec
MOV r2, #20
konec:
2)
MOV r0, #5
MOV r1, #4
CMP r0, r1

BVS konec
MOV r2, #20
konec:
Nadřazený - - Od Medvěd (Org) Dne 07. 11. 2017 08:43
Pozor na to, že sčítání čísel se znaménkem a bez znaménka je sice tatáž operace (díky dvojkovému doplňku), ale to, kdy výsledek přeteče a kdy ne, se už liší.
Vlajka V indikuje znaménkové přetečení, vlajka C (nebo u SUB její negace) indikuje to bezznaménkové.

Ve Tvém příkladu 1-4 ani 5-4 chápané jako čísla se znaménkem nepřetečou (výsledky jsou -3 a 1), takže vlajka V se ani v jednom případu nezastaví.
Nadřazený - - Od Miskin001 (Bronzový hroch) Dne 07. 11. 2017 23:36 Upraveno 08. 11. 2017 16:37
Tak to už potom chápu. Já jsem nevěděl, že flag C znamená přetečení pro bez znaménkovou operaci (teda nepřetečení u odčítání). Ani mi nepřišlo divné, že u bezznaménkových porovnávání se používá flag C a u znaménkových flag V.
Ještě jste se tam zmiňovali o sčítání dlouhých čísel za pomocí carry, je toto sčítání pouze pro bez znaménkové, když indikuje carry bezznaménkové přetečení?

Edit: Vložená zpátky otázku, kterou jsem smazal.
Nadřazený - - Od Medvěd (Org) Dne 08. 11. 2017 10:04
Kouzlo je v tom, že jak pro čísla se znaménkem, tak pro čísla bez znaménka
se sčítání a odčítání chovají úplně stejně -- binární reprezentace záporných
čísel je vymyšlena tak, aby to vyšlo.

Takže instrukci ADD je úplně jedno, když třeba sčítáš 0xfffffffd s 0x00000002,
nebo -3 a 2. Pokaždé vyjde 0xffffffff, jenom jednou si výsledek vyložíš jako
0xffffffff, podruhé jako -1.

> Ještě jste se tam zmiňovali o sčítání dlouhých čísel za pomocí carry, je
> toto sčítání pouze pro bez znaménkové, když indikuje carry bezznaménkové
> přetečení?


Pokud chceš sčítat dlouhá čísla se znaménkem, všechny složky až na tu
nejvyšší sčítáš bezznaménkově (tedy používáš carry), tu nejvyšší znaménkově.
Nadřazený - Od Miskin001 (Bronzový hroch) Dne 08. 11. 2017 11:33
O ano, mně to došlo, ale až potom co jsem to napsal. Já jsem si nedokázal uvědomit co znamená znaménkové a bezznamenkové přetečení, proto jsem ani nedokázal pochopit, jak to funguje sčítání/odčítání velkých čísel s carry.
- - Od kripnermatej@gmail.com Dne 05. 11. 2017 11:10
Ahoj, mám podobnou otázku ohledně následujícího programu:

MOV r0, #42
MOV r1, #7
SDIV r2, r0, r1

Je správě že vyhazuje chybu?:

./ccrR5i6v.s:83: Error: selected processor does not support ARM mode `sdiv r2,r0,r1'
Nadřazený - - Od Medvěd (Org) Dne 05. 11. 2017 19:37

> Je správě že vyhazuje chybu?:
>
> ./ccrR5i6v.s:83: Error: selected processor does not support ARM mode `sdiv r2,r0,r1'


Správně to není. Totiž: na ARMu jsou instrukce pro dělení nepovinné
a některé procesory je umí, jiné ne. Přenastavili jsme simulátor, aby
jeho virtuální procesor dělení uměl. Zkus to prosím znovu.

        Medvěd
Nadřazený - - Od kripnermatej@gmail.com Dne 07. 11. 2017 19:42 Upraveno 07. 11. 2017 19:44
Díky, dělení už funguje.
Mám ale jiný problém. Neměl by následující kód také fungovat (resp. assemblovat se a zacyklit)?

loop:
B loop

Dostávám chybu:

./cc6mhtjq.s:87: Error: symbol `loop' is already defined

Zatím jsem to vyřešil přidáním unikátního čísla do jména labelu:

loop%=:
B loop%=
Nadřazený - Od Filip Štědronský (Org) Dne 07. 11. 2017 19:51
Název 'loop' koliduje s nějakým předdefinovaným názvem
kompilátoru/standardní knihovny. Pokud to pojmenuješ třeba
'smycka' nebo jakkoli jinak, bude to fungovat.
Nahoru Téma KSP / Úložky / Simulátor assembleru

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill