Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 2

20 ili 32 bita ......

Pravilo koje smo nekoliko puta na predavanjima rekli je slijedeće: neposredna vrijednost zapisana u strojnom kodu
naredbe se prilikom izviđenja te naredbe predznačno proširuje sa 20 na 32 bita na temelju najvišeg (dvadesetog) bita
neposredne vrijednosti. Prema tome, za vrijeme izvođenja gornjih 12+1=13 bitova mogu biti ILI SVE NULE ILI SVE
JEDNICE. Kako bi se izbjegle greške u programiranju, prilikom pisanja programa, kad zadajete neposrednu vrijednost,
onda također mora poštivati to ograničenje.

Asemblerski prevoditelj će broj kojeg ste napisali u programu pretvoriti u 32 bitni zapis i provjeriti njegovih gornjih 13
bitova. Ako u tim bitovima ima i NULA i JEDINICA, onda će javiti grešku "number out of range". Brojeve koje pišete u
programu će asemblerski prevoditelj tumačiti na dva načina. Ako ste napisali pozitivan broj, onda će ga prevoditelj
pretvoriti u 32-bitni NBC i na njemu provjeravati gornjih 13 bitova. Ako ste napisali broj s negativnim predznakom, onda
će ga pretvoriti u 32-bitni 2'k i na njemu provjeravati gornjih 13 bitova.

U praksi imate TRI situacije:

A) Mali pozitivni brojevi


Ovo su brojevi koji se promatraju kao NBC i koji se mogu zapisati u 19 bitova, tako da će 20-ti bit uvijek biti NULA.
FRISC će prilikom izvođenja naredbe u gornjih 12 bitova staviti NULE pa prema tome bilo koja neposredna vrijednost
koju pišete u Vašem programu, a koja ima na gornjih 13 bitova NULE, može se pisati i bez da navodite te sve nule:

Primjeri:

napisana naredba -> prevodi se u strojni kod -> izvodi se kao

ADD R0, 1, R0 -> ADD R0, 00001, R0 -> ADD R0, 00000001, R0
ADD R0, 12, R0 -> ADD R0, 00012, R0 -> ADD R0, 00000012, R0
ADD R0, 123, R0 -> ADD R0, 00123, R0 -> ADD R0, 00000123, R0
ADD R0, 1234, R0 -> ADD R0, 01234, R0 -> ADD R0, 00001234, R0
ADD R0, 12345, R0 -> ADD R0, 12345, R0 -> ADD R0, 00012345, R0
ADD R0, 123456, R0 -> GREŠKA

zadnji redak je greška jer se ne može prevesti u ADD R0,00123456, R0. Naime, broj 123456 je prevelik za 19 bita, tj.
gornjih 13 bitova nisu ili svi NULA ili svi JEDAN. Broj 00123456 binarno izgleda ovako:
0000 0000 0001 0010 0011 0100 0101 0110, tj. u gornjih 12 bitova ima i NULE i JEDINICE.

B) Veliki pozitivni brojevi


Ovi brojevi se također promatraju kao NBC brojevi, ali oni će u gornjih 13 bitova uvijek imati sve JEDINICE. Prilikom
izvođenja FRISC će 20-ti bit (koji je u jedinici) poširiti na 12 gornjih bitova. Broj koji pišete u vašem programu mora
biti napisan tako da navedete svih 32 bita, zato da bi asembler znao da Vi uistinu želite tu vrijednost. Time se sprječava
nehotična greška programera u kojoj se u programu napiše jedan broj, a u izvođenju bi se koristio drugačiji broj.

Primjeri:

napisana naredba -> prevodi se u strojni kod -> izvodi se kao

ADD R0, FFFFFFFF, R0 -> ADD R0, FFFFF, R0 -> ADD R0, FFFFFFFF, R0
ADD R0, FFFFF123, R0 -> ADD R0, FF123, R0 -> ADD R0, FFFFF123, R0
ADD R0, FFF80000, R0 -> ADD R0, 80000, R0 -> ADD R0, FFF80000, R0
ADD R0, 80000, R0 -> greška jer bi procesor koristio broj FFF80000

Ne smijete napisati ADD R0,80000,R0 iako se u strojnom kodu može zapisati 80000 unutar 20 raspoloživih bitova. To je
zabranjeno pisati jer asembler ne zna da li ste vi svjesni da će procesor zbog predznačnog proširenja na temelju 20-tog
bita ovu naredbu izvesti kao ADD R0,FFF80000, R0. Prema tome asembler od Vas u ovom slučaju očekuje da napišete
svih 32 bita neposredne vrijednosti ADD R0,FFF80000, R0. Time se sprječava nehotična greška u kojoj ste u programu
napisali jedan broj (80000), a u izvođenju bi se koristio drugačiji broj (FFF80000).

Ne smijete napisati ADD R0,12345678,R0 iako ste zadali svih 32 bita. To je zabranjeno pisati jer ovaj broj u gornjih 13
bitova ima i NULE i JEDINCE. Iz istog razloga su zabranjeni i brojevi 00FFFFFF, FF000000 itd.
C) Negativni brojevi
Asemblerski prevoditelj dozvoljava pisanje negativnih brojeva. Ako napišete negativan broj, asembler podrazumijeva da
taj broj koristi format 32-bitnog dvojnog komplementa. Prvo će apsolutni iznos broja pretvoriti u binarni oblik, a nakon
toga će napraviti operaciju dvojnog komplementa. Dobiveni broj se provjerava kako je gore opisano za slučajeve A) i B),
tj. dobiveni broj mora imati u gornjih 13 bitova ili SVE JEDINICE ili SVE NULE.

Primjeri:

napisana naredba -> prevodi se u strojni kod -> izvodi se kao

ADD R0, -1, R0 -> ADD R0, FFFFF, R0 -> ADD R0, FFFFFFFF, R0
ADD R0, -123, R0 -> ADD R0, FFEDD, R0 -> ADD R0, FFFFFEDD, R0
ADD R0, -12345, R0 -> ADD R0, EDCBB, R0 -> ADD R0, FFFEDCBB, R0
ADD R0, -123456, R0 -> GREŠKA

Zadnji redak je greška jer broj -123456 zapisan u 32-bitnom dvojnom komplementu iznosi FFEDCBAA, tj. u binarnom
zapisu 1111 1111 1110 1101 1100 1011 1010 1010, a taj broj u gornjih 13 bitova ima i NULE i JEDINCE, što znači da se
taj broj (-123456) ne može dobiti predznačnim proširivanjem prilikom izvođenja naredbe ADD.

Još par primjera ispravnih neposrednih vrijednosti napisanih u programu:

1, 123, 4FFFF, 7FFFF

FFF80000, FFFF0000, FFF87654

-12, -FFFF, - 7FFFF

Primjeri:

ADD R0, 12345678, R1 će bit GREŠKA jer se u naredbi može kodirati samo 20 bitovna konstanta a ostalih gornjih 12
bita mogu biti ili sve nule ili sve jedinice

LOAD R0, (123456) je GREŠKA jer broj 123456 nije broj koji ima u gornjih 12+1 bita sve NULE ili sve JEDINICE
(opet ista priča kao i ranije). prema tome

LOAD R0, (12345) bi bilo OK,

LOAD R0, (32345) bi bilo OK,

LOAD R0, (72345) bi bilo OK

no LOAD R0, (82345) bi bila GREŠKA (number out of range) jer je 20ti bit jedinica i procesor bi to shvatio kao LOAD
R0, (0FFF82345) što je razlika u odnosu na ono što je programer napisao te je to GREŠKA.

You might also like