当自己想使用C语言开发一个编译器的时候,需要将文本内容转换为汇编语言,此时需要我们对汇编语言具有一定了解及简单编写程序,否则无法继续进行编译器的编写。
开发工具此处使用MASM32开发工具,当然也可以选用SASM, 此处由于并不深入学习且无兼容性考虑,因此此处选用MASM32工具。
下载此处点击Australia 1/2开始下载
图1.png 安装
将下载后的安装包解压如下图, 会有一个install.exe文件
图2.png
双击install.exe文件,安装即可。中间会有一步选择安装路径,选择自己想要安装的盘符即可。
注:此处的盘符影响之后的工作盘符,其他盘符可能无法链接到库文件。
安装完成后,会在桌面出现如下图所示的图标
图3.png 程序测试
创建文件: File -> New, 然后Ctrl+S保存(此处的文件的路径应与刚刚安装的盘符相同, 文件名格式为:xxx.asm)
输入下列代码
.486.model flat, stdcalloption casemap :noneincludelib masm32libkernel32.libincludelib masm32libuser32.libincludelib masm32libgdi32.libincludelib masm32libmsvcrt.libincludelib masm32libmasm32.libinclude masm32includekernel32.incinclude masm32includeuser32.incinclude masm32includegdi32.incinclude masm32includewindows.incinclude masm32includemsvcrt.incinclude masm32includemasm32.incinclude masm32macrosmacros.asm.data.codestart: print chr$("Hello Wordld!") print chr$(" ",13,10) mov eax, sval(input("Enter any press to continue..."))end start编译
点击Project -> Assemble ASM file进行编译,编译之后会在同级目录下生成后缀名为obj的文件
链接
点击Project -> Assemble && file进行链接,链接之后会在同级目录下生成后缀名为exe的文件
运行
点击Project -> Run Program, 出现如下图结果
图4.png 编码框架 .486.model flat, stdcalloption casemap:noneincludelib masm32libkernel32.libincludelib masm32libuser32.libincludelib masm32libgdi32.libinclude masm32includekernel32.incinclude masm32includeuser32.incinclude masm32includegdi32.incinclude masm32includewindows.inc.data// 变量.codestart:// 代码end start
接下来分别解释下每行代表什么:
.486
告诉汇编器应该生成486处理的伪代码,也可以使用.386。
.model flat, stdcall
使用平坦内存模式并使用stdcall调用习惯(stdcall指函数的参数从右往左压入,即最后的参数先压入,且函数在结束时清栈),这几乎是所有Windows API函数和dll的标准
option casemap :none
控制字符的映射为大写。为使“Windows.inc”文件正常工作,这里应用为“none”
includelib include
为了使用Windows API的函数, 需要导入dll文件。这里由静态库(.lib)完成,它们使系统能在内存的动态基地址处动态的载入dll。Includelib masm32libkernel32.lib我们不只需要包含静态库,还需要包含.inc文件,这是由l2inc工具根据库文件自动生成的。include masm32includekernel32.inc 特殊的包含文件Windows.inc,其中包含了Windows API的所有常量和结构的定义。
.data
定义变量的地方
.code
代码区域
start ... end start
表示程序的开始/结束标签。这里不一定要用start, 可以使用任何单词和“end”语句后相同的标签。