MASM32快速起步

摘要:
MASM32是一个免费的软件程序,让您编辑Microsoft宏汇编程序代码从一个基本的文本界面。它强调MASM代码各部分以不同的颜色,使其更容易扫描和检测错误。注意MASM32编辑器实际上并没有让你运行或编译的代码。对于这一点,你仍然需要Microsoft宏汇编程序1,下载并安装MASM32。2,MASM32文件夹中打开的editor.exe文件。

MASM32是一个免费的软件程序,让您编辑Microsoft宏汇编程序(MASM)代码从一个基本的文本界面。它强调MASM代码各部分以不同的颜色,使其更容易扫描和检测错误。它提供了一个简单的布局程序员手动编辑代码,没有任何花哨的功能或选项的常规Microsoft宏汇编。注意MASM32编辑器实际上并没有让你运行或编译的代码。对于这一点,你仍然需要Microsoft宏汇编程序

1,下载并安装MASM32。

2,MASM32文件夹中打开的editor.exe文件。

3,点击“浏览”。

4,选择的的MASM代码文件,你想编辑,然后单击“打开”。“这将显示你的代码,自动突出显示根据MASM32计划(命令一个颜色,文本另一种颜色,等等)。

5,进行更改,然后单击“保存”。

这几天读了CSDN上人气相当旺的《疯狂的程序员》,有感于汇编语言入门之难,特写此文,以飱众多热心的网友,以邀更多的有心人共同探索充满神秘光环的汇编编程。
1.1安装MASM32
http://www.masm32.com/下载MASM32。指定一个盘符后,其将被安装至该盘的一个名为“masm32”的路径中。下文介绍了如何在MASM32自带的编辑器及VC6 IDE中编写Hello World的汇编程序。
1.2Quick Editor环境
MASM32自带一个Quick Editor的编辑器,位于masm32目录下,名为qeditor.exe。
作为一个IDE,Quick Editor让我们很方便地在其中进行编辑源码,连接并运行程序。
注意:尽管Quick Editor支持拖放操作,但不推荐这样做。因为这种作法不能使Quick Editor自动地将当前目录设为所打开文件所在的目录,其结果,就是在连接时,提示找不到.obj文件。正确的作法是,先运行Quick Editor,再通过菜单File->Open打开相应的源码。
在Quick Editor修改代码后,一定要记得先存盘,才编译及连接。否则,所生成的执行文件还依旧是未保存之前的旧版本。
新建一个文件夹HelloWorld,打开Quick Editor,输入下面的源码,并将其存至HelloWorld文件夹中,名为“HelloWorld.asm”。
1 ;HelloWorld.asm
2  
3 comment * ----------------------------------------------
4 The First Assemble Application
5 ---------------------------------------------- *
6  
7     .386
8 .model flat, stdcall
9     option casemap:none
10  
11 include /masm32/include/windows.inc
12  
13 include /masm32/include/user32.inc
14 include /masm32/include/kernel32.inc
15  
16 includelib /masm32/lib/user32.lib
17 includelib /masm32/lib/kernel32.lib
18  
19 .data
20 szCaption   db 'System Information', 0
21 szText      db 'Hello, World!', 0
22  
23 .code
24 start:
25     invoke MessageBox,/     ;调用函数名
26         NULL,/                      ;父窗口句柄
27         offset szText,/           ;文字
28         offset szCaption,/      ;标题
29         MB_OK                    ;按钮类型
30        
31 invoke ExitProcess, NULL
32 end start
代码中,“/masm32/include/”及“/masm32/lib/”分别限定了Quick Editor所能识别的包含文件及库文件的路径。这样,即使我们没有在操作系统的环境变量中设置相应的路径,Quick Editor也能找到这些文件。
下面是汇编、连接及运行程序的方法。
Quick Editor的菜单Project->Assemble ASM file,可汇编源码,并生成HelloWorld.obj文件。Project->Link OBJ File连接obj文件,并生成HelloWorld.exe文件。Project->Assemble & Link则是上面两步的组合。Project->Console Assemble & Link是在控制台下进行汇编及连接。其结果是,在运行程序时,先打开一个控制台,再由控制台来负责装载及运行程序。也就是说,控制台是程序运行的平台。如果关闭控制台,则程序也被自动地关闭了。
这里选择Assemble & Link,生成可执行文件。然后点击工具栏上的“Run Program”图标,弹出“Run Program or Help File”窗口,选择生成的HelloWorld.exe文件,点击“打开”按钮,将弹出一个窗口,显示“Hello, World!”。这就是我们的第一个Win32汇编程序!
Visual C++下的一个类似于此的Win32应用,其.exe文件约150KB。而我们这个HelloWorld.exe有多大?2.50KB,是前者的1/60。
1.3Visual C++环境
下面,我们不使用Quick Editor,而是使用Visual C++6的IDE来编写这个汇编程序。
在VC6中新建一个Project,类型为Makefile,项目名称为“VCHelloWolrd”。在接下来的Wizard窗口中,均点击”Next”或”Finish”按钮,接受默认设置。
为此项目新增一个VCHelloWorld.asm文件,内容如下:
1 ;VCHelloWorld.asm
2  
3 comment * ---------------------------------------------
4 The First Assemble Application
5 --------------------------------------------- *
6  
7     .386
8 .model flat, stdcall
9     option casemap:none
10  
11 include windows.inc
12 include user32.inc
13 include kernel32.inc
14  
15 includelib user32.lib
16 includelib kernel32.lib
17  
18 .data
19 szCaption   db 'System Information', 0
20 szText      db 'Hello World in Visual C++!', 0
21  
22 .code
23 start:
24     invoke MessageBox,/     ;调用函数名
25         NULL,/              ;父窗口句柄
26         offset szText,/     ;文字
27         offset szCaption,/ ;标题
28         MB_OK               ;按钮类型
29        
30 invoke ExitProcess, NULL
31 end start
共有2个地方与上例不同,均已用加粗字体标出。一是include及includelib指令语句没有了路径,只留下具体的文件名(下面将在VC中为其指定具体的路径)。二是szText的内容改为”Hello, World in Visual C++!”。
再为此项目新增一个名为“VCHelloWorld.mak”的文件,内容如下:
1 OUTDIR=./Debug
2  
3 all : VCHelloWorld.exe
4  
5 VCHelloWorld.exe : VCHelloWorld.obj
6     link /nologo /DEBUG /incremental:no /subsystem:windows
7           /out:$(OUTDIR)/VCHelloWorld.exe $(OUTDIR)/VCHelloWorld.obj
8  
9 VCHelloWorld.obj : VCHelloWorld.asm
10     ml /nologo /coff /c /Fo $(OUTDIR)/VCHelloWorld.obj VCHelloWorld.asm
VC的NMAKE调用此文件来生成VCHelloWorld.obj及VCHelloWorld.exe文件。首先定义了名为Debug的输出路径。其次,all是一个默认的target名,其依赖于名为VCHelloWorld.obj的target。link任务负责将Debug路径下的VCHelloWord.obj连接成该路径下的VCHelloWorld.exe。接下来,定义了VCHelloWorld.exe的target,其依赖于VCHelloWorld.asm文件。下面的ml任务,负责在Debug路径中生成VCHelloWorld.obj文件。
下面在VC中设置所需的头文件及库文件所在的路径。单击菜单Tools->Options,在弹出的窗口中选择Directories标签,在Show directories for的下拉列表框中分别选择Executable files, Include files及Library files,分别为它们增加F:/MASM32/bin,F:/MASM32/INCLUDE, F:/MASM32/LIB的路径。这样,即使代码中没有指定具体的路径,VC也知道如何找到它们。
最后,告诉VC,当我们按下Build按钮(F7)时,将.exe文件存放在何路径下。单击菜单Project->Settings, 在弹出的窗口中,选Win32 Debug,选Debug标签,选General Category,在Executable for debug session的文本框中输入具体的路径,如“F:/CodeTest/ASM/VCHelloWorld/Debug/VCHelloWorld.exe”。
执行完上面的步骤后,按Build按钮(F7),再按Execute Program(Ctrl+F5),Hello World in Visual C++!的消息窗口出来了。此时,VCHelloWorld.exe的大小为16.0KB,依旧远远小于150KB。

免责声明:文章转载自《MASM32快速起步》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇静态分析基础技术idea Rebug调试工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

洛谷 1192:台阶问题(递推,DP)

题目描述 有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式。 输入输出格式 输入格式: 两个正整数N,K。 输出格式: 一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod 100003 后的结果。 输入输出样例 输入样例#1: 5 2 输出样例#1: 8 说明 对于...

C++ -- VLD(Visual LeakDetector)内存泄露库的使用

https://blog.csdn.net/xp178171640/article/details/80828530https://blog.csdn.net/xiaoyafang123/article/details/83655356 VLD简介 由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一...

C++ 断言

assert宏 (基本概念与用法整理) assert宏的深入学习 1、运行时断言 1.1、assert属于运行时断言,可以在运行时判断给定条件是否为真,如果为真则什么也不做,否则打印一跳错误信息,然后通过abort来终止程。当程序开发阶段,我们可以在debug模式下加入大量的运行时断言,来提高我们程序的健壮性,并且提高开发速度。但是当程序需要发布的时候,大...

谈谈你对 keep-alive 的了解?

在做电商有关的项目中,当我们第一次进入列表页需要请求一下数据,当我从列表页进入详情页,详情页不缓存也需要请求下数据,然后返回列表页,这时候我们使用keep-alive来缓存组件,防止二次渲染,这样会大大的节省性能。 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,避免重新渲染 ,其有以下特性: 一般结合路由和动态组件一起使用...

电子词典的服务器端程序

程序功能简述:程序实现了多用户的注册,登录,查寻,历史查寻,退出功能,在对数据库读写和修改的时候设计只有登录的账号可以读写和修改与该登录账号相关的信息,每个账号的信息相对独立,这避免了多用户操作是对数据库访问的冲突。 用了最少整整四天才完成这个工作,但是还是有点bug,记录下自己的代码。 整个电子词典是分块做的:包含的Dic_Server.c,Dic_Cl...

Linux平台Java调用so库JNI使用例子

1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数。 如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/test/net/wangliping/HelloJNI.java   package net.wanglipingpublic class Hello...