Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Estructura de computadora, Apuntes de Arquitectura de ordenadores

Asignatura: Estructura de Computadors I, Profesor: , Carrera: Enginyeria Informàtica, Universidad: UPC

Tipo: Apuntes

2016/2017

Subido el 17/04/2017

nina1995-2
nina1995-2 🇪🇸

2

(1)

1 documento

1 / 23

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Estructura de Computadors 1 (EC1) 1
Sessió 1. Naturals, enters i reals
Solucions de la sessió
Activitat 1.A: Resta d’enters en doble precisió
A1 = +3
A2 = -2 A1 = +65538
A2 = +65535
@* 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 = 0x0012
0x00F2 MOVHI R6, A2 R6 = 0x0112 R6 = 0x0112
0x00F4 LD R1, 0(R5) R1 = 0x0003 R1 = 0x0002
0x00F6 LD R2, 0(R6) R2 = 0xFFFE R2 = 0xFFFF
0x00F8 SUB R0, R1, R2 R0 = 0x0005 R0 = 0x0003
0x00FA CMPLTU R3, R1, R2 R3 = 0x0001 R3 = 0x0001
0x00FC LD R1, 2(R5) R1 = 0x0000 R1 = 0x0001
0x00FE LD R2, 2(R6) R2 = 0xFFFF R2 = 0x0000
0x0100 SUB R4, R1, R2 R4 = 0x0001 R4 = 0x0001
0x0102 SUB R4, R4, R3 R4 = 0x0000 R4 = 0x0000
0x0104 MOVI R5, R R5 = 0x0016 R5 = 0x0016
0x0106 MOVHI R5, R R5 = 0x0116 R5 = 0x0116
0x0108 ST 0(R5), R0 M[0x0116] = 0x0005 M[0x0116] = 0x0003
0x010A ST 2(R5), R4 M[0x0118] = 0x0000 M[0x0118] = 0x0000
0x010C HALT
0x010E 0x0003 0x0002 A1: A1:
0x0110 0x0000 0x0001
0x0112 0xFFFE 0xFFFF A2: A2:
0x0114 0xFFFF 0x0000
0x0116 0x0000 R: R:
0x0118 0x0000
Activitat 1.B: Representació d’enters i reals
Exercici: Rang (Ca2) amb 16 bits: ]32767...32768[
a) 1024 = 0x0400
b) -2 = 0xFFFE
c) 65536 = N.R** (0x00010000)
d) -32768 = 0x8000
e) 32768 = N.R** (0x00008000)
f) 12345 = 0x3039
*: La primera adreça (@) és 0x00EC degut al “include crt0.s”.
**: N.R (No Representable amb 16 bits)
Actualitzat: 13/03/2007 Facultat d’Informàtica de Barcelona (UPC) 2007
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17

Vista previa parcial del texto

¡Descarga Estructura de computadora y más Apuntes en PDF de Arquitectura de ordenadores solo en Docsity!

Sessió 1. Naturals, enters i reals

Solucions de la sessió

▪ Activitat 1.A: Resta d’enters en doble precisió

A1 = +

A2 = -

A1 = +

A2 = +

@* 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

▪ Activitat 1.B: Representació d’enters i reals

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

▪ Activitat 1.C: Representació d’enters i reals

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

▪ Activitat 1.F: Traducció d’expressions complexes en alt nivell

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

Sessió 2. Tipus de dades estructurats

Solucions de la sessió

▪Activitat 2.A: Accés indirecte a una variable a través d’un punter

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

▪Activitat 2.B: Accés aleatori als elements d’un vector

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

▪Activitat 2.C: Cadenes de caràcters (strings)

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

▪Activitat 2.D: Accés aleatori a una matriu de tuples

Exercici 2.5:

  1. Escriviu la secció .data corresponent a la traducció a SISA-F de la declaració anterior:

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

  1. Escriviu la fórmula, de l’adreça de cada un dels camps de var, en funció de l’adreça de var:

@var.a = var @var.b = var + 2 @var.c = var + 4

  1. Escriviu la fórmula, per al càlcul de l’adreça de mat[i][3].a i l’adreça de mat[2][j].c, en funció de l’adreça inicial de mat i els valors de i i j:

@mat[i][3].a = mat + i46 + 3* @mat[2][j].c = mat + 246 + j*6 + 4

  1. Traduir a SISA-F la següent sentència en C, utilitzant les anteriors fórmules mat[i][3].a = mat[2][j].c

$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

Sessió 3. Subrutines

Solucions de la sessió

▪Activitat 3.A: Programar una subrutina senzilla

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

▪Activitat 3.B: Una crida a subrutina dins d’un bucle

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

Sessió 4. E/S per enquesta i tractament de bits

Solucions de la sessió

▪Activitat 4.A: La pantalla

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

▪Activitat 4.B: El teclat

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

▪Activitat 4.D: Visualització d’operacions de tractament de bits

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

▪Activitat 5.B: El teclat

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