Primera Parte: Cuestiones

Anuncio
S.E.T.I. 1
Examen 16 Feb. 2007
Primera Parte: Cuestiones
1. Tema corto. Segmento de estado de tarea. Nota: No es necesario dibujarlo.
(1.5/10)
Solución. El TSS almacena el estado (contexto) de las tareas. Tiene campos dinámicos, que son actualizados cuando se cambia de tarea y campos estáticos que se definen al
comenzar una nueva tarea pero que no se modifican dinámicamente.
a) Campos dinámicos
Registros de propósito general.
Registros selectores de segmentos.
Registro EFLAGS.
Puntero de instrucción EIP.
Enlace a la tarea previa que no es otra cosa que el selector de segmento del
TSS anterior. Se actualiza solo cuando se espera retornar de una tarea (llamada
mediante la instrucción CALL, una interrupción o una excepción).
31
0
15
Direccion Base Mapa de Bits E/S
T 100
Selector Segmento LDT
96
GS
92
FS
88
DS
84
SS
80
CS
76
ES
72
EDI
68
ESI
64
EBP
60
ESP
56
EBX
52
EDX
48
ECX
44
EAX
40
EFLAGS
36
EIP
32
CR3 (PDBR)
28
SS2
SS1
SS0
8
4
ESP0
Enlace a Tarea Anterior
Ing. Electrónica (Curso 2006-2007)
16
12
ESP1
Bits Reservados. Poner a 0
24
20
ESP2
0
(la figura
1
S.E.T.I. 1
Examen 16 Feb. 2007
no se pide)
b) Campos estáticos.
Selector que apunta al descriptor de la LDT empleada. Se permite a cada tarea
tener su propia tabla de descriptores local.
CR3. Dirección fı́sica del directorio de páginas. Igualmente se permite a cada
tarea tener su propio directorio de páginas.
Punteros de pila (y selectores de segmento) de nivel 0, 1 y 2.
Bit T. Cuando vale uno provoca una excepción de depuración cuando se cambia
de tarea.
Dirección base del mapa de acceso de entrada/salida.
Es un desplazamiento de 16 bits (<DFFFh) que apunta al mapa de permisos de
entrada salida, que está contenido en el propio TSS. Sirve para limitar el acceso
a E/S. El tamaño es variable. Es un acceso limitado a E/S para las tareas con
grano fino ya que podemos definir a qué puertos se accede y a cuales no.
Segmento de Estado de Tarea (TSS)
El ultimo byte del
mapa de bits debe
tener todos los
bits a uno
31
24 23
0
1 1 1 1 1 1 1 1
Mapa de Bits de Permisos de E/S
Direccion Base del Mapa de E/S
64H
0
Si CPL>EFLAGS.IOPL se comprueba el mapa de permisos de E/S para ver si podemos acceder, si no el acceso está permitido. Cada bit del mapa se corresponde
con el permiso de acceso a un puerto (byte).
; Ejemplo:
;
el bit 1 del sexto byte:
;
indica el puerto 41 = (6-1)*8 + 1
;
si vale 1 esta prohibido el acceso
;
si vale 0 esta permitido el acceso
Si todos los bits del puerto accedido valen 0 podemos acceder (si es de tamaño
dword se representará con 4 bits), sino se producirá una excepción de protección general. Las direcciones E/S no representadas se consideran a 1, es decir
prohibidas.
Ing. Electrónica (Curso 2006-2007)
2
S.E.T.I. 1
Examen 16 Feb. 2007
2. Tema corto. Interrupciones y excepciones: clasificación.
(1.5/10)
Solución.
Interrupciones
Básicamente hablamos de interrupciones cuando es algo externo al microprocesador el
causante de la misma. Estas pueden ser:
Externas. Las produce algún dispositivo periférico conectado al microprocesador a
través de las patillas de interrupciones del mismo.
• Patilla /NMI (Non Maskable Interrupt). Interrupción no enmascarable. Se
activa por flanco y se memoriza un nivel de peticiones. Su atención se realiza
mediante el vector no 2.
• Patilla /INTR. Interrupción enmascarable con EFLAGS.IF = 0. Es activa por
nivel.
Internas. Generadas por software por medio de la instrucción INT n.
Excepciones
Las excepciones son situaciones provocadas por el propio funcionamiento del microprocesador.
Hardware.
• Faults. Se producen antes de ejecutar la instrucción. CS:EIP se guarda en la
pila y apunta a la dirección que produjo el fallo. Se reintentan al retornar de la
excepción
• Traps. Se producen después de la ejecución de la instrucción. CS:EIP apunta
a la instrucción siguiente. Algunos traps permiten continuar la ejecución del
programa, otros no.
• Aborts. Cuando hay errores graves (errores hardware, valores ilegales o no
consistentes en las tablas). No se puede continuar la ejecución del programa.
No siempre se puede precisar la localización exacta.
Software. Excepciones como: INTO, INT3, BOUND, INT n.
Ing. Electrónica (Curso 2006-2007)
3
S.E.T.I. 1
Examen 16 Feb. 2007
3. Cuestión. ¿Qué diferencias hay entre la codificación little endian y la big endian?
Pon un ejemplo.
(0.5/10)
Solución. Orden de los bytes en memoria. Es importante conocer el orden de almacenamiento de los datos en memoria sobretodo cuando pasamos información de un tipo
de arquitectura a otro.
Little endian. Se almacena primero el LSByte (Least Significant Byte: byte menos
significativo) y luego el MSByte (Most Significant Byte: byte más significativo).
Es tı́pico en las arquitecturas de Intel.
Big endian. Se almacena primero el MSByte y luego el LSByte. Es tı́pico de Motorola.
; El dato escrito en base hexadecimal 12345678h
; se almacenara como:
;
Direccion:
0
1
2
3
; Little endian
78h 56h 34h 12h
;
Big endian
12h, 34h, 56h, 78h
4. Cuestión. ¿Qué es el segmento de pila máquina y cómo funciona? Nota: no estoy
preguntando por la pila de registros de la FPU.
(0.5/10)
Solución. Sección de Pila. Es una zona especial que permite almacenar datos de forma dinámica en forma de pila LIFO (Last In, First Out ), que significa que el último dato
en entrar es el primero en salir.. Existe un conjunto de registros que apuntan a la cima de
la pila (notar que en la mayorı́a de los microprocesadores las pilas crecen hacia posiciones
de memoria decrecientes). La operación PUSH introduce un dato en la pila y la operación
POP extrae un dato de la misma.
Memoria
Memoria
PUSH
POP
Dato 1
Dato 2
Dato 3
Puntero de pila
Dato 1
Dato 2
Dato 3
Dato 4
Dato 5
Dato 6
0
Ing. Electrónica (Curso 2006-2007)
4
S.E.T.I. 1
Examen 16 Feb. 2007
5. Cuestión. Enumera los diferentes números reales especiales que puede codificar
la unidad de punto flotante.
(0.5/10)
Solución.
Números reales especiales. Entre estos estarı́an:
Los infinitos, que se obtienen al dividir por cero.
Los ceros que tienen signo.
Los no normalizados, que aumentan la resolución cerca del cero pero con menos
dı́gitos de precisión
Los no números, que pueden ser de señalización (SNaN Signaling Not a Number)
o silenciosos (QNaN:√Quiet Not a Number). Estos se obtienen como resultado de
operaciones del tipo: −1 o log(−1).
NaN
NaN
− Finito No Normalizado
−∞
S
1
E
0
1
0
−Finito Normalizado
+Finito No Normalizado
−0 +0
+Finito Normalizado + ∞
Números Reales y Codificaciones NaN para Punto Flotante de 32-Bit
Sig
E
Sig
S
0.000...
0.000...
−0
+0 0
0
1 1...254
1.XXX...
−Finito
No Normalizado
−Finito
Normalizado
1
255
1.000...
−∞
X
255
1.0XX...
X
255
1.1XX...
0.XXX...
+Finito
No Normalizado 0
0
0.XXX...
+Finito
1...254 1.XXX...
Normalizado 0
+∞ 0
255
1.000...
SNaN
SNaN X
255
1.0XX...
QNaN
QNaN X
255
1.1XX...
(la figura no se pide)
6. Cuestión. Explica el contenido del registro DR6.
31
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reservado (puesto a 1)
B B B 0 1 1 1 1 1 1 1 1 B B B B
DR6
T S D
3 2 1 0
(0.5/10)
Solución.
En este registro se guarda el estado de la depuración.
B0..B3. Condición de breakpoint detectada. Se activan aún cuando el punto de
ruptura no esté habilitado.
BD. Acceso a registro de depuración detectado. Indica que la siguiente instrucción
accederá a un registro de depuración (DR0..DR7). Esta prestación sólo está activa si
DR7.GD = 1 (General Detection flag).
BS. Indica que la excepción de depuración se produjo por el modo paso a paso de
ejecución (EFLAGS.TF=1) que es la excepción de depuración de mayor prioridad.
Ing. Electrónica (Curso 2006-2007)
5
S.E.T.I. 1
Examen 16 Feb. 2007
BT. Indica que la excepción se produjo por una conmutación de tarea (TSS.T = 1).
Este registro es un registro pegajoso (sticky register), lo que significa que el microprocesador pone a 1 los bits, pero no los borra automáticamente. El Sistema Operativo debe
borrar estos bits.
NOTA: Esta parte constituye el 50 % de la nota del examen. La nota final es la media de la nota de prácticas
y la nota del examen, aunque para ello es imprescindible aprobar el examen y las prácticas cada uno por separado.
Ing. Electrónica (Curso 2006-2007)
6
S.E.T.I. 1
Examen 16 Feb. 2007
Segunda Parte: Problemas
1. Problema. En el laboratorio disponemos de la tarjeta de adquisición de datos
ACL-8112, que permite la salida y entrada de datos digitales y analógicos.
Dispone de 16 canales de entrada digitales y de 16 canales de salida digitales. Se
accede a ellos con direcciones de E/S (instrucciones in y out). La dirección BASE
es la 220h. Las direcciones BASE+6 y BASE+7 son empleadas para los canales
de entrada (byte menos significativo y más significativo respectivamente; solo
lectura) y las direcciones BASE+13 y BASE+14 para los canales de salida (solo
escritura).
El esquema hardware a emplear es el siguiente:
Sistema de Test de Circuitos Integrados Lógicos de 14 patillas de la serie TTL
J3
J1
BASE+13
BASE+14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bit 0
bit 0
10k
10k
10k
10k
10k
10k
10k
1
2
3
4
5
6
7
14
13
12
11
10
9
8
10k
10k
Zócalo
10k
10k
10k
Salidas
J2
BASE+6
bit 0
BASE+7
bit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Entradas
ACL-8112
Se pide realizar un programa que sea capaz de comprobar el funcionamiento de
algunos circuitos integrados lógicos de la serie estándar TTL como el 7432 (OR),
el 7400 (NAND), el 7408 (AND), y el 7486 (XOR). El patillaje del integrado 7400
se muestra en la siguiente figura (el resto es similar, en cuanto a qué patillas son
entradas y cuales salidas).
Ing. Electrónica (Curso 2006-2007)
7
S.E.T.I. 1
Examen 16 Feb. 2007
VCC
14
13
12
11
10
9
1
2
3
4
5
6
8
7
GND
El trabajo se puede desglosar en los siguientes apartados:
a) Generación de los vectores de test. Esta rutina toma como dato de entrada (en
AX) un vector inicial, que se forma a partir de la tabla de verdad de la función
lógica a analizar. La rutina de generación de vectores de test deberá devolver los
4 vectores que aparecen ordenando los bits según se ve en el ejemplo de la figura
y devolverlos en AX, BX, CX y DX. (30 %)
Tabla de verdad, ejemplo pana AND (7408)
Vector inicial
000010100111xxxx
"x" : no importa
Salida
0
0
0
1
Salida
Salida
Salida
00
01
10
11
Salida
Entradas
xxxx000000000000
xxxx010010001001
Vectores de test
xxxx100100010010
xxxx111111111111
b) Retardo de N milisegundos. Se nos pide que entre la presentación al integrado de un vector de test y su comprobación transcurra un tiempo mı́nimo de N
milisegundos, que implementaremos mediante esta subrutina. Como parámetro
de entrada en EAX el número de milisegundos de espera. El microprocesador
funciona a 3GHz. (20 %)
c) Comprobación de un vector de test. Esta rutina presentará el vector de test
contenido en AX al circuito integrado a través de la tarjeta ACL-8112 y después
de un retardo de 20 milisegundos comprobará las entradas para ver si lo cumple.
(30 %)
Los bits que en la salida del ACL8112 pongamos en un valor deberán permanecer
con el mismo valor si los hemos conectado a una entrada del circuito integrado a
verificar. Las salidas deberán dar un valor que coincida con el del vector de test
presentado.
c) Rutina principal de identificación. Basándose en una tabla de vectores iniciales (que tenéis que especificar) para la comprobación de los circuitos integrados
lógicos especificados, el programa deberá obtener los vectores de test, para cada
vector inicial, probar cada vector de test con su retardo correspondiente, y averiguar si cumple todos los vectores de test, para devolver en EAX el número del
circuito integrado (que podéis poner al lado de cada vector inicial en la tabla).
Ing. Electrónica (Curso 2006-2007)
8
S.E.T.I. 1
Examen 16 Feb. 2007
Si no cumple un vector de test se pasa al siguiente vector inicial hasta terminar
con todos. Devolverá el número del integrado identificado o cero en caso de no
identificar ninguno. (20 %)
(2.5/10)
Solución.
Una posible solución es:
[BITS 32]
[SECTION .text]
[GLOBAL _TestIC]
5
10
BASE equ
220h
; Direccion de E/S de la ACL-8112
; Apartado d) del examen (20 %)
_TestIC:
;Prototipo de la funcion en C
;
; extern int TestIC();
;
; ebp+0
Direccion de retorno
; ebp+4
Antiguo ebp
15
push
mov
pushad
20
25
35
40
45
50
; Prologo C
mov
ecx,0
@otro_integrado:
push
ecx
xor
edi,edi
mov
di,[Vectores+ecx*4]
mov
[Integrado],edi
mov
ax,[Vectores+ecx*4+2]
call
30
ebp
ebp,esp
GeneraVectoresTest
pushad
call
PruebaVector
popad
jnz
@sigue_otro
mov
ax,bx
pushad
call
PruebaVector
popad
jnz
@sigue_otro
mov
ax,cx
pushad
call
PruebaVector
popad
jnz
@sigue_otro
mov
ax,dx
pushad
call
PruebaVector
popad
jz
@salir
@sigue_otro:
pop
ecx
inc
ecx
cmp
ecx,[NVectores]
Ing. Electrónica (Curso 2006-2007)
; N o circuito integrado
; Vector inicial
; ax,bx,cx,dx contienen
; los vectores de test
; Prueba 1er vector
; Prueba 2 o vector
; Prueba 3er vector
; Prueba 4 o vector
9
S.E.T.I. 1
55
Examen 16 Feb. 2007
jnz
@otro_integrado
popad
pop
xor
ret
ebp
eax,eax
; Epilogo C
; No encontrado en tabla
ecx
; Recupero de la pila
ebp
eax,[Integrado]
; Epilogo C
65
@salir:
pop
popad
pop
mov
ret
70
; Apartado a) del examen (30 %)
GeneraVectoresTest:
; Entrada: EAX = vector inicial
mov
ecx,4
60
75
80
85
@repite:
mov
bt
jnc
bts
@s1:
bt
jnc
bts
@s2:
bt
jnc
bts
@s3:
mov
shl
or
dx,0
ax,15
@s1
dx,1
; Comprueba el bit 15
; Remapea en bit 1
ax,14
@s2
dx,0
; Comprueba el bit 14
ax,13
@s3
dx,2
; Comprueba el bit 13
bx,dx
bx,3
dx,bx
;
;
;
;
Salida
; Remapea en bit 2
bx = .... .... .... .SAB
bx = .... .... ..SA B...
Desplaza y copia
dx = .... .... ..SA BSAB
95
ax,1
bx,1
ax,1
bx,1
ax,1
bx,1
100
shl
or
shl
or
bx,6
dx,bx
bx,3
dx,bx
mov
loop
[V1+ecx*2],dx
@repite
mov
mov
mov
mov
ret
ax,[V1]
bx,[V2]
cx,[V3]
dx,[V4]
105
Entrada B
; Remapea en bit 0
shl
shl
shl
shl
shl
shl
90
Entrada A
; bx = .... .... .... ...A
; bx = .... .... .... ..AB
; bx = .... .... .... .ABS
;
;
;
;
bx
dx
bx
dx
=
=
=
=
....
....
....
....
...A
...A
ABS.
ABSA
BS..
BSSA
....
BSSA
....
BSAB
....
BSAB
110
; Apartado b) del examen (20 %)
Retardo:
; Entrada EAX los milisegundos de espera
; La cuenta será 1ms*F_CPU * EAX = 3e6 * EAX ciclos
Ing. Electrónica (Curso 2006-2007)
10
S.E.T.I. 1
115
120
125
130
135
140
145
150
155
160
165
Examen 16 Feb. 2007
mov
ecx,eax
@repite_retardo:
rdtsc
; Memorizo instante EDX EAX
mov
edi,eax
mov
esi,edx
add
edi,3000000
adc
esi,0
@espera:
rdtsc
cmp
jl
cmp
jl
loop
ret
edx,edi ; Comprueba que la parte alta llegó
@espera
eax,esi ; Comprueba que la parte baja llegó
@espera
@repite_retardo
; Apartado c) del examen (30 %)
PruebaVector:
; Entrada AX el vector de test
mov
dx,BASE+6
; Apunto a dir. E/S para las salidas (ACL-8112)
out
dx,ax
; Saco los datos
push
eax
; Guardo el vector de test
mov
call
eax,20
Retardo
; Espero lo que me indican
pop
mov
in
ebx
dx,BASE+13
ax,dx
; Recupero el vector de test en ebx
; Apunto a dir. E/S para las entradas (ACL-8112)
; Leo los datos
cmp
ret
ax,bx
; ZF=1 si son iguales, ZF=0 si son distintos
[SECTION .data]
; Sección de datos inicializados
NVectores
dw 4
Vectores
dw 7408, 0000101001110000b ; Puerta AND
dw 7400, 0010111011100000b ; Puerta NAND
dw 7432, 0000111011110000b ; Puerta OR
dw 7486, 0000101011100000b ; Puerta XOR
[SECTION .bss]
V1 resw
1
V2 resw
1
V3 resw
1
V4 resw
1
Integrado
resd
; Seccion de datos no inicializados
1
Un ejemplo de programa principal (no se pide):
#include <stdio.h>
#include <stdlib.h>
4
extern int TestIC();
int main()
{
Ing. Electrónica (Curso 2006-2007)
11
S.E.T.I. 1
Examen 16 Feb. 2007
int ic;
9
ic=TestIC();
if(ic) printf("Identificado el circuito integrado %d\n", ic);
else
printf("No se ha identificado ningún"
" circuito de los memorizados\n");
14
}
Y un ejemplo de fichero makefile (no se pide):
testic.exe: testic.c rutinas.o
gcc testic.c rutinas.o -o testic.exe -g
5
rutinas.o: rutinas.asm
nasm -g -f win32 rutinas.asm -o rutinas.o
Ing. Electrónica (Curso 2006-2007)
12
S.E.T.I. 1
Examen 16 Feb. 2007
2. Problema. Se pide implementar una subrutina escrita en ensamblador que realize el producto de dos matrices cuyos elementos están expresados en formato real
largo. La subrutina se llamará desde un programa en C y el prototipo de la función será:
void ProductoMatrices(double * A, int m, int n, // Matriz m x n
double * B, int r,
// Matriz n x r
double * C);
// Matriz m x r
donde la matriz A tiene dimensiones m × n, la matriz B tiene dimensiones n × r
y la matriz resultado del producto C tiene dimensiones m × r.
La fórmula para el producto de matrices es la siguiente:
ci,j =
Pn−1
k=0
ak,j ∗ bi,k
Cuando se pasa un puntero a una función en C lo que aparece es la dirección en la
que se encuentra la variable. Ası́, para facilitar la legibilidad pondremos después
del prólogo C:
%define
%define
%define
%define
%define
%define
DirA
M
N
DirB
R
DirC
ebp+8
ebp+12
ebp+16
ebp+20
ebp+24
ebp+28
;
;
;
;
;
;
Direccion
Dimension
Dimension
Direccion
Dimension
Direccion
de la matriz A
m
n
de la matriz B
r
de la matriz C
El ejemplo de llamada a la función será:
extern void ProductoMatrices(double * A, int m, int n,
double * B, int r, double *C );
// ...
// Asigno matrices
double A[3*4]={2,1,0, -1,1,0, 0,0,1, 0,0,0};
double B[4*3]={1,1,1,0, 1,1,1,0, 1,1,1,0};
// Reservo espacio
double C[4*4]={0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0};
// ...
ProductoMatrices(A,3,4,B,3,C);
(2.5/10)
Solución.
3
Una posible solución es:
[BITS 32]
[SECTION .text]
[GLOBAL _ProductoMatrices]
; La subrutina en C tiene el siguiente prototipo:
;
; void ProductoMatrices(double * A, int m, int n,
Ing. Electrónica (Curso 2006-2007)
13
S.E.T.I. 1
8
13
18
23
28
Examen 16 Feb. 2007
;
;
; ebp+0
; ebp+4
%define
%define
%define
%define
%define
%define
double * B, int r, double *C );
Direccion de retorno
Antiguo ebp
DirA
ebp+8
; A es tamaño M x N
M
ebp+12
N
ebp+16
DirB
ebp+20
; B es tamaño N x R
R
ebp+24
DirC
ebp+28
; C es tamaño M x R
_ProductoMatrices:
push
ebp
mov ebp,esp
pushad
; Prologo de C
; Programa
finit
mov eax,0
mov [var_j],eax
@bucle_vertical:
; var_i=0
mov eax,0
mov [var_i],eax
@bucle_horizontal:
; var_j=0
33
FLDZ
mov eax,0
mov [var_k],eax
@bucle_interior:
; Suma=0.0
-
; var_k=0
38
; c(i,j) = SUM_k {b(i,k)*a(k,j)}
43
48
; Para obtener a(i,k) la cuenta es
; DirB + (i+k*M)*8
mov
eax,[var_k]
mov
edx,[M]
imul
edx
add
eax,[var_i]
shl
eax,3
add
eax,[DirB]
FLD
53
58
qword [eax]
; b(i,k)
Suma
; Para obtener a(k,j) la cuenta es
; DirA + (k+j*N)*8
mov
eax,[var_j]
mov
edx,[N]
imul
edx
add
eax,[var_k]
shl
eax,3
add
eax,[DirA]
63
FLD
FMULP
FADDP
qword [eax]
ST1
ST1
68
mov
inc
mov
cmp
eax,[var_k]
eax
[var_k],eax
eax,[N]
Ing. Electrónica (Curso 2006-2007)
; a(k,j)
; a()*b()
; Suma
b(i,k)
Suma
Suma
14
S.E.T.I. 1
Examen 16 Feb. 2007
jl
@bucle_interior
; Si var_k<n sigue
; Para obtener c(i,j) la cuenta es
; DirC + (i+j*M)*8
mov
eax,[var_j]
mov
edx,[M]
imul
edx
add
eax,[var_i]
shl
eax,3
add
eax,[DirC]
73
78
83
88
FSTP
qword [eax]
; -
mov
inc
mov
cmp
jl
eax,[var_i]
eax
[var_i],eax
eax,[M]
@bucle_horizontal
; Si var_i<m sigue
mov
inc
mov
cmp
jl
eax,[var_j]
eax
[var_j],eax
eax,[R]
@bucle_vertical
; Si var_j<r sigue
93
popad
pop ebp
ret
; Epilogo en C
98
[SECTION .bss]
var_i
resd 1
var_j
resd 1
var_k
resd 1
; Segmento de datos no inicializados
Un ejemplo de programa principal (no se pide):
3
8
#include <stdio.h>
#include <stdlib.h>
extern void ProductoMatrices(double * A, int m, int n,
double * B, int r, double *C );
void PintaMatriz(double *M, int x, int y)
{
int i,j;
printf("Matriz\n");
for(j=0;j<y;j++)
{
for(i=0;i<x;i++)
printf(" %5.2lf ",M[j*x+i]);
printf("\n");
}
13
}
18
23
int main()
{
int i,j;
double A[3*4]={2,1,0, -1,1,0, 0,0,1, 0,0,0};
double B[4*3]={1,1,1,0, 1,1,1,0, 1,1,1,0};
double C[4*4]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
Ing. Electrónica (Curso 2006-2007)
15
S.E.T.I. 1
Examen 16 Feb. 2007
printf("PRODUCTO DE MATRICES\n");
PintaMatriz(A,3,4);
printf("*\n");
PintaMatriz(B,4,3);
printf("=\n");
28
ProductoMatrices(A,3,4,B,3,C);
33
PintaMatriz(C,4,4);
return 0;
}
Y un ejemplo de fichero makefile (no se pide):
test: producto.o test.c
gcc -g -o test test.c producto.o
4
producto.o: producto.asm
nasm -g -f win32 producto.asm -o producto.o
NOTA: Esta parte constituye el 50 % de la nota del examen. La nota final es la media de la nota de prácticas
y la nota del examen, aunque para ello es imprescindible aprobar el examen y las prácticas cada uno por separado.
Ing. Electrónica (Curso 2006-2007)
16
Descargar