[SOLUCIONADO] Como usar stdin en ensamblador?

Iniciado por proxy_lainux, Julio 14, 2013, 02:12:28 PM

Tema anterior - Siguiente tema

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

Julio 14, 2013, 02:12:28 PM Ultima modificación: Agosto 27, 2014, 08:58:52 PM por Expermicid
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

Mira las definiciones que hay en C

Segun Vc++ se definen  asi:
Código: c

/* 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

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

Código: php
[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

Agosto 31, 2013, 06:25:14 PM #3 Ultima modificación: Agosto 31, 2013, 06:59:11 PM por binary_death
Para obtener el handle:

Código: asm

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