Oct 2019 Se dice que una palabra es palındroma cuando resulta la misma leıda de izquierda a derecha que de derecha a izquierda (por ejemplo anilina). a) (30 %) Programe en ensamblador del 88110 la funcion pal(str) que recibe un parametro en la pila que es una cadena de caracteres, pasada por direccion, acabada con el caracter NUL . Dicha funcion devuelve en el registro r29 el valor entero 0 si no es palındroma o 1 si lo es. Se supondra que existe la funcion de librerıa strlen(str) que devuelve en r29 la longitud de la cadena de caracteres str que finaliza con el caracter NUL (excluyendo dicho caracter). El parametro str se pasa por direccion en la pila. Para la realizacion de este ejercicio se llevara a cabo el tratamiento del Marco de Pila descrito en clase y se supondra que estan definidas todas las macros que se han explicado en la parte teorica de la asignatura; que las subrutinas llamantes dejan disponibles todos los registros excepto r1, r30 (SP) y r31 (FP); que la pila crece hacia direcciones de memoria decrecientes y el puntero de pila apunta a la ultima posicion ocupada.


Los pasos a seguir son 1º conocer el tamaño de la palabra para despues poner r20 y r21 apuntando al primer y ultimo digito, como tenemos strlen (str) lo primero sera llamarla
pal: PUSH(r1) guardamos posicioon de retorno r1
ld r20,r30,4 metemos en r20 la cadena de caracteres para meterlo pasarlo por strlen, recordemos que r30 es SP
PUSH(r20) guardamos r20 para pasarlos por strlen y llamamos a streln con bsr
bsr strlen
fin de la llamda r29 contiene el tamaño
addu r30,r30,4 SP apunta a la ultima dir ocupada y decreciente por tanto para saltar el null subimos uno
cmp r7,r29,r0 compara la longitud con 0 por si es pal
bb1 eq,r7,es_pal si lo es salta pal
subu r29,r29,1 resta el tamaño -1 para el desplazamiento que realizara mas adelante
ld r20,r30,4 ponemos r20 en la primera pos
addu r21,r20,r29 ponemos r21 en la ultima pos
or r29,r0,r0 r29 ya no lo necesitamos y lo ponemos a 0
bucpal: cmp r7,r20,r21 comparamos el principio con el final
bb1 hs,r7,es_pal hs = r20 >= r21 por si termina el bucle
ld.bu r2,r20,r0 guarda r20 en r2
ld.bu r3,r21,r0 guarda r21 en r3
cmp r7,r2,r3 compara para ver si no son iguales y asi saltar a ne
bb1 ne,r7,no_pal
subu r21,r21,1 mueve las posiciones como ya sabemos r21 apunta al ultimo
addu r20,r20,1
br bucpal bucle para mirar elemento a elemento
es_pal: or r29,r0,1 r 29 es como el return , como lo pusimos a 0 en el or
no_pal: POP(r1)
jmp(r1) fin

Programe en ensamblador del 88110 la funcion inspec(vpal,vchar) que recibe dos parametros en la pila (ambos por direccion): vpal: Es un vector de cadenas de caracteres. Cada elemento del vector contiene un puntero a una cadena de caracteres que finaliza con el caracter NUL. Si el puntero contiene la direccion NULL indica que el vector ha finalizado. Es un parametro de entrada. vchar: Es un vector de enteros de un byte. El elemento i-esimo del vector contendra 1 si el elemento i-esimo de vpal apunta a una palabra palındroma o 0 si no. Es un parametro de salida. La rutina llamante se encarga de reservar memoria suficiente para este parametro. La funcion devolvera en r29 el numero de elementos evaluados de vpal.


Para evaluar el vector vpal es necesario recorrer lo con un puntero que ocupara una variable local en lapila (desplazamiento -8 a r31). Ademas es necesario devolver en r29 el numero de elementos evaluados, por lo que es necesario almacenarlo en otra variable local (desplazamiento -4 a r31). Se recorre el puntero vpal hasta que se encuentra NULL. El byte menos significativo del valor devuelto por pal en r29 se almacena en la posicion de vchar indicada por la cuenta almacenada en la var
inspec: PUSH(r1) guardamos posicion de retorno r1
PUSH(r31) guardamos marco de pila
or r31,r30,r30 se crea el marco de pila
subu r30,r30,8 se guardan dos palabras
ld r20,r31,8 se carga vpal
or r3,r0,r0 contador de elementos a 0
buc_ev: ld r21,r20,r0 elemento de vpal
cmp r7,r21,r0 null termina
bb1 eq,r7,fin_ev
st r20,r31,-8 se almacena el puntero en el cursor
st r3,r31,-4 var locales en pila
PUSH(r21) comprueba si es pal
bsr pal la funcion anteriormente realizada
addu r30,r30,4
ld r20,r31,-8 vchar
ld r3,r31,-4 se recuperan las las variables locales en pila
ld r21,r31,12
st.b r29,r21,r3 se almacena en las pos de vchar
addu r3,r3,1
addu r20,r20,4 incrementamos y sigue el bucle
fin_ev: or r29, r3, r3 r 29 es como el return copia de r3
or r30,r31,r31 fin marco de pila
POP(r31) POP(r1) fin
jmp(r1)

Se pide implementar en ensamblador del MC88110 una subrutina que realice el producto de dos matrices de numeros enteros positivos de simple precision (cada elemento es de 32 bits). Esta rutina multiplicara dos matrices, una matriz matA, de dimensiones MxN, por otra matriz matB, de dimensiones NxP, dejando el resultado en una matriz matR, de dimensiones MxP, en doble precision (cada elemento es de 64 bits). Para facilitar su implementacion, esta rutina se apoyara en otra que calculara cada elemento aij de la matriz matR individualmente, para ello multiplicara la fila i de matA por la columna j de matB, ya que el elemento en cuestion se obtiene como CALC ELEM(DirFil, SepFil, DirCol, SepCol, DimVec), que calcula el elemento aij de la matriz matR, como el producto de la fila y columna que se les pasa como parametros. Los para ́metros de entrada se pasan en la pila:
  • DirFil por direccion, es la direccion de comienzo de la fila i-esima de matA.
  • SepFil por valor, es la separacion expresada en palabras entre los distintos elementos de la fila de matA.
  • DirCol por direccion, es la direccion de comienzo de la columna j-esima de matB.
  • SepCol por valor, es la separacion expresada en palabras entre los distintos elementos de la columna de matB.
  • DimVec por valor, es la dimension de los dos vectores, tanto de la fila, como de la columna.
  • Para evitar desbordamientos, se realizara este producto en doble precision, es decir, aunque los elementos de matA y matB son de 32 bits, el producto se expresara en 64 bits. La subrutina devuelve en r28-r29 el elemento aij que ha calculado, en r28 la parte alta y en r29 la parte baja. No es necesario que esta subrutina implemente el marco de pila. Para realizar este producto se recomienda usar la instruccion mulu.d rD, rS1, rS2, que realiza el producto de rS1 por rS2 y deja el resultado en doble precision en rD y rD+1, la parte baja en rD+1 y la parta alta en rD.


    Lo primero fijarse bien como se trabaja con matrices y como se tratan, se pasan 5 elementos por parametros, y en el enunciado te dicen como trabajar la multiplicacion.
    CALC_ELEM: ld r10,r30,0 DirFil por direccion, es la direccion de comienzo de la fila i-esima de matA.
    ld r11,r30,8 DirCol por direccion, es la direccion de comienzo de la columna j-esima de matB.
    ld r15, r30,16 DimVec por valor, es la dimension de los dos vectores, tanto de la fila, como de la columna.
    ld r20,r30,4 SepFil por valor, es la separacion expresada en palabras entre los distintos elementos de la fila de matA.
    ld r20,r30,12 SepCol por valor, es la separacion expresada en palabras entre los distintos elementos de la columna de matB.
    mak r20,r20,0<2> Extrae el campo de bit de r20 empezando por el bit menos significativo y lo mete en r20 con desplazamiento 0<2>
    mak r21,r21, 0<2> igual pero en r21
    add r28,r0,r0 punteros para moverse por la matriz
    add r29,r0,r0 punteros para moverse por la matriz
    SIG_ELEM: ld r12,r10,0 carga r10 en r12 para moverse por la matriz
    ld r13,r11,0 igual pero con la matriz B
    mulu.d r26,r12,r13
    addu.co r29,r29,r27
    addu.ci r28,r28,r26
    addu r10,r10,r20
    addu r11,r11,r21
    DBNZ (r15,SIG_ELEM)
    jmp (r1) se almacena en las pos de vchar

    b) (60%)MULTMAT(DirMatA,DirMatB,DirMatR,M,N,P),quecalculaelproductodelasmatricesmatA y matB, cuyos elementos son nu ́meros enteros positivos de 32 bits, y deja el resultado en matR, cuyos elementos son nu ́meros enteros positivos de 64 bits. Los para ́metros de entrada se pasan en la pila: DirMatA por direccion, es la direccion de comienzo de la matriz A. DirMatB por direccion, es la direccion de comienzo de la matriz B. DirMatR por direccion, es la direccion de comienzo de la matriz R. M, N, P por valor, son las dimensiones de las matrices, MxN indica el tamano de matA y NxP indica el tamano de matB


    PUSH (r1)
    PUSH (r31)
    add r31, r30, 0
    sub r30, r30, 20
    ld r10, r31, 8
    ld r11, r31, 12
    ld r12, r31, 16
    ld r13, r31, 28
    ld r14, r31, 20
    SIG: ld r20, r31, 20
    ld r21, r31, 28
    ld r22, r31, 24
    add r23, r0, 1
    st r10, r31, -20
    st r11, r31, -16
    st r12, r31, -12
    st r14, r31, -8
    st r13, r31, -4
    PUSH (r22)
    PUSH (r21)
    PUSH (r11)