Programación General > ASM (Ensamblador)
Arreglo De Una Estructura
Enko:
Para hacer un array hago:
--- Código: Text --- Array dd 255 dup ? El problema es que si en vez de "dd" pongo la estructura la cosa no compila. Y si llegase a compilar, tampoco me imagino como sería el ecceso.
¿Que se hace en esos casos? Es decir, cuando se necesita tener en memoria consecutivame estructuras.
Se hace varios arreglos con sus campos por separado?
Eternal Idol:
Yo no suelo trabajar con arrays estaticos sino dinamicos y lo que encontre en Internet no me funciona directamente:
http://maven.smith.edu/~thiebaut/ArtOfAsse...H05/CH05-3.html
Pero si reemplazo el (?) por ({}) si me funciona bien.
De cualquier manera siendo los arrays memoria contigua el chiste sigue estando en que para acceder a cualquier campo de cualquier elemento del array se hace una operacion matematica simple.
Primero obtenemos la estructura en si con: Elemento * sizeof(Estructura)
Y despues le sumamos la posicion en que se encuentra el campo al que queremos acceder. Aunque nos podemos ahorrar este paso usando esto (uso el ejemplo de la pagina pero asi me gusta mas):
--- Código: Text --- Point structx word 0y word 0z word 0Point ends Object8 structPts point 8 dup ({})Color dword 0Object8 ends .datad Object8 {} .codemain:mov d.Pts[0*sizeof(Point)].x, 0mov d.Pts[0*sizeof(Point)].y, 1mov d.Pts[0*sizeof(Point)].z, 2mov d.Pts[1*sizeof(Point)].x, 0mov d.Pts[1*sizeof(Point)].y, 1mov d.Pts[1*sizeof(Point)].z, 2
Enko:
Gracias por el link. Pense que no se podía ya que no se me ocurría el tema de como direccionarlo después.
Aca va la version en FASM
--- Código: Text --- struct MyPoint x dw 0 y dw 0ends section '.data' data readable writeable myArray MyPoint rb 8 * sizeof.MyPoint; si o si tiene que ser linea nueva section '.code' data readable mov [MyArray.x + 0 * sizeof.MyPoint], 5 mov [MyArray.y + 0 * sizeof.MyPoint], 8 mov [MyArray.x + 1 * sizeof.MyPoint], 9 mov [MyArray.y + 1 * sizeof.MyPoint], 5
Enko:
Por sierto, para arrays Dinamicos, ¿Que se hace?
HeapAlloc y luego redireccionas usando Index x SizeOf + algo mas?
--- Código: Text --- ; para un array de Points que tiene x, y: DWORD [hHeap + 0 * sizeof.DWORD + 0 * sizeof.Array] = Array[0].x [hHeap + 1 * sizeof.DWORD + 0 * sizeofArray] = Array[0].y ; lo mismo pero ahora sin sizeof.DWORD que es 4 [hHeap + 0 + 1 * sizeof.Array] = Array[1].x [hHeap + 4 + 1 * sizeofArray] = Array[1].y Es asi, o se puede hacerlo mas comodo?
Eternal Idol:
--- Cita de: "Enko" --- Por sierto, para arrays Dinamicos, ¿Que se hace?
--- Fin de la cita ---
Primero obtenemos la estructura en si con: Elemento * sizeof(Estructura)
Y despues le sumamos la posicion en que se encuentra el campo al que queremos acceder.
Si tuvieramos una estructura con 3 campos siendo estos de tipo DWORD a,b y c. Entonces para acceder a b sumariamos 4 y a c 8 (a es 0).
En MASM podes usar assume y solo tenes que calcular el valor inicial y usar la estructura:
--- Código: Text --- ;teniendo en eax Elemento * sizeof(Estructura)assume eax:ptr ESTRUCTURAmov ebx, [eax].amov ecx, [eax].bmov edx, [eax].c
¿Cool, no?
Navegación
[#] Página Siguiente
Ir a la versión completa