lib不是有效的win32应用程序_Win32汇编开篇、Hello World

下载MASM32

地址:http://www.masm32.com/

MASM32并不是微软官方发布的软件,是国外的MASM爱好者自行整理和编写的一个软件包,最高版本为11.0版,另外下载了MASM32 ,还要下载一个开发工具RadASM,RadASM下不下载都行,如果没有,需要我们手动编译(ml)、链接(exe)。有了RadASM,可以一键编译、链接、运行。

注意的是,MASM32 安装只能安装在某个盘的根目录,我第一次安装在某个目录下,貌似在编译时会报错,具体记不清了。5b243b746c5fecff2bce8cb1c7fd9288.png

2c87a033e30f8289646c41db058677dd.png

Hello Word

.386
.model flat, stdcall
option casemap:none

includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib

include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc


system PROTO C:ptr sbyte,:vararg

printf PROTO C:ptr sbyte,:vararg

.data
szTitle BYTE 'hello', 0
szText BYTE 'Hello World', 13,10,0
fmt BYTE '%s',0
szPause BYTE 'pause',0
.code
start:

invoke printf ,ADDR szText,ADDR fmt
invoke MessageBox, NULL, offset szText, offset szTitle, MB_OK
invoke system,ADDR szPause
end start

运行效果:988e2716c8777b3e17bb56c376e93e7c.png

程序解释

  1. .386是一个汇编语言伪指令,告诉编译器我们的程序是使用80386指令集编写的,还可以使用 .486、.586, 但最安全的还是使用.386。

  2. .model是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是flat。stdcall告诉编译器参数的传递约定,stdcall表示函数即子程序调用时,实参入栈顺序是从右到左。

  3. 最后一句是表示标识符区分大小写

.386
.model flat, stdcall
option casemap:none
  1. includelib和include负责引入要使用的库文件和头文件。
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib

include  C:\masm32\include\windows.inc
include  C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc

  1. 汇编语言中要调用外部的函数(子程序),如C函数,就必须进行函数原型声明,其声明的格式有两种,使用PROTO和EXTRN。
system PROTO C:ptr sbyte,:vararg

printf PROTO C:ptr sbyte,:vararg
  1. .data 中包括已初始化的数据。
.data
szTitle BYTE 'hello', 0
szText BYTE 'Hello World', 13,10,0
fmt BYTE '%s',0
szPause BYTE 'pause',0
  1. 输出时通过invoke调用printf函数,参数是szText、fmt,ADDR表示取地址,ADDR szText表示取szText的地址。

  2. 然后在调用API MessageBox,用来弹出一个对话框,显示Hello World。


end 

上面这段是用来标识代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。

.code
start:

invoke printf ,ADDR szText,ADDR fmt
invoke MessageBox, NULL, offset szText, offset szTitle, MB_OK
invoke system,ADDR szPause
end start

命令行编译、链接、运行

如果我们使用IDE,不需要我们在命令行进行繁琐、重复的工作,但是要进行学习,这些命令和参数还是要了解下的,在下载Masm32后,把他加入系统环境变量,注意是bin目录,然后cmd进入存放源文件asm下,通过ml进行编译,不出意外会生成一个obj文件。

ml /c /coff MasmDemo.Asm
25733e5b5b9414f8d2c186c81fe4e6fe.png

在进行链接,生成exe,控制台程序一定要指定 /subsystem:console 。

link /subsystem:console MasmDemo.obj

最后输入MasmDemo.exe运行程序。

MasmDemo.exe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值