文档章节

学 Win32 汇编[2]: 最简单的 Win32 程序

涂孟超
 涂孟超
发布于 2014/09/26 15:29
字数 923
阅读 17
收藏 0

; Test2_1.asm

.386
.model flat, stdcall

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
    szCaption db 'Hi', 0
    szMsg     db 'Hello World!', 0

.code
start:
    invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
    invoke ExitProcess, NULL
end start

 
 
 
 
 

 

 

  

建立过程:
1、文件 -> 新建工程 -> 工程类型: Win32 App (no res)、工程名称: Test1 -> 默认下去到完成.
2、打开 Test1.asm 输入以上代码, 然后编译执行. 结果如下:



程序注释:

; Test1.asm
; 分号是单行注释

comment &
  注释还可以使用 comment, 现在两个 & 之间的是注释内容, 其中的百分号也可以换做其他符号, 譬如 ^
&

COMMENT ^
  这也是注释, 
  还是多用 ; 吧, 比较方便 ^

; ********************************

.386
.model flat, stdcall

;.386 和 .model 都是是汇编伪指令; .386 表示使用 386 指令集, 这是 Win32 程序的最低需求.
;类似的还有 .8086 .286 .386p .486 .486p .586 .586p .mmx 等, 其中的 p 表示可以使用一些特权指令.

;.model 用于定义工作模式;
;flat 是内存模式, 类似还有: tiny small medium compact large huge, Win32 程序只能选择 flat;
;stdcall 是语言模式, 类似的还有: c syscall basic fortran pascal, 使用 Win32 API 必须选择 stdcall.

; ********************************

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

;kernel32.dll 是系统服务接口, 负责内存管理等;
;user32.dll 是用户服务接口, 负责消息管理等;
;下面的程序会用到它们的函数.

;user32.inc 和 kernel32.inc 中分别包含着对应 DLL 的函数、常量、结构的声明.
;windows.inc 包含着 Win32 程序用到的常量、结构的声明; 譬如下面用到的 MB_OK 常量就是在其中声明.

;程序在编译时, 见到 include (伪)指令就会把它指定的 inc 文件(或 asm) 文件复制到当前位置.
;inc 文件主要包含函数或常量的声明.

;lib 文件包含了动态库函数的地址信息和静态库的函数代码, 程序在链接阶段会提取这些信息或代码; 
;对 DLL(动态库), 程序运行时会根据这些地址信息去调用 DLL 中的相应的函数.

;inc 和 lib 文件分别存放在 masm32\include\ 和 masm32\lib\ 下;
;这里没有使用路径是因为 RadASM 已经给设置好了系统路了.

; ********************************

.data
    szCaption db 'Hi', 0
    szMsg     db 'Hello World!', 0

;.data 说明这是程序的数据段, 下面的 .code 是代码段
;后面还会接触到 .const(常量段)、.data?(变量段)等

;这里是定义了两个字符串变量 szCaption、szMsg, 后面的 0 表示是 0 结束的字符串.
;关于 db 等后面详细探讨.

; ********************************

.code
start:
    invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
    invoke ExitProcess, NULL
end start

;这段程序用到了两个 API 函数: MessageBox(显示消息框)、ExitProcess(退出程序);
;这两个函数分别来自 user32.dll 和 kernel32.dll.

;invoke 是调用函数或子过程的伪指令.
;addr 是取地址的伪指令, 这里也可以换做 offset

;start 是随便命名的标号, 用于表示程序段的开始和结束

;另外汇编本来是不区分大小写的, 但在使用 WinAPI 和 C 函数时必须注意大小写
;标号(如 start)和变量也要注意大小写
;指令和伪指令大小写均可

;汇编会忽略多余的空白, 并用 \ 续行, 譬如:
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
;可写作:
invoke MessageBox, NULL,\ 
                   addr szMsg,\
                   addr szCaption,\
                   MB_OK

 
 
 
 
 

 

 

  

关于换行: 在实际操作中, 我没有使用换行符号 \ 也可以, 如:

; Test2_1.asm

.386
.model flat, stdcall

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
    szCaption db 
      'Hi', 0
    szMsg     db 'Hello World', 
                 '!', 0

.code
start:
    invoke MessageBox, NULL, 
                       addr szMsg, 
                       addr szCaption, 
                       MB_OK
    invoke ExitProcess, NULL
end start

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/04/03/1703614.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0
win32汇编和x64汇编?

win32汇编升到winx64汇编,转型容易吗?我指的是会win32汇编,还学x64汇编吗?我是初学,能不能直接学x64汇编语言,请推荐本书?

IIOWE
2014/10/01
840
3
为什么破解要学win32汇编?

听说破解要学win32汇编,写壳也要用win32汇编?为什么呢?不学不能学破解吗?

IIOWE
2014/10/02
2.4K
13
Win32汇编开发环境介绍和RadAsm简明教程

Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编...

nothingfinal
2009/08/01
0
0
MASM32 SDK

MASM32 SDK是不同工具软件的大集合,它的汇编编译器用的是微软MASM软件包中的Ml.exe,资源编译器和32位链接器使用的是Microsoft Visual Studio中的Rc.exe和Link.exe,同时包含了Microsoft V...

匿名
2011/05/04
5.9K
1

没有更多内容

加载失败,请刷新页面

加载更多

【C++】智能指针简述(四):shared_ptr

  在开始本文内容之前,我们再来总结一下,前文内容:   1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.   2.auto_ptr防止拷贝后析构释放同一块内...

shzwork
23分钟前
1
0
作为Java程序员这些技术都不会,拿什么去涨薪跳槽?

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~,缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博...

别打我会飞
46分钟前
2
0
springboot开发之定时器quartz 定时任务调度(压缩版,抽取quartz的单个任务表实现)

前言 老了, 记不住了, 好记性不如烂笔头; 没想到曾经过目不忘的我, 也有这么一天, 岁月蹉跎,学习一天不如一天 难受 Quartz可以用来做什么? Quartz是一个任务调度框架。比如你遇到这样的问题...

尾生
51分钟前
11
0
技术经理平时都干啥?

「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负责时所承担的角色。通常他既要对最终交付的软件系统负责,另外也会像一个程序员一样去开发实现系统。 一个技术主管...

春哥大魔王的博客
今天
7
0
java工作流引擎Jflow流程事件和流程节点事件设置

流程实例的引入和设置 关键词: 开源工作流引擎 Java工作流开发 .net开源工作流引擎 流程事件 工作流节点事件 应用场景: 在一些复杂的业务逻辑流程中需要在某个节点或者是流程结束后做一些业...

ccflow周朋
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部