mokjomjopi

10
Quadern de laboratori Estructura de Computadors Emilio Castillo José María Cela Montse Fernández David López Joan Manuel Parcerisa Angel Toribio Rubèn Tous Jordi Tubella Gladys Utrera Departament d’Arquitectura de Computadors Facultat d’Informàtica de Barcelona Quadrimestre de Primavera - Curs 2014/15 Aquest document es troba sota una llicència Creative Commons

description

gigvgi

Transcript of mokjomjopi

  • Quadern de laboratoriEstructura de Computadors

    Emilio CastilloJos Mara CelaMontse FernndezDavid LpezJoan Manuel ParcerisaAngel ToribioRubn TousJordi TubellaGladys Utrera

    Departament dArquitectura de ComputadorsFacultat dInformtica de BarcelonaQuadrimestre de Primavera - Curs 2014/15Aquest document es troba sota una llicncia Creative Commons

  • Licencia Creative CommonsEsta obra est bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 Espaa de Creative Commons. Para ver una copia de esta licencia, visite

    http://creativecommons.org/licenses/by-nc-sa/2.5/es/

    o envie una carta a

    Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

    Usted es libre de: copiar, distribuir y comunicar pblicamente la obra hacer obras derivadas

    Bajo las condiciones siguientes: Reconocimiento. Debe reconocer los crditos de la obra de la manera especificada por el autor

    o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra).

    No comercial. No puede utilizar esta obra para fines comerciales. Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una obra derivada,

    slo puede distribuir la obra generada bajo una licencia idntica a sta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los

    derechos de autor Nada en esta licencia menoscaba o restringe los derechos morales del autor.

    Advertencia: Este resumen no es una licencia. Es simplemente una referencia prctica para entender el Texto Legal (la licencia completa).Los derechos derivados de usos legtimos u otras limitaciones reconocidas por ley no se ven afectados por lo anterior.

  • - 53 -

    Sessi 4: Codificaci en coma flotant

    Objectiu: Estudiar la codificaci de nombres en coma flotant, i practicar la manipulaci de

    bits (desplaaments i operacions lgiques bit a bit), i la codificaci de subrutines.

    Lectura prvia

    En aquesta sessi posarem en prctica els coneixements sobre subrutines, sobre

    operacions amb camps de bits, i sobre el format de coma flotant per crear un programa en

    assemblador que resolgui el segent problema: sigui A un nmero real codificat en un cert

    format de coma fixa en base 2, es demana convertir-lo en el nmero real R equivalent,

    codificat en el format de coma flotant de simple precisi.

    El format de coma fixa (format inicial)

    El format de coma fixa del nmero A s el segent: t 32 bits, el bit 31 cont el signe (0

    per als positius) i la resta de bits del 30 al 0 representen la magnitud, codificada en el sistema

    posicional de base 2, amb 19 bits a lesquerra de la coma (part entera) i 12 bits a la dreta

    (part fraccionria)

    011123031

    ,A =

    valorimplicit A( ) 1( )A31 Ai 2i 12

    i 0=

    30

    =

    S Magnitud, amb part entera i part fraccionria

    :

    El format de coma flotant IEEE-754 de simple precisi (format final)

    El format de coma flotant del nmero R, de simple precisi definit a lestndard IEEE-

    754 tamb t 32 bits: el bit 31 cont el signe (0 per als positius); els 23 bits de menys pes

    contenen la mantissa, en base 2, fraccionria, normalitzada, amb bit ocult i coma a la dreta

    daquest bit; i els restants 8 bits (del 23 al 30) contenen lexponent, un enter codificat en

    excs a 127:

    022233031

    ,R =

    valorimplicit R( ) 1( )R31 1 Ri 2i 23

    i 0=

    22

    +

    2

    127 Ri 2i 23

    i 23=

    30

    +

    =

    S Exponent Mantissa

  • Sessi 4: Codificaci en coma flotant Estructura de Computadors

    - 54 -

    Enunciats de la sessi

    Aquesta sessi es dedicar a escriure el segent programa de conversi de coma fixa a coma

    flotant, seguint les instruccions del text. Els formats de coma fixa i de coma flotant en simple

    precisi estan explicats a la Lectura Prvia.

    int signe;int exponent;int mantissa;int cfixa = 0x87D18A00; // nmero inicial, en coma fixafloat cflotant; // resultat final, en coma flotant

    main() {descompon(cfixa, &signe, &exponent, &mantissa);cflotant = compon(signe, exponent, mantissa);

    }

    Figura 4.1: Programa en alt nivell que converteix un nmero en coma fixa a coma flotant

    El programa de conversi (figura 4.1), sexecuta en dos passos:

    Funci descompon. Descompon el nmero en coma fixa en tres parts: signe,

    mantissa normalitzada i exponent en excs a 127.

    Funci compon. Compon les tres parts, signe, mantissa i exponent, en un nic nmero

    en coma flotant en simple precisi.

    Per emmagatzemar les tres parts obtingudes al primer pas definirem tres enters de mida

    word: signe, exponent i mantissa. En les activitats segents es detalla el funcionament de

    les dues subrutines.

  • - 55 -

    Estructura de Computadors Sessi 4: Codificaci en coma flotant

    Activitat 4.A: Funci descompon

    La funci descompon (veure figura 4.2) rep com a parmetres un nombre en coma fixa cf i

    tres enters passats per referncia. La funci extrau de cf els segents valors: el signe (0 o 1);

    mantissa normalitzada i sense bit ocult (23 bits); i exponent en excs a 127 (8 bits), i els

    guarda als enters signe, mantissa i exponent.

    Figura 4.2: Codi en alt nivell de la subrutina descompon

    void descompon(int cf, int *s, int *e, int *m) {int exp;

    *s = (cf < 0); // si s negatiu val 1, sin 0cf = cf = 0) { // normalitza i calcula exponent

    cf = cf > 8) & 0x7FFFFF; // alinear i eliminar bit ocultexp = exp + 127; // codificar en excs a 127

    }*e = exp; // guarda exponent resultant*m = cf; // guarda mantissa resultant

    }

    Recordem que el nombre en coma fixa es compon de signe (1 bit) i magnitud (31 bits).

    Per tant, la primera operaci de la subrutina consisteix a separar el signe de la magnitud: codi-

    fica el signe en lenter signe (0 si s positiu, 1 si s negatiu) i lelimina del nombre cf despla-

    ant tots els bits 1 posici a lesquerra. Fixat que la coma de la magnitud ara sha desplaat

    tamb 1 posici i est situada a la dreta del bit 13:

    1121331 0

    ,0 x 20magnitud = mantissa

    A continuaci es comprova si la magnitud val zero (pot ser un +0 o un -0, ja que hem

    eliminat el signe). Si la magnitud s zero, codificarem la mantissa cf i lexponent exp com

    zero.

    Si no s zero, per obtenir la mantissa normalitzada i lexponent corresponent, desplacem

    la coma 18 posicions a lesquerra fins a situar-la a la dreta del bit 31. Compte! que els bits no

  • Sessi 4: Codificaci en coma flotant Estructura de Computadors

    - 56 -

    es desplacen, tan sols hem dajustar el valor inicial de lexponent exp, que en lloc de 0 ser 18:

    131 0

    ,0 x 218magnitud =

    30

    mantissa

    Per normalitzar la mantissa caldr eliminar els zeros inicials que pugui tenir, desplaant

    la magnitud repetidament cap a lesquerra fins que el primer bit no nul ocupi la posici 31.

    Naturalment, aquest desplaament de la magnitud sense moure la coma equival a un desplaa-

    ment a la dreta de la coma, i en conseqncia necessita un ajust de lexponent, restant-li la

    mateixa quantitat. Lalgorisme (figura 4.2) consisteix en un bucle on a cada iteraci es despla-

    a cf 1 posici a lesquerra i es decrementa lexponent una unitat, fins que el bit ms signifi-

    catiu s 1. En aquest punt, podem dir que la mantissa ja est normalitzada i lexponent

    calculat. Per exemple, si suposem que aquest bucle itera k vegades, cf i exp queden aix:

    1+k31 0

    0 x 218-k0 k

    magnitud =,1

    mantissa

    30

    A continuaci, la mantissa normalitzada sha de desplaar a la dreta perqu ocupi els 24

    bits de menor pes de cf. Per tal que el bit 31 passi a ocupar la posici 23 cal fer un desplaa-

    ment a la dreta de 8 posicions.

    Desprs hem de deixar en cf una mantissa de sols 23 bits, posant a zero el bit ocult, que

    ara ocupa la posici 23, aix com els bits del 23 al 31, fent una and lgica amb la mscara

    0x7FFFFF:

    31 0

    0 ,0

    mantissa

    23 22

    Desprs, a lexponent exp li sumem 127 per codificar-lo en excs a 127.

    Finalment, guardem els resultats de cf i exp als enters mantissa i exponent.

  • - 57 -

    Estructura de Computadors Sessi 4: Codificaci en coma flotant

    Completa lexercici 4.1 abans de continuar:

    Exercici 4.1: Tradueix a assemblador MIPS la subrutina descompon.

    descompon:

    Al fitxer s4a.s estan ja programats el programa principal (main) i les declaracions de

    variables globals en assemblador MIPS. Afegeix-hi el codi de lexercici 4.1. A continuaci,

    carregal al simulador, assemblal i executal.

    Comprova que al final de lexecuci del programa signe = 1, que exponent=

    0x0000008D (141 en decimal), i que matissa = 0x007A3140.

    Activitat 4.B: Funci compon

    Figura 4.3: Codi en alt nivell de la subrutina compon

    float compon(int signe, int exponent, int mantissa){ return (signe

  • Sessi 4: Codificaci en coma flotant Estructura de Computadors

    - 58 -

    Completa lexercici 4.2 abans de continuar:

    Exercici 4.2: Programa en assemblador la subrutina compon.

    compon:

    Afegeix el codi de lexercici 4.2 al fitxer s4a.s. Veurs que el fitxer cont una subrutina

    compon provisional amb 1 sola instrucci, escrita per permetre fer proves a lactivitat 4.A:

    esborra-la. A continuaci, assemblal i executal.

    Comprova que el nmero resultant, en coma flotant, val cflotant=0xC6FA3140. Tamb

    pots comprovar el seu valor en decimal en el simulador. De quina manera ho consultars?

    Quin s el valor final de cflotant, en decimal, que dna Mars?

    Valor decimal de cflotant =

    Exercici 4.3: Codifica en coma fixa i en coma flotant (en hexadecimal) els segents nmeros:

    Decimalcfixa

    (valor inicial)cflotant

    (valor final)

    0.0 0x 0x

    - 0.0 0x 0x

    12.75 0x 0x

    Completa el segent exercici abans de continuar:

    Verifica que el teu programa tamb converteix correctament els nmeros de lexercici

    4.3, inicialitzant cfixa amb els valors de la segona columna i observant al simulador si el

    resultat en cflotant s el de la tercera columna.

  • - 59 -

    Estructura de Computadors Sessi 4: Codificaci en coma flotant

    Activitat 4.C: Errors de precisi en la conversi

    Un cop llegida la prctica i resolts els anteriors exercicis hauries de ser capa de reflexionar

    sobre els errors de precisi que es poden cometre fent la conversi proposada, i respondre les

    preguntes del segent exercici:

    Exercici 4.4: Contesta les segents preguntes

    1) Quina condici ha de complir el valor inicial de cfixa perqu es produeixi prdua de precisi en la conversi que proposa aquesta prctica?

    2) Indica un valor de cfixa per al qual es produiria prdua de precisi al convertir-lo, i el corresponent valor en coma flotant:

    3) En quina sentncia concreta del programa en alt nivell es pot produir la prdua de precisi?

    4) Quin dels 4 modes darrodoniment que coneixes est portant a la prctica aquest programa de conversi?

    5) El format de coma fixa explicat en aquesta prctica permet codificar un rang de valors bastant limitat. Indica un nmero positiu que estigui DINS el rang del format de coma flotant de simple precisi (en decimal) per que estigui FORA del rang del format de coma fixa. Indica tamb quin s el MENOR nmero potncia de 2 que compleixi aquesta condici.

    cfixa cflotant

    0x 0x

  • Sessi 4: Codificaci en coma flotant Estructura de Computadors

    - 60 -

    Portada-Quadern-de-LaboratoriQuadern-de-laboratori-sessio4-sp