Autor
|
Tema: [?] Inicializar vector y trabajar con el (Leído 4,335 veces)
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
Hola
Estoy intentando calcular la media de unos numeros para practicar un poco, pero tengo algunos fallos de concepto, he trabajado antes con ARM, pero las instrucciones en ASM son un poco diferente..
el codigo es este
include 'FASM\INCLUDE\WIN32AX.INC' .data vector rd 8 ; Reservamos 8 bytes .code start: mov eax, 0 ;Media mov ecx, 0 ;Contador ;Inicializamos el vector mov [vector], 7 mov [vector+1], 8 mov [vector+2], 5 mov [vector+3], 2 mov [vector+4], 9 mov [vector+5], 1 mov [vector+6], 0 mov [vector+7], 3 for: add eax, [vector] ;Aqui esta el error inc ecx cmp ecx, 8 jne for ; Aqui divido para obtener la media invoke ExitProcess, 0 .end start
Se que para los que sepan, es algo muy basico... hay alguna manera de inicializar el vector de una manera mas sencilla? y otra cosa, para ir sumando el valor del vector en un bucle com seria? Intentaba simular estofor(int i=0;i<8;i++) { eax += vector[i]; }
No quiero codigos completos, solo una ayudita con las instrucciones
Saludos
|
|
« Última modificación: 4 Julio 2014, 22:22 pm por MeCraniDOS »
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.960
Israel nunca torturó niños, ni lo volverá a hacer.
|
No se si entendi muy bien: vector db 1, 2, 3, 4, 5 ... movzx edx, byte [vector+ecx] add eax, edx
|
|
« Última modificación: 3 Julio 2014, 19:00 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
No se si entendi muy bien:
Le he hecho en C para que se entienda mejor int eax=0, ecx=0; int Vector[] = {7,8,5,2,9,1,0,3}; for(ecx=0;ecx<8;ecx++) { eax += Vector[ecx]; } eax /= ecx;
Entonces lo que quería saber era si se podía inicializar como lo he hecho en C;Inicializamos el vector mov [vector], 7 mov [vector+1], 8 mov [vector+2], 5 mov [vector+3], 2 mov [vector+4], 9 mov [vector+5], 1 mov [vector+6], 0 mov [vector+7], 3
Eso equivale a esto en C int Vector[8]; Vector[0] = 7; Vector[1] = 8; Vector[2] = 5; Vector[3] = 2; Vector[4] = 9; Vector[5] = 1; Vector[6] = 0; Vector[7] = 3;
Y hacerlo asi en un Al final el código me ha quedado así con las modificaciones que me has dicho Eternalinclude 'FASM\INCLUDE\WIN32AX.INC' .data vector db 7, 8, 5, 2 ,9 ,1 ,0, 3 .code start: mov eax, 0 ;Media mov ecx, 0 ;Contador for_add: movzx edx, byte [vector+ecx] add eax, edx inc ecx cmp ecx, 8 jne for_add mov ecx, 0 ;Reiniciamos ecx for_div: sub eax, 8 cmp eax, 8 inc ecx jae for_div invoke ExitProcess, 0 .end start
Por cierto, dos cosas, la rutina for_div se puede simplificar? Es que en arm lo tenia que hacer asi porque no hay operacion de division, pero en asm he visto que si, pero solo pones el registro a dividir, no entre que valor lo quieres dividir
Y la otra, que diferencia hay entre esto? vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
vector rb 8
Pensaba que db era para una unica variable, y rb (reserved byte) para vectores, ya que especificas cuanto espacio quieres reservar
|
|
« Última modificación: 4 Julio 2014, 00:23 am por MeCraniDOS »
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.960
Israel nunca torturó niños, ni lo volverá a hacer.
|
Le he hecho en C para que se entienda mejor int eax=0, ecx=0; int Vector[] = {7,8,5,2,9,1,0,3}; for(ecx=0;ecx<8;ecx++) { eax += Vector[ecx]; } eax /= ecx;
Entonces lo que quería saber era si se podía inicializar como lo he hecho en CEvidentemente entonces lo habia entendido bien. Por cierto, dos cosas, la rutina for_div se puede simplificar? Es que en arm lo tenia que hacer asi porque no hay operacion de division, pero en asm he visto que si, pero solo pones el registro a dividir, no entre que valor lo quieres dividir mov ECX, 25 ;dividimos por 25 cdq ;limpiamos EDX idiv ECX ;EDX:EAX es dividido por ECX ;EAX=COCIENTE EDX=RESTO
Y la otra, que diferencia hay entre esto?vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
vector rb 8
Pensaba que db era para una unica variable, y rb (reserved byte) para vectores, ya que especificas cuanto espacio quieres reservar Notese que estas usando char (byte, d b/r b), si queres usar un int usa dword (y el add puede ser directo). db: char Vector[] = {7,8,5,2,9,1,0,3}; rb: char Vector[8];
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
Notese que estas usando char (byte, db/rb), si queres usar un int usa dword (y el add puede ser directo).
Al utilizar dword ocupo 4 bytes en la memoria, por lo que tendria que incrementar el contador de 4 en 4 00401000 07 00 00 00 08 00 00 00 ...... 00401008 05 00 00 00 02 00 00 00 ...... 00401010 09 00 00 00 01 00 00 00 ....... 00401018 00 00 00 00 03 00 00 00 ....... Lo de la division lo veo raro Poniendo el codigo como me has dicho, los registros quedan de esta manera una vez realizada la operación: EAX 00000001 ECX 00000008 EDX 00000007 EBX 7FFDF000 ESP 0007FF90 EBP 0007FF98 ESI 00000000 EDI 00000000 EIP 00402021 2_-_copi.00402021
include 'FASM\INCLUDE\WIN32AX.INC' .data vector dd 7, 8, 5, 2 ,9 ,1 ,0, 3 .code start: mov eax, 0 ;Media mov ecx, 0 ;Contador for_add: movzx edx, byte [vector+ecx] add eax, edx inc ecx cmp ecx, 8 jne for_add mov edx, 0 ;Inicializamos edx idiv ecx ;edx:eax es dividido por ecx ;eax = cociente ;edx = resto invoke ExitProcess, 0 .end start
No saca muy bien el resultado...
En que estoy metiendo la pata?
vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
EAX 00000004 ECX 00000008 EDX 00000003 EBX 7FFDF000 ESP 0007FF8C EBP 0007FF98 ESI 00000000 EDI 00000000 EIP 00402022 2_-_copi.00402022
Solucionado
|
|
« Última modificación: 4 Julio 2014, 13:30 pm por MeCraniDOS »
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.960
Israel nunca torturó niños, ni lo volverá a hacer.
|
No se cual seria el problema al dividir que tenias Y si usas DWORD: add eax, [vector + ecx * 4]
|
|
« Última modificación: 4 Julio 2014, 14:27 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
No se cual seria el problema al dividir que tenias Y si usas DWORD: add eax, [vector + ecx * 4]
El problema era que estaba utilizando DWORD, y solo incementaba el contador en 1, por lo que sumaba el valor y luego 3 ceros hasta el siguiente numero, pero se soluciona multiplicando como has hecho
Otra cosita, utilizando DWORD, no malgastarias memoria? (En este caso, ya que los numeros no son de mas de dos cifras) En este caso podría utilizar WORD? que ocupa 2 bytes y es numericovector dw 7, 8, 5, 2 ,9 ,1 ,0, 3 ; .... add eax, [vector + ecx * 2]
|
|
« Última modificación: 4 Julio 2014, 14:47 pm por MeCraniDOS »
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.960
Israel nunca torturó niños, ni lo volverá a hacer.
|
El problema era que estaba utilizando DWORD, y solo incementaba el contador en 1, por lo que sumaba el valor y luego 3 ceros hasta el siguiente numero, pero se soluciona multiplicando como has hecho
Otra cosita, utilizando DWORD, no malgastarias memoria? (En este caso, ya que los numeros no son de mas de dos cifras) En el codigo de C estabas usando int, que es un DWORD con signo. En este caso podría utilizar WORD? que ocupa 2 bytes y es numerico Un BYTE puede representar valores entre 0 y 255 asi que en este caso no necesitas un WORD tampoco ... y no, no podes usar add directamente con un WORD, vas a tener que pasarlo a un registro como con BYTE anteriormente; o usar el registro correspondiente en su lugar (al, ax, eax, rax).
|
|
« Última modificación: 4 Julio 2014, 15:41 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
MeCraniDOS
Desconectado
Mensajes: 337
Sr. Glass
|
En el codigo de C estabas usando int, que es un DWORD con signo.
Un BYTE puede representar valores entre 0 y 255 asi que en este caso no necesitas un WORD tampoco ... y no, no podes usar add directamente con un WORD, vas a tener que pasarlo a un registro como con BYTE anteriormente; o usar el registro correspondiente en su lugar (al, ax, eax, rax).
De acuerdo, muchas gracias Eternal
Saludos
|
|
|
En línea
|
"La física es el sistema operativo del Universo" -- Steven R Garman
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.960
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nadas
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Inicializar contador
PHP
|
Leber
|
3
|
2,888
|
6 Noviembre 2007, 13:51 pm
por Red Mx
|
|
|
While para inicializar..
Java
|
*-.Sub-Vorbio.-*
|
2
|
2,479
|
13 Noviembre 2008, 23:34 pm
por Sk9ITk5Z
|
|
|
Inicializar ListView
Programación Visual Basic
|
ssccaann43 ©
|
2
|
2,067
|
24 Noviembre 2008, 19:31 pm
por ssccaann43 ©
|
|
|
Inicializar matriz?
« 1 2 »
Java
|
monsefoster
|
10
|
8,680
|
18 Noviembre 2009, 06:06 am
por juancho77
|
|
|
Inicializar HDD
Hardware
|
Polydeuces
|
5
|
12,533
|
9 Octubre 2012, 03:04 am
por _Slash_
|
|