















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Estructura de Computadors I, Profesor: , Carrera: Enginyeria Informàtica, Universidad: UPC
Tipo: Apuntes
1 / 23
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
















@* Instruccions Continguts Continguts 0x00EC MOVI R5, A1 R5 = 0x000E R5 = 0x000E 0x00EE MOVHI R5, A1 R5 = 0x010E R5 = 0x010E 0x00F0 MOVI R6, A2 R6 = 0x0012 R6 = 0x 0x00F2 MOVHI R6, A2 R6 = 0x0112 R6 = 0x 0x00F4 LD R1, 0(R5) R1 = 0x0003 R1 = 0x 0x00F6 LD R2, 0(R6) R2 = 0xFFFE R2 = 0xFFFF 0x00F8 SUB R0, R1, R2 R0 = 0x0005 R0 = 0x 0x00FA CMPLTU R3, R1, R2 R3 = 0x0001 R3 = 0x 0x00FC LD R1, 2(R5) R1 = 0x0000 R1 = 0x 0x00FE LD R2, 2(R6) R2 = 0xFFFF R2 = 0x 0x0100 SUB R4, R1, R2 R4 = 0x0001 R4 = 0x 0x0102 SUB R4, R4, R3 R4 = 0x0000 R4 = 0x 0x0104 MOVI R5, R R5 = 0x0016 R5 = 0x 0x0106 MOVHI R5, R R5 = 0x0116 R5 = 0x 0x0108 ST 0(R5), R0 M[0x0116] = 0x0005 M[0x0116] = 0x 0x010A ST 2(R5), R4 M[0x0118] = 0x0000 M[0x0118] = 0x 0x010C HALT 0x010E 0x0003 0x0002 A1: A1: 0x0110 0x0000 0x 0x0112 0xFFFE 0xFFFF A2: A2: 0x0114 0xFFFF 0x 0x0116 0x0000 R: R: 0x0118 0x
Exercici: Rang (Ca2) amb 16 bits: [ − 32768 ... 32767 ]
a) 1024 = 0x
b) -2 = 0xFFFE
c) 65536 = N.R**^ (0x00010000)
d) -32768 = 0x
e) 32768 = N.R **^ (0x00008000)
f) 12345 = 0x
*: La primera adreça (@) és 0x00EC degut al “include crt0.s”.
**: N.R ≡ (No Representable amb 16 bits)
Exercici:
a) 1.0 = 0x3E
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 3 E 0 0
b) -32.125 = 0xC
1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 C 8 0 2
c) 1E2 = 0x4B
0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0
d) 0 = 0x
e) 100000 = 0x5F0D
0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1
f) -23.4 =0xC6EC
1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0
Exercici:
a) (+2) * (-3) = (-6) [0xFFFA] Ovf? No
b) (-32768) * (-1) = (+32768) [0x00008000] Ovf? Si
c) (+1) / (0) = Excepció Ovf? -
d) (-1024) / (+130) = (-7) [0xFFF9] Ovf? No
e) (+32767) / (-32767) = (-1) [0xFFFF] Ovf? No
f) (+1234) * (-512) = (631808) [0xFFF9A400] Ovf? Si
Exercici:
.include “macros.s” .include “crt0.s” .data a: .word 0 b: .word 0 c: .word 1 d: .word 2 e: .word 3 x: .word 0
.text main: $MOVEI R0, a LD R1, 0(R0) ;R1 = a $MOVEI R0, b LD R2, 0(R0) ;R2 = b $MOVEI R0, c LD R3, 0(R0) ;R3 = c $MOVEI R0, d LD R4, 0(R0) ;R4 = d $MOVEI R0, e LD R5, 0(R0) ;R5 = e if: $CMPEQ R0, R1, R2 ;a==b? BZ R0, else ADDI R5, R5, 1 ;R5 = (e+1) MUL R4, R4, R5 ;R4 = d(e+1) SUB R3, R3, R4 ;R3 = c-d(e+1) $MOVEI R0, x ST 0(R0), R3 ;x = c-d(e+1) BNZ R0, endif else: ADDI R5, R5, 1 ;R5 = (e+1) MUL R4, R4, R5 ;R4 = d(e+1) SUB R3, R3, R4 ;R3 = c-d(e+1) ADDI R3, R3, 1 ;R3 = c-d(e+1)+ SUB R1, R1, R2 ;R1 = a-b DIV R3, R3, R1 ;R3 = (c-d(e+1)+1)/(a-b) $MOVEI R0, x ST 0(R0), R3 ;x = (c-d(e+1)+1)/(a-b) endif: HALT Programa del fitxer s1f.s
Exercici 2.1: Traduïu a assemblador el codi de la figura 2.3.
Escrit en C:
int dada;
int *pdada;
main ()
{
pdada = &dada; *pdada = *pdada + 1;
}
Escrit en SISA-F:
main: $MOVEI R1, dada ; R1 = &dada $MOVEI R2, pdada ; R2 = &pdada ST 0(R2), R1 ; pdada = &dada LD R1, 0(R2) ; R1 = pdada LD R3, 0(R1) ; R1 = *pdada ADDI R3, R3, 1 ; R2 = *pdada + 1 ST 0(R1), R Programa del fitxer s2a.s
Exercici 2.2: Escriviu la fórmula per al càlcul de l'adreça de l'element vec[i], en funció de l'adreça inicial de vec i del valor i.
@vec[i] = vec + i*TAM_ELEM
A partir de la fórmula anterior, escriviu un fragment de codi en assemblador tal que copiï en el registre R1 el valor de vec[i], és a dir: R1 <- vec[i].
$MOVEI R1, i LD R1, 0(R1) ADD R1, R1, R1 ;R1 = i* $MOVEI R2, vec ;R2 = &v[0] ADD R1, R1, R2 ;R1 = v + i* LD R1, 0(R1) ;R1 = v[i] Programa del fitxer s2b1.s
Exercici 2.4: Traduïu a assemblador SISA-F el codi del programa de la figura 2.5.
Escrit en C:
#define N 5
char cadena [N+1];
unsigned int vec[N];
void main ()
{
register int i; for (i=0; i<N; i++)cadena[i] = (char)vec[N-i-1] + ’0’; cadena[n]=0; /* posa la marca de final de string! */
}
Escrit en SISA-F:
for:
$CMPLT R3, R1, R BZ R3, ffor $MOVEI R4, vec SUB R5, R2, R ADDI R5, R5, - ADD R5, R5, R ADD R4, R4, R LD R6, 0(R4) MOVI R4, ' ADD R4, R4, R $MOVEI R0, cadena ADD R0, R0, R STB 0(R0), R ADDI R1, R1, 1 BNZ R3, for
ffor:
$MOVEI R3, cadena ADD R2, R2, R MOVI R0, 0 STB 0(R2), R Programa del fitxer s2c.s
Exercici 2.5:
Escrit en C:
#define N 3
#define M 4
struct tupla {
(0)int a; (2)char b; (4)int c;
}; // TAM_ELEM = 6
struct tupla var;
struct tupla mat[N][M];
int i,j;
Escrit en SISA-F:
N = 3 M = 4 .data var: .word 0 .byte 0 .balign 2 .word 0 mat: .fill NM6, 1, 0 .balign 2 i: .word 0 j: .word 0
@var.a = var @var.b = var + 2 @var.c = var + 4
@mat[i][3].a = mat + i46 + 3* @mat[2][j].c = mat + 246 + j*6 + 4
$MOVEI R0, mat+(246)+ $MOVEI R1, j LD R1, 0(R1) MOVI R3, 6 MUL R1, R1, R ADD R0, R0, R LD R0, 0(R0) …
$MOVEI R1, mat+(3*6) $MOVEI R2, i LD R2, 0(R2) MOVI R3, 24 MUL R2, R2, R ADD R4, R1, R ST 0(R4), R Programa del fitxer s2.s
Exercici 3.1: Programa en assemblador la subrutina f del programa de la figura 3.5.
Escrit en C:
int f (int a, int b, int c) { register int r; r = g(c, a); return b –r; }
Escrit en SISA-F:
f: ;crida $PUSH R1, R2, R ADDI R2, R1, 0 ADDI R1, R3, 0 $CALL R6, g $POP R6, R2, R ;ficrida SUB R0, R2, R JMP R Programa del fitxer s3a.s
Exercici 3.2: Programeu en SISA-F la subrutina codifica, la qual fa crides a la funció g.
Escrit en C:
int codifica (char *pfrasein, char *pfraseout) { register int i;
i = 0; while (*pfrasein != 0 ) { *pfraseout = g(alfabet, pfrasein); pfrasein++; pfraseout++; i++; } *pfraseout = 0; return i; }
Escrit en SISA-F:
Versió 1(by Miguel Ángel)
codifica:
MOVI R0, 0
while:
LDB R3, 0(R1) MOVI R4, 0 $CMPNE R5, R3, R BZ R5, fiwhile $PUSH R0, R1, R2, R ADDI R2, R1, 0 $MOVEI R1, alfabet $CALL R6, g $POP R6, R2, R STB 0(R2),R $POP R ADDI R1, R1, 1 ADDI R2, R2, 1 ADDI R0, R0, 1 BNZ R5, while
fiwhile:
JMP R Programa del fitxer s3b.s
Exercici 4.1: Escriu un programa en alt nivell que mostri una ‘A’ a la posició [4,8] de la pantalla, amb atribut invers, i una ‘B’ a la posició [4,9] amb atribut normal. Observa que la fila és la mateixa en els dos casos, així que sols cal escriure-la un cop.
Escrit en C:
main () { out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, ‘A’ + 0x0100); out (Rcon_pant, 0x8000); out (Rcol_pant, 9); out (Rdat_pant, ‘B’); out (Rcon_pant, 0x8000); }
Escrit en SISA-F: MOVI R0, 4 OUT Rfil_pant, R MOVI R0, 8 OUT Rcol_pant, R $MOVEI R1, 'A+0x OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R MOVI R0, 9 OUT Rcol_pant, R $MOVEI R1, 'B OUT Rdat_pant, R OUT Rcon_pant, R HALT
Programa del fitxer s4a.s
Exercici 4.2: Escriu un programa en alt nivell que esperi fins que es polsi una tecla qualsevol, i llavors escrigui una ‘A’ a la posició [4,8] de la pantalla, amb atribut normal.
Escrit en C:
main () {
while (in (Rest_tec) == 0){} out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, ‘A’); out (Rcon_pant, 0x8000); }
Escrit en SISA-F: enq: IN R1, Rest_tec BZ R1, enq MOVI R2, 4 OUT Rfil_pant, R MOVI R2, 8 OUT Rcol_pant, R $MOVEI R2, 'A OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R HALT
Programa del fitxer s4b1.s
Exercici 4.3: Escriu una nova versió del programa en alt nivell anterior per tal que, en comptes d’una ‘A’, escrigui el caràcter associat a la tecla polsada. Fixa’t que es tracta de fer sols un petit canvi en la finalització Recorda que per traduir el codi de rastreig del teclat es disposa del vector tteclat.
Escrit en C:
main () {
register int dada;
while (in (Rest_tec) == 0){} dada = in (Rdat_tec); out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, tteclat[dada]); out (Rcon_pant, 0x8000); }
Escrit en SISA-F: enq: IN R1, Rest_tec BZ R1, enq IN R1, Rdat_tec $MOVEI R2, tteclat ADD R1, R1, R LDB R1, 0(R1) MOVI R2, 4 OUT Rfil_pant, R MOVI R2, 8 OUT Rcol_pant, R OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R HALT
Programa del fitxer s4b2.s
Exercici 4.4: Escriu en alt nivell una nova versió del programa anterior, tal que faci la mateixa tasca (llegir una tecla i escriure-la en pantalla) però repetidament, fins que la tecla polsada sigui una ‘F’. Fixa’t que es tracta sols d’insertar l’anterior programa dins un bucle.
Escrit en C:
main () {
register int dada;
do { while (in (Rest_tec) == 0){} dada = in (Rdat_tec); out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, tteclat[dada]); out (Rcon_pant, 0x8000); } while (tteclat[dada] != ‘F’); }
Escrit en SISA-F: bucle: enq: IN R1, Rest_tec BZ R1, enq IN R1, Rdat_tec $MOVEI R2, tteclat ADD R1, R1, R LDB R1, 0(R1) MOVI R2, 4 OUT Rfil_pant, R MOVI R2, 8 OUT Rcol_pant, R OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R $MOVEI R3, 'F $CMPEQ R4, R3, R BZ R4, bucle HALT
Programa del fitxer s4b.s
Exercici 4.7: Tradueix a SISA-F el programa main i la subrutina mostra de la figura 4.1.
Escrit en C:
int w; main () { mostra(w); }
int mostra (int i) { int col=16; out (Rfil_pant, 0); do { col--; out (Rcol_pant, col); out (Rdat_pant, ‘0’ + (i & 0x1)); out (Rcon_pant, 0x8000); i = i >> 1; } while (col > 0); }
Escrit en SISA-F: $MOVEI R1, w LD R1, 0(R1) $CALL R6, mostra HALT
mostra: MOVI R2, 16 MOVI R3, 0 OUT Rfil_pant, R bucle: ADDI R2, R2, - OUT Rcol_pant, R MOVI R4, 0x AND R4, R1, R $MOVEI R5, ' ADD R4, R4, R OUT Rdat_pant, R $MOVEI R5, 0x OUT Rcon_pant, R MOVI R5, - SHL R1, R1, R $CMPGT R4, R2, R BNZ R4, bucle JMP R
Programa del fitxer s4d1.s
Exercici 4.8: Escriu en alt nivell (en C) el nou programa principal (main), suposant que l’acció mostra és la que esta declarada a la figura 4.1.
Escrit en C:
int w = 0x8888; main () {
register int dada; do { mostra(w); while (in (Rest_tec) == 0){} dada = in (Rdat_tec); if (tteclat[dada] == ‘A’) w = w << 1; else if(tteclat[dada] == ‘B’) w = w >> 1; else if(tteclat[dada] == ‘C’) w= w >> 1; else if(tteclat[dada] == ‘D’) w = w / 2; else if (tteclat[dada]> ‘0’ && tteclat[dada] < ‘9’){ int n; n= *dada – ‘0’; w = w ^ ((1<<n)-1); } }while(true); }
Escrit en SISA-F:
main: $MOVEI R1, w LD R1, 0(R1) $PUSH R $CALL R6, mostra $POP R enq: IN R2, Rest_tec BZ R2, enq IN R2, Rdat_tec $MOVEI R3, tteclat ADD R2, R2, R LDB R2, 0(R2) $MOVEI R3, 'A $CMPEQ R3, R2, R BZ R3, else MOVI R4, 1 SHL R1, R1, R BNZ R3, fi else1: $MOVEI R3, 'B $CMPEQ R3, R2, R BZ R3, else MOVI R4, - SHL R1, R1, R BNZ R3, fi else2: $MOVEI R3, 'C $CMPEQ R3, R2, R BZ R3, else MOVI R4, - SHA R1, R1, R BNZ R3, fi
… (continua)
… (continuació)
else3: $MOVEI R3, 'D $CMPEQ R3, R2, R BZ R3, else MOVI R4, 2 DIV R1, R1, R BNZ R3, fi else4: $MOVEI R3, ' $CMPGE R3, R2, R $MOVEI R4, ' $CMPLE R4, R2, R AND R4, R3, R BZ R4, fi $MOVEI R3, ' SUB R3, R2, R MOVI R4, 1 SHL R4, R4, R ADDI R4, R4, - XOR R1, R1, R fi: $MOVEI R2, w ST 0(R2), R $PUSH R $CALL R6, mostra $POP R MOVI R2, 0 BZ R2, enq
Un cop verificat que el programa transforma correctament els bits d’un enter positiu, podríeu provar-ho amb un enter negatiu com w = 0xFFF9. Dóna el mateix resultat la divisió per 2 (tecla ‘D’) que el SHA a la dreta (tecla ‘C’)? Per què?
Resposta:
Es tracta d’un desplaçament a la dreta d’un enter imparell negatiu (-7), tal com hem
vist a classe de teoria, en aquest cas, SHA ≠ DIV 2.
DIV fa truncament , SHA arrodoneix cap a - ∞. Exemple: -7/2 = 3 ; -7/2 = -
Exercici 5.2: Escriu un programa en alt nivell que esperi fins que polsem una tecla qualsevol, i llavors escrigui en pantalla, a la posició [4,8], el caràcter associat a aquesta tecla, en mode invers. Escriu el main i la RSI de teclat, i les variables que necessitis.
Escrit en C:
void keyboard () { register int dada;
dada = in (Rdat_tec); out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, tteclat[dada]); out (Rcon_pant, 0x8000); }
main () {
out(Rcon_tec, 1); interrupts_vector[1]=&keyboard; ei (); while (in (Rest_tec)== 0){} }
Escrit en SISA-F: .text main: MOVI R2, 1 OUT Rcon_tec, R $MOVEI R0, interrupts_vector $MOVEI R1, keyboard ST 2(R0),R EI
bucle: IN R1, Rest_tec BZ R1, bucle HALT
keyboard: IN R1, Rdat_tec $MOVEI R2, tteclat ADD R1, R1, R LDB R1, 0(R1) $MOVEI R2, 0x ADD R1, R1, R MOVI R2, 4 OUT Rfil_pant, R MOVI R2, 8 OUT Rcol_pant, R OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R JMP R
Programa del fitxer s5b1.s
Exercici 5.3: Modifica el programa anterior perquè repeteixi la mateixa tasca per a cada tecla que polsem, i acabi quan la tecla polsada sigui la ‘F’.
Escrit en C:
void keyboard () { register int dada;
dada = in (Rdat_tec); out (Rfil_pant, 4); out (Rcol_pant, 8); out (Rdat_pant, tteclat[dada]); out (Rcon_pant, 0x8000); if (tteclat[dada] == ‘F’)fi = 1; }
unsigned char fi;
main () { fi = 0; out(Rcon_tec, 1); interrupts_vector[1]=&keyboard; ei (); while (!fi){} }
Escrit en SISA-F: .text main: MOVI R2, 1 OUT Rcon_tec, R $MOVEI R0, interrupts_vector $MOVEI R1, keyboard ST 2(R0),R EI $MOVEI R0, fi bucle: LDB R2, 0(R0) BZ R2, bucle HALT
keyboard: IN R1, Rdat_tec $MOVEI R2, tteclat ADD R1, R1, R LDB R1, 0(R1) MOVI R2, 4 OUT Rfil_pant, R MOVI R2, 8 OUT Rcol_pant, R OUT Rdat_pant, R $MOVEI R2, 0x OUT Rcon_pant, R $MOVEI R2, 'F $CMPEQ R3, R1, R BZ R3, fikeyboard MOVI R1, 1 $MOVEI R0, fi STB 0(R0), R fikeyboard: JMP R
Programa del fitxer s5b.s