fasm consola

Iniciado por .rn3w., 30 Mayo 2014, 06:34 AM

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

.rn3w.

es posible trabajar por consola en FASM  ???

Eternal Idol

Si, claro. En Windows se usan las funciones de la API GetstdHandle con STD_OUTPUT_HANDLE y WriteFile.
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

_Enko

#2
Hola, yo prefiero usar la runtime de C para  la consola, se hace asi:

format PE  Console
entry start

include '%fasminc%/win32ax.inc'

section ".data" data readable writeable
       szMsg db 'Hola',0
       frmt db '%s',0
       szPause db 'PAUSE',0
       


section ".code" code readable writeable executable
start:

      cinvoke  printf, szMsg, frmt
      cinvoke  system, szPause
      invoke   ExitProcess,0

section ".idata" import data readable writeable

library kernel32,'kernel32.dll',\
       user32,'user32.dll',\
       msvcrt,'msvcrt.dll'

       include '%fasminc%\api\kernel32.inc'
       include '%fasminc%\api\user32.inc'
       include '%fasminc%\api\msvcrt.inc'


msvcrt.inc no viene con fasm, pero lo puedes agregar manualmente a los includes.
Con la ventaja de tener toda la libreria de c standard a mano; En el caso de la consola, obtiene el HANDLE automaticamente

http://bitshare.com/files/bwvzbp1q/MSVCRT.INC.html
colocas el archivo en INCLUDE/API

Saludos.

.rn3w.

#3
gracias por responder...

tienen algun ejemplo de como mostrar por consola los resultados de un procedimiento???

es decir que mi procedimiento devuelve varios resultados en un bucle, mi duda es como mostrar todos esos resultados


gracias a todos......

Eternal Idol

Podes usar printf perfectamente, busca su referencia en Google si nunca programaste en C/C++.
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

.rn3w.

pretendo mostrar dx pero no funciona
pueden revisar mi codigo? se lo agradeceria mucho...


format PE console
entry start
include 'win32w.inc'

;======================================
section '.data' data readable writeable
;======================================

Msg1  DB 'Introduzca el nombre:',0
Msg2  DB 'Total:$'
Msg3  DB 'Error',0dh,0ah
Avanza DB 0Dh,0Ah, '$'
BufEnt DB '*.*',0
       DB ?
ASCIIZ DB '*.*',0

DTASeg DW ?

;=======================================
section '.code' code readable executable
;=======================================

start:

proc Entrada

               cld
               mov ax,@DATA
               mov ds,ax
               mov [DTASeg],es
               mov es,ax
               mov es,ax

               mov ah,4eh
               mov cx,17h
               mov dx,offset ASCIIZ
               int 21h
               jc Final

               
Bucle:

         mov es,[DTASeg]
         mov di,80h+30

         mov cx,13
         xor al,al
         repne scasb
         dec di
         mov al,'$'
         stosb
         
         push ds

         mov ah,9
         mov ds,[DTASeg]
         mov dx,80h+30
         ccall   [printf],dx ; pretendo mostrar dx----------------------------------------
         int 21h
         pop ds
         
         mov ah,9
         mov dx,OFFSET Avanza

         int 21h

         mov ah,4Fh
         int 21h
         jc Final

         jmp Bucle
         
         Final:

         cmp ax,12h
          jne error

         mov ah,9
         mov dx,OFFSET Msg2
         int 21h
         

         
         Error:
         mov ah,9
         mov dx,OFFSET Msg3
         int 21h

         mov ax,4c01h
         int 21h

       endp
;====================================
section '.idata' import data readable
;====================================


library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll' ,\user32,'user32.dll'

import user32,MessageBoxA,'MessageBoxA'

import  kernel,\
        ExitProcess,'ExitProcess'

import  msvcrt,\
        printf,'printf',\
        getchar,'_fgetchar'

Eternal Idol

¿int 21h?  :-X Estas mezclando codigo de 16 bits para MS-DOS en un programa de 32 bits para Windows que te dejo _Enko ...
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

.rn3w.

#7
ouch es que aprendi assembler para 16 bits

como mostrar dx para 32 bits por consola???

_Enko

#8
Hola, como te había comentado EternalIdol,
http://www.cplusplus.com/reference/cstdio/printf/



cinvoke printf, szFORMATO, edx

donde szFormato podría ser:
szFORMATO db "Este es el valor de DX: %i",0




recuerda que como es 32 bit, es dificil que pases como parametro DX solo, tienes que pasar el registro EDX completo.
Para que no haya problemas, recuerda hacer  XOR EDX, EDX al inicio, asi no tienes problemas con el bit alto. y Si modificas solamente DX, EDX tendrá el mismo valor.

i% significa que vas a pasar como parametro un nro entero, un INT.
printf va reemplazar %i con el valor del siguiente parametro.
Si usas por ejemplo "%i, %i"  tendrás que pasar como parametro 2 enteros.


Seria algo como

 ccall   [printf],szFORMATO, edx

szFORMATO es "%i",0

Puedes programar en fasm en 16bit tambien.
PE console  una aplicación con consola de 32 bit. No exiten interrupciones alli.
En Fasm puedes programar en 16bit tambien, si mal no recuerdo era format MZ, asi obtienes una aplicacion para DOS (que es  consola)




Saludos.

.rn3w.

ya intente de varias formas y nada
creo que el problema es que no entra al procedimiento