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.
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
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!
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.
¿Y cómo puedo enlazar? Se supone que no necesito usar C Standard
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.
He intentado esto encontrado en la web, pero nasm me da un error:
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
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 (http://www.godevtool.com/):
GoLink.exe /console /entry:start main.obj kernel32.dll
http://therobpoint.blogspot.com/2012/11/asm-how-to-use-windows-api-in-nasm.html