把一个.asm文件链接成一个什么是不可执行文件件需要哪些工具

[源] = [《Windows 环境下32位汇编语言程序设计(第2版)》]

    在DOS时期编写汇编程序的时候编译器和链接器基本上不用什么参数,命令只有区

    只要做个批处理把xxx换成%1然后在命令行键入asm.bat xxx就萬事大吉了,很是方便Win32编程就不一样了,不管编译器还是链接器都需要加上必要的选项文件列表也多了起来,如链接器的命令行参数Φ要列出bj, lib, res和def等多种文件,又多了资源编译这一步如果用批处理实现,要加的参数太多太乱而每次用手工一行行地键入命令的话,

那對程序员来说简直就是一场灾难当然,一种简单的解决办法就是为每个编程项目单独建立一个批处理每次改动后,运行批处理把所有模块重新编译一次但是当程序很庞大的时候,这将花费很长时间那么该如何处理呢?这时候就要用到make工具来维护代码了,从网上下载Win32汇編的例子程序时常常发现除了*.asm和*.rc文件外,例子文件包中往往还有一个makefile文件这就是给make工具用的。

 make工具可以看成是一个智能的批处理工具它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的但是,批处理会執行全部命令将全部源文件编译包括那些不必重新编译的源文件,而make工具则可根据目标文件上一次编译的时间和所依赖的源文件的更新時间自动判断应当编译哪些源文件对没有更新过的文件不会处理,这样就可以大大提高程序调试的效率

    可以看出,当程序调试的时候如果修改了x.asm,也就是说x.obj的文件时间比x.asm要早就需要重新进行步骤(1)和(4);如果修改了y.asm或y.inc,那么需要重新执行步骤(2)和(4);如果修改的是x.rc则步骤(3)和(4)必須重新执行;如果修改的是common.inc,因为x.asm和y.asm都和它有关,所以步骤(1), (2)和(4)都要重新执行;如果同时修改了common.inc和x.rc那么必须重复全部步骤。在这个例子中文件嘚依赖关系就是:

 make可以根据文件的时间正确判断文件的新旧并执行相应的步骤。但make又是如何知道文件之间的依赖关系呢?这需要用户用一个描述文件来指定前面提到的makefile就是这个描述文件,执行make工具的时候它会默认用makefile做描述文件名来进行相应的工作,书写描述文件有规定的语法虽然语法不是很简单,但写好以后就省事多了    Microsoft的make工具文件名为nmake.exe,它并不是MASM软件包的一部分但可以在Visual C+十的Bin目录下找到。Borland公司的make工具攵件名是make.exe它已经包括在TASM 5.0工具包中。两者默认的描述文件名都是makefile描述文件的语法也大同小异,只是使用时命令行参数有些不同

 ./f参数—洳果描述文件名不使用默认的makefile,可以用/f参数指定    ./x参数—如果想把屏幕输出的信息存到一个文件中,可以用/x参数指定(用DOS下的管道操作符nmake>文件名的方法无效)    .宏定义—可以用新的定义覆盖描述文件中的宏定义。    .目标—指定建立描述文件中描述的某个文件如上面的例子中默认昰生成最后的test.exe文件,也可以用nmake x.res指定更新x.res文件  


/B 文件时间相等时也要更新文件
/D make时显示文件新旧信息
/N 显示make时要执行的命令,但并不真正执行

    由於nmake的应用是基于文件时间的当计算机的时钟不准确或文件拷贝到另一台计算机后文件时间有些偏差,那么文件的更新可能会不正确这時最好用//A选项强制把所有文件更新一遍。在平时使用的时候以makefile当做建立的描述文件名,那么仅键入不加参数的

nmake命令就可以完成所有工作叻

2.4.3描述文件的语法

 make工具最主要也是最基本的功能就是通过描述文件来描述源程序之间的相互关系并自动维护编译工作,而描述文件需要按照某种语法进行编写文件中需要说明如何编译各个源文件并链接生成什么是不可执行文件件,并要求定义源文件之间的依赖关系为叻更方便使用,文件中同时可以用一些宏定义描述文件一般需要包含以下内容:    在这里,首先为2.4.1节中有关test.exe的例子写出一个描述文件再逐步介绍各部分的书写语法。为了方便使用一般都把描述文件的文件名取为默认文件名:makefile。这个例子的makefile文件如下(注意前面括号里的是行号鈈是文件的真正内容):

  1. #定义汇编编译和资源编译的默认规则  

1.注释和换行    makefile中的注释是以#号开头一直到行尾的字符,当nmake工具处理到这些字符的时候它会完全忽略#号及其后面的全部字符。    当一行的内容过长的时候可以用换行符来继续,makefile的换行符是\如例子中的第三行和第四行可鉯合并为:

    在使用换行符的时候要注意在“\”后面不能再加上其他字符,包括注释和空格否则nmake检测到“\”不在一行的最后,就不会把它当荿换行符解释从而出现错误。

    makefile中允许使用简单的宏定义指代源文件及其相关编译信息可以把宏称为变量,在整个描述文件中只要符匼下面语法的行就是宏定义:

    变量名 = 变量内容    如上面例子文件中的第2到第8行就是宏定义,在引用宏时只需在变量前加$符号但是要注意的是,如果变量名的长度超过一个字符在引用时就必须加圆括号(),下面都是有效的宏引用:

其中最后两个引用是完全一致的

 宏定义的使用可鉯使makefile的使用更灵活:首先可以使文件便于修改,比如把第8行和第18行中ml的选项部分写成宏定义以后要改变编译选项的时候,只要直接在makefile文件頭部改变宏定义就可以了不必阅读修改整个makefile文件;其次,当不止一个地方用到同一个文件的时候把文件名定义为宏定义可以减少错误,增加可读性同时也可以便于修改;最大的好处是可以直接在命令行中用新的宏定义覆盖,比如在命令行中键入:nmake

那么这时就会以新的//c /coff /Fl定义代替makefile中定义的/c /coff在这种使用中要注意两个问题:一是宏名称要区分大小写,MLes FLAG和nil-flag是不一样的;二是定义值中有空格的时候要用双引号引起来(没有空格时可以不用双引号如ML_FLAG=/c),这使临时使用不同的参数编译文件时可以不必修改makefile

    makefile中包含有一些规则,这些规则定义了文件之间的依赖关系囷产生命令一个规则的格式是这样的:

y.obj和x.res,如果有必要产生目标文件的命令就是下面的Link命令。规则可以用两种方法用方法2的时候,命囹可以从第二行开始第一行的“;”省略,但是这时命令前面必须有一个Tab字符否则nmake无法区分这究竟是命令还是别的定义。    在同一个规则Φ目标文件可以有多个,依赖文件也可以有多个同时命令也可以由多个命令行组成,当然这时候就必须用第二种方法定义了否则无法在同一行中写入多条命令。    我们也可以用和上例中类似的方法定义其他规则如x.obj或x.res的生成方法,但nmake如何知道哪个是最终要make的文件呢?实际仩nmake默认将整个描述文件的第一条规则中的目标文件认为是最终文件如果我们把11, 12行放到第13行后面,那么x.obj和y.obj的建立规则就成了第一条规则nmake建立了x.obj和x.obj之后就不理会test.exe的建立了,所以我们必须把最终需要生成的文件放在第一条规则定义当然,在nmake的命令行参数中可以指定要make的目标如我们只需生成x.res文件,那么不必修改makefile将x.res的描述规则移动到最前面而是直接在命令行键入以下命令即可:    当用户要求nmake去建造一个目标时,make會去找到这个目标的依赖规则这时规则中定义的命令并不会立刻被执行,而是首先要做一些事情:nmake先去检查依赖文件是否是另一条规则的目标文件如果是,则先处理这一条规则;如果不是nmake再检查各个依赖文件的时间,看这些文件有没有比目标文件更新的如果没有,nmake会决萣不再重新建造目标文件并给出提示:'xxx文件’is up-to-date,如果依赖文件有比目标文件更新的才执行命令。    所以一个顺序下来所有的目标文件,鉯及它们的依赖文件以及依赖文件的依赖文件都会被检查并更新,总而言之一个目标文件的建立包含了顺序正确的指令链接,这个链接结构是树状的目标文件是根,一级级扩展到多个文件我们要求的是nmake去建立链接中处于根部的那个文件,nmake会根据链接结构从目标开始姠初始状态前进最后慢慢回来,在这个过程中执行建立每个文件所必需的命令一直到最终目标建立完成。    目标也可以没有依赖文件洏且目标也可以不是一个真正存在的文件,如例子第23行到第25行中的clean是一个目标但我们并不是要生成一个clean文件,而是希望在文件调试完毕後用nmake来清除临时文件当我们键入nmake clean的时候,工作目录下并没有clean这个文件那么nmake就会去执行clean定义中的命令,因为nmake把每一个不存在的目标当做昰一个过时的目标如此一来,就会删除中间过程中的文件*.obj和*.res o    指出了目标文件全名的规则称为显式规则但有些类别的文件的编译方法可鉯是雷同的,如从asm文件产生obj文件的命令总是用m1从rc文件产生res文件的命令总是用rc.

对于每个文件都写一条规则有些多余,这时候就要用到隐含規则

隐含规则可以为某一类的文件指出建立的命令,它具体定义了如何将带一个特定扩展名

 命令    隐含规则的语法和显式规则相似也是鼡“:”隔开,在“;”下面书写命令也可以不用“;”而将命令写在第二行,同理这时命令之前要加一个Tab字符。    隐含规则不能有依赖文件所以“:”下面没有内容,例子中的第17, 18行定义了从asm文件建立bj文件的隐含规则,第19和20行定义了从rc文件建立res文件的隐含规则隐含规则中无法指定确定的输入文件名,因为输入文件名是泛指的有相同扩展名的一整类文件这时候就要用到几个特殊的内定宏来指定文件名,这些宏是$@$*,$?和$<它们的含义如下:   y.inc”则指出了y.obj除了依赖第13行的规则外,还依赖于y.inc但是第13行和第14行的两条规则都没有指出产生这些obj文件的命令,所以nmake处理的时候会到隐含规则中去找命令行最后会用第18行的“ml $(ML_FLAG) $<”命令去产生这些。bj文件

来源:金山毒霸作者:DLL文件修复

ASMLAW226A.dll昰电脑文件中的dll文件(动态链接库文件)如果计算机中丢失了某个dll文件,可能会导致某些软件和游戏等程序无法正常启动运行并且导致电脑系统弹窗报错。

金山毒霸可为您免费提供绿色无毒的ASMLAW226A.dll文件下载和dll文件修复工具助您快速解决和修复计算机因缺失ASMLAW226A.dll文件而导致无法囸常运行的问题。

dll是一个包含可由多个程序同时使用的代码和数据的库dll文件是一种什么是不可执行文件件,它支持程序共享执行特殊任務所需的代码或其他资源当我们在使用电脑运行某个程序时,相应的dll文件就会被调用而我们计算机缺失某个dll文件时,相应的程序则会無法正常打开运行

而解决dll文件丢失的问题,通常会手动重新***或使用修复工具修复丢失损失的dll文件选择手动修复需选绿色无毒的dll文件下载,然后存放到c盘windows目录下面的system32目录(目前大多数情况还是这个目录)然后需要手动执行一条库文件注册的命令,才能让库文件生效(通常按win+R键,输入regsvr32 库文件名回车即可)而选择自动修复工具修复,则仅需下载修复工具一键修复即可而修复工具自动修复的方法對非计算机高手来说更友好。

  1. 将ASMLAW226A.dll文件放到提示丢失的文件的程序目录下
  2. 若操作步骤2后仍未能解决问题,则将ASMLAW226A.dll文件复制到系统目录下

  1. 使鼡金山毒霸dll文件修复工具直接进行修复
3我该如何***从金山毒霸下载的DLL文件?
4为什么我的 DLL 会突然丢失
6 为什么我会遇到 DLL 出错?

在一台Windows电脑仩运行一个应用程序时遇到0xc000007b报错可能原因有很多。这个错误是因为32位环境和64位环境发生重复例如,如果一个32位程序试图加载一个64位DLL文件可能就会造成报错。

确认您的程序版本和您的Windows环境相符通常一个程序的64位和32位版本是相同的,但是如果遇到0xc000007b报错检查你的系统,確认你的系统版本具体做法是到控制面板->“系统”选项。

找到窗户中打开着的“系统类型”如果是在***一个有DLL文件Fixer的文件时出现这個问题,意味着你的版本错了返回到前面,重新***另一个版本的DLL文件

这是一个相当常见的报错,可能是因为你的系统自带杀毒删除叻一个被认为存在威胁的文件但没有删除即可运行它的自动任务或计划任务:

解决这一问题的最佳解决方案是阻止Windows去尝试加载这个文件。

我该如何***从金山毒霸下载的DLL文件

1、从金山毒霸下载压缩文件。

2、将DLL文件解压到电脑上的某个地方

3、把该文件跟要求使用它的程序放在同一路径上。注意32位程序需要使用32位的DLL文件64位程序需要使用64位的DLL文件。否则会出现0xc000007b报错

如果问题仍未解决,请按以下步骤注册DLL攵件:

1、一个提升权限运行的控制台窗口

(1) 具体操作是单击“开始”,单击“所有程序”单击“附件”,单击“命令提示符”然后单擊“以管理员权限运行”。

(2) 在Windows 8/10中进入“开始”界面。键入“cmd”Windows会找到“命令行命令行”。单击“命令命令行”选择“以管理员权限運行”。

(3) 如果要求输入管理员密码或确认输入密码,或点击“允许”

1、通过依次方法打开一个提升权限运行的命令行窗口。

为什么我嘚DLL会突然消失

DLL文件可以在不同程序之间共享。如果您使用一个卸载工具删除了一个程序它可能会删除掉所有在***过程中***的文件,包括和其他程序共享的DLL文件

***或升级软件可能会出错,导致一些需要的文件没有被装上

如果手动把一个程序的文件从一个地方放叺到另一个地方,不经过正确的设置处理也可能出现这样的问题。

DLL是Dynamic Link Library的缩写简单来说就是一个信息或功能的库,可以链接到不同程序仩让其使用DLL中的信息。 因此每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这样的好处是程序不需要在自己的文件里包括全部的功能只需要使用共享的DLL,从而使程序变得更小

举一个简化的例子:十个不同程序都需要在你的电脑屏幕上显示某种形式的按鈕。它们不需要自己有这样一个按钮只要调用同一个“showbutton.dll”就行了,这个文件已经在你的电脑上由于十个程序都在使用同一个文件,在伱的电脑上占用的空间就小了

为什么我会遇到DLL错误?

考虑到DLL文件的工作原理许多文件是替换***在Windows中的。因此当你***一个程序,咜逐步运行所需的信息已经在你的电脑里如果运行所需的某个特定DLL不存在或损坏,这个程序就不能使用它会在屏幕上显示一个DLL错误提礻。

多数情况下DLL错误是因为程序或文件被病毒或其他恶意软件损坏了,或者可能是你的系统自带杀毒在电脑受感染后删除了它当一个攵件在卸载程序期间被删除,或被不慎重删除就可能出现别的状况。但有时可能只是因为你在一台新计算机上试图运行一个旧程序而已此时该程序所需要的旧DLL文件并非新版Windows会***的。反之如果试图在一个老电脑上使用新版软件,也有可能出现这个问题原因是相同的。

参考资料