Punteros, Vectores y Matrices - Organización del Computador II

Memoria Est´
atica
Punteros, Vectores y Matrices
Organizaci´
on del Computador II
31-03-2015
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
1/1
Repaso de punteros
¿Qu´e, c´omo y para qu´e?
Un puntero es una variable que referencia una posici´on de la memoria.
(ejemplo: una variable cuyo valor es una direcci´
on de memoria)
Como toda variable, tiene un tipo y un nombre.
Sirve para guardar datos en memoria.
Operadores:
& → Da como resultado la direcci´
on de memoria de una variable.
* → Da como resultado el valor apuntado por un puntero.
(Adem´
as de ser el indicador del tipo puntero)
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
2/1
Repaso de punteros
Ejemplos:
int *pepe
Crea un puntero de tipo entero con nombre pepe.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
3/1
Repaso de punteros
Ejemplos:
int *pepe
Crea un puntero de tipo entero con nombre pepe.
int x = 5
pepe = &x
Guarda en la direcci´on del puntero pepe la direcci´on de x.
Se dice que pepe apunta a x.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
3/1
Repaso de punteros
Ejemplos:
int *pepe
Crea un puntero de tipo entero con nombre pepe.
int x = 5
pepe = &x
Guarda en la direcci´on del puntero pepe la direcci´on de x.
Se dice que pepe apunta a x.
*pepe = 8
Guarda 8 en la direcci´
on apuntada por el puntero pepe.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
3/1
Repaso de punteros
Ejemplos:
int *pepe
Crea un puntero de tipo entero con nombre pepe.
int x = 5
pepe = &x
Guarda en la direcci´on del puntero pepe la direcci´on de x.
Se dice que pepe apunta a x.
*pepe = 8
Guarda 8 en la direcci´
on apuntada por el puntero pepe.
int y
y = *pepe
Guarda en y el valor apuntado por pepe.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
3/1
Repaso de punteros
Ejemplos m´
as visuales:
1
int *pepe
2
int x = 5
pepe = &x
3
*pepe = 8
4
int y
y = *pepe
Orga2
1.
pepe =
0x100
Memoria Est´
atica / Punteros / Vectores / Matrices
4/1
Repaso de punteros
Ejemplos m´
as visuales:
1
int *pepe
2
int x = 5
pepe = &x
3
*pepe = 8
4
int y
y = *pepe
Orga2
2.
x=
pepe =
5
0x80
0x80
0x100
Memoria Est´
atica / Punteros / Vectores / Matrices
5/1
Repaso de punteros
Ejemplos m´
as visuales:
1
int *pepe
2
int x = 5
pepe = &x
3
*pepe = 8
4
int y
y = *pepe
Orga2
3.
x=
pepe =
8
0x80
0x80
0x100
Memoria Est´
atica / Punteros / Vectores / Matrices
6/1
Repaso de punteros
Ejemplos m´
as visuales:
1
int *pepe
2
int x = 5
pepe = &x
3
*pepe = 8
4
int y
y = *pepe
Orga2
4.
y=
8
0x78
x=
8
0x80
pepe =
0x80
0x100
Memoria Est´
atica / Punteros / Vectores / Matrices
7/1
Vectores
Declaramos en C un vector v :
int v[5];
¿C´omo est´a guardado en memoria?
Como 5 enteros (doublewords / 4 bytes) consecutivos:
v[0]
v[1]
v[2]
v[3]
v[4]
0x00005DF3AC
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
8/1
Vectores
Si rememoramos el ejemplo de la primera clase:
section .data:
msg: DB ’Hola mundo’, 10
largo: EQU $-msg
msg es una etiqueta que, vista como un puntero, es un vector de
caracteres almacenados de la siguiente manera:
msg es un char*, es como si en C hici´eramos:
char msg[11] = "Hola mundo\n";
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
9/1
Vectores
Volviendo al ejemplo del vector v
Si suponemos que el primer elemento se encuentra almacenado en la
direcci´on 0x200 de memoria; ¿c´
omo se realiza la siguiente asignaci´on?
int v[5];
v[2] = 8;
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
10 / 1
Vectores
Volviendo al ejemplo del vector v
Si suponemos que el primer elemento se encuentra almacenado en la
direcci´on 0x200 de memoria; ¿c´
omo se realiza la siguiente asignaci´on?
int v[5];
v[2] = 8;
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
11 / 1
Vectores
Volviendo al ejemplo del vector v
Si suponemos que el primer elemento se encuentra almacenado en la
direcci´on 0x200 de memoria; ¿c´
omo se realiza la siguiente asignaci´on?
int v[5];
v[2] = 8;
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
12 / 1
Vectores
Volviendo al ejemplo del vector v
Si suponemos que el primer elemento se encuentra almacenado en la
direcci´on 0x200 de memoria; ¿c´
omo se realiza la siguiente asignaci´on?
int v[5];
v[2] = 8;
}
4 bytes
v[0]
v[1] v[2]=8 v[3]
v[4]
=
=
=
0x200 0x204 0x208
0x200+4*0 0x200+4*1 0x200+4*2
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
13 / 1
Vectores
La regla
En general, para indizar dentro de un vector, la “regla” es:
“puntero al inicio del arreglo” +
+ “tama˜
no del dato” * “´ındice del elemento al que queremos acceder”
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
14 / 1
Vectores
Direccionamiento
En ensamblador
;rdi = puntero al vector
mov dword [rdi+4*i], valor
El modo de direccionamiento que se utiliza para indizar un vector es:
base + ´ındice + desplazamiento
El formato general para direccionar es:
[ Base + Indice*scala +/- Desplazamiento ]
Base = alg´
un registro
Indice = alg´
un registro
scala = 1, 2, 4 u 8
Desplazamiento = inmediato de 32 bits
ver: Manual Intel - Vol.1 - 3.7.5 - Specifying an Offset
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
15 / 1
Vectores y Punteros
Si tenemos:
int v[5];
Para C: v es un puntero al primer elemento del vector.
Entonces podemos hacer en ASM:
Entonces podemos hacer en C:
int *p_v = v;
lea rsi, [rbp-X] ; rsi = v
mov [rbp-Y], rsi ; p_v = v
int *p_v = &v[0];
¿Y a qu´e equivale es ensamblador?
v = &v[0] + 1;
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
16 / 1
Vectores y Punteros
Si tenemos:
int v[5];
Para C: v es un puntero al primer elemento del vector.
Entonces podemos hacer en ASM:
Entonces podemos hacer en C:
int *p_v = v;
lea rsi, [rbp-X] ; rsi = v
mov [rbp-Y], rsi ; p_v = v
int *p_v = &v[0];
¿Y a qu´e equivale es ensamblador?
v = &v[0] + 1;
v = v + 1;
// &v[0] + 1 == &v[1]
lea rsi, [rbp-X] ; rsi = v
add rsi, 4
; rsi += 4
mov [rbp-X], rsi ; v++
+1 posici´
on de puntero a entero == pr´
oximo elemento. Elementos de tama˜
no 4 ⇒ +4.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
16 / 1
Matrices
No son muy distintas a los vectores.
Se representan igual en memoria.
Se almacenan como varios vectores. En C se almacenan por filas.
Si la matriz tiene dimensi´
on MxN entonces sabemos que
est´a formada por M vectores de N elementos cada uno.
Se lo conoce como almacenamiento por filas.
Estos vectores est´an almacenados en memoria uno al lado del otro.
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
17 / 1
Matrices
Ejemplo: almacenamiento por filas
Si tenemos M, una matriz de enteros de 3x3:
En memoria se representa:
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
18 / 1
Matrices
Suponiendo que el primer elemento de M se encuentra almacenado en
la posici´on de memoria 0x300 y queremos asignar un valor en M[2, 1]
entonces en C hacemos:
int m[3][3];
m[2][1] = 7;
¿Y en ensamblador?
0x300 + 4*3 = 0x30C
0x31C = 0x318 + 4*1
0x30C + 4*3 = 0x318
0x30C
0x300 + 4*3
Orga2
0x318
0x31C
0x30C + 4*3 0x318 + 4*1
Memoria Est´
atica / Punteros / Vectores / Matrices
19 / 1
Matrices
Suponiendo que el primer elemento de M se encuentra almacenado en
la posici´on de memoria 0x300 y queremos asignar un valor en M[2, 1]
entonces en C hacemos:
int m[3][3];
m[2][1] = 7;
¿Y en ensamblador?
0x300 + 4*3 = 0x30C
0x31C = 0x318 + 4*1
0x30C + 4*3 = 0x318
0x30C
0x300 + 4*3
Orga2
0x318
0x31C
0x30C + 4*3 0x318 + 4*1
Memoria Est´
atica / Punteros / Vectores / Matrices
20 / 1
Matrices
Suponiendo que el primer elemento de M se encuentra almacenado en
la posici´on de memoria 0x300 y queremos asignar un valor en M[2, 1]
entonces en C hacemos:
int m[3][3];
m[2][1] = 7;
¿Y en ensamblador?
0x300 + 4*3 = 0x30C
0x31C = 0x318 + 4*1
0x30C + 4*3 = 0x318
0x30C
0x300 + 4*3
Orga2
0x318
0x31C
0x30C + 4*3 0x318 + 4*1
Memoria Est´
atica / Punteros / Vectores / Matrices
21 / 1
Matrices
Suponiendo que el primer elemento de M se encuentra almacenado en
la posici´on de memoria 0x300 y queremos asignar un valor en M[2, 1]
entonces en C hacemos:
int m[3][3];
m[2][1] = 7;
¿Y en ensamblador?
0x300 + 4*3 = 0x30C
0x31C = 0x318 + 4*1
0x30C + 4*3 = 0x318
0x30C
0x300 + 4*3
Orga2
0x318
0x31C
0x30C + 4*3 0x318 + 4*1
Memoria Est´
atica / Punteros / Vectores / Matrices
22 / 1
Matrices
Suponiendo que el primer elemento de M se encuentra almacenado en
la posici´on de memoria 0x300 y queremos asignar un valor en M[2, 1]
entonces en C hacemos:
int m[3][3];
m[2][1] = 7;
¿Y en ensamblador?
0x300 + 4*3 = 0x30C
0x31C = 0x318 + 4*1
0x30C + 4*3 = 0x318
0x30C
0x300 + 4*3
Orga2
0x318
0x31C
0x30C + 4*3 0x318 + 4*1
Memoria Est´
atica / Punteros / Vectores / Matrices
23 / 1
Matrices
En general, para indizar dentro de una matriz M[i, j], la “regla” es:
“puntero al inicio de la matriz” +
+ “cantidad elementos de la fila” * “indice de fila” * “tama˜
no dato” +
+ “indice de columna” * “tama˜
no dato”
En ensamblador
; en rdi tenemos el puntero a la matriz
mov rax, cantElemPorFilas
lea rdi, [ rdi + rax*i*4 + j*4 ]
mov dword [rdi], VALOR
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
24 / 1
Matrices y punteros
Las matrices y los punteros tambi´en est´an relacionados. Si tenemos:
int m[3][4];
Para C: m es un puntero al primer elemento de la matriz.
Entonces podemos hacer en C:
int *p_m = m;
int *p_m = &m[0][0];
Entonces podemos hacer en ASM:
lea rsi, [rbp-X] ; rsi = m
mov [rbp-Y], rsi ; p_m = m
Adem´as, son equivalentes:
int m[12]
int m[3][4]
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
25 / 1
Ejercicios
Ejercicio 1
Dado un vector de n enteros de 16 bits, hacer una funci´on que devuelva la
suma de los elementos del vector.
El prototipo de la funci´on es:
short suma(short* vector, short n);
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
26 / 1
Ejercicios
Ejercicio 1 - Soluci´on
suma:
; RDI = vector
; SI = n
push rbp
mov rbp, rsp
push r12
xor r12, r12
xor rcx, rcx
mov cx, si
Orga2
.cicloSuma:
add r12w, [rdi]
lea rdi, [rdi+2]
loop .cicloSuma
mov rax, r12
.fin:
pop r12
pop rbp
ret
Memoria Est´
atica / Punteros / Vectores / Matrices
27 / 1
Ejercicios
Ejercicio 2
Dada una matriz de nxn enteros de 16 bits, hacer una funci´on que
devuelva los elementos de la diagonal en el vector pasado por par´ametro.
El prototipo de la funci´on es:
void diagonal(short* matriz, short n, short* vector);
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
28 / 1
Ejercicios
M´as Ejercicios
Toda la Pr´
actica 0 y la Pr´
actica 1.
orga2.com.ar > Pr´acticas y TPs > Pr´acticas.
http://orga2.com.ar?pid=7
Orga2
Memoria Est´
atica / Punteros / Vectores / Matrices
29 / 1