elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  [?] Inicializar vector y trabajar con el
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [?] Inicializar vector y trabajar con el  (Leído 4,335 veces)
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
[?] Inicializar vector y trabajar con el
« en: 3 Julio 2014, 17:55 pm »

Hola  ;D

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

Código
  1. include 'FASM\INCLUDE\WIN32AX.INC'
  2.  
  3. .data
  4. vector rd 8 ; Reservamos 8 bytes
  5.  
  6. .code
  7. start:
  8. mov eax, 0 ;Media
  9. mov ecx, 0 ;Contador
  10.  
  11. ;Inicializamos el vector
  12. mov [vector], 7
  13. mov [vector+1], 8
  14. mov [vector+2], 5
  15. mov [vector+3], 2
  16. mov [vector+4], 9
  17. mov [vector+5], 1
  18. mov [vector+6], 0
  19. mov [vector+7], 3
  20.  
  21. for:
  22. add eax, [vector] ;Aqui esta el error
  23. inc ecx
  24. cmp ecx, 8
  25. jne for
  26.  
  27.        ; Aqui divido para obtener la media
  28.  
  29. invoke ExitProcess, 0
  30.  
  31. .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 esto

Código
  1. for(int i=0;i<8;i++)
  2. {
  3.    eax += vector[i];
  4. }

No quiero codigos completos, solo una ayudita con las instrucciones  :rolleyes:

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 Desconectado

Mensajes: 5.960


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [?] Inicializar vector y trabajar con el
« Respuesta #1 en: 3 Julio 2014, 18:49 pm »

No se si entendi muy bien:
Código
  1. vector db 1, 2, 3, 4, 5
  2. ...
  3. movzx edx, byte [vector+ecx]
  4. 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 Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Inicializar vector y trabajar con el
« Respuesta #2 en: 4 Julio 2014, 00:20 am »

No se si entendi muy bien:

Le he hecho en C para que se entienda mejor


Código
  1.    int eax=0, ecx=0;
  2.    int Vector[] = {7,8,5,2,9,1,0,3};
  3.  
  4.    for(ecx=0;ecx<8;ecx++)
  5.    {
  6.         eax += Vector[ecx];
  7.    }
  8.  
  9.    eax /= ecx;

Entonces lo que quería saber era si se podía inicializar como lo he hecho en C

Código
  1. ;Inicializamos el vector
  2. mov [vector], 7
  3. mov [vector+1], 8
  4. mov [vector+2], 5
  5. mov [vector+3], 2
  6. mov [vector+4], 9
  7. mov [vector+5], 1
  8. mov [vector+6], 0
  9. mov [vector+7], 3

Eso equivale a esto en C

Código
  1.    int Vector[8];
  2.  
  3.    Vector[0] = 7;
  4.    Vector[1] = 8;
  5.    Vector[2] = 5;
  6.    Vector[3] = 2;
  7.    Vector[4] = 9;
  8.    Vector[5] = 1;
  9.    Vector[6] = 0;
  10.    Vector[7] = 3;

Y hacerlo asi en un  :o



Al final el código me ha quedado así con las modificaciones que me has dicho Eternal

Código
  1. include 'FASM\INCLUDE\WIN32AX.INC'
  2.  
  3. .data
  4.        vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
  5.  
  6. .code
  7.        start:
  8.                mov eax, 0      ;Media
  9.                mov ecx, 0      ;Contador
  10.  
  11.                for_add:
  12.                        movzx edx, byte [vector+ecx]
  13.                        add eax, edx
  14.                        inc ecx
  15.                        cmp ecx, 8
  16.                        jne for_add
  17.  
  18.                mov ecx, 0 ;Reiniciamos ecx
  19.  
  20.                for_div:
  21.                        sub eax, 8
  22.                        cmp eax, 8
  23.                        inc ecx
  24.                        jae for_div
  25.  
  26.                invoke ExitProcess, 0
  27.  
  28. .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  :huh: :huh:

Y la otra, que diferencia hay entre esto?


Código
  1. vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
Código
  1. vector rb 8

Pensaba que db era para una unica variable, y rb (reserved byte) para vectores, ya que especificas cuanto espacio quieres reservar  :rolleyes:
« Ú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 Desconectado

Mensajes: 5.960


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [?] Inicializar vector y trabajar con el
« Respuesta #3 en: 4 Julio 2014, 09:02 am »


Le he hecho en C para que se entienda mejor


Código
  1.    int eax=0, ecx=0;
  2.    int Vector[] = {7,8,5,2,9,1,0,3};
  3.  
  4.    for(ecx=0;ecx<8;ecx++)
  5.    {
  6.         eax += Vector[ecx];
  7.    }
  8.  
  9.    eax /= ecx;

Entonces lo que quería saber era si se podía inicializar como lo he hecho en C

Evidentemente 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  :huh: :huh:

Código
  1. mov ECX, 25 ;dividimos por 25
  2. cdq ;limpiamos EDX
  3. idiv ECX ;EDX:EAX es dividido por ECX
  4. ;EAX=COCIENTE EDX=RESTO

Y la otra, que diferencia hay entre esto?

Código
  1. vector db 7, 8, 5, 2 ,9 ,1 ,0, 3
Código
  1. vector rb 8

Pensaba que db era para una unica variable, y rb (reserved byte) para vectores, ya que especificas cuanto espacio quieres reservar  :rolleyes:

Notese que estas usando char (byte, db/rb), 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 Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Inicializar vector y trabajar con el
« Respuesta #4 en: 4 Julio 2014, 13:14 pm »

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  :-\

Citar
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  :rolleyes:

Poniendo el codigo como me has dicho, los registros quedan de esta manera una vez realizada la operación:

Citar
EAX 00000001
ECX 00000008
EDX 00000007
EBX 7FFDF000
ESP 0007FF90
EBP 0007FF98
ESI 00000000
EDI 00000000
EIP 00402021 2_-_copi.00402021

Código
  1. include 'FASM\INCLUDE\WIN32AX.INC'
  2.  
  3. .data
  4. vector dd 7, 8, 5, 2 ,9 ,1 ,0, 3
  5.  
  6. .code
  7. start:
  8. mov eax, 0 ;Media
  9. mov ecx, 0 ;Contador
  10.  
  11. for_add:
  12. movzx edx, byte [vector+ecx]
  13. add eax, edx
  14. inc ecx
  15. cmp ecx, 8
  16. jne for_add
  17.  
  18. mov edx, 0 ;Inicializamos edx
  19. idiv ecx ;edx:eax es dividido por ecx
  20.  
  21. ;eax = cociente
  22. ;edx = resto
  23.  
  24. invoke ExitProcess, 0
  25.  
  26. .end start

No saca muy bien el resultado...  :silbar:

En que estoy metiendo la pata?  :huh:




Código
  1. vector db 7, 8, 5, 2 ,9 ,1 ,0, 3

Citar
EAX 00000004
ECX 00000008
EDX 00000003
EBX 7FFDF000
ESP 0007FF8C
EBP 0007FF98
ESI 00000000
EDI 00000000
EIP 00402022 2_-_copi.00402022

Solucionado ;D
« Ú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 Desconectado

Mensajes: 5.960


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [?] Inicializar vector y trabajar con el
« Respuesta #5 en: 4 Julio 2014, 14:25 pm »

No se cual seria el problema al dividir que tenias  ;D

Y si usas DWORD:
Código
  1. 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 Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Inicializar vector y trabajar con el
« Respuesta #6 en: 4 Julio 2014, 14:44 pm »

No se cual seria el problema al dividir que tenias  ;D

Y si usas DWORD:
Código
  1. 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  ;D

Otra cosita, utilizando DWORD, no malgastarias memoria? (En este caso, ya que los numeros no son de mas de dos cifras)  :silbar:




En este caso podría utilizar WORD? que ocupa 2 bytes y es numerico

Código
  1. vector dw 7, 8, 5, 2 ,9 ,1 ,0, 3
  2.  
  3. ; ....
  4.  
  5. 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 Desconectado

Mensajes: 5.960


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [?] Inicializar vector y trabajar con el
« Respuesta #7 en: 4 Julio 2014, 15:38 pm »

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  ;D

Otra cosita, utilizando DWORD, no malgastarias memoria? (En este caso, ya que los numeros no son de mas de dos cifras)  :silbar:

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 Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Inicializar vector y trabajar con el
« Respuesta #8 en: 4 Julio 2014, 22:22 pm »

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  ;D ;D

Saludos
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.960


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [?] Inicializar vector y trabajar con el
« Respuesta #9 en: 5 Julio 2014, 01:05 am »

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Inicializar contador
PHP
Leber 3 2,888 Último mensaje 6 Noviembre 2007, 13:51 pm
por Red Mx
While para inicializar..
Java
*-.Sub-Vorbio.-* 2 2,479 Último mensaje 13 Noviembre 2008, 23:34 pm
por Sk9ITk5Z
Inicializar ListView
Programación Visual Basic
ssccaann43 © 2 2,067 Último mensaje 24 Noviembre 2008, 19:31 pm
por ssccaann43 ©
Inicializar matriz? « 1 2 »
Java
monsefoster 10 8,680 Último mensaje 18 Noviembre 2009, 06:06 am
por juancho77
Inicializar HDD
Hardware
Polydeuces 5 12,533 Último mensaje 9 Octubre 2012, 03:04 am
por _Slash_
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines