jeni duke lexuar...
Leksione

Overflow – Hardware/Software Interface

Odometer-overflow

Eshtë i njohur fakti që fenomeni “overflow” (kapërderdhje) ndodh kur rezultati i nje veprimi arithmetik nuk mund te paraqitet me hardwarin qe kemi në dispozicion dhe që sinjalizohet nga indikatori (“flag”) OF.  Ky indikator shprehet nga barazimi OF=CF XOR rs dhe kur nje “overflow” ndodh kemi automatikisht që OF=1.

Si percillet fenomeni i “overflow” qe zë fill ne ALU , pra në “hardware” drejt “softwarit”?  Per kete le te marrim si shembull procesoret e familjes MIPS.

Gjuhet C dhe Java nuk i marrin parasysh “overflow” per numrat e plote (integer), ndersa Fortran dhe ADA sinjalizojne kur ai ndodh. I takon pastaj programuesit te vendose se çfare duhet te beje. Nga ana tjeter kompjuterat manipulojne edhe numra pa shenje (p.sh. adresa te operandave ne kujtese) per te cilet fenomeni i “overflow” mund edhe te injorohet, pasi nuk perben ndonje problem serioz (pasi nuk kane shenje). Kjo do te thote qe ne disa raste “overflow” duhet te trajtohet, ndersa ne raste te tjera te injorohet. Per keto arsye procesoret MIPS kane dy grupe instruksionesh arithmetike :

add (add) , addi (add imediate),  sub (subtract)  – shkatojne nje nderprerje ne rastin e nje “overflow”.

addu (add uninsigned) , addiu (add imediate uninsigned),  subu (subtract uninsigned)  – NUK shkatojne nje nderprerje ne rastin e nje “overflow.

Perderisa gjuha C nuk merr parasysh “overflow”, kompliatoret C per MIPS gjenerojne gjithmone, pavarsisht llojit te variablave, versionet u (uninsigned ) te instruksioneve (addu, addiu, subu). Kompilatoret Fortan per MIPS, ne varesi te llojit te operandave, perdorin grupin e duhur te instruksioneve arithmetike.

Siç permendem edhe me siper, procesoret MIPS e trajtojne “overflow” si nje nderprerje. Keshtu adresa e instruksionit qe gjeneroi nje nderprerje, ruhet ne nje regjister dhe CPU kercen ne ekzekutimin e nje rutine te caktuar qe duhet te trajtoje dhe korigjoje efektin e “overflow”.

Per mikroprocesoret e familjes Intel në lidhje me  indikatorin “overflow” lexoni ketu. Me poshte eshte nje shembull i perdorimit te instruksioni jno = Jump if No Overflow per numra te plote me shenje (signed integers).

/* Performs r = a + b, returns 1 if the result is safe (no overflow), 0 otherwise */

int add_i32(int32_t a, int32_t b, int32_t* r)

{   

    volatile int no_overflow = 1;

    volatile int32_t result = a + b;

    asm volatile

    (

     “jno 1f          ;”

     “movl $0, %[xo]  ;”

     “1:              ;”

     : [xo] “=m” (no_overflow)

     );

    if(r)

        *r = result;

    return no_overflow;

}

Ka ndodhur…

Nje “overflow” i trajtuar jo siç duhet ishte shkaku kryesor i deshtimit te misionit Ariane 5, Flight 501 duke shkaktuar nje dëm prej…370 milion$. Ketu me poshte eshte nje pese e kodeve ne gjuhen ADA qe shkaktuan rrezimin e kesaj rakete.

Ne rreshtin e fundit te ketij kodi kryhet nje konvertim nga  “64 bit floating point” ne “16 bit signed integer”. Ky konvertim, ne nje moment te caktuar, ka gjeneruar nje “exepsion” si pasoje e “overflow”, por ai nuk eshte parashikuar te trajtohet ne kete rresht ne program, gje e cila eshte bere ne rreshtat e meparshem te kodit te paraqitur ketu. Ky injorim i  “overlow” kushtoi vetem …370 milion $. Ketu eshte raporti i plote i Komisionit qe hetoi mbi shkaqet e rrezimit te Ariane 5, Flight 501: Ariane 5 – flight 501 failure

L_M_BV_32 := TBD.T_ENTIER_32S ((1.0/C_M_LSB_BV) * G_M_INFO_DERIVE(T_ALG.E_BV));

if L_M_BV_32 > 32767 then

P_M_DERIVE(T_ALG.E_BV) := 16#7FFF#;
elsif L_M_BV_32 < -32768 then

P_M_DERIVE(T_ALG.E_BV) := 16#8000#;
else

P_M_DERIVE(T_ALG.E_BV) := UC_16S_EN_16NS(TDB.T_ENTIER_16S(L_M_BV_32));
end if;
P_M_DERIVE(T_ALG.E_BH) :=
UC_16S_EN_16NS (TDB.T_ENTIER_16S ((1.0/C_M_LSB_BH) * G_M_INFO_DERIVE(T_ALG.E_BH)));

Diskutim

Ende pa komente.

Lini një Përgjigje

Ju lutemi, bëni hyrjen me një nga këto metoda që të postoni komentin tuaj:

Stema e WordPress.com-it

Po komentoni duke përdorur llogarinë tuaj WordPress.com. Dilni /  Ndryshoje )

Foto Google

Po komentoni duke përdorur llogarinë tuaj Google. Dilni /  Ndryshoje )

Foto Twitter-i

Po komentoni duke përdorur llogarinë tuaj Twitter. Dilni /  Ndryshoje )

Foto Facebook-u

Po komentoni duke përdorur llogarinë tuaj Facebook. Dilni /  Ndryshoje )

Po lidhet me %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Regjistroni adresën tuaj e-mail për të marrë artikujt e rinj nëpërmjet mesazheve ...

Kategori

Intel CPU Architectures

Procesore Apple Ax

Apple A12 Bionic
Këtë e pëlqejnë %d blogues: