win32汇编中nmake用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32汇编中nmake用法相关的知识,希望对你有一定的参考价值。

win32汇编中,比如我想用nmake编译连接一个TEST.ASM文件
请高手帮忙给我下例子
需要MAKEFILE的描述和放置位置
和NMAKE编译时的那句话 谢谢
OK的话追加100

在Win32编程中,由于Windows有很多的数据结构和定义,这些都放在include文件中,还有连接时要用到Import库(通俗的讲就是Windows提供的DLL文件中的函数列表,也就是告诉程序到哪里去调用API函数),这些都放在include 和lib目录中。我们在编译时要指定以下的系统环境:

set include=\\Masm32v5\\Include
set lib=\\Masmv5\\lib
set path=\\Masmv5\\Bin
这样编译器就会到正确的路径中去找 include 文件和 lib 文件。你可以自己在 autoexec.bat 文件中加上以上语句,为了产生Windows的PE格式的执行文件,在编译和连接中要指定相应的参数:

编译: Ml /c /coff 文件名.asm
连接: Link /SUBSYSTEM:WINDOWS OBJ文件名.obj 资源文件名.res

为了不在每次编译时都要打这么多的参数,我们可以用 nmake 文件来代为执行,nmake 是代码维护程序,他会检查 .asm .obj .exe .res 等文件的时间,如果你更新了源程序,他会自动执行编译程序或连接程序产生相应的文件。你可以在文件名为 makefile 的文件中指定使用的编译器和连接程序以及相应的参数,下面是一个 makefile 文件的例子:

NAME = Clock
OBJS = $(NAME).obj
RES = $(NAME).res
$(NAME).exe: $(OBJS) $(RES)
Link /DEBUG /SUBSYSTEM:WINDOWS $(OBJS) $(RES)
$(RES): $(NAME).rc
Rc $(NAME).rc
.asm.obj:
Ml /c /coff $(NAME).asm
文件告诉 nmake程序,程序名为 clock,产生 clock.exe 文件需要 clock.obj和 clock.res 文件,而产生 clock.res 文件需要 clock.rc 文件,产生 clock.obj 文件要用到 clock.asm 文件,至于是否需要执行 ml, link 和 rc,程序会根据文件的时间自动判断。
参考技术A 在命令行键入nmake /? 可以显示帮助信息,nmake的语法如下:nmake [选项] [/f 描述文件名] [/x 输出信息文件名] [宏定义] [目标]说明如下:● /f参数——如果描述文件名不使用默认的makefile,可以用/f参数指定。● /x参数——如果想把屏幕输出的信息存到一个文件中,可以用/x参数指定(用DOS下的管道操作符nmake > 文件名的方法无效)。● 宏定义——可以用新的定义覆盖描述文件中的宏定义。● 目标——指定建立描述文件中描述的某个文件,如上面的例子中默认是生成最后的test.exe文件,也可以用nmake x.res指定更新x.res文件。nmake常用的选项如表2.8所示。选 项 简 介 /A 不检测文件时间,强制更新所有文件 /B 文件时间相等时也要更新文件 /D make时显示文件新旧信息 /N 显示make时要执行的命令,但并不真正执行 /P 一个比较有用的选择,make时显示详细的信息 由于nmake的应用是基于文件时间的,当计算机的时钟不准确或文件拷贝到另一台计算机后文件时间有些偏差,那么文件的更新可能会不正确,这时最好用/A选项强制把所有文件更新一遍。在平时使用的时候,以makefile当做建立的描述文件名,那么仅键入不加参数的nmake命令就可以完成所有工作了。描述文件的语法make工具最主要也是最基本的功能就是通过描述文件来描述源程序之间的相互关系并自动维护编译工作,而描述文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,并要求定义源文件之间的依赖关系,为了更方便使用,文件中同时可以用一些宏定义。描述文件一般需要包含以下内容:● 注释● 宏定义● 显式规则● 隐含规则来自 http://hi.baidu.com/silyt/blog/item/fd7655954f70090f7bf480e7.html

将预处理器变量传递给 nmake 构建环境

【中文标题】将预处理器变量传递给 nmake 构建环境【英文标题】:Passing preprocessor variable to nmake build environment 【发布时间】:2012-06-11 22:48:32 【问题描述】:

我在 Win7 x64 构建环境中使用 nmake 构建驱动程序时遇到问题。我正在定义一个预处理器变量并使用 -

通过命令行传递它
build /nmake "USER_C_FLAGS=/DMyVersion=3"

而构建日志是 -

...
/DMyVersion=3
/typedil- 
/wd4603
/wd4627
....

所以,我清楚地将变量视为编译器选项的一部分。现在在标题文件中,我这样做了

#define otherVersion 10
#ifdef MyVersion
  #undef otherVersion
  #define otherVersion MyVersion
#endif

#define FileVersion otherVersion

问题是 FileVersion 始终为 10 而不管 MyVersion 定义是否已通过并存在于环境中。为了测试,发生了什么,我做了 -

#ifdef MyVersion
  #error MyVersion is present in the environment.
#endif

我看到正在打印的语句。但是为什么 otherVersion 总是 10 尽管环境中存在预处理器指令?为什么它不采用通过命令行选项传递的值 3

【问题讨论】:

【参考方案1】:

我不确定这是否适合您,但有些人确实尝试使用 msbuild 实现相同的效果。他们必须调整项目文件以将他们的定义“导入”构建过程。看看MSBuild.exe not accepting either /p:DefineConstants nor /p:PreprocessorDefinitions

【讨论】:

以上是关于win32汇编中nmake用法的主要内容,如果未能解决你的问题,请参考以下文章

请问如何用win32汇编语言遍历所有驱动器和所有文件夹

汇编中的win32 api帮助

如何修改汇编win32中 static控件的字体颜色

win32汇编hello world

【提问】Win32汇编的教材用啥好,初学

WIN32 汇编直接CALL 与间接CALL ?