asm numeros binarios para pasarlos y guardar como txt

Iniciado por melonero, 18 Marzo 2017, 14:43 PM

0 Miembros y 1 Visitante están viendo este tema.

melonero

saludos lo 1º a todos es mi 1º post
soy autodidacta  en ensamblador aprendi con un Z81 spectrum
es el lenguaje mas fácil para de aprender aun que dicen q es muy complicao
mi problema es el siguiente
me hice un programa para las quinielas de futbol y va de maravilla
y me hice un programa para la lotería primitiva, ahí tengo el problema
uso para los nº bits y me los guarda en formato primi.dat para leerlo me hice otro programa q lo lee perfectamente pero me lo saca en pantalla en formato txt cuando son pocas apuestas las copio de la pantalla y lo guardo en el block de notas, pero cuando son muchas como unas 3000 es muy tedioso copiar y pegar

lo q os quiero pedir es que rutina tengo q poner para q me lo guarde como txt
si pudierais ayudarme os lo agradecería
siento no saber mas de este lenguaje q me apasiona
e buscado por muchos sitios pero no encuentro nada por eso acudo a vosotros

saludos y gracias si podeis ayudarme y si no también os doy las gracias


este es el programa q me le los bits y los pasa a txt,por pantalla
yo lo quiero en un fichero txt y no por pantalla
no se q parte tengo q cambiar he probado muchas formas y no me da los resultados q quiero


Código (asm) [Seleccionar]
pila    segment stack
       db  128 dup('pila')
pila    ends
;..................................
;segmento de codigos
;..................................
codigo  segment
lefich  proc  far
       assume  cs:codigo,ds:datos,es:datos,ss:pila
;
       push    ds
       sub     ax,ax
       push    ax
       mov     ax,datos
       mov     es,ax
       mov     ds,ax
       call    modo
       call    abrir
       call    escribe
       call    cerrar

       ret
lefich  endp
;..................................
leer    proc
       push    ax
       push    bx
       push    cx
       push    dx
       push    si
       mov     bx,handle
       mov     cx,nbytes3
       lea     dx,num_bin
       mov     ah,3fh
       int     21h
       jnc     bienleer
       mov     error,ax
       jmp     finleer
bienleer:
       mov     nbytes2,ax
       mov     error,0
finleer:
       pop     si
       pop     dx
       pop     cx
       pop     bx
       pop     ax
       ret
leer    endp
;................................
;procedimiento para pasar los numeros de binario a ascii
;...............................
escribe   proc
       push    ax
       push    bx
       push    cx
       push    dx
       push    si
       mov     cx,nbytes1
cont1:
       push    cx
       mov     cx,18
cont2:

       push    cx
       mov     cx,6
cont:
       push    cx
       call    leer
       sub     ax,ax
       mov     al,num_bin
       mov     num_bin,0
       mov     cx,2
       mov     bx,00
       mov     si,10
relleno:
       mov     byte ptr numer[bx], '0'
       inc     bx
       loop    relleno
llena:
       sub     dx,dx
       div     si
       add     dl,'0'
       dec     bx
       mov     byte ptr numer[bx],dl
       inc     cx
       or      ax,ax
       jnz     llena
       lea     si,numer
       mov     cx,2
repite:
       push    cx
       mov     ah,02h
       mov     dl,[si]
       int     21h
       inc     si
       pop     cx
       loop    repite
       lea     dx,space
       call    es_mensa
       pop     cx
       loop    cont
       lea     dx,salto
       call    es_mensa
       pop     cx
       loop    cont2
       call    tesper
       pop     cx
       loop    cont1
       pop     si
       pop     dx
       pop     cx
       pop     bx
       pop     ax
       ret
escribe  endp
;.....................................
es_mensa   proc
       push    ax
       mov     ah,09h
       int     21h
       pop     ax
       ret
es_mensa   endp
;.......................................
modo    proc
       push    ax
       mov     ah,00h
       mov     al,mon
       int     10h
       pop     ax
       ret
modo    endp
;....................................
tesper  proc
       push    ax
       mov     ah,0
       int     16h
       pop     ax
       ret
tesper  endp
;....................................
abrir   proc
       push    ax
       push    dx
       lea     dx,fichero
       mov     al,acceso
       mov     ah,3dh
       int     21h
       jnc     bienabrir
       mov     error,ax
       jmp     finabrir
bienabrir:
       mov     handle,ax
       mov     error,0
finabrir:
       pop     dx
       pop     ax
       ret
abrir   endp
;.....................................
cerrar  proc
       push    ax
       push    bx
       lea     bx,handle
       mov     ah,3Eh
       int     21h            
       pop     bx
       pop     ax
       ret
cerrar  endp
;................................
;final del programa
codigo  ends
       end  lefich




no consigo que me lo guarde ,me sale un fichero de 6000 bytes pero vacio en blenco
sialguien pudiera decir me donde me equivoco, gracias
Código (asm) [Seleccionar]
escribe   proc
       push    ax
       push    bx
       push    cx
       push    dx
       push    si
       lea     di,campo        
       mov     cx,nbytes1
cont1:      
       push    cx
       mov     dx,conta
       call    leer
       sub     ax,ax
       mov     al,num_bin
       mov     num_bin,0
       mov     cx,2
       mov     bx,00
       mov     si,10
relleno:
       mov     byte ptr numer[bx], '0'
       inc     bx
       loop    relleno
llena:
       sub     dx,dx
       div     si
       add     dl,'0'
       dec     bx
       mov     byte ptr numer[bx],dl
       inc     cx
       or      ax,ax
       jnz     llena
       lea     si,numer
       mov     cx,2
       mov     [di],bl
       inc     di
       inc     dx
       adc     conta,dx
       pop     cx
       loop    cont1

       pop     si
       pop     dx
       pop     cx
       pop     bx
       pop     ax
       ret
escribe  endp
;.....................................

modificado pero no me funciona bien
me saca el fichero txt con todo 1 no se como arreglarlo
Código (asm) [Seleccionar]
escribe   proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        mov     cx,nbytes1
cont2:
        lea     di,campo
        mov     dx,conta
        adc     di,dx
        push    cx
        mov     bx,handle
        mov     cx,nbytes3
        lea     dx,num_bin
        mov     ah,3fh
        int     21h
        jnc     bienleer
        mov     error,ax
        jmp     finleer
bienleer:
        mov     nbytes2,ax
        mov     error,0
finleer:               
        mov     ax,nbytes2                   
relleno:
        mov     byte ptr numer[bx], '0'
        inc     bx
        loop    relleno
        mov     si,10
llena:
        sub     dx,dx
        div     si
        add     dl,'0'
        dec     bx
        mov     byte ptr numer[bx],dl       
        or      ax,ax
        jnz     llena       
        mov     [di],dl       
        inc     di
        inc     dx
        adc     conta,1       
       
        lea     dx,space
        call    es_mensa
        pop     cx
        loop    cont2                     

        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
escribe  endp



· Los códigos deben ir en etiquetas GeSHi
· Los titulos deben ser desciprtivos al problema
· No debes hacer doble post, usa el botón modificar
>aquí las reglas del foro
-Engel Lex

cpu2

No soy muy entendido en las interrupciones del DOS, ni la API de Windows, pero creo que deberias de usar Createfile con eso deberia de bastar.

Un saludo.

melonero

Cita de: cpu2 en 21 Marzo 2017, 12:39 PM
No soy muy entendido en las interrupciones del DOS, ni la API de Windows, pero creo que deberias de usar Createfile con eso deberia de bastar.

Un saludo.
no se q es eso ya digo q soy autodidacta
yo programo con tasm,y tlink para 8086
con el edit

cpu2

#3
Pues la API de Windows, funciones para "facilitar"

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

Tienes que incluir librerias, pero tambien la tienes en la interrupcion 21h si no me equivoco, https://msdn.microsoft.com/es-es/library/cc438736(v=vs.71).aspx, 3CH.  Te ira mejor esta ultima, pero mejor ves emigrando a la API.

Un saludo.

Edito:

Aqui tienes las funciones del int 21:

http://stanislavs.org/helppc/int_21.html

Meta

Hola:

¿Por qué asm en Windwos a estas alturas de la vida?
Si es para temas de hadcer driver lo entiendo.

He estado buscando, no encuentro ejemplo, solo documentos sobre asm.
http://personals.ac.upc.edu/guerrero/fo/asm.pdf

https://es.answers.yahoo.com/question/index?qid=20080427172053AAJ4KWm

[youtube=640,360]https://www.youtube.com/watch?v=ofG8OD7Jbpg[/youtube]

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

melonero

CitarHola:

¿Por qué asm en Windwos a estas alturas de la vida?
Si es para temas de hadcer driver lo entiendo.
hola
te explico por que asm
es un programa de quinielas de loteria primitiva  
la razón es por hay que analizar 13.987.147 columnas, con cualquier programa
se tarda muchos minutos si no horas
el mio lo hace en segundos
el progama esta hecho funciona muy bien ,el problema es que las guarda en binario , y tengo que pasarlas a ascii ,y tengo el otro programa que las lee y me las saca por pantalla
como trabajo con el símbolo del sistema solo puedo copiar de 24 en 24 líneas
para pocas apuestas esta bien las copio y las guardo en un fichero.txt
el problema es cuando son 6000 apuestas
si tuviera la posibilidad de pasar el fichero.dat a fichero.txt
seriagenial para mi proyecto
y la ultima razón es q no se programar en otro lenguaje, y odio windows
saludos y gracias

Meta

Cita de: melonero en 24 Marzo 2017, 15:15 PM
odio windows

¿Qué es lo que odias de Windows?

Puede que aquí te de ideas.
https://underc0de.org/foro/asm/crear-y-escribir-un-archivo-en-asm/

Parece muy interesante tu programa. Porque la genreacion de ahora que soy yo lo hago con PIC en asm, el 8086 ya no lo toco.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/