(Ayuda) Programa ensamblado en modo 32 bits no se puede puede ejecutar en 64 bit

Iniciado por HelloWorldCodigo, 23 Agosto 2015, 23:28 PM

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

HelloWorldCodigo

Hola a todos y a todas. El problema que tengo es que al ensamblar un código con NASM con la etiqueta -fwin32 no puede ser ejecutado según Windows a 64 bits. No he probado la aplicación en modo 32 bits (no tengo ningún ordenador de 32 bits), así que no sé si es problema del código.

Código (asm) [Seleccionar]
STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10
NULL                equ 0

global start
extern ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleInputA

section .data    ;message we want to display on console
msg                 db "Press a key to continue...", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss     ;buffers declaration
buffer_out          resd 2
buffer_in           resb 32

section .text
   start:       ;starting point of our program
       push    STD_OUTPUT_HANDLE
       call    GetStdHandle   ;call to get a handle to the
       push    NULL           ;specified mode (input, output...)
       push    buffer_out
       push    msg.len
       push    msg
       push    eax            ;contains the GetStdHandle result
       call    WriteConsoleA  ;call to print our msg in console

   read:
       push    STD_INPUT_HANDLE
       call    GetStdHandle        ;new call to get input handle
       push    NULL
       push    1
       push    buffer_in
       push    eax
       call    ReadConsoleInputA   ;call to detect user input
                                   ;this function will wait til
   exit:                           ;it detects enough keypresses
       push    NULL                ;(in this case, 1)
       call    ExitProcess


Este es el comando que he usado:
nasm -fwin32 main.asm -o main.exe

MCKSys Argentina

Hola!

No responderé a tu pregunta principal, pues no manejo bien nasm.

Pero para ésto:

Cita de: HelloWorldCodigo en 23 Agosto 2015, 23:28 PM
... No he probado la aplicación en modo 32 bits (no tengo ningún ordenador de 32 bits), así que no sé si es problema del código...

puedes usar una máquina virtual. VirtualBox es gratis y fácil de usar. Si vas a hacer desarrollos, te conviene tener al menos 1 VM por cada target que quieras.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Eternal Idol

Windows de 64 bits ejecuta programas de 32 bits. El problema es que no estas generando ningun programa en lo absoluto ... apenas llegaste al codigo objeto, necesitas enlazar.
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

HelloWorldCodigo

¿Y cómo puedo enlazar? Se supone que no necesito usar C Standard

Eternal Idol

Con un enlazador, yo uso el de Microsoft (link.exe). Hay que aprender a buscar:
http://forum.codecall.net/topic/65222-intro-to-win32-assembly-using-nasm-part-1/

Si queres que te ayuden mejor usa MASM como casi todo el mundo que programa en assembly para Windows.

PD. El cuarto y ultimo parametro de ReadConsoleInputA no puede ser nulo, tiene que ser un puntero a DWORD.
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

HelloWorldCodigo

He intentado esto encontrado en la web, pero nasm me da un error:

Código (asm) [Seleccionar]
extern GetStdHandle
extern WriteConsoleA
extern ReadConsoleInputA
extern ExitProcess

import GetStdHandle kernel32.dll
import ExitProcess kernel32.dll
import WriteConsoleA kernel32.dll
import ReadConsoleInputA kernel32.dll


El error junto al comando son los siguientes:
nasm -fwin32 main.asm -o main.exe
main.asm:10: error: parser: instruction expected
main.asm:11: error: symbol `import' redefined
main.asm:11: error: parser: instruction expected
main.asm:12: error: symbol `import' redefined
main.asm:12: error: parser: instruction expected
main.asm:13: error: symbol `import' redefined
main.asm:13: error: parser: instruction expected

También he probado este comando y me sale el mismo error:
nasm main.asm -o main.exe

Eternal Idol

Si vas a seguir copiando y pegando codigo sin entender nada hasta lograrlo hacelo pero no preguntes a cada paso que des por favor, ya lo estas haciendo en otros lados ademas.

Con el codigo original, que te va a dar una excepcion a menos que arregles la llamada a ReadConsoleInputA, baja el golink:
GoLink.exe /console /entry:start main.obj kernel32.dll


http://therobpoint.blogspot.com/2012/11/asm-how-to-use-windows-api-in-nasm.html
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