U1 Apuntes Lenguaje Ensamblador

download U1 Apuntes Lenguaje Ensamblador

of 64

Transcript of U1 Apuntes Lenguaje Ensamblador

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    1/64

    Fundamentos de Computadores

    Tema 3LENGUAJE

    ENSAMBLADOR

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    2/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador Contenido - I

    INTRODUCCIN ____________________________________1

    Uso de un lenguaje ensamblador _____________________3

    Inconvenientes del lenguaje ensamblador ______________3

    Eleccin de un lenguaje ensamblador _________________3

    ARQUITECTURA DEL P MIPS R2000 _________________4

    Simulador de MIPS R2000: SPIM ____________________5

    INSTRUCCIONES BASICAS___________________________7

    Empleo de variables temporales ______________________8

    Operandos ________________________________________8

    Accesos a memoria _________________________________9

    Accesos a estructuras de datos ______________________10

    Direccionamiento de la memoria ____________________11MODOS DE DI RECCIONAMIENTO ___________________13

    Direccionamiento a registro ________________________13

    Direccionamiento inmediato ________________________13

    Direccionamiento base o desplazamiento______________14

    Direccionamiento relativo al contador de programa ____14

    INSTRUCCIONES DE BI FURCACIN O SALTO ________15

    Salto incondicional ________________________________15

    Salto condicional__________________________________16

    FORMATO DE LAS INSTRUCCIONES_________________19

    Formato R _______________________________________19

    Formato I________________________________________20

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    3/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador Contenido - II

    Formato J _______________________________________21

    JUEGO DE INSTRUCCIONES________________________22

    USO DE REGISTROS Y MEMORIA ___________________28

    Registros de la CPU _______________________________28

    Distribucin de la memoria_________________________30

    PROGRAMACIN EN ENSAMBLADOR _______________31

    EJEMPLOS________________________________________33

    PROGRAMACIN MEDIANTE SUBRUTINAS __________39

    Paso de parmetros _______________________________41

    Preservacin de registros___________________________41

    EJEMPLOS________________________________________42

    MANEJO DE DATOS EN COMA FLOTANTE ___________47

    Instrucciones para coma flotante ____________________47

    LLAMADAS AL SISTEMA ___________________________50

    EJEMPLO _________________________________________51

    PROGRAMAS RECURSIVOS _________________________52

    Estructura de la pi la_______________________________52

    Diseo (ejemplo factor ial )__________________________53

    REGULARIDAD Y ORTOGONALIDAD_________________54

    EJEMPLOS: _______________________________________55

    Programa que detecta cadenas capicuas.______________55

    Clculo de la serie de fibonazzi. _____________________55

    Conversin a formato IEEE 754. ____________________55

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    4/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 1

    INTRODUCCIN Instruccin: Palabra de un lenguaje que especifica

    alguna accin.

    Juego de instrucciones: Cto. de todas lasinstrucciones que forman un lenguaje.

    Lenguaje Mquina: Lenguaje de programacin queentiende un ordenador directamente.

    Lenguaje Ensamblador: Abstraccin de lenguajemquina para hacerlo ms fcil de programar.

    Lenguaje de Alto Nivel: Lenguaje de programacinabstracto ms cercano al lenguaje humano natrual.

    Lenguaje de

    Alto Nivel

    Lenguaje

    Ensamblador

    Lenguaje

    Mquina

    Ensamblador

    Compilador

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    5/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 2

    Lenguaje de alto nivel (C):

    int suma(int a, int b){

    c=a+b;

    }

    Lenguaje Ensamblador:suma: lw $16, O($22)

    lw $17, O($23)

    add $15, $16, $17

    sw $15, O($21)

    jr $31

    Lenguaje Mquina:

    01010000110011101010100010010101

    01111010010101010100010111010110

    01010010111011010101010101010101

    1010101110110010010111010110010001011010101100100111110100010101

    01101010101110101101010101010101

    10101001000101011110101010010101

    01101011000101010101001011011011

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    6/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 3

    Uso de un lenguaje ensamblador Velocidad

    Tamao

    Carencia de compiladores

    Inconvenientes del lenguaje ensamblador

    Dependientes de la mquina

    Programas ms largos (factor de expansin)

    Depuracin difcil.

    Compiladores muy optimos.

    Eleccin de un lenguaje ensamblador

    CISC: Complex Instruction Set Comp.

    RISC: Reduced Instruction Set Comp.

    680X0, 80X86

    RX000, PowerPC, Sparc, Alpha

    MIPS R2000

    1970

    1980

    1990

    CISC

    RISC

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    7/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 4

    ARQUITECTURA DEL P MIPS R2000

    Simple y regular.

    Bus de datos: 32bits

    Bus de direcciones: 32bits 4Gb de direccionamiento

    MIPSR2000

    Coprocesador

    Matemtico

    R2010

    Memoria

    Principal

    Bus del Sistema

    $0

    $1

    $2

    $3

    $31

    PC

    hi

    lo

    UAL

    Status

    Cause

    EPC

    BadVAddr

    MMU

    con TLB

    Coprocesador 0

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    8/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 5

    $0

    $1$2

    $3

    $31

    Coprocesador 1

    Unidad de

    divisin

    Unidad demultiplicacin

    FPU. Nmeros en coma flotante IEEE 754

    Modo Usuario y Modo Ncleo

    Unidad de control cableada y segmentada

    Cache externa separada para datos y programa.

    Simulador de MIPS R2000: SPIM Programa capaz de ejecutar programas para MIPS

    R2000 y R3000.

    Mquina virtual.

    Instrucciones Reales y pseudoinstrucciones.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    9/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 6

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    10/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 7

    INSTRUCCIONES BASICASInstruccin aritmtica:

    En lenguaje de alto nivel:

    c:=a+b (PASCAL)

    Sobre MIPS R2000:

    add c, a, b c operando destino

    a primer operando fuente

    b segundo operando fuente

    La instruccin add SIEMPRE debe tener 3 op.

    Para sumar ms operandos:g:=a+b+c+d+e+f

    add g,a,b # g:=a+b

    add g,g,c # g:=a+b+c

    add g,g,d # g:=a+b+c+d

    add g,g,e # g:=a+b+c+d+e

    add g,g,f # g:=a+b+c+d+e+f

    (Factor de expansin)

    Operacin de resta o substraccin:

    sub c,a,b #c:=a-b

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    11/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 8

    Empleo de variables temporales

    Variables internas no necesarias para el resultado pero sipara los clculos intermedios.

    Para generar:

    f:=(g+h)-(i+j)+(k-l)

    add t0,g,h # t0 variable temporaladd t1,i,j # t1 variable temporal

    sub t2,k,l # t2 variable temporal

    sub f,t0,t1 # El orden de las anteriores

    add f,f,t2 # instr. no importa

    Operandos

    Los operandos en lenguaje mquina deben estar situadosen los registros del procesador.

    Registros de 32 bits

    R2000 32 registros de 32 bits + hi + ho + PC R2010 32 registros de 32 bits

    Memoria Principal 4Gb como mximo

    El compilador debe asignar las variables a los registros.

    Por ejemplo f $16, g $17, h $18, etc.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    12/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 9

    Accesos a memoria

    Los datos se han de traer de memoria principal a losregistros para poder trabajar con ellos.

    Los resultados pueden necesitar volcarse a memoria.

    Para traer un dato hay que hacer una lectura sobrememoria, instruccin lw(load word)

    Para volcar un dato hay que hacer una escritura sobrememoria, instruccin sw(store word)

    Formato:

    lw $8, D($17) # $8=contenido de D+$17

    sw $10, D($17) # En dir. D+$17 alamcena $10

    D+$17 direccin efectiva

    MIPS R2000$8

    $10 D

    MP

    $17 = 0

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    13/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 10

    Accesos a estructuras de datos

    PROGRAM ejemploVAR

    x,k,i: INTEGER;V: ARRAY[0..999] OF INTEGER;BEGIN

    x:=k-(V[i]+V[i]);V[i+1]:=k+V[i];

    END.

    Como acedemos al elemento i del vector:Suponemos i almacenada en $17

    lw $10, Vinicio($17) # $17 se le llama reg. indice

    MIPS R2000

    $10

    V (dir. inicio)

    MP

    $17 = i

    ... $17

    V[i]

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    14/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 11

    Direccionamiento de la memoria

    Direccionamiento por palabra, media palabra y byte.

    Palabras (32 bits, 4bytes): 0, 4, 8, 12, 232-4

    Medias pal. (16 bits, 2bytes): 0, 2, 4, 6, 232-2

    Bytes (8 bits, 1bytes): 0, 1, 2, 3, 232-1

    0123

    4567

    891011

    D

    D+4

    D+8

    D+1

    D+6

    Memoria Principal

    *Con D mltiplo de 4Dir.

    0

    1

    23

    4

    5

    6

    7

    8

    9

    ....

    Palabra 0

    (Word 0)

    Palabra 4(Word 4)

    Dir.

    0

    1

    23

    4

    5

    6

    7

    8

    9

    ....

    Media Palabra 0(Half-Word 0)

    Media Palabra 2(Half-Word 2)

    Media Palabra 4(Half-Word 4)

    Dir.

    0

    1

    23

    4

    5

    6

    7

    8

    9

    ....

    Byte 0

    Byte 1

    Byte 2Byte 3

    Byte 4

    Byte 5

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    15/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 12

    Del ejemplo: Para acceder a V[i], siendo V un vector de

    palabras, $17 debe contener i*4 y no i.

    V[i] ? Elemento nmero i del vector V.

    V ? Vector de palabras.

    V[i] ? Palabra nmero i.

    Qu direccin tendr V[i]?

    Para codificar: V[i+1]:=V[i]+k;lw $10, Vinicio($17) # $17 i*4

    add $10, $18, $10 # $18 contiene k

    add $17, $17, $21 # $21 contiene 4

    sw $10, Vinicio($17) # V[i+1]:=k+V[i]

    Dir.

    V-1

    V

    V+1

    V+2

    V+3

    V+4

    ....

    V+(i*4)

    V+(i*4)+1

    V+(i*4)+2

    V+(i*4)+3

    ....

    V = V[0] =

    V[i] =

    V[1] =

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    16/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 13

    MODOS DE DIRECCIONAMIENTOModos de acceder a los operandos de una instruccin.

    Repercuten en el modo de acceder a los datos.

    Modo real: Sumaralgo al contenido de un registro.

    Modo virtual: Segn sea el algo:

    Direccionamiento a registro

    Direccionamiento inmediato

    Direccionamiento base o desplazamiento

    Direccionamiento relativo a PC

    Direccionamiento a registro El dato esta ubicado en el registro

    sub $8, $10, $22

    lw $10, Vinicio($17)

    Direccionamiento inmediato El operando es un valor constante

    Inicializacines o operaciones con ctes.

    Instrucciones en versin inmediata:

    addi $17, $17, 4 # inmediate add

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    17/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 14

    Direccionamiento base o desplazamiento

    Normalmente se emplea para accesos a memoria

    La direccin efectiva se obtiene sumando una cantidadms el contenido de un registro

    La cantidad se codifica con la instruccin.

    Dos posibles interpretaciones:

    lw $10, Vinicio($17) #Acceso al valor $17/4lw $10, 12($16) #Acceso al valor 3

    #En $16 esta Vinicio

    Direccionamiento relativo al contador deprograma

    Normalmente usado en saltos.

    bne $21, $8, seguir # Ir a seguirsi $8$21

    seguires una etiqueta

    La direccin de salto se calcula como un valor aadido (orestado) al contador de programa actual

    Este valor lo calcula el ensamblador:

    etiqueta: addi $5, $8, 78

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    18/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 15

    INSTRUCCIONES DE BIFURCACIN OSALTOTipos:

    Salto incondicional

    Salto condicional

    Salto incondicional

    Instruccin:j(jump)Operando: Direccin destino. Valor concreto o etiqueta

    j 2300 #Salta a la direccin 2300j etiqueta #Salta a la direccin de la etiqueta

    Instruccin:jr(jump register)Operando: Registro que contiene la dir. de salto.

    Direccionamiento indirecto a registro

    jr $12 #Salta a direccin indicada por $12

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    19/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 16

    Salto condicional Salta si se produce alguna condicin

    Implementa IFTHENELSE

    beq $7, $12, etiqueta #Salta si $7 = $12

    bne $7, $12, etiqueta #Salta si $7$12

    Comparacin de desigualdad:

    slt $8, $19, $22 # set on less than

    Si $19

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    20/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 17

    Algunas codificaciones sencillas:

    SENTENCIA IF (SI)

    Suponemos i, j, a, h $16 - $19

    SI (i=j)ENTONCES a:=a+h;a:=a+j;

    bne $16, $17, L1add $18, $18, $19

    L1: add $18, $18, $17

    BUCLE REPEAT UNTIL (REPETIR HASTA)

    Variables: g, h, i, j $17 - $20

    A es un vector de enteros (de palabras)Suponemos (como ocurre en C) que A=&A[0]=Ainicio

    REPETIRg:=g+A[i];i:=i+j;

    HASTA (i=h)

    bucle: multi $9, $19, 4lw $8, A($9)add $17, $17, $8add $19, $19, $20bne $19, $18, bucle

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    21/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 18

    SENTENCIA WHILE (MIENTRAS)

    Suponemos i, x $22 - $23

    i:=1MIENTRAS (i

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    22/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 19

    FORMATO DE LAS INSTRUCCIONES Cada instruccin ocupa 32 bits (1 palabra)

    3 tipos de codificaciones

    decodificador de instrucciones ms simple

    Formato R

    Instrucciones con todos los operandos en registros

    Campos de la instruccin:

    6 bits 5 bits 5 bits 5 bits 5 bits 6 bits

    1 y ltimo: Tipo de operacin a realizar

    2: Primer operando fuente

    3: Segundo operando fuente

    4: Destino

    5: Desplazamiento en op. de desplazamiento

    op rf1 rf2 rd desp func

    Por ejemplo:

    add $15, $2, $3

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    23/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 20

    000000 00010 00011 01111 00000 100000

    Formato I

    Instrucciones de carga/almacenamiento

    Instrucciones de salto condicional

    Instrucciones con datos inmediatos

    Se utilizan 16 bits para codificar dato o desplazamiento Formato:

    op rf rd inm

    6 bits 5 bits 5 bits 16 bits

    Carga: lw $3, Ainicio($13) Salto condicional: beq $1,$2, salir

    El desplazamiento de salirsonpalabras

    salirlo calcula el compilador

    Si el salto excede el desplazamiento mximo:

    beq $18, $19, Etiqueta

    bne $18, $19, auxj etiqueta

    aux:

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    24/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 21

    Formato J Instrucciones de salto incondicional (no todas)

    Formato:

    op direccin

    6 bits 26 bits

    direccin expresada en palabras

    Salto mximo 228 bytes = 256Mb

    Salto mayor: Instruccinjr registro con direccin.

    Programas no relocalizables

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    25/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 22

    JUEGO DE INSTRUCCIONES Instrucciones reales

    Pseudoinstrucciones ()

    ARITMTICO-LGICAS:

    add Rdest, Rsrc1, Src2 Suma (con signo)addi Rdest, Rsrc1, Imm Suma inmediata (c.s.)addu Rdest, Rsrc1,Src2

    Suma (sin signo)

    addiu Rdst, Rsrc1, Imm Suma inmediata (s.s.)sub Rdest, Rsrc1, Src2 Resta (con signo)subu Rdest, Rsrc1,Src2

    Resta (sin signo)

    div RSrc1, RSrc2 Divisin (con signo)divu RSrc1, RSrc2 Divisin (sin signo)

    cociente en registro lo - resto en reg. hi

    mult Rsrc1, Rsrc2 Multiplicacin (c.s.)multu Rsrc1, Rsrc2 Multiplicacin (s.s.)

    parte baja resultado en reg. lo - alta en reg. hi

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    26/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 23

    nor Rdst, Rsrc1, Src2 Nor (Or negada)or Rdst, Rsrc1, Src2 Orori Rdst, Rsrc1, Imm Orand Rdst, Rsrc1, Src2 AND lgicoandi Rdst, Rsrc1, Imm AND inmediataxor Rdst, Rsrc1, Src2 Xor (Or exclusiva)xori Rdst, Rsrc1, Imm Xor inmediata

    Sll Rdst, Rsrc1, Src2 Desplazamiento a izq.srl Rdst, Rsrc1, Src2 Desp. a derecha

    sra Rdst, Rsrc1, Src2 Desp. aritmtico dcha.En Src2 esta el nm. de bits a desplazar

    MANIPULACIN DE CONSTANTESli Rdst, Imm Rdst Imm ()

    lui Rdst, Imm Rdst(parte alta)Imm

    COMPARACINslt Rdst,Rsrc1, Src2 = 0bgezal Rsrc, Etiq Salto y enlaza si >= 0bltz Rsrc, Etiq Salto si < 0blez Rsrc, Etiq Salto si

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    28/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 25

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    29/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 26

    CARGA

    la Rdest, ident Carga direccin ()lb Rdest, direccin Carga byte (ext.

    signo)lbu Rdest, direccin Carga byte (sin ext.)lh Rdest, direccin Carga media-pal.(ext.)lhu Rdest, direccin Carga media-pal.(s.e.)lw Rdest, direccin Carga palabrald Rdest, direccin Carga doble palabra()

    ALMACENAMIENTOsb Rsrc, direccin Almacena byte bajo

    sh Rsrc, direccin Alm. media-pal. bajasw Rsrc, direccin Alm. palabrasd Rsrc, direccin Alm. doble palabra

    En las instrucciones de carga y almacenamiento:

    Direcciones para bytes: cualquiera. Direcciones para medias pal.: mltiplos de dos (pares).

    Dir. para palabras: mltiplos de 4.

    Dir. para dobles palabras: mltiplos de 8.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    30/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 27

    MOVIMIENTO

    move Rdest, Rsrc Rdest Rsrc ()mfhi Rdest Rdest himflo Rdest Rdest lomthi Rdest hi Rdestmtlo Rdest lo Rdest

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    31/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 28

    USO DE REGISTROS Y MEMORIA

    Registros de la CPU

    32 registros de propsito general

    $n registro n

    $0=0 siempre

    Identificadores y usos convenidos (tabla)

    $1, $26, $27 el ensamblador y S.O.

    $4-$7 Paso primeros 4 arg. a subrutinas

    $8-$15, $24, $25 Temporales $16-$23 Valores preservados en llamadas

    $29 Puntero de pila

    $30 Puntero de marco

    $31 Direccin de retorno (jal)

    $28 Puntero a datos globales (64K): heap

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    32/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 29

    Nmero Nombre Uso

    0 $zero Constante 01 $at Reservado para el ensamblador2 $v0 Evaluacin de expresiones3 $v1 Evaluacin de expresiones4 $a0 Argumento 15 $a1 Argumento 2

    6 $a2 Argumento 37 $a3 Argumento 48 $t0 Temporal (no preservado entre llamadas)9 $t1 Temporal (no preservado entre llamadas)10 $t2 Temporal (no preservado entre llamadas)11 $t3 Temporal (no preservado entre llamadas)12 $t4 Temporal (no preservado entre llamadas)13 $t5 Temporal (no preservado entre llamadas)14 $t6 Temporal (no preservado entre llamadas)15 $t7 Temporal (no preservado entre llamadas)16 $s0 Salvado temporalmente (preservado entre llamadas)17 $s1 Salvado temporalmente (preservado entre llamadas)18 $s2 Salvado temporalmente (preservado entre llamadas)19 $s3 Salvado temporalmente (preservado entre llamadas)20 $s4 Salvado temporalmente (preservado entre llamadas)21 $s5 Salvado temporalmente (preservado entre llamadas)22 $s6 Salvado temporalmente (preservado entre llamadas)

    23 $s7 Salvado temporalmente (preservado entre llamadas)24 $t8 Temporal (no preservado entre llamadas)25 $t9 Temporal (no preservado entre llamadas)26 $k0 Reservado para el ncleo del S.O.27 $k1 Reservado para el ncleo del S.O.28 $gp Puntero al rea global (global pointer)29 $sp Puntero de pila (stack pointer)30 $fp Puntero de marco (frame pointer)31 $ra Direccin de retorno (return address)

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    33/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 30

    Distribucin de la memoria

    Organizacin convencional

    3 partes:

    Segmento de cdigo: 0x400000 (text segment)

    Segmento de datos: 0x10000000 (data segment)

    Segmento de pila: 0x7FFFFFFF (stack segment) $29

    Segmento de pila

    Datos dinmicosDatos estticos

    Segmento cdigo

    Reservado0x00000000

    0x10000000

    0x00400000

    0x7FFFFFFF

    Ordenamiento de los bytes:

    Little endian

    31

    32 1 00

    Big endian

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    34/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 31

    31

    0

    1 2 30

    PROGRAMACIN EN ENSAMBLADOR

    1 instruccin por lnea

    4 campos:

    Etiqueta (opcional)

    Cdigo operacin

    Operandos

    Comentario (opcional)

    Identificadores: Caracteres alfanumricos + _ + .

    Palabras reservadas

    Etiquetas = identificador+:

    Directivas: Instrucciones SOLO para el ensamblador

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    35/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 32

    Directiva.align n Alinea el siguiente dato en 2n bytes. Con n=0, se

    desactiva la alineacin de .half, .word, .float,.double hasta la siguiente directiva .data

    .ascii str Almacena la cadena str en memoria sin car. nulo.

    .asciiz str Almacena str en memoria + car. nmero 0 (NULL)

    .byte b1, ,bn Almacena los bn en bytes de memoria consecutiva

    .data Almacena los elementos declarados acontinuacin de la directiva a partir de la dir.ADDR en el segmento de datos. Si no aparece setoma la dir. por defecto.

    .double d1, ,dn Almacena los dn doble words de coma flotante (64bits) consecutivamente en memoria.

    .end Fin del programa

    .float f1, ,fn Almacena los fn valores de coma flotante (32 bits)consecutivamente en memoria.

    .global smbolo Smbolo declarado como global. Se puedereferenciar desde otros archivos.

    .half h1, ,hn Alamcena las hn medias palabras (16 bits)consecutivamente en memoria.

    .space n n bytes reservados en el segmento de datos

    .text Almacena los elementos declarados tras estadirectiva en el segmento de cdigo a partir de ladireccin ADDR. Estos elementos solo pueden serpalabras (.word) o instrucciones. Si no aparece

    ADDR se toma la direccin por defecto..word w1, ,wn Almacena las wn palabras (32 bits) en posicionesconsecutivas de memoria.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    36/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 33

    EJEMPLOSEjemplo 1:

    Suma de los primeros 200 nmeros.

    En PASCAL:

    i:=0; suma:=0;REPETIRi:=i+1;suma:=suma+1;

    HASTA QUE(i>=200)

    i $8, suma $9

    .data 0x10000000 #seg. de datos

    .text #seg. Cdigo

    .global __start #Inicio del prog.

    __start: addi $8,$0,0 #i:=0addi $9,$0,0 #suma:=0

    repeat: addi $8,$8,1 #i:=i+1add $9,$9,$8 #suma:=suma+islti $10,$8,200 #$10:=1 si i

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    37/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 34

    Ejemplo 2:

    Programa que cuenta la longitud de la palabraFundamentos+NULL almacenada a partir de la direccin0x10000000. En $21 se debe almacenar la cadena.

    .data 0x10000000 #Seg. de datos

    .asciiz Fundamentos.text

    .global inicio #En SPIM __start

    inicio: lui $20, 0x1000 #Carga parte altaori $20, 0x0000 #Carga parte bajaaddi $21, $0, 0 #Inicializamos a 0

    bucle: lb $19, 0($20) #Lectura byte de la cad.beq $0, $19, fin #Si es 0 (NULL), fin

    addi $20, $20, 1 #Inc. para leer sig. caraddi $21, $21, 1 #Inc. longitudj bucle

    fin: .end

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    38/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 35

    Ejemplo 3:

    Programa que copia la longitud de la palabraFundamentos + NULL almacenada a partir de la direccin0x10000000 a la direccin 0x100020A0

    .data 0x10000000 #Seg. de datos

    .asciiz Fundamentos.data 0x100020A0 #Direccin destino

    .space 12 (11+1) #Espacio para copia

    .text

    .global inicio #En SPIM __start

    inicio: lui $20, 0x1000 #Carga parte altaori $20, 0x0000 #Carga parte bajalui $21, 0x1000 #Parte alta destino

    ori $21, 0x20A0 #Parte baja destinobucle: lb $19, 0($20) #Lectura byte de la cad.

    sb $19, 0($21) #Copiamos caracterbeq $0, $19, fin #Si es 0 (NULL), finaddi $20, $20, 1 #Inc. para leer sig. caraddi $21, $21, 1 #Siguiente car. destinoj bucle

    fin: .end

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    39/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 36

    EJEMPLO 4:

    Programa que cuenta los bits a 1 en una palabra de 32 bits

    Palabra en registro $20. Resultado en registro $21.

    .data 0x10000000

    .text

    .global __start

    inicio: add $21, $0, $0 #Contador a 0beq $20, $0, fin #Si no hay 1s, finaddi $18, $0, 1 #Ponemos 1 en $18

    rotar: beq $18, $0, fin #32 desplazamientosand $19, $20, $18 #Extraer bit i-essimosll $18, $18, 1 #Desplazar a la izq.beq $19, $0, rotar #Bit 0, no contamos

    addi $21, $21, 1 #Incrementamos cuentaj rotar

    fin .end

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    40/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 37

    EJEMPLO 5:

    Programa en ensamblador que concatene dos cadenasacabadas en NULL.

    El algoritmo debe copiarlas en una cadena destino.Primero copia una y despus copia la segunda acontinuacin.

    Para referenciar una posicin de memoria usaremos

    etiquetas en lugar de usar lui y ori. Las etiquetas apuntanal inicio de las cadenas. Las direcciones las genera elensamblador.

    .data 0x10000000cad1: .asciiz ensambladorcad2: .asciiz ejemplo

    dest: .space 19.text.global __start

    inicio: add $16,$0,$0lcad1: lb $17, cad1($16) #Leer caracter cad. 1

    beq $17,$0,flcad1 #Si es 0, leer cad. 2sb $17,dest($16) #Copiamos a destinoaddi $16,$16,1 #Incrementamos indice

    j lcad1 #Seguir leyendo cad. 1flcad: add $18,$0,$0 #Lectura seg. cadenalcad2: lb $17,cad2($18) #Leer carcter

    sb $17,dest($16) #Copiar a destinobeq $17,$0, fin #Con NULL acabamosaddi $16,$16, 1 #Incrementamos indice 1addi $18, $18, 1 #Inc. indice 2j lcad2

    fin: .end

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    41/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 38

    EJEMPLO 6:

    Dado un vector de 6 enteros de 32 bits en 0x10000000, noindique cuantos elementos son mayores, menores eiguales que el ltimo elemento. Ubicar el resultado enmemoria, despus de los elementos del vector y delnmero de elementos.

    .data 0x10000000vector: .word 34, 21, 10, 5, 3, 10nelem: .word 6mayor: .word 0menor: .word 0igual: .word 0

    .text

    .global __start

    inicio: lw $20,nelem($0) #Leemos nm. elementosaddi $16,$0,4mult $20,$16 #Tamao en bytesmflo $16 #Movemos lo a $16addi $16,$16,-4 #Indice ltima coponentelw $8,vector($16) #Referencia en $8add $18,$0,$0 #Indice para vector

    bucle: addi $20,$20,-1 #Dec. nmero elementoslw $21,vector($18) #Leemos elemento vectoraddi $18,$18,4 #Inc. indice

    si: slt $7,$21,$8 #$21

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    42/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 39

    j finb

    snsa: beq $21,$8,igua #Son iguales?lw $9,mayor($0) #Mayor. Leer mayoresaddi $9,$9,1sw $9,mayor($0)j finb

    igua: lw $9,igual($0) #Leemos igualesaddi $9,$9,1sw $9,igual($0)

    finb: beq $20,$0,finj bucle

    fin: .end

    PROGRAMACIN MEDIANTE

    SUBRUTINAS

    MIPS da soporte a las subrutinas mediante lainstruccin jal (jump and link).

    Almacena en $31 la direccin de retorno (PC)

    Sintaxis: jal Direccin

    Para finalizar: jr $31

    jal rutina

    instruccin

    D-4

    D

    rutina

    jr $31

    $31:=D (PC+4)

    PC:=rutina

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    43/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 40

    Llamadas anidadas?

    Solucin: Usar la pila ($29)

    Almacenar en pila: Apilar opush

    Sacar de pila: Desapilar opop

    Por ejemplo:

    Prog.

    principalRutina 1 Rutina 2

    Rutina 3

    El compilador generar:

    inicio: jal Rut1j fin

    Rut1: addi $29,$29,-4 #Apilarsw $31, 0($29) #Guardar dir. retornojal Rut2lw $31,0($29) #Recuperar direccin

    addi $29,$29,4 #Desapilarjr $31

    Rut2: igual que Rut1

    Rut3: #No hace falta apilar porque no#hay llamada a subrutina

    jr $31

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    44/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 41

    fin: .end

    Paso de parmetros

    Por convencin se usan $4, $5, $6, $7

    Para ms parmetros se usa la pila

    Preservacin de registro s

    Con rutinas anidadas, que pasa con $4$7?

    Solucin: Usar la pila

    Cuando se llama a una subrutina, que ocurre con los

    valores actuales de los registros? Dos convenios:

    Guardar invocadora (caller save).

    Guardar invocada (callee save).

    En MIPS se usa el convenio callee save.

    Guardar

    Salto

    RestaurarRutina Salto

    Guardar

    Rutina

    Restaurar

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    45/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 42

    EJEMPLOS

    Uso de subrutinasPROCEDURE intercambia(var v:vector;k:integer);VAR temp:integer;BEGINtemp:=v[k];v[k]:=v[k+1];v[k+1]:=temp;

    END.

    Registros: $15temp, $4v, $5k

    Algoritmo de ordenamiento de la burbujaPROCEDURE ordena(var v:vector; n:integer);VAR i,j:integer;BEGINFOR i:=0 TO n-1 DOBEGINj:=i-1;WHILE(j>=0) AND (v[j]>v[j+1]) DOBEGINintercambia(v,j);j:=j-1;

    END;END;END.

    Registros: $19i, $17j, $4v, $5n

    PASOS A SEGUIR:

    1.Generar cuerpo de la rutina

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    46/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 43

    2.Salvar los registros usados

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    47/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 44

    Rutina de intercambio de elementos del vector:

    1.- Cuerpo:2 addi $14,$0,4 #$14=4

    mult $5,$14 #lo=k*4mflo $2 #$2=lo (k*4)add $2,$4,$2 #$2=v+(k*4) v[k]lw $15, 0($2) #$15(temp)=v[k]

    lw $16, 4($2) #$16=v[k+1]sw $16, 0($2) #v[k]=$16=v[k+1]sw $15, 4($2) #v[k+1]=$15=temp

    2.- Salvado de registros ($2,$14,$15,$16)inter: addi $29,$29,-16 #Espacio para 4 pal1 sw $2, 0($29) #Apilar $2

    sw $14, 4($29) #Apilar $14sw $15, 8($29) #Apilar $15

    sw $16, 12($29) #Apilar $16Recuperacin de registros y retorno de subrutina3 lw $2, 0($29) #Desapila $2

    lw $14, 4($29) #Desapila $14lw $15, 8($29) #Desapila $15lw $16, 12($29) #Desapila $16addi $29,$29,16 #Vaciar pilajr $31 #Fin de subrutina

    Rutina de ordenamiento de la burbuja:

    Necesita guardar los parmetros en otros registros

    Hay que implementar dos bucles anidados

    El bucle interno tiene dos condiciones

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    48/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 45

    1.-Cuerpo:

    ordena: ( 4 )Apilar registros usados5 add $18,$4,$0 #Copia parmetro v

    add $20,$5,$0 #Copia parmetro nadd $19,$0,$0 #i:=0addi $21,$0,4 #$21=4

    for: slt $8,$19,$20 #$8=0 si i>=nbeq $8,$0,exitf #Salir si i>=naddi $17,$19,-1 #j:=i-1

    while: slti $8,$17,0 #S8=1 si j=v[j]

    add $4,$18,$0 #Parmetro v=vadd $5,$17,$0 #Parmetro k=jjal inter

    addi $17,$17,-1 #j:=j-1j while #Repetir bucle while

    exitw: addi $19,$19,1 #i:=i+1j for #Repetie bucle for

    exitf: ( 6 )Desapilar todos los registros apiladosjr $31 #Retorno de subrutina

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    49/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 46

    2.-Apilar - desapilar: $8,$15-$21, $24, $25, $31: total 11

    4 addi $29,$29,-44 #Espacio para 11 pal.sw $8,0($29) #Apilar $8sw $31,40($29) #Apilar $31

    6 lw $8,0($29) #Desapilar $8addi $29,$29,44 #Liberar espacio pila

    Programa principal que llama a la rutina de la burbuja

    .data 0x10000000v: .word 0x10000004 #Direccin vector

    .word 72,50,8 #Vector

    .word 20,15

    .text

    .global inicio

    inicio: lw $4,v($0) #Inicializa parmetro vaddi $5,$0,5 #Inicializa parmetro njal ordena #Burbujaj fin #Salto al final

    CODIGO DE LAS RUTINAS

    fin: .end

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    50/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 47

    MANEJO DE DATOS EN COMAFLOTANTE

    Standar IEEE 754

    Formatos simple (32 bits) y doble precisin (64 bits)

    Datos manejados por FPU 32 registros de 32 bits.

    Doble precisin: 2 registros consecutivos.

    Instrucciones de coma flotante SOLO con reg. pares

    Registro de control y estado

    Idea similar a procesador: carga y almacenamiento

    Operaciones en FPU y P simultneas

    Instrucciones con sufijo d (doble) y s (simple)

    Instrucciones para coma flotante

    FRdest, FRsrc1 y FRsrc2 registros de FPU PARES ($fn)

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    51/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 48

    add. FRdest, FRsrc1, FRsrc2

    d(doble precisin) s (simple precisin)

    sub. FRdest, FRsrc1, FRsrc2

    abs. FRdest, FRsrc

    Valor absoluto de FRsrc

    mult.FRdest, FRsrc1, FRsrc2div. FRdest, FRsrc1, FRsrc2

    l. FRdest, direccion ()

    s. FRdest, direccion ()

    Carga y almacenamiento

    mfc1 Rdest,FRscr

    Mueve dato de FPU a CPU

    mtc1 Rsrc,FRdest

    Mueve dato de CPU a FPU

    mfc1.d Rdest,FRscr ()

    Mueve datos de FRscr y FRscr+1 a Rdest y Rdest+1

    mtc1.d Rsrc,FRdest ()

    Idem pero de CPU a FPUc.x. FRscr1,FRscr2

    Comparacin de FRscr1 y FRscr2. Se activa el bitcorrespondiente del reg. de estado del coprocesador. El bitdepende de la condicin x: eq, neq, lt, le, gt, ge.

    bc1t direccion #Salto si TRUE

    bc1f direccion #Salto si FALSE

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    52/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 49

    Ejemplo:

    Suma de los elementos de un vector en coma flotante desimple precisin. El vector empieza en 0x10000004.

    .data 0x10000000tam: .word 4vector: .float 3.1415, 2.7182

    .float 1.0e+2, 6.5e-1

    res: .float 0.0.text.globl __start

    inicio: addi $15,$0,0 #Indiceaddi $17,$0,0 #Contadorlw $16,tam($0) #Tamao del vectormtc1 $0, $f2 #0 a f2 (temporal)

    bucle: l.s $f4,vector($15)#Leemos elem $15 vectoradd.s $f2,$f2,$f4 #Sumamos elementoaddi $15,$15,4 #Increm. indiceaddi $17,$17,1 #Increm. contadorslt $8,$17,$16 #Final?bne $8,$0,bucle #$8=1 implica $17

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    53/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 50

    LLAMADAS AL SISTEMA Son llamadas al sistema operativo

    Facilitan la tarea del programador

    Ofrecen servicios como imprimir por pantalla ointroducir nmeros y caracteres por teclado

    syscall

    Tipo de llamada en $2 ($v0)

    Parmetros en $4$7 ($f12 con coma flotante)

    Ejecutar syscall.

    El resultado se devuelve en $2 o $f0

    Servicio Cdigo Parmetros Resultadoprint_int 1 $4=enteroprint_float 2 $f12=floatprint_double 3 $f12=dobleprint_string 4 $4=dir. cadenaread_int

    5 $2 enteroread_float 6 $f0 floatread_double 7 $f0 dobleread_string 8 $4=dir. buffer,

    $5= longitudsbrk 9 $4=desplazam. $2 direccinexit 10

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    54/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 51

    EJEMPLO

    Programa que calcula la potencia de dos nmeros: ab

    Para ensamblador, deberemos imprimir las cadenas y leerlos datos que el usuario introduzca con llamadas alsistema.

    .data 0x10000000cad1: .asciiz \nDame la base real:

    cad2: .asciiz \nDame el exponente entero:cad3: .asciiz \nEl resultado es:.text.global inicio

    inicio: addi $2,$0,4 #Cdigo impresinla $4, cad1 #direccin de cadena1syscall #Impresinaddi $2,$0,6 #Cod. lectura floatsyscall #Lectura baseaddi $2,$0,4 #Cod. impresin

    la $4, cad2 #direccin cadena2syscall #Impresinaddi $2,$0,5 #Cod. lectura enterosyscall #Lectura exponente

    mfc1 $4,$f0 #Pasamos la base a $4add $5,$0,$2 #Exponente en $5jal pot #Llamada a rutinamtc1 $2,$f12 #Resultado de $2 a $f12addi $2,$0,4 #Cdigo impresinla $4,cad3 #Direccin cadena3syscall #Impresinaddi $2,$0,2 #Escritura floatsyscall #Escribimos $f12addi $2,$0,10 #Cod. salida programasyscall.end

    pot: addi $29,$29,-12 #Hacemos sitio en pila

    sw $9,0($29) #Apila $9

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    55/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 52

    s.s $f4, 4($29) #Apila $f4s.s $f6, 8($29) #Apila $f6addi $9,$0,2 #i:=2mtc1 $4,$f4 #aux:=base

    mtc1 $4,$f6 #$f6:=basefor: slt $10,$5,$9 #i>exponente?

    bne $10,$0,exif #salir si i>exponentemul.s $f4,$f4,$f6 #aux:=aux*baseaddi $9,$9,1 #i:=i+1j for

    exif: mfc $2,$f4 #Devolvemos res en $2

    lw $9,0($29) #Desapilar $9l.s $f4, 4($29) #Desapilar $f4l.s $f6, 8($29) #Desapilar $f6addi $29,$29, 12 #Restaurar pilajr $31 #Fin subrutina

    PROGRAMAS RECURSIVOS

    Rutina que se llama a si misma En cada llamada se usan los mismos registros y

    direcciones de memoria

    Uso adecuado de la pila

    Estructu ra de la pi la Es necesario almacenar en la pila cierta informacin

    MIPS ofrece un modelo para hacer las llamadas de unaforma uniforme, que indica la estructura que debe tenerla pila:

    1.Argumentos de la subrutina (ms de 4)

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    56/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 53

    2.Registros que se modifican en la subrutina y cuyo

    valor se debe mantener3.Variables locales.

    Argumento 5

    Argumento 6

    ...

    Registrosguardados

    Variables locales

    +

    -$sp ($29)

    $fp ($30)

    Dis eo (ejemp lo fac to rial)

    FUNCTION factorial(n:integer):integer;BEGINIF(n0)THEN factorial:=n*factorial(n-1);ELSE factorial:=1;

    END;

    Cada llamada debe guardar su propia pila. Suponemosque tenemos el entero en $2 y que ya lo hemos leido delusuario. El parmetro de factorial lo pasamos en $4: #Inicializacin y lectura

    addi $4,$2,0 #Parmetro introducido a $4jal fact #Llamada principal

    #Imprimir y terminar

    fact: addi $29,$29,-8 #Espacio para 2 palabrassw $4,4($29) #Almacena parmetro ($4)

    sw $31,0($29) #Almacena dir. retorno

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    57/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 54

    lw $2,4($29) #Lectura argumento n ?bgtz $2,seguir #Si n>0 llamarseaddi $2,$0,1 #Un 1 como resultadoj volver #fin de recursin

    seguir: lw $3,4($29) #Lectura argumento naddi $4,$3,-1 #Parmetro n-1

    jal fact #Llamada recursiva

    lw $3,4($29) #Lectura argumento nmult $2,$3 #n*factorial(n-1) ($2)mflo $2 #Resultado parcial

    volver: lw $31,0($29) #Direccin de retotno

    addi $29,$29,8 #Restaurar pilajr $31 #Retorno

    REGULARIDAD Y ORTOGONALIDAD

    Regularidad: Conjunto de instrucciones uniformes sincasos especiales. Simplifica la programacin.

    Ortogonalidad: Cualquier operacin se puede usarcon cualquier operando y cualquier modo dedireccionamiento.

    Los dos conceptos estn muy unidos.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    58/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 55

    EJEMPLOS:

    Programa que detecta cadenas capicuas.

    Clculo de la serie de fibonazzi.

    Conversin a formato IEEE 754.

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    59/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 56

    .databuffer: .space 100

    cad: .asciiz "\nIntroduce la cadena:"si: .asciiz "\nLa cadena es capicua"no: .asciiz "\nLa cadena no es capicua"

    .text

    .globl __start__start: la $4,cad

    addi $2,$0,4syscalladdi $2,$0,8la $4,bufferaddi $5,$0,100syscall

    add $11,$0,$0 #Clculo de la longitudaddi $12,$0,10

    long: lb $10,0($4)beq $10,$12,finlongaddi $4,$4,1addi $11,$11,1j long

    finlong: beq $11,$0,fin #Cadena vaciaaddi $4,$4,-1 #Apuntar al ultimo char.la $5,buffer

    bucle: lb $10,0($4)lb $12,0($5)bne $10,$12,finno

    addi $4,$4,-1addi $5,$5,1addi $11,$11,-2

    slti $13,$11, 2 #$13=1 si $11

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    60/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 57

    fin: addi $2,$0,10syscall

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    61/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 58

    .data

    .text

    .globl __start

    __start:addi $2,$0,5syscalladd $4,$0,$2jal fibonj fin

    fibon: addi $29,$29,-12sw $10,8($29)sw $4,4($29)sw $31,0($29)

    beq $4,$0,zeroslti $10,$4,2bne $10,$0,un

    addi $4,$4,-1jal fibon

    add $10,$0,$2lw $4,4($29)addi $4,$4,-2jal fibonadd $2,$2,$10jr finfibo

    zero: add $2,$0,$0jr finfibo

    un: addi $2,$0,1

    finfibo: lw $31,0($29)lw $4,4($29)lw $10,8($29)addi $29,$29,12jr $31

    fin: add $4,$0,$2add $2,$0,1syscalladdi $2,$0,10

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    62/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 59

    syscall

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    63/64

    FUNDAMENTOS DE COMPUTADORESTema 3. Lenguaje Ensamblador 60

    .dataflotant: .float 103.487

    string: .byte 0,0,0,0,0,0,0,0,0 #Espacio para almacenar elnmerocad: .asciiz "\nIntroduce el nmero en coma flotante:"return: .asciiz "\nEl nmero en formato IEEE754 es (en Hex.):\n"

    .text

    .globl __start__start: la $4,cad #Impresin de la cadena cad

    addi $2,$0,4syscalladdi $2,$0,6 #Lectura de nmero en coma flotantesyscallmov.s $f12, $f0 #Impresin del nmeroaddi $2, $0, 2syscall

    mfc1 $4, $f0 #Llevmos el nmero del copro a laaddi $5, $0, 16 #CPU para su visualizacinaddi $6, $0, 7

    bucle: divu $4, $5 #Conversin a hexadecimalmfhi $7 #Dividiendo por 16 sucesivamente

    sb $7, string($6) #Y almacenando los resultados enaddi $6, $6, -1 #el espacio reservado en ordenmflo $4 #inverso: primera divisin dgitobne $4,$0,bucle #menos significativoadd $6, $0, $0addi $10, $0, 8

    loop: lb $4, string($6) #Conversin de la cadena de digitosslti $5, $4, 10 #hex. en sus correspondientesbne $5, $0, menorde10 #caracteres ASCII para poderlos

    #Imprimirmajorde10:addi $4, $4, 55 #Si el dgito es mayor de 9

    j finloop #sumamos 55 a su valor para convertir#en los caracteres de A a F.

    menorde10:addi $4, $4, 48 #Si esta entre 0 y 9, sumamos 48 para#Convertir en caracteres 0 a 9.

    finloop: sb $4, string($6)addi $6, $6, 1beq $6, $10, fin #Repetimos para todos los dgitosj loop

    fin: la $4,return #Imprimimos la cadena returnaddi $2,$0,4syscall

  • 7/23/2019 U1 Apuntes Lenguaje Ensamblador

    64/64

    la $4,string #Imprimimos la cadena correspondienteaddi $2,$0,4 #al numero convertido

    syscalladdi $2,$0,8 #Esperamos la pulsacion de una tecla

    la $4,cadaddi $5,$0,2syscall

    addi $2,$0,10 #Fin del programasyscall