• Martes 5 de Noviembre de 2024, 17:29

Autor Tema:  Lectura De Un Numero  (Leído 6734 veces)

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Lectura De Un Numero
« en: Domingo 1 de Octubre de 2006, 01:46 »
0
Ahora que tenía un par de dias libres, decidi probar algunas cosas de assembly, estoy usando fasm para DOS.

Lo que quiero hacer, es basicamente leer un numero por teclado y almacenarlo en alguna variable y mostrarlo luego en la pantalla.

El problema mio consiste en que logro leer un vector de numeros.... pero no logro convertirlo a un numero.
Lo que tendria que hacer es algo asi (pseudocodigo):
Código: Text
  1.  
  2. for(i=0; i<=Length(Numeros); i++)
  3. {
  4.     Resultado += Numeros[i] * Potencia(10, i);
  5. }
  6.  
  7.  

Este es el codigo, la parte problematica est'a resltada con mayusculas
trate de recortarlo lo mejor que pude (tendria que ser una calculadora con opciones, solo dejé la de sumar, de ahí comienza)
Código: Text
  1.  
  2. format MZ
  3. entry codseg : start
  4.  
  5. segment codseg
  6. start:
  7.  
  8.    push dataseg
  9.    pop ds
  10.  
  11. sumar:
  12.    mov   [result], 0
  13.    mov   dx, input_text
  14.    mov   ah, 9
  15.    int   21h
  16.    xor   si, si
  17.    mov   bx, number
  18. ingreso:
  19. ;se pide el ingreso del caracter
  20.    mov   ah, 08h
  21.    int   21h
  22. ;verifico si el ingreso es un numero
  23.    cmp   al, 13
  24.    je    seg_suma
  25. ;es menor que 0
  26.    cmp   al, 30h
  27.    jl    ingreso
  28. ;es mayor que 9
  29.    cmp   al, 39h
  30.    jg    ingreso
  31. ;el numero es valido se guarda y se imprime
  32.    mov   ah, 02h
  33.    mov   dl, al
  34.    int   21h
  35.    mov   [bx + si], al
  36.    inc si
  37. loop ingreso
  38.  
  39. seg_suma:
  40. ;write line
  41.    mov   dx, write_line
  42.    mov   ah, 9
  43.    int   21h
  44. ;write the number
  45.    mov   [bx+ si], byte '$'
  46.    mov   dx, number
  47.    mov   ah, 9
  48.    int   21h
  49.  
  50.  
  51. ;save the number
  52. ;**************************************************************
  53. ;ESTA ES LA PARTE QUE NO SE COMO HACER
  54. ;ES DECIR, QUIERO CONVERTIR LA CADENA EJ> '6','5',2' EN EL NUMERO 652
  55.    
  56. ;ACA TERMINA SUPUESTAMENTE LA PARTE PROBLEMATICA
  57. ;*************************************************************
  58.  
  59.  
  60. segment dataseg
  61.       pause_text    db 'Adios, presione una tecla....$'
  62.       input_text    db 'Ingrese numero: $'
  63.       write_line    db 13,10,'$'
  64.       number        db 0,0,0,0,0,0,0,0,0,'$'
  65.       result        dd 0                        
  66.  
  67.  

PD: Por sierto, FASM tiene procedimientos? trate de poner la palabra proc, pero no hubo caso :(:S

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #1 en: Domingo 1 de Octubre de 2006, 02:08 »
0
Por sierto,  conocen algun ejemplo para usar la consola de windows, lo que necesito es solo el Read, ReadLine, Write, WriteLine.... es que odio DOS.
Busque en internet pero no hubo caso,.... :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #2 en: Domingo 1 de Octubre de 2006, 09:25 »
0
Mira que el pseudocodigo no funciona tampoco eh, tenes que empezar a obtener los numeros de atras para adelante (el ultimo es la unidad y tiene que ser potenciada por cero asi termina siendo multiplicada por uno) y restarles el valor en ASCII de 0.

La verdad es que no me acuerdo de haber usado proc (tampoco lo suelo usar en MASM) con FASM, capaz aca encontras algo: http://flatassembler.net/docs.php

En cuanto a la consola de Windows: http://msdn.microsoft.com

Primero usas GetStdHandle para obtener un HANDLE a la consola y despues usas ese HANDLE con las funciones de I/O.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #3 en: Domingo 1 de Octubre de 2006, 15:58 »
0
Citar
Mira que el pseudocodigo no funciona tampoco eh, tenes que empezar a obtener los numeros de atras para adelante (el ultimo es la unidad y tiene que ser potenciada por cero asi termina siendo multiplicada por uno) y restarles el valor en ASCII de 0.
Si me di cuenta en la noche cuando fui a dormir  :-$

Por sierto, no usas proc? ¿Se arregla toda la cosa con saltos?

Gracias por lo links, el de la pagina de Fasm ya lo había revisado, pero ahora me fijo lo de msnd.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #4 en: Domingo 1 de Octubre de 2006, 16:37 »
0
Cita de: "Enko"
Por sierto, no usas proc? ¿Se arregla toda la cosa con saltos?
Una cosa es que no use PROC y otra que no use funciones. Basicamente lo que hago es meter por codigo lo que la directiva PROC del MASM mete "ocultamente". En MS-DOS se suelen pasar los parametros por registros y despues hacer el call y en Windows se usa la pila a placer.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #5 en: Martes 3 de Octubre de 2006, 00:01 »
0
Ya pude solucionar lo de la consola.
Las duda que tengo son:
¿Cual de estas dos formas es mejor usar en FASM?
trabajan con distintos includes, eso ya me di cuenta, y el último tarda mas en compilar. Las dos ejecutables ocupan lo mismo.

Este es el codigo que hice al principio
Código: Text
  1.  
  2. format PE Console
  3. entry start
  4. include 'include\win32a.inc'
  5.  
  6. section '.data' data readable writeable
  7. ;datos comunes
  8.    Saludo  db 'Hola Mundo!',0
  9.    char    db ?
  10.    num    dd ?
  11.    inHandle     dd ?
  12.    outHandle  dd ?
  13.  
  14. ;section '.bss' readable writeable
  15.  
  16.  
  17. ;section '.code' code readable executable
  18. section '.text' code readable executable
  19. start:
  20.    invoke   AllocConsole
  21.    invoke   GetStdHandle, STD_OUTPUT_HANDLE
  22.    mov      [outHandle], eax
  23.    invoke   GetStdHandle, STD_INPUT_HANDLE
  24.    mov      [inHandle], eax
  25.    invoke   WriteConsole, [outHandle], Saludo, 11, edx, 0
  26.    invoke   ReadConsole,[inHandle],char,1,num,0
  27.    invoke   ExitProcess, 0
  28.  
  29. section '.idata' import data readable writeable
  30.  
  31.  
  32.      library kernel32,'KERNEL32.DLL'
  33.  
  34.      import kernel32,\
  35.    AllocConsole, 'AllocConsole',\
  36.    ExitProcess, 'ExitProcess',\
  37.    WriteConsole, 'WriteConsoleA',\
  38.    ReadConsole, 'ReadConsoleA',\
  39.    GetStdHandle, 'GetStdHandle'
  40.  
  41.  

este es el otro...
Código: Text
  1.  
  2. format PE Console
  3. include 'include\win32ax.inc'
  4. .data
  5.  
  6.   caracter     DB ?
  7.   escritos     DD ?
  8.   leidos       DD ?
  9.   outHandle    DD ?
  10.   inHandle     DD ?
  11.   string1    DB "Hello World!"
  12.  
  13. .code
  14.   start:
  15.   invoke  AllocConsole
  16.   invoke  GetStdHandle,STD_OUTPUT_HANDLE
  17.   mov [outHandle],eax
  18.   invoke  GetStdHandle,STD_INPUT_HANDLE
  19.   mov [inHandle],eax
  20.   invoke  WriteConsole,[outHandle],string1,12,escritos,0
  21.   invoke  ReadConsole,[inHandle],caracter,1,leidos,0
  22.   invoke  ExitProcess,0
  23. .end start
  24.  
  25.  
Lo que me extraña es que en el ultimo, cuando traté de importar las rutinas del kernel32, me tiraba error diciendo que ya esaban importadas.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #6 en: Martes 3 de Octubre de 2006, 00:04 »
0
Para Windows siempre uso MASM32 pero ahi tenes la respuesta:

http://flatassembler.net/docs.php?article=win32

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #7 en: Martes 3 de Octubre de 2006, 00:08 »
0
Cita de: "Eternal Idol"
Para Windows siempre uso MASM32 pero ahi tenes la respuesta:

http://flatassembler.net/docs.php?article=win32
gracias, ahora estoy leyendo el articulo.
Por sierto, si bien las ejecutables ocupan lo mismo, pero tienen algo de 20 bytes distintos.

Segun me doy cuenta MASM32 está mejor documentado y hay mas ejemplo y muchos trabajan con él.... ¿no me será mejor cambiar a masm32?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #8 en: Martes 3 de Octubre de 2006, 00:12 »
0
Cita de: "Enko"
gracias, ahora estoy leyendo el articulo.
Por sierto, si bien las ejecutables ocupan lo mismo, pero tienen algo de 20 bytes distintos.

Segun me doy cuenta MASM32 está mejor documentado y hay mas ejemplo y muchos trabajan con él.... ¿no me será mejor cambiar a masm32?
No tengo idea y no da como para preocuparse  :devil: Si te interesa saberlo podes abrir los ejecutables con cualquier depurador (WinDbg, OllyDbg, SoftICE) o desensamblador (IDA) y ver la diferencia que tienen realmente.

Que yo sepa para Windows MASM32 es lo mas usado por lejos, no creo que tengas problemas con FASM pero proba los dos si queres.

PD. Es cierto.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #9 en: Martes 3 de Octubre de 2006, 00:49 »
0
tan solo para completar, lo mismo en masm32
Código: Text
  1.  
  2.     .486
  3.     .model flat, stdcall
  4.     option casemap :none &#59; case sensitive
  5.     include \masm32\include\windows.inc
  6.      include \masm32\include\user32.inc
  7.     includelib \masm32\lib\user32.lib    
  8.     include \masm32\include\kernel32.inc
  9.     includelib \masm32\lib\kernel32.lib
  10.     .data
  11.  
  12.         caracter     DB ?
  13.         escritos     DD ?
  14.         leidos       DD ?
  15.         outHandle    DD ?
  16.         inHandle     DD ?
  17.         string1      DB "Hello World!"
  18.     .code
  19. start:
  20.         invoke  AllocConsole
  21.         invoke  GetStdHandle,STD_OUTPUT_HANDLE
  22.         mov     outHandle,eax
  23.         invoke  GetStdHandle,STD_INPUT_HANDLE
  24.         mov     inHandle,eax
  25.         invoke  WriteConsole,outHandle, offset string1, 12, offset descritos, 0
  26.         invoke  ReadConsole,inHandle, offset caracter, 1, offset leidos, 0
  27.         invoke  Sleep, 1000
  28.         invoke  ExitProcess,0          
  29. end start
  30.  
  31.  
es mas o menos lo mismo, salgo la diferencia del "offset variable", en vez de "[variable]"

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #10 en: Martes 3 de Octubre de 2006, 15:09 »
0
Ahora me surgió otra duda sobre eficiencia....tal vez un poco boba.

Supongamos que en el codigo en una linea, tengo que realizar una operacion matemática, pero necesito el eax para otra cosa posteriormente. (ademas tengo los otros registros ocupados)

es mejor en el caso hacer un
Código: Text
  1.  
  2. iloop:
  3.    push  eax
  4.    ....operaciones
  5.    pop   eax
  6.    dec   eax
  7.    cmp  eax, 0
  8.    je     iloop
  9.  
  10.  
o mas bien, tratar de no usar el eax antes reemplazandolo por una variable
Código: Text
  1.  
  2. iloop:
  3.    ...operaciones con eax
  4.    dec   variable
  5.    cmp  variable, 0
  6.    je     iloop
  7.  
  8.  
suponiendo que todos los registros estan ocupados

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #11 en: Martes 3 de Octubre de 2006, 18:34 »
0
Fijate cuantos ciclos consumen y bytes ocupan cada una de las versiones  ;)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #12 en: Martes 3 de Octubre de 2006, 21:07 »
0
Cita de: "Eternal Idol"
Fijate cuantos ciclos consumen y bytes ocupan cada una de las versiones  ;)
Lo de los bytes entendí pero ¿como me fijo los ciclos? (tengo ollydbg si es que eso hace falta) :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #13 en: Martes 3 de Octubre de 2006, 21:34 »
0
Aca tenes alguna info al respecto:
http://home.comcast.net/~fbui/intel.html

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #14 en: Martes 3 de Octubre de 2006, 23:36 »
0
Cita de: "Eternal Idol"
Aca tenes alguna info al respecto:
http://home.comcast.net/~fbui/intel.html
excelente link,  era una de las cosas que andaba necesitando. :D
por sierto, estaría bueno que esté en la seccion de manuales. :P

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #15 en: Miércoles 4 de Octubre de 2006, 08:09 »
0
Cita de: "Enko"
por sierto, estaría bueno que esté en la seccion de manuales. :P
Hecho y es cierto, con C, de culo, caca, carajo, etc.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #16 en: Miércoles 11 de Octubre de 2006, 14:43 »
0
¿Hay alguna funcion de alguna librería para convertir Numero a Cadena?
vi que está StrToInt y lstrlen en la libreria kernel32 pero no logró encontrar una que sea IntTostr.

Como quiero ir práticando algunas cosas y solo se puede sacar a la consola cadenas y todavía no estoy tan entrenado para hacerme mi rutina propia para eso :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #17 en: Miércoles 11 de Octubre de 2006, 15:26 »
0
Podes usar wsprintf(cadena, "%d", numero);

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Lectura De Un Numero
« Respuesta #18 en: Miércoles 11 de Octubre de 2006, 18:51 »
0
Cita de: "Eternal Idol"
Podes usar wsprintf(cadena, "%d", numero);
ok, muchas gracias.
Con eso tengo para entretenerme un rato.

al principio no me salia porque no sabía que solo se le podía pasar DWORD.