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
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)
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
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)