13.07.2015 Views

Soluciones de los ejercicios sobre instrucciones y direccionamiento

Soluciones de los ejercicios sobre instrucciones y direccionamiento

Soluciones de los ejercicios sobre instrucciones y direccionamiento

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong><strong>instrucciones</strong> y <strong>direccionamiento</strong>• Siguiente: <strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> periféricos y ADM• Padre: Materiales didácticos• Inicial: Fundamentos <strong>de</strong> or<strong>de</strong>nadores1Con <strong>direccionamiento</strong> in<strong>de</strong>xado resulta DE = (CD)+(X) = (CD)+(CP), es <strong>de</strong>cir, relativo a programa. Porejemplo:[15] LD .A,/5[.X] ; al final <strong>de</strong>l ciclo <strong>de</strong> lectura <strong>de</strong> la; instrucción, (CP) se incrementa, y; cuando la UCP calcula la dirección efectiva,; (X) = (CP) = 16; DE = 5+16=21o:[15] BR /5[.X] ; bifurca a 5+16 = 21Modificar (X) sería lo mismo que bifurcar: LD .X,#3 es equivalente a BR /3La utilidad es la <strong>de</strong>l modo relativo a programa. Si, por ejemplo, queremos bifurcar a una instrucción queestá diez direcciones más a<strong>de</strong>lante po<strong>de</strong>mos hacerlo con BR /9[.X]. Si esta instrucción está en ladirección 1.500, bifurcará a 1.501 + 9; si está en 4.000, bifurcará a 4.001 + 9.Para hacer posible que la instrucción referencie una dirección anterior a la suya, la máquina pue<strong>de</strong>diseñarse para que (CD) se interprete como un número con signo (6 bits: margen <strong>de</strong> -32 a +31, conconvenio <strong>de</strong> complemento a 2). Esto es útil para las bifurcaciones que implementan bucles pequeños:[1230] BR /-31[.X] ; bifurca a -31+1231 = 1200Para que el programador no tenga que estar contando el número <strong>de</strong> <strong>instrucciones</strong> que hay que saltarse, elensamblador pue<strong>de</strong> estar diseñado <strong>de</strong> modo que reconozca el <strong>direccionamiento</strong> relativo a programa (“$”<strong>de</strong>lante <strong>de</strong> la etiqueta, o nada) y cuente:programa fuente:programa objeto:1


[1200] ETI LD ... [1200] 001 ...... ... ... ...[1230] BR ETI [1230] 011010100001<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>El ensamblador ha traducido así:(CO) = 011 = BR; (MD) = 010 (in<strong>de</strong>xado); (CD) = B’100001 = D’-31Caso <strong>de</strong> autoincremento: En general, no está clara la utilidad, pero si (CD)=0, resulta un modoinmediato, con el operando en la palabra siguiente (la instrucción, junto con el operando, ocupa dospalabras):[d] LD .A,/0[.X++]; DE = d+1; X = CP se incrementa dos veces:; una, por haber leído la instrucción;; otra, por el modo <strong>de</strong> <strong>direccionamiento</strong>[d+1] 4000 ; la instrucción carga 4000 en AC y pasa a d+22Operación Modo <strong>de</strong> <strong>direccionamiento</strong> Dirección efectivaCargar el valor <strong>de</strong> una constante eninmediatoun registroRecorrer una lista <strong>de</strong> datosalmacenados en palabrasconsecutivas <strong>de</strong> la MPautoincrementola misma <strong>de</strong> la instrucciónDE = (R); (R)+n → RBifurcar a una dirección cercana relativo a programa DE = (CP) + (CD)Llamar a una rutina contenida enla ROMAcce<strong>de</strong>r a un dato que está un<strong>de</strong>terminado número <strong>de</strong>direcciones más allá <strong>de</strong> unadirección <strong>de</strong> partida dadaLlamar a una rutina ubicada enotro módulo escrito por el usuariodirecto (poniendo en CD un valornumérico)in<strong>de</strong>xadodirecto (poniendo una etiquetacomo valor <strong>de</strong> CD)DE = (CD)DE = (CD) + (R)DE = (CD)2


3<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>(A+B)×C, o: AB+C× A+B×C, o: ABC×+LD /A LD /APUSHPUSHLD /B LD /BPUSHPUSHADD LD /CLD /C PUSHPUSHMULMULADDPOPPOP4CALL hace una operación push <strong>sobre</strong> la pila, introduciendo en ella el contenido <strong>de</strong> CP; RET hace un popSi el convenio es que PP apunta a la cima,• CALL: (PP)-k → PP; (CP) → (PP)• RET: ((PP)) → CP; (PP)+k → PPSi el convenio es que PP apunta a la primera libre por encima <strong>de</strong> la cima,• CALL: (CP) → (PP); (PP)-k → PP• RET: (PP)+k → PP; ((PP)) → CP5(I0)(I1)0 → CP,RA; ? 508 → PP---------repetir siempre(MP[RA]) → RI; (CP) + 1 → CPsi (CO) esCLR: 0 → AC;(CP) → RA...3


<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>(OCALL0)(OCALL1)(RET0)(RET1)/*otras <strong>instrucciones</strong>*/...CALL: ? (PP)-1 → PP,RA---------------? (CP) → (RA) /*es <strong>de</strong>cir, (CP) → MP[RA]*/-------------? (CD) → CP,RA-------------RET: ? (PP) → RA-------------? ((RA)) → CP /*es <strong>de</strong>cir, (MP[RA]) → CP*/(PP)+1 → PP /*esto pue<strong>de</strong> hacerse aqui, en RET o en RET1*/-------------? (CP) → RA-------------6En el supuesto a, cada una <strong>de</strong> las UCP ejecuta 11.000 <strong>instrucciones</strong> en un tiempo que es la suma <strong>de</strong> <strong>los</strong>tiempos <strong>de</strong> ejecución para P1 y P2. Así, para la UCP U1 medimos una velocidad V 1=11.000/((1+10)×10 -3 ) = 1.000.000, es <strong>de</strong>cir, 1 MIPS.En el supuesto b, cada una <strong>de</strong> las UCP ejecuta 9×1.000 + 10.000 <strong>instrucciones</strong> en un tiempo que es lasuma <strong>de</strong> 9 veces el tiempo <strong>de</strong> ejecución para P1 más el tiempo <strong>de</strong> ejecución para P2. Así, para la UCPU1 medimos una velocidad V 1= 19.000/((9×1+10)×10 -3 ), que también resulta ser 1 MIPS.Repitiendo <strong>los</strong> cálcu<strong>los</strong> para las cuatro UCP resulta, en MIPS:Supuesto aSupuesto bV1 11/11 = 1 19/19 = 1V2 11/26 = 0,423 19/106 = 0,179V3 11/41 = 0,268 19/49 = 0,388V4 11/7 = 1,57 19/23 = 0,826Es <strong>de</strong>cir, para el supuesto a la UCP más rápida es U4, pero para el supuesto b la más rápida es U1Conclusión:No se pue<strong>de</strong> i<strong>de</strong>ntificar a “la más rápida”; <strong>los</strong> “MIPS” no son una medida fiable paracomparar las prestaciones <strong>de</strong> distintas UCP.4


7<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>a. La velocidad es V = F/CPI (medida en MIPS), don<strong>de</strong> F es la frecuencia <strong>de</strong> reloj (medida en MHz) yCPI el número medio <strong>de</strong> cic<strong>los</strong> por instrucción: si se ejecutan I 1<strong>instrucciones</strong> que requieren C 1cic<strong>los</strong>, I 2<strong>instrucciones</strong> que requieren C 2cic<strong>los</strong>, etc.,CPI = (I 1×C 1+ I 2×C 1+...)/ (I 1+ I 2+...)Aplicando <strong>los</strong> datos,• CPI A= (2×1 + 4×2 + 10×3)/(2 + 4 + 10) = 5/2V A= 100/(5/2) = 40 MIPS• CPI B= (32×1 + 6×2 + 2×3)/(32 + 6 + 2) = 5/4V B= 100/(5/4) = 80 MIPSEs <strong>de</strong>cir, en <strong>instrucciones</strong> ejecutadas por segundo el segundo compilador genera un programa quehace que la UCP sea el doble <strong>de</strong> rápida.b. Para calcular <strong>los</strong> tiempos reales <strong>de</strong> ejecución tenemos en cuenta el número total <strong>de</strong> cic<strong>los</strong> <strong>de</strong> relojpara cada programa:• C A= 2×10 6 + 4×2×10 6 + 10×3×10 6 = 40×10 6 cic<strong>los</strong>T A= 40×10 6 /100×10 6 = 0,4 segundos• C B= 32×10 6 + 6×2×10 6 + 2×3×10 6 = 50×10 6 cic<strong>los</strong>T B= 50×10 6 /100×10 6 = 0,5 segundosEs <strong>de</strong>cir, pese a dar el doble <strong>de</strong> MIPS, el segundo programa tarda más en ejecutarse. La explicaciónes fácil: tiene muchas más <strong>instrucciones</strong>, pero la mayoría son <strong>de</strong> un ciclo, lo que hace aumentar elnúmero <strong>de</strong> MIPS.5


8<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>a. <strong>de</strong>splazamiento: correspon<strong>de</strong> a lo que tradicionalmente se llama <strong>direccionamiento</strong> directo, oabsoluto. Como la dirección está fijada en la instrucción, se pue<strong>de</strong> usar para almacenar o acce<strong>de</strong>r aoperandos cuya dirección se asigna estáticamente (dirección relativa fijada en tiempo <strong>de</strong> traducción,y dirección absoluta en tiempo <strong>de</strong> carga)b. base: la dirección efectiva está contenida en el registro, es <strong>de</strong>cir, es un modo indirecto a registro.Operandos cuya dirección se asigna dinámicamente (dirección calculada en tiempo <strong>de</strong> ejecución)c. base + <strong>de</strong>splazamiento: pue<strong>de</strong> usarse para acce<strong>de</strong>r a un elemento <strong>de</strong>ntro <strong>de</strong> un array; el<strong>de</strong>splazamiento contendría la dirección <strong>de</strong>l primer elemento <strong>de</strong>l array, y en el registro <strong>de</strong> base (queen este caso actúa como un índice) se introduciría la dirección <strong>de</strong>l elemento calculada relativamenteal comienzo <strong>de</strong>l array. O bien, y similarmente, para acce<strong>de</strong>r a un elemento <strong>de</strong>ntro <strong>de</strong> una estructura<strong>de</strong> registro (record)d. (factor×índice) + <strong>de</strong>splazamiento: para acce<strong>de</strong>r por su número a un elemento <strong>de</strong> un array queempieza en la dirección dada por el <strong>de</strong>splazamiento. El registro <strong>de</strong> índice contendrá el número <strong>de</strong>elemento, y se usará el factor <strong>de</strong> escala a<strong>de</strong>cuado según que <strong>los</strong> elementos <strong>de</strong>l array sean <strong>de</strong> 1, 2, 4 u8 bytese. base + índice + <strong>de</strong>splazamiento: pue<strong>de</strong> servir para acce<strong>de</strong>r a un campo <strong>de</strong> un registro <strong>de</strong>ntro <strong>de</strong> unarray <strong>de</strong> registros; por ejemplo, base es la dirección <strong>de</strong> comienzo <strong>de</strong>l array, índice es el número <strong>de</strong>lelemento (registro) multiplicado por el número <strong>de</strong> bytes <strong>de</strong> cada elemento, y <strong>de</strong>splazamiento es loque hay que sumar para acce<strong>de</strong>r al campo. O también, para accesos a arrays bidimensionales.f. base + (factor×índice) + <strong>de</strong>splazamiento: para accesos más eficientes a arrays bidimensionalescuando <strong>los</strong> elementos son <strong>de</strong> 2, 4 u 8 bytes9La fórmula a aplicar es: base + (factor×índice) + <strong>de</strong>splazamiento. Sólo tenemos que <strong>de</strong>scodificar el byteSIB para ver qué registros actúan como base e índice y cuál es el factor:(SIB) = H’8A = B’10001010, es <strong>de</strong>cir:factor <strong>de</strong> escala = B’10 (4)índice = B’001 (EBX)base = B’010 (ECX)Por tanto:DE = (ECX) + 4×(EBX) + (<strong>de</strong>splaz.)Aplicando <strong>los</strong> valores dados y operando en <strong>de</strong>cimal:DE = 255 + 4×15 + 10 = D’3256


10<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>a. El número <strong>de</strong> byes viene indicado en el campo “limit” <strong>de</strong>l GDTR. Como tiene 16 bits, el númeromáximo <strong>de</strong> bytes es 2 16 = 65.536 bytesb. El número <strong>de</strong>l <strong>de</strong>scritor está contenido en el campo “In<strong>de</strong>x” <strong>de</strong>l selector. Como tiene 13 bits, GDTpue<strong>de</strong> contener hasta 2 13 = 8.192 <strong>de</strong>scriptores (congruente con lo anterior, puesto que cada <strong>de</strong>scriptortiene 8 bytes)c. El tamaño máximo <strong>de</strong> un segmento está <strong>de</strong>terminado por <strong>los</strong> 20 bits <strong>de</strong>l campo “limit” <strong>de</strong> su<strong>de</strong>scriptor, que dan la longitud <strong>de</strong>l segmento en bytes si G = 0 o en unida<strong>de</strong>s <strong>de</strong> 4 KB si G = 1. Portanto, si en el <strong>de</strong>scritor <strong>de</strong>l segmento es G = 0, el tamaño máximo es 2 20 = 1 MB; si G = 1, el tamañomáximo es 2 20 unida<strong>de</strong>s <strong>de</strong> 4 KB, es <strong>de</strong>cir, 2 20 ×4×2 10 = 4 GBd.• De acuerdo con el formato <strong>de</strong>l registro GDTR, la dirección <strong>de</strong> base <strong>de</strong> la tabla GDT esH’00000000, y su extensión (limit) es H’00FF = 255 (es <strong>de</strong>cir, pue<strong>de</strong> contener 256/8 = 32<strong>de</strong>scriptores <strong>de</strong> segmento)• (DS) = H’001A = B’000000011010. De acuerdo con el formato <strong>de</strong>l registro DS, in<strong>de</strong>x = 3; TI = 0(se selecciona GDT); RPL = 2• La dirección <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong>ntro <strong>de</strong> la GDT es 8×in<strong>de</strong>x = 24 = H’18, y ésta es la dirección enmemoria <strong>de</strong>l <strong>de</strong>scritor <strong>de</strong>l segmento, puesto que la dirección <strong>de</strong> base <strong>de</strong> la tabla es 0• Teniendo en cuenta lo dicho <strong>sobre</strong> <strong>los</strong> contenidos <strong>de</strong> memoria, el contenido <strong>de</strong>l <strong>de</strong>scritor <strong>de</strong>lsegmento será el indicado en esta figura:De aquí resulta:• Como G = 0, el tamaño <strong>de</strong>l segmento se mi<strong>de</strong> en bytes, y es: H’E1918 = 923.928 bytes• La dirección <strong>de</strong> base <strong>de</strong>l segmento es H’1F1C1B1A = 521.935.642e. Con todo esto ya se pue<strong>de</strong> respon<strong>de</strong>r a las dos preguntas:• La primera es trivial: dirección final = dirección <strong>de</strong> base <strong>de</strong>l segmento + offset = 521.935.642 +325 = 521.935.967• La respuesta a la segunda no es tan evi<strong>de</strong>nte. En la figura anterior po<strong>de</strong>mos ver que DPL = 0, es<strong>de</strong>cir, el acceso a este segmento requiere el máximo privilegio. No sabemos cuál es el nivel <strong>de</strong>privilegio <strong>de</strong>l programa en el que está la instrucción (no conocemos el contenido <strong>de</strong>l registro CS),7


<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>que <strong>de</strong>bería ser también 0 para que el acceso fuese posible, pero sí conocemos el contenido <strong>de</strong>DS, y vemos que RPL = 2. Por tanto, aunque el programa tuviese el máximo privilegio, para esteacceso está rebajado al nivel 2, <strong>de</strong> don<strong>de</strong> <strong>de</strong>ducimos que este acceso sería imposible. La UCPgeneraría la interrupción correspondientef. El objetivo principal <strong>de</strong> <strong>los</strong> registros <strong>de</strong> segmento en el 8086 era ampliar el espacio <strong>de</strong><strong>direccionamiento</strong> <strong>de</strong> <strong>los</strong> 64 KB (16 bits) <strong>de</strong>l 8080 a 1 MB (20 bits). Adicionalmente, con <strong>los</strong> cuatroregistros <strong>de</strong> segmento que tenía se facilitaba una separación en la memoria entre <strong>los</strong> segmentos <strong>de</strong>código (programa), datos y pila. Pero no había nada previsto en el hardware para facilitar laprotección <strong>de</strong> unos procesos frente a otros. La estructura <strong>de</strong> datos intermedia llamada “<strong>de</strong>scriptor <strong>de</strong>lsegmento” proporciona esos mecanismos <strong>de</strong> protección (que aprovecha el sistema operativo):tamaño máximo <strong>de</strong> <strong>los</strong> segmentos (campo “limit”), opciones <strong>de</strong> sólo lectura, sólo ejecución, etc.(campo “type”) y niveles <strong>de</strong> privilegio (campo DPL <strong>de</strong>l <strong>de</strong>scriptor y campos RPL <strong>de</strong> <strong>los</strong> registros <strong>de</strong>segmento)g. El gran inconveniente es que como las tablas <strong>de</strong> <strong>de</strong>scritores, que pue<strong>de</strong>n ser muy gran<strong>de</strong>s (hasta 64KB la GDT, como hemos visto), están en memoria, <strong>los</strong> accesos a memoria se multiplican. Todoacceso a una dirección implica leer previamente el <strong>de</strong>scriptor, es <strong>de</strong>cir, dos accesos adicionales (dospalabras). En MIPS, la velocidad se dividiría por tres.La solución es muy sencilla (una vez que se conoce). Aunque el número total <strong>de</strong> segmentos (y, portanto, <strong>de</strong> <strong>de</strong>scriptores) pueda ser muy gran<strong>de</strong> (más <strong>de</strong> 8.000 sólo en la tabla GDT), en un momento<strong>de</strong>terminado sólo hay seis segmentos “activos”: <strong>los</strong> <strong>de</strong>terminados por <strong>los</strong> contenidos <strong>de</strong> <strong>los</strong> seisregistros <strong>de</strong> segmento. La renovación <strong>de</strong> esos segmentos (la carga con un nuevo valor <strong>de</strong> uno ovarios registros <strong>de</strong> segmento) no es muy frecuente: sólo tiene lugar cuando la UCP cambia <strong>de</strong> tarea(<strong>de</strong>bido a una interrupción que hace pasar al sistema operativo, y a la salida <strong>de</strong>l sistema operativopara ejecutar otra tarea) y cuando se ejecuta una instrucción <strong>de</strong> transferencia <strong>de</strong> control (bifurcación,llamada a subprograma, etc.) “lejana”, es <strong>de</strong>cir a una instrucción que está en otro segmento. Portanto, pue<strong>de</strong>n mantenerse en la UCP copias <strong>de</strong> <strong>los</strong> <strong>de</strong>scriptores <strong>de</strong> segmento que se estén utilizando,y <strong>de</strong> ese modo no harán falta accesos adicionales a la memoria. De hecho, <strong>los</strong> seis registros <strong>de</strong>segmento tienen en realidad dos partes: una “visible” (<strong>los</strong> 16 bits que forman el selector: in<strong>de</strong>x + TI+ RPL) y otra “escondida”, en la que está la copia <strong>de</strong>l <strong>de</strong>scriptor:Cuando se carga un nuevo valor (un nuevo <strong>de</strong>scriptor) en un registro <strong>de</strong> segmento la UCP se encarga(<strong>de</strong> manera transparente al programador) <strong>de</strong> cargar la copia <strong>de</strong> su <strong>de</strong>scriptor en la parte escondida.Al ser copias <strong>de</strong> informaciones en memoria, las partes escondidas constituyen un tipo <strong>de</strong> memoria8


<strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> <strong>instrucciones</strong> y <strong>direccionamiento</strong>oculta (cache)11a. Los modos relativos sólo permiten transferencias <strong>de</strong> control <strong>de</strong>ntro <strong>de</strong>l segmento en el que seencuentra la instrucción. Las bifurcaciones o llamadas a subprogramas que estén en otro segmentonecesitan <strong>de</strong> otro modo <strong>de</strong> <strong>direccionamiento</strong>. Se usan distintas <strong>instrucciones</strong> para cada caso. Lastransferencias <strong>de</strong>ntro <strong>de</strong>l mismo segmento se llaman “cercanas”, y a otro segmento “lejanas”b. En una CALL “cercana” se guarda, como siempre, el contenido <strong>de</strong>l contador <strong>de</strong> programa. En unaCALL “lejana” se guarda también el contenido <strong>de</strong>l registro CS, pero sólo la parte visible: la parteescondida se recargará con el <strong>de</strong>scriptor <strong>de</strong> segmento cuando se ejecute la correspondiente RET, querecupera <strong>de</strong> la pila <strong>los</strong> valores <strong>de</strong>l contador <strong>de</strong> programa y <strong>de</strong> CS. Naturalmente, hay dos versiones<strong>de</strong> RET, una cercana y otra lejana• Siguiente: <strong>Soluciones</strong> <strong>de</strong> <strong>los</strong> <strong>ejercicios</strong> <strong>sobre</strong> periféricos y ADM• Padre: Materiales didácticos• Inicial: Fundamentos <strong>de</strong> or<strong>de</strong>nadores9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!