estructura de computadors – istudies.ac.upc.edu/eupvg/esc1/documentacio/sessio1.pdfdefinició del...

13
Estructura de computadors – I Pràctiques de laboratori ( Sessió 1 )

Upload: others

Post on 26-Dec-2019

4 views

Category:

Documents


0 download

TRANSCRIPT

  • Estructura de computadors – I

    Pràctiques de laboratori

    ( Sessió 1 )

  • Introducció: l’entorn de treball

    Els passos habituals per fer un programa (en qualsevol llenguatge) són els següents (figura 1)

    1. Primer es crea el programa escrivint-lo en el llenguatge font per mitjà d’un editor deprogrames. El resultat és un fitxer en un llenguatge que pot entendre l’usuari, però no lamàquina.

    2. Per traduïr-lo a llenguatge màquina es fa servir un programa traductor. Aquest generaun fitxer amb la traducció del vostre programa, però encara no és un fitxer executable.

    3. Un fitxer executable conté el programa traduit més una sèrie de codi que ha de tenir totprograma que es vulgui córrer a una màquina determinada. Aquest codi comú es troba ales anomenades biblioteques del llenguatge (language libraries). L’encarregat d’ajuntarel vostre codi amb el codi d’aquestes biblioteques és un programa anomenat muntador(linker). Així doncs, el següent pas és invocar el muntador, que generarà el programaexecutable.

    Editor

    Traductorbiblioteca

    del llenguatge

    Muntador

    PROG.ASM

    PROG.OBJ

    PROG.EXE

    Figura 1 : Entorn típic de programació

    Durant el procés de creació d’un programa se solen produir errors. Hi ha dos tipus d’errors: elssintàctics o detectables en temps de traducció, i els semàntics o detectables en temps d’execució.Els errors sintàctics són, per exemple, escriure malament una instrucció o fer una operació entre dostipus de dades incompatibles. Aquests errors són detectats pel traductor i els hem de solucionarabans de poder generar un executable.

    Un cop tenim un programa sintàcticament correcte el podem executar, però això no implica queel programa sigui correcte. Totes les instruccions poden ser correctes, però ens podem haver oblidatde posar la condició de final d’un bucle (i que aquest no acabi mai) o que, senzillament, el programano faci el que nosaltres volem. Aquests errors només es poden detectar en temps d’execució, i pertal d’eliminar-los fem servir un depurador de programes (debugger). Els depuradors ens permetenexecutar el programa instrucció a instrucció i veure tots els valors que es van calculant, de maneraque podem trobar els errors.

    En el laboratori farem servir l’editor edit de DOS. El traductor (que en el cas de traduir d’unllenguatge assemblador a llenguatge màquina rep el nom d’assemblador), el linker i el debuggerseran els de Borland (TASM, TLINK y TD)

  • Quina pinta fa un programa en assemblador?

    A la figura 2 teniu el codi de la primera pràctica que provarem.

    .model large

    .386

    N EQU -3

    .stack 100h

    .dataA1 dd 1A2 dd -1A3 dd 77777777h.code.startupETIQ1: MOV EAX, A1 MOV EBX, A2 ADD EAX, EBX ADD EAX, N MOV A3, EAX.exitEND

    Figura 2 : Codi del programa INTRO1.ASM

    El codi que està ressaltat ha d’aparèixer en qualsevol programa. Les comandes .model large i.386 indiquen l’entorn en que ens mourem (model de treball i tipus d’instruccions). Després de ladefinició del model, podem posar les constants que ens interessi. Les constants es defineixen com anom EQU valor. A partir d’aquest punt totes les aparicions d’una constant són substituïdes pel seuvalor (compte: NO és una variable, NO es troba a memòria).

    A continuació es defineix el segment de pila per mitjà de la directiva .stack i el número de bytesque volem dedicar a la pila (en aquest cas 100h bytes).

    La directiva .data indica el començament del segment de dades. A partir d’aquest puntdeclararem totes les variables globals que faci servir el nostre programa.

    La directiva .code indica el començament del segment de codi. Al segment de codi estaran elsprocediments i funcions del programa (com veurem en properes pràctiques) i el programa principal.El programa principal és el codi comprés entre les directives .startup i .exit. El vostre fitxer had’acabar necessàriament amb la directiva END.

    Al començament i final del programa principal han d’anar una sèrie d’instruccionsobligatòriament, i que sempre són les mateixes. Aquestes instruccions NO les heu de posar

    Definició del model

    Declaració de constants

    Definició del segment de pila

    Inici del segment de dades

    Inici del segment de codi

    Començament del programa principal

    Final del programa principal

    Final del fitxer

  • vosaltres, sinó que les afegeix el traductor substituïnt el .startup i el .exit per les instruccionspertinents.

    Com es compila i es linka un programa?

    La traducció es fa amb el programa Turbo Assembler, amb la següent comanda:

    tasm /zi nomprograma

    NOTA: tant la comanda tasm com el vostre nom de programa (no fa falta extensió, només elnom) pot estar en majúscules o minúscules. La opció de compilació /zi ha d’estarOBLIGATÒRIAMENT en minúscules (si no, la ignora). Aquesta opció de compilació generainformació que serà utilitzada després a l’hora de depurar el programa. El tasm genera un fitxernomprograma.obj.

    Per muntar s’ha de fer:

    tlink /v /3 nomprograma

    NOTA: Novament, tant tlink com el nom del programa (sense extensió) pot estar en majúsculeso minúscules, mentre que les opcions /3 (que linka amb la biblioteca d’instruccions del 386) com /v(que fa que es deixi informació pel debugger) han d’estar en minúscules.

    Un cop fet això ja tenim un executable nomprograma.exe que podem executar o depurar.

    Com s’analitza un programa?

    L’anàlisi d’un programa es fa mitjançant un programa depurador (o debugger), en el nostre casfarem servir el Turbo Debugger.

    Per veure com funciona utilitzarem el programa de la figura 2, l’heu d’editar (edit intro1.asm),ensamblar (tasm /zi intro1.asm) i muntar (tlink /v /3 intro1) tal i com s’explica a la seccióanterior. Un cop tingueu el programa executeu el debugger:

    td intro1

    El td ofereix moltes possibilitats. Només explicarem les que ens interessen a la nostraassignatura. Primer de tot, ens interessa veure la informació a nivell de segments. Per fer aixòanirem al menú principal (F10) escollirem la opció View (V) i la subopció CPU (C). És a dir,

  • premeu consecutivament les tecles F10-V-C. Ara podeu veure una nova pantalla amb informacióper la depuració. El millor és veure aquesta pantalla el més gran possible, per tant feu un Zoom(premeu la tecla F5).

    La pantalla que veureu està dividida en 5 zones, que contenen informació sobre el segment decodi, els registres, els flags, la pila i el segment de dades. Podeu passar de una subpantalla a l’altreprement la tecla TAB (figura 3)

    Pantalla de codi

    Pantalladeregistres

    Pantalladeflags

    Pantalla depila

    Pantalla de dades

    TAB TAB

    TAB

    TABT

    AB

    Divisió de la pantalla al td

    Figura 3: Pantalla del Turbo Debugger.

    Al començament, la pantalla de codi mostra el programa que heu demanat de depurar. Si canvieude pantalla (per mitjà de TAB) anireu (en aquest ordre) a la pantalla de registres, a la de flags, a lade pila i a la de dades, tornant després a la de codi (proveu de fer-lo).

    A la pantalla de codi, us trobareu que les primeres instruccions no són les que heu programarvosaltres. Són les instruccions introduïdes per la directiva .startup, i les podeu veure a la figura 4.

    mov dx, un valor que pot canviar d’un PC a un altremov ds, dxmov bx, sssub bx, dxshl bx, 04mov ss, dxadd sp, bx

    Figura 4: instruccions instroduïdes per la directiva .startup

    Aquestes instruccions són sempre les mateixes, independentment del programa que es vagi a feri inicialitzen tot l’entorn de treball (fixeu-vos que inicialitzen els registres ds, ss i sp). La primerainstrucció del vostre programa està després d’aquestes 7 instruccions, per tant, el primer que hauríeude fer és executar-les i posar-vos a sobre de la primera instrucció pròpia del vostre programa (queestà indicada per l’etiqueta ETIQ1 (podeu veure com la informació sobre etiquetes es manté: abans

  • de la vostra primera instrucció hi ha un indicador #intro1#etiq1 que marca el nom del fitxer il’etiqueta associats a la instrucció).

    Per executar una instrucció anirem al menú principal (F10), opció Run (R), subopció Traceintro (T). Això executa una (i només una) instrucció. Hi han accions que es fan força sovint;aquestes tenen el que s’anomena un curtcircuït al teclat: una tecla o una combinació de tecles quefan el mateix sense necessitat de passar pel menú cada vegada. Per exemple, al costat de Traceintro trobareu el seu curtcircuït (F7). Això vol dir que és equivalent fer F10-R-T que fer F7.

    Per treballar, us recomanem que feu sempre el següent: primer executeu amb F7 les 7instruccions del .startup (observeu com, conforme les executeu, a la pantalla de codi el cursoravança i com els registres i els flags que es modifiquen durant l’execució es veuen ressaltats a lapantalla respectiva). Un cop heu executat aquestes instruccions, esteu a la primera instrucció pròpiadel vostre programa (identificada per #intro1#etiq1).

    Tot i que per defecte els registres surten amb 16 bits, hauríeu de fer servir el td amb els registresde 32 bits. Per fer això, aneu a la pantalla de registres (amb el TAB) i feu ALT-F10 (les dues teclessimultàniament) i al submenú que surt escolliu la opció de registres amb 32 bits (R).

    Per veure les dades del vostres programa teniu dues possibilitats: inspeccionar una única dada ocontrolar el segment de dades. Per a inspeccionar una dada podeu anar al menú principal (des dequalsevol subpantalla) per mitjà de la tecla F10, escollir la opció Data (D), subopció Inspect (I).Un finestra us preguntarà quina variable voleu veure. Per exemple, pregunteu per la variable A3, ussortirà una finestra com la de la figura 5, que us indicarà la seva adreça (segment:desplaçament), lalongitud (byte, word, dword) i el seu valor decimal i hexadecimal (per sortir d’aquesta finestra,premeu ESC)

    Inspecting A3

    @XXXX:0008

    dword 2004318071 (77777777h)

    adreça inicial desegment de dades(coincideix ambel registre DS)

    desplaçamentde la dadarespecte DS

    longitut de la dada

    valor (decimal)de la dada

    valor (hexadecimal)de la dada

    Figura 5: finestra d’inspecció d’una dada a memòria.

    L’altre possibilitat és controlar el segment de dades. Si us aneu a la subpantalla de dades (permitjà de TAB) podeu fer ALT-F10, subopció Goto (G) i us preguntarà quina variable voleu veure.Si poseu A1 veureu com la pantalla de dades es situa a l’adreça DS:0000 (que és on comença ladada A1). Amb la opció d’inspecció descrita al paràgraf anterior podeu observar com A1 és aDS:0000, A2 a DS:0004 i A3 a DS:0008, per tant podeu controlar totes les variables a lamateixa finestra. El problema és que la finestra de dades us mostra la pantalla byte a byte i, en

  • aquest cas, les variables són de mida dword. Si voleu veure les dades del DS amb una mida diferentde byte, feu a la mateixa pantalla de dades ALT-F10 Display as (D) i escolliu mida entre Byte,Word o Long (Nota: en aquest punt, pel TD un double word és un long word); per tant en aquestcas s’ha d’escollir la opció L.

    Torneu a la pantalla de programa (TAB) i anem a executar el programa pas a pas. Observeu quela primera instrucció mou a EAX la variable A1. Cada cop que hi ha una instrucció que referència amemòria, a dalt de la pantalla surt la adreça implicada i el valor abans d’executar la instrucció(veure figura 6).

    ds:0000 00000001

    ETIQ1: MOV EAX, A1

    Figura 6: Adreça i valor de la posició implicada en una instrucció de memòria.

    Si executeu les dues primeres instruccions veureu com EAX i EBX es carregen amb els valors 1(00000001h) i -1 (FFFFFFFFh) respectivament. El resultat de sumar EAX i EBX és el següent(figura 7):

    0000 0000 0000 0000 0000 0000 0000 0001 =EAX 1111 1111 1111 1111 1111 1111 1111 1111 =EBX

    1 0000 0000 0000 0000 0000 0000 0000 0000

    +

    CF=1 SF=0

    (el resultatés positiu)

    OF=0(positiu mésnegatiu iguala positiu: nooverflow)

    ZF=1

    (el resultatés zero)

    Figura 7: Resultat de ADD EAX, EBX.

    Podeu comprovar com tant el registre com els flags que es modifiquen canvien de color. Si araexecuteu la segona suma (suma EAX amb la constant N, que valia -3) sortirà el de la figura 8:

    Abans d’executar la instrucció MOV A3, EAX observeu que:

    1. A dalt de la pantalla us surt l’adreça i el valor de la posició de memòria implicada, és adir, A3 (ds:0008 77777777)

    2. A la pantalla del segment de dades podeu observar com, efectivament, aquesta ésl’adreça i el valor implicats.

  • Si executeu la instrucció (F7) podeu veure com a la pantalla del segment de dades, la variableA3 ha canviat de valor (el nou valor és: FFFFFFFDh).

    Les dues últimes instruccions (mov ah, 4c i int 21) són afegides per la directiva .exit. Si lesexecuteu, el programa acaba. Llavors podeu sortir del td (ALT-X) o bé tornar a executar-lo (F7, usdirà que el programa ha acabat, premeu RETURN, F7 i us preguntarà si voleu tornar-lo a carregar,premeu RETURN i ja torneu a estar al començament del programa).

    0000 0000 0000 0000 0000 0000 0000 0000 =EAX 1111 1111 1111 1111 1111 1111 1111 1101 =N

    0 1111 1111 1111 1111 1111 1111 1111 1101

    +

    CF=0 SF=1

    (el resultatés negatiu)

    OF=0(positiu mésnegatiu iguala negatiu: nooverflow)

    ZF=0

    (el resultatno és zero)

    Figura 8: Resultat de ADD EAX, N.

  • Sessió 1: Operacions aritmètiques senzilles

    En aquesta sessió aprendreu a treballar amb números enters i naturals amb l’assemblador, fentpetits programes que sumen i resten, i a més veureu la utilització de les operacions lògiques AND iOR.

    Activitat 1.1: Enters i naturals

    Recordeu que quan es representa qualsevol dada a memòria, té un valor explícit (aquell que técom a dada guardada en binari) i un valor implícit (aquell que té interpretada com un tipus de dadadeterminat o com a instrucció).

    Suposem dues variables de tamany byte A1 i A2 amb valors binaris 00110010b i 11000000b,respectivament. Completeu les caselles en blanc en l’exercici 1.

    Valor explícit(binari)Variable

    A1

    A2

    00110010

    11000000

    Valor explícit(hexadecimal)

    Valor implícit(com a natural

    Valor implícit(com a enter

    en decimal) en decimal)

    Exercici 1

    Haureu observat que els valors són ben diferents segons la interpretació (valor implícit) que enfeu. Calculeu ara la suma dels dos números i respongueu les preguntes de l’exercici 2.

  • Valor explícit(binari)

    0 0 1 1 0 0 1 0

    1 1 0 0 0 0 0 0Valor explícit(hexadecimal)

    Valor implícit(com a natural)

    Valor implícit(com a enter)+

    = = =

    Quin és el valor final del flags? CF= OF= ZF= SF=

    És el resultat final correcte interpretat com a natural?

    És el resultat final correcte interpretat com a enter?

    Exercici 2

    Per comprovar que els vostres resultats són correctes, assembleu i munteu elprograma 1, i comproveu els resultats mitjançant el programa td.

    .model large

    .386

    .stack 100h

    .dataA1 db 00110010bA2 db 11000000b.code.startupETIQ1: MOV AL, A1 MOV AH, A2 ADD AL, AH MOV BL, AL MOVZX EAX, AL MOVSX EBX, BL.exitEND

    Programa 1

    Per últim empleneu les caselles de l’exercici 3 mitjançant l’execució del programa del’exercici anterior.

  • Contingut(binari)Registre

    AL

    BL

    Contingut(hexadecimal)

    S’executa la instrucció MOVZX EAX, AL

    Contingut d’EAX?

    binari hexa

    S’executa la instrucció MOVSX EBX, BL

    Contingut d’EBX?

    binari hexa

    Desprès d’executar les 4 primeres instruccions:

    Exercici 3

    Activitat 1.2: Instruccions lògiques

    Amb aquesta activitat farem servir les instruccions lògiques del 386.

    Suposem que tenim dues variables de tamany byte (A1 i A2) amb valors 11110000b i10101010b i volem calcular el resultat de les operacions AND i OR amb tots dos valors. Empleneules caselles de l’exercici 4.

    Valor(binari)Variable

    A1

    A2

    1 1 1 1 0 0 0 0

    1 0 1 0 1 0 1 0

    Valor(hexadecimal)

    Valor(binari)

    1 1 1 1 0 0 0 0

    1 0 1 0 1 0 1 0

    A1 AND A2

    binari hexa

    A1 OR A2

    hexabinari

    Exercici 4

    Per comprovar el resultat tenim el programa 2.

  • .model large

    .386

    .stack 100h

    .dataA1 db 11110000bA2 db 10101010b.code.startupETIQ1: MOV AL, A1 MOV BL, A2 AND AL, BL MOV AH, A1 MOV BH, A2 OR AH, BH NOT AX MOV BX, 1000000000000000b BT BX, 15 BT BX, 14.exitEND

    Programa 2

    Les primeres 3 instruccions calculen l’operació AND, i les altres tres fan la OR. Comproveu queels resultats de l’exercici anterior eren correctes.

    Després de fer la OR tenim a AL el resultat de la AND i a AH el de la OR, calculeu el resultat defer una NOT sobre AX a l’exercici 5. Després comproveu el resultat executant la instrucció NOTAX del programa 2.

    AX

    binari hexa

    NOT AX

    binari hexa

    Exercici 5

    Per últim farem servir la instrucció BT per consultar els bits 15 i 14 del valor1000000000000000b. Aquesta instrucció carrega al flag CF el valor del bit del primer operantindicat al segon operant.

    Empleneu l’exercici 6 i comproveu el resultat amb l’execució de les últimes instruccions delprograma 2.

  • BX

    binari hexa

    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0

    BT BX, 15 CF?

    BT BX, 14 CF?

    Exercici 6