Professional Documents
Culture Documents
Predznacno Prosirenje S 20 Na 32 Bita
Predznacno Prosirenje S 20 Na 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.
Primjeri:
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.
Primjeri:
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:
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.
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
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.