我正在尝试通过函数打印作为参数接收的字符。
我的功能声明如下:
STD_OUTPUT_HANDLE equ -11
NULL equ 0
global _print
extern _ExitProcess@4, _GetStdHandle@4, _WriteConsoleA@20
section .data
msg db 'a', 13, 10, 0
msg.len equ $ - msg
section .bss
dummy resd 1
section .text
_print:
;Prologue
push ebp
mov ebp, esp
mov edx, [ebp + 4]
push STD_OUTPUT_HANDLE
call _GetStdHandle@4
push NULL
push dummy
push 1
push edx
push eax
call _WriteConsoleA@20
;Epilogue
mov esp, ebp
pop ebp
push NULL
call _ExitProcess@4
我的调用函数声明如下:
global _main
extern _print
section .data
msg db 'c', 13, 10, 0
msg.len equ $ - msg
section .text
_main:
;Prologue
push ebp
mov ebp, esp
push msg
call _print
;Epilogue
mov esp, ebp
pop ebp
我希望在我的控制台中输出'c'作为输出,但这不起作用。当我将变量msg(定义为'a'的那个)传递给WriteConsole时,打印消息的方法有效。所以我猜测问题在于传递参数或从堆栈中读取它。
我正在使用Nasm编译,gcc链接&在Windows平台(32位)上使用intel语法进行编译。
我使用这些命令编译和链接
nasm -fwin32 tiny.asm
nasm -fwin32 tiny_print_char.asm
gcc tiny_print_char.obj tiny.obj -m32 --enable-stdcall-fixup -nostdlib c:\windows\system32\kernel32.dll -lkernel32
任何人都可以帮助我吗?