Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: proxy_lainux en Julio 14, 2013, 02:12:28 PM

Título: [SOLUCIONADO] Como usar stdin en ensamblador?
Publicado por: proxy_lainux en Julio 14, 2013, 02:12:28 PM
bueno, vengo con otra duda

estoy tratando de hacer un ejercicio usando fgets para escribir en consola pero despues del primer printf se termina la ejecucion y no se ejecuta la funcion fgets(), verifique con ollydbg y en los parametros me aparece

stream = NULL

lo que me imagino que ese es el problema de porque no se detiene la ejecucion para escribir en consola

ya intente usar

extern _stdin
%define stdin 0
STDIN equ 0

y siempre me aparece como null, ¿alguien sabe como puedo poner en stream "stdin", para poder escribir en consola con fgets(), estoy haciendolo en nasm con gcc, espero alguien sepa algo

salu2
Título: Re:como usar stdin en ensamblador?
Publicado por: Arkangel en Julio 14, 2013, 03:48:28 PM
Mira las definiciones que hay en C

Segun Vc++ se definen  asi:

/* Declare _iob[] array */

#ifndef _STDIO_DEFINED
_CRTIMP FILE * __cdecl __iob_func(void);
#endif  /* _STDIO_DEFINED */

#define stdin  (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])



Basicamente tienes que exportar ese array de msvcrt.dll y sacar de hay las estructuras FILE

Saludos
Título: Re:como usar stdin en ensamblador?
Publicado por: proxy_lainux en Julio 14, 2013, 04:02:05 PM
mmm, creo todavia es algo complicado para mi, apenas estoy haciendo ejercicios en asm para acostumbrarme, pero investigare sobre ese array en asm

dejo el codigo que tengo, a lo mejor hay mas errores y por eso no me funciona, mientras investigare lo que mencionas

[BITS 32]

section .data
cual: db 'Cual es tu nombre?',0
STDIN equ 0

section .bss

buf: resb 64
lent: equ $-buf

section .text

global _WinMain@16
extern _printf
extern _fgets
extern _stdin
extern _ExitProcess@4

_WinMain@16:

push cual
call _printf
add esp, 4

push STDIN
push lent
push buf
call _fgets

push 0
call _ExitProcess@4
ret 16
Título: Re:como usar stdin en ensamblador?
Publicado por: binary_death en Agosto 31, 2013, 06:25:14 PM
Para obtener el handle:

Código (asm) [Seleccionar]

invoke  GetStdHandle, STD_INPUT_HANDLE
mov      [std_input], eax


Ahora ya puedes trabajar con él.

PD: Lo cierto es que no podrás usar ese handle con fgets, pero es la forma más fácil de hacerlo en Win32 y tienes a tu disposición muchas API's  de lectura y escritura con las que manejarte  ;)