Jos kirjoitan
asm("mov r0, #1000");
niin kääntäjä toimii. Jos kirjoitan
asm("mov r0, #1001");
niin tulee ilmoitus:
Error: invalid constant (3e9) after fixup
Onko tuo ominaisuus, bugi, jäynä tai onko minulta jäänyt jotain huomaamatta?
Rekisteriin voi kyllä ladata muistista ihan minkä luvun tahansa.
asm("mov r0, #1000");
niin kääntäjä toimii. Jos kirjoitan
asm("mov r0, #1001");
niin tulee ilmoitus:
Error: invalid constant (3e9) after fixup
Onko tuo ominaisuus, bugi, jäynä tai onko minulta jäänyt jotain huomaamatta?
Rekisteriin voi kyllä ladata muistista ihan minkä luvun tahansa.
Vastaukset 2
Vanhimmat
Kannattaa kaivaa prosessorin manuaali esiin ja katsoa miten tuo vakio on koodattu mov r0, ... käskyyn. Siinä todennäköisesti on jokin bitti raja. Tuo 1000 voidaan ilmaista <= 10 bitillä:
1000 = 250 << 2 (eli 8 -bit vakio 2 bittinen siirto vakio, esim. mov r0, 250, rol 2)
1000 = 125 << 3 (eli 7 -bit vakio 2 bittinen siirto vakio, esim. mov r0, 125, rol 3)
Tuota 1001 ilmaisemiseen siirtobittejä ei voi käyttää, joten vakio osan pitäisi olla 12 -bittiä. Joten todennäköisesti joku tuollainen rajoitus tulee vastaan. Eli luku 1016 on seuraava minkä voi ilmaista, (jos vakio osa 8-bittinen niin silloin 1004).
eikös arduino ole Atmel AVR -pohjainen?
Niissä rekisteri on 8 bittiä.
Jos kääntäjä on tehty niin, että samaa rekisteriä voi kohdella joko etumerkittömänä tai etumerkillisenä, silloin hyväksyttävä arvoalue on:
-128 .. 255
Mikä tahansa tuon alueen ulkopuolinen luku pitäisi aiheuttaa virheilmoitus.
Jos kerran 1000 ei tuota virheilmoitusta, se on kääntäjän bugi.