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
© Copyright 2024