nasm的win32编程小心得

本文记录了使用nasm进行Win32编程的过程,包括遇到的错误及解决方法。作者在尝试导入 MessageBoxA 函数时遇到了困难,最终通过调整链接器和函数调用方式成功运行程序。主要内容涉及 NASM 汇编语言,Win32 API,以及链接器 lcclnk 的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于成功了。下面是我的探索过程,以及一些其他的遗留问题。
首先给出我的第一个小程序:

;assemble with
;NASM -fwin32 hello.asm
;link with
;lcclnk -s -subsystem windows hello.obj

%include "include/win32n.inc"

extern _MessageBoxA@16
;Import _MessageBoxA@16 user32.dll


global _WinMain@16


SEGMENT .text USE32 class=code
_WinMain@16:

push dword 0 ; OK button
push dword title1
push dword string1
push dword 0
call _MessageBoxA@16

ret

segment .data use32

string1: db 'hello world',13,'Success!!!',13,10,0
title1: db 'Hello',0 

;其实上面这个头文件没有用到
import这里,发现这句居然不能用,报错,也不知道为什么,只好使用了另外一种方式实现:~extern
_WinMain@16;这是lcclnk规定的入口点方式,必须定义这个global
_MessageBoxA@16;这里碰到过挫折,一直出错,以前是写成了 [_MessageBoxA@16]

其实造成失败的问题主要出在连接这一部分。
一开始的时候是找不到合适的lib文件,因为有几个例子是使用win32.lib的,但是我没有找到这个。
于是打算使用masm的link.exe,用user32.lib,* <-- **** 我将masm的user32.lib拿来用alink连接,失败了
后来在些资料中找到了lcc-win32,下载下来安装好了,将重新编译好的user32.lib拿来,使用lcclnk编译,本来应该是没问题的,但是由于那个call的地方我写成了call [_MessageBoxA@16] ****这个样到底指到了什么地方?**** 哎,还是原配的好,成功了。在想这个lcclnk到底实现了什么?nasm的obj文件里都有什么?


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值