不要把MASM32开发环境和MASM汇编器版本搞混了!

合集下载

Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境

Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境

Windows10下利⽤DOSBOX和MASM32搭建汇编语⾔开发环境⽬录⼀、⼯具准备1)下载DOSBOX2)下载MASM323)汇编⼯具下载⼆、安装⼯具1)安装DOSBOX2)DOSBox使⽤指南3)安装MASM32三、程序调试过程四、参考资料总结⼀、⼯具准备1)下载DOSBOX⼯具介绍:DOSBox 是⼀个 DOS 模拟程序,由于它采⽤的是 SDL 库,所以可以很⽅便的移植到其他的平台。

⽬前,DOSBox 已经⽀持在Windows、Linux、Mac OS X、BeOS 、palmOS、Android 、webOS、os/2等系统中运⾏。

不少DOS下的游戏都可以直接在该平台上运⾏。

说明:由于项⽬已经停更,⽬前官⽹上指出,DOSBOX可以运⾏于32位和64位的Windows Vista和Windows 7之上,根据本⼈亲测,亦可在32位和64位的Windows 10上运⾏DOSBOX,因此有需要的可以试试。

选择Win32 installer那个安装了⼀路next即可2)下载MASM32⼯具介绍:MASM32是国外的MASM爱好者Steve Hutchesson⾃⾏整理和编写的⼀个软件包,⽬前最⾼版本为11r版。

MASM32并⾮指Microsoft的MASM宏汇编器,⽽是包含了不同版本⼯具组建的汇编开发⼯具包。

它的汇编编译器是MASM6.0以上版本中的Ml.exe,资源编译器是Microsoft Visual Studio中的Rc.exe,32位链接器是Microsoft Visual Studio中的Link.exe,同时包含有其他的⼀些如Lib.exe和DumpPe.exe等⼯具。

3)汇编⼯具下载⼆、安装⼯具1)安装DOSBOX安装下载到的DOSBox0.74-win32-installer.exe,直接⼀路Next完成安装。

2)DOSBox使⽤指南1、创建⼀个⽤于保存汇编⼯具(如MASM、Link、DEBUG等⼯具)和汇编⽂件(*.asm)的⽬录,如:D:\DEBUG。

我的汇编大作业MASM32的环境熟悉

我的汇编大作业MASM32的环境熟悉

汇编大作业MASM32环境的熟悉首先看看我们汇编程序的流程,开发一个程序,熟悉一下它的流程:如下图所示:工欲善其事必先利其器工具去网上下载MASM32,笔者在此提供一个网址:/进去之后点击下载,然后选择中国程序员下载的文件,点击下载就OK了下载下来后是一个加压的软件包,解压后是一个可执行文件,如图所示:双击这个图标,即可安装,它属于多组织或者个人开发的一个集合开发环境,所以里面有许多的协议或者规定,弹出文件框的时候一直点确定即可安装成功(里面的盘符选择选为C盘比较爱好,以后调用系统的DLL,或者加载速度比较快),安装最后阶段会有DOS的一个长时间刷屏过程是程序与WINDOWS的匹配调用过程,这时候等待一会就好了安装成功后的启动方法:C:\masm32\qeditor, 双击即可,如下所示图标打开的界面如图所示:首先我们来看看基本的界面吧和WINDOWS的许多编辑界面基本一样,标题栏有:文件,编辑,选择,工程,工具,代码,符号转化,脚本,窗口,帮助下面我们逐个讲解:文件:里面有:保存,另存为,新建,打印等等各种和WORD 里面一样的东西如下图:基本上每一个都有一个快捷键最常用的是New,Open和Open in New Window,分别代表:新建,打开,在新的窗口打开编辑:里面有:撤销,反撤销,复制,粘贴,剪切如下图:这里我介绍几个与其他软件不同的地方:Undo:撤销Redo:反撤销,就是把撤销的东西再次撤销,很方便自己错误的改变,可以很方便的做出挽回选择:里面有很多操作,下作说明如下图:Upper Case:中文名,转为大写字母,当你选中一段文档的时候,点击它,可以将你选中区域中的小写字母转化为大写字母Lower Case:中文名,转化小写字母,遇上一个相反,是将你选中区域类的大写字母全部转化为小写字母Reverse Text:撤销前两种对文档的操作More Indent:是选中区域和前者区域之间的空格变大,在文档整理阶段比较好用,便于程序的阅读。

Win32汇编--使用MASM

Win32汇编--使用MASM

Win32汇编--使⽤MASM经过上⼀讲的准备⼯作,相信⼤家已经搭建好了 Win32 汇编的⼯作环境,并已经知道编译、链接⼀个程序的过程和原理了。

现在,我们让例⼦回归到经典:include <stdio.h>int main(void){Printf(“Hello, world\n”);} // 事实上想想,这不正是初⽣的婴⼉?!⿇雀虽⼩,五脏俱全。

刚刚那个C语⾔的”Hello, world”程序包含了C语⾔中的最基本的格式。

在C语⾔的源程序中,我们不需要为堆栈段、数据段和代码段的定义⽽烦恼,编译器会⾃⼰解决。

回顾⼀下,在DOS 下的汇编这段代码会变成什么样? Follow me!;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 堆栈段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>stack segmentdb 100 dup (?) ;定义100个字节的内存存储单元空间,默认值为?stack ends ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data segmentszHello db ‘Hello, world’,0dh,0ah,’$’data ends ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code segmentassume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axmov ah,9mov dx,offset szHelloint 21hmov ah,4chint 21hcode endsend start在例⼦中我们看到,stack、data、code都找到了⾃⼰的⼩窝。

如何用VC6.0集成 开发环境来构建MASM32汇编的编程环境

如何用VC6.0集成 开发环境来构建MASM32汇编的编程环境

如何用VC6.0集成开发环境来构建MASM32汇编的编程环境(原创)作者:maxzhou88(周哥)开发高性能的程序少不了用汇编编程,限于C语言中内嵌汇编语言的局限(如在C代码中混合汇编语言编程时,很难实现跳表),一些代码必须书写在独立的汇编源文件中。

遗憾的是,在调试时,只能看到裸的汇编码,而不能到懂标号,变量等,现在能这样C与ASM 混合编程就方便多了。

编程环境:VC6.0,Masm32v8优点:[1] 使用VC6.0集成开发环境可以利用其强大的Debug功能来实现源代码级调试(Source Code Debug),(看变量、设置断点、查看MASM32的高级命令展开......)[2] 使用VC6.0的资源编辑器,可视化编辑资源。

[3] 实现C/C++与ASM的混合编程。

[4] 在窗口下比在CMD下工作符合一般人的习惯,再也不需要写makefile文件或xxx.bat 文件了。

方法:[1] 安装VC6.0,这个我就说了,大家都会的哦,一般我将它安装在C:\Program Files\ Microsoft Visual Studio。

[2] 安装MASMv8.exe,一般我将它安装在D:\MASM32 下。

[3] 将Win32ASM(masm32)中的ml.exe和ml.err拷贝到C:\Program Files\ Microsoft Visual Studio\VC98\Bin[4] 使用VC6.0新建一个空工程,如:hello(类型为:win32 console、win32 application、DLL 等均可)。

[5] 把汇编和资源文件拷至新建工程目录下(hello.asm,hello.rc),并把这些文件加入工程中(将*.asm添加到Source Files, 将*.rc添加到Resource Files)。

[6] 配置IDE(这就配置一次就搞定):在VC的菜单tools/option…/paths(include files)中添加一个路径d:\MASM32\INCLUDE[7] 配置工程(每个工程都要这样配置):打开工程设置(project settings),点击*.asm文件选择(Custom Build),命令中加上:ml /c /coff /Zi /Fo$(TargetDir)\$(InputName).obj $(InputPath)输出中加上:$(TargetDir)\$(InputName).obj注意选Settings for: Win32 Debug 和Win32 release,将上面的两条都加上,而且每个*.ASM文件(如有多个ASM时)都这样设置。

masm编译汇编程序

masm编译汇编程序

masm编译汇编程序masm编译汇编程序⽹上的教程都不是很管⽤,我下载下来是masm32然后⾥⾯并没有masm.exe⽂件,我下载了masm.exe⽂件,提⽰我不能运⾏不过有这个东西,打开这个界⾯,新建⽂件可以写汇编程序project->assemble asm file 可以编译出.obj⽂件会弹出两个框1.创建新⽂件:File->New,编辑代码,保存成***.asm的⽂件即可。

2.编译源⽂件:Project->Assemble Asm File,汇编结束后会出现⼀个txt的结果⽂档,如果有错,可以根据相应的结果进⾏调试然后在进⾏汇编,此步会产⽣***.obj⽂件。

3.连接:Project->Link Obj File,链接2步骤中产⽣的Obj⽂件,产⽣exe⽂件。

4.运⾏:Project->Run Program,运⾏程序。

不过masm32写⼊的汇编程序需要有⼀定的格式.486.model flat, stdcalloption casemap:noneincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\gdi32.libinclude \masm32\include\kernel32.incinclude \masm32\include\user32.incinclude \masm32\include\gdi32.incinclude \masm32\include\windows.inc.data// 变量.codestart:// 代码end start不按格式写会报错。

MASM32使用教程

MASM32使用教程

MASM32使用教程如果你在用汇编语言来开发windows下的程序的话,MASM32是很好的选择。

(Masm32下载地址请用google搜索罢。

)工欲善其事,必先利其器。

本文主要针对masm32 v8来说明三点:1、基本使用方法如何在MASM32中建立、汇编、链接源程序文件和运行生成的可执行文件。

2、如何开启MASM32的在线帮助功能3、汉化QEDITOR菜单一、基本使用方法以在C:\PWIN951\TEMP文件夹下建立TEST.ASM和生成TEST.EXE为例.安装好MASM32后,打开“资源管理器”或“我的电脑”,进入MASM32所在文件夹(假设为C:\MASM32),双击QEDITOR.EXE的图标,这就进入了MASM32的集成开发环境。

1.[这一步是可选的,以下可选的步骤均简称为“可选”] 输入资源文件, 然后使用菜单栏上的菜单File -> Save 或快捷工具栏中的代表存盘功能的磁盘状图标,第一次需要输入文件名,注意要指定扩展名 .RC 并存盘,注意如果是在集成环境中编译此资源文件,文件名必须是RSRC.RC(大小写均可)。

2.[可选] 编译资源文件。

使用菜单栏上的菜单Project -> Compile Resource File。

这时系统会打开一个DOS 窗口运行相关的批处理文件,并报告结果。

若不编译成功,信息为(具体错误信息因错误而异):Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 - Build 1823Copyright (C) Microsoft Corp. 1985-1998. All rights reserved.Using codepage 936 as defaultCreating rsrc.RESRC: RCPP -CP 936 -f C:\PWIN951\TEMP\RCa83947 -g C:\PWIN951\TEMP\RDa83947 -DRC_IN VOKED -D_WIN32 -pc\:/ -E -I. -I .rsrc.rc.rsrc.rc (1): error RC2135 : file not found: MAINICON.ICO.Writing MENU:600, lang:0x409, size 128Microsoft (R) Windows Resource To Object Converter Version 5.00.1736.1Copyright (C) Microsoft Corp. 1992-1997. All rights reserved.CVTRES : fatal error CVT1101: cannot open rsrc.res for readingPress any key to continue . . .其中给出了出错语句的行号,错误类型代码及错误信息。

Win10系统VS2022开发环境中(X86)Win32汇编(MASM32)环境配置和一些。。。

Win10系统VS2022开发环境中(X86)Win32汇编(MASM32)环境配置和一些。。。

Win10系统VS2022开发环境中(X86)Win32汇编(MASM32)环境配置和⼀些。

抱歉,还是只能⽤⽶国的软件以及技术以及等等等等。

如果配置完成,在vs2022调试环境下正确编译运⾏后,可以看到如下画⾯:在VS022中开发学习汇编必然很⽅便。

这⾥可以下载vs2022项⽬源码:注意, AsmDude()只⽀持到vs2019。

主要配置过程如下:step1: 按照vs2022(直接官⽹下载Community版本)step2:这⾥下载masm32v11r.zip这个压缩包step3: 将MASM32的install.exe运⾏安装到C盘(也可以是别的盘),安装过程注意同意其解压,这⾥会耽搁⼀⼩段时间。

step4: 在vs中建⽴⼀个控制台应⽤。

删除原来默认⽣成的cpp⽂件。

step5: 在项⽬图标上上右键, ⽣成依赖项->⽣成⾃定义->选中masm, 如下图:step6: 在源⽂件图标上右键,添加 -> 新建项, 新建 test.asm⽂件。

step7: 在test.asm写⼊代码如下:.386.model flat, stdcall.stack 4096option casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib.constszCaption db '恭喜',0szText db 'Win32汇编程序成功编译!',0.dataExitProcess proto, dwExitcode: dword; 代码段.codemainT PROCinvoke MessageBox,NULL,offset szText,offset szCaption,MB_OKinvoke ExitProcess,NULLmainT ENDPEND mainT// 部分代码源⾃ <<[琢⽯成器—Windows环境下32位汇编语⾔程序设计].罗云彬.第三版>>上⾯代码中的 mainT是我这⾥为了解释如何配置⽽故意起的名字。

mars汇编语言 -回复

mars汇编语言 -回复

mars汇编语言-回复mars汇编语言是一种常用于教学和研究的汇编语言,它的简单易学以及广泛应用使得它成为了许多初学者和专业开发者的首选。

本文将一步一步解答关于mars汇编语言的相关问题,带你了解这门强大而有趣的编程语言。

第一步:什么是mars汇编语言?mars汇编语言(MIPS Assembly Language)是基于MIPS架构的一种汇编语言。

MIPS(Microprocessor without Interlocked Pipeline Stages)是一个常用于处理器设计和计算机架构研究的32位精简指令集(RISC)。

第二步:为什么选择mars汇编语言?选择mars汇编语言的原因有很多。

首先,它是一门非常简单易学的汇编语言,具有清晰的语法和直观的指令集。

其次,mars汇编语言广泛应用于教学中,有许多教程和示例代码可供参考。

另外,mars汇编语言还可以帮助理解计算机体系结构,提高编程技能,并且可以用于编写高效、底层的程序。

第三步:如何获取mars汇编语言的开发环境?要使用mars汇编语言进行开发,我们首先需要下载并安装mars汇编器。

mars汇编器是一个集成开发环境(IDE),可以在Windows、Linux和Mac等操作系统上运行。

我们可以在官方网站上找到最新版本的mars汇编器,并按照官方文档中的说明进行安装。

第四步:如何编写一个简单的mars汇编程序?下面我们将一起编写一个简单的mars汇编程序,以展示这门语言的基本语法和用法。

我们编写一个程序,计算并输出从1到10的和。

.dataresult: .word 0.text.globl main# 跳转到main标签处开始执行main:li t0, 1 # 将1加载到寄存器t0中li t1, 10 # 将10加载到寄存器t1中li t2, 0 # 将0加载到寄存器t2中loop:add t2, t2, t0 # 将t0与t2相加,并将结果存储到t2中addi t0, t0, 1 # 将t0加1,并将结果存储到t0中ble t0, t1, loop # 若t0 <= t1,则跳转到loop标签处sw t2, result # 将t2的值存储到result标签处li v0, 1 # 将1加载到系统调用号寄存器v0中lw a0, result # 将result标签处的值加载到参数寄存器a0中syscall # 调用系统调用输出结果li v0, 10 # 将10加载到系统调用号寄存器v0中syscall # 调用系统调用退出程序这段程序首先声明一个数据段(.data),其中包括一个名为result的字(word),用于存储计算结果。

masm32尽好资料[宝典]

masm32尽好资料[宝典]

MASM32绝好资料Introduction to Assembler (2)MASM Reference (11)宏参考MACRO Reference (11)伪指令参考 (16)语法参考 (31)其它参考 (37)寄存器大全 (37)标志寄存器Processor Flags (37)80位数据寄存器Stack of 80-bit Data Registers (38)Ascii 字符表Ascii Characters (39)奔腾指令优化参考Pentium Optimisation (40)调用格式Calling Conventions (43)命令行工具Command Line Tools (43)Introduction to Assembler汇编概述直线内存模式FLA T Memory Model32位(二进制位,bit。

下同)Windows程序使用“直线内存模式”。

这样的程序实际只有一个段,包括程序的所有代码和数据,而且只能在386以上的INTEL处理器上运行。

早期的16位程序使用段和偏移来代表地址,每个段的大小不能超过64KB,而“直线内存模式”只有偏移,它的大小是4G,即0XFFFFFFFF,这种地址表示方式使汇编程序更易于开发。

在FLA T模式下,所有的段寄存器都自动设置成为同一个值,32位Windows程序中段/偏移形式的地址在不是必须的。

对于DOS程序员来说,32位Windows PE格式的应用程序好象是.COM程序一样,使用单一的段包括了代码和数据,只操作偏移地址,而不是用段/偏移地址。

直线内存模式时,应用程序在4G内存空间内所有的引用都是近程地址(NEAR code addressing)和近程数据(NEAR data addressing)。

GS和FS段寄存器在普通的FLA T模式应用程序中并不使用,一般是操作系统用于操作实例(used in instances)。

Masm汇编语言错误信息

Masm汇编语言错误信息

Masm汇编语言错误注释:嵌套过程,段,结构,宏指令,IRP,IRPC或REPT不是正确结束.如嵌套的外层已终止,而内层还是打开状态Masm汇编语言错误信息:Symbol not definedMasm汇编语言错误注释:符号没有定义Masm汇编语言错误信息:Syntax errorMasm汇编语言错误注释:语句的语法与任何可识别的语法不匹配Masm汇编语言错误信息:Type illegal in contextMasm汇编语言错误注释:指定的类型在长度步可接收Masm汇编语言错误信息:Should have been group nameMasm汇编语言错误注释:给出的组合不符合要求Masm汇编语言错误信息:Must be declared in pass 1Masm汇编语言错误注释:得到的不是汇编程序所要求的常数值.例如,向前引用的向量长度Masm汇编语言错误信息:Symbol type usage illegalMasm汇编语言错误注释:PUBLIC 符号的使用不合法Masm汇编语言错误信息:Symbol already different kindMasm汇编语言错误注释:企图定义与以前定义不同的符号Masm汇编语言错误信息:Symbol is reserved wordMasm汇编语言错误注释:企图非法使用一个汇编程序的保留字(例如,宣布MOV为一个变量) Masm汇编语言错误信息:Forward reference is illegalMasm汇编语言错误注释:向前引用必须是在第一遍扫视中定义过的Masm汇编语言错误信息:Must be registerMasm汇编语言错误注释:希望寄存器作为操作数,但用户提供的是符号而不是寄存器Masm汇编语言错误信息:Extra characters on lineMasm汇编语言错误注释:当一行上已接受了定义指令的足够信息,而又出现了多余的字符Masm汇编语言错误信息:Wrong type of registerMasm汇编语言错误注释:指定的寄存器类型并不是指令中或伪操作中所要求的.例如ASSUME AX Masm汇编语言错误信息:Must be segment or groupMasm汇编语言错误注释:希望给出段或组,而不是其它Masm汇编语言错误信息:Symbol has no segmentMasm汇编语言错误注释:想使用带有SEG的变量,而这个变量不能识别段Masm汇编语言错误注释:必须是WORD,DW,QW,BYTE或TB,但接收的是其它内容Masm汇编语言错误信息:Already defined locallyMasm汇编语言错误注释:试图定义一个符号作为EXTERNAL,但这个符号已经在局部定义过了Masm汇编语言错误信息:Segment parameters are changedMasm汇编语言错误注释:SEGMENT的自变量表与第一次使用这个段的情况不一样Masm汇编语言错误信息:Not proper align/combine typeMasm汇编语言错误注释:SEGMENT参数不正确Masm汇编语言错误信息:Reference to mult definedMasm汇编语言错误注释:指令引用的内容已是多次定义过的Masm汇编语言错误信息:Operand was expectedMasm汇编语言错误注释:汇编程序需要的是操作数,但得到的却是其它内容Masm汇编语言错误信息:Operator was expectedMasm汇编语言错误注释:汇编程序需要的是操作符,但得到的却是其它内容Masm汇编语言错误信息:Register already definedMasm汇编语言错误注释:汇编内部出现逻辑错误Masm汇编语言错误信息:Division by 0 or overflowMasm汇编语言错误注释:给出一个用0作除数的表达式Masm汇编语言错误信息:Shift count is negativeMasm汇编语言错误注释:移位表达式产生的移位计数值为负数Masm汇编语言错误信息:Operand type must matchMasm汇编语言错误注释:在自变量的长度或类型应该一致的情况下,汇编程序得到的并不一样.例如,交换Masm汇编语言错误信息:Illegal use of externalMasm汇编语言错误注释:用非法手段进行外部使用Masm汇编语言错误信息:Must be record field nameMasm汇编语言错误注释:需要的是记录字段名,但得到的是其它东西Masm汇编语言错误信息:Must be record or field nameMasm汇编语言错误注释:需要的是记录名或字段名,但得到的是其它东西Masm汇编语言错误信息:Operand must have sizeMasm汇编语言错误注释:需要的是操作数的长度,但得到的是其它内容Masm汇编语言错误信息:Must be var,label or constantMasm汇编语言错误注释:需要的是变量,标号或常数,但得到的是其它内容Masm汇编语言错误信息:Must be structure field nameMasm汇编语言错误注释:需要的是结构字段名,但得到的是其它内容Masm汇编语言错误信息:Left operand must have segmentMasm汇编语言错误注释:右操作数所用的某些东西要求左操作数必须有一个段(例如:":") Masm汇编语言错误信息:Unknown symbol typeMasm汇编语言错误注释:在符号语句的类型字段中,有些不能识别的东西Masm汇编语言错误信息:One operand must be constMasm汇编语言错误注释:这是加法指令的非法使用Masm汇编语言错误信息:Operands must be same or 1 absMasm汇编语言错误注释:这是减法指令的非法使用Masm汇编语言错误信息:Normal type operand expectedMasm汇编语言错误注释:当需要变量,标号时,得到的却是STRUCT,FIELDS,NAMES,BYTE,WORD或DWMasm汇编语言错误信息:Constant was expectedMasm汇编语言错误注释:需要的是一个常量,得到的却是另外的内容Masm汇编语言错误信息:Operand must have segmentMasm汇编语言错误注释:SEG伪操作使用不合法Masm汇编语言错误信息:Must be associated with dataMasm汇编语言错误注释:有关项用的是代码,而这里需要的是数据,例如一个过程的DS取代Masm汇编语言错误信息:Must be associated with codeMasm汇编语言错误注释:有关项用的是数据,而这里需要的是代码Masm汇编语言错误信息:Already have base registerMasm汇编语言错误注释:试图重复基地址Masm汇编语言错误信息:Already have index registerMasm汇编语言错误注释:试图重复变址地址Masm汇编语言错误信息:Must be index or base registerMasm汇编语言错误注释:指令需要基址或变址寄存器,而指定的是其它寄存器Masm汇编语言错误信息:Redefinition of symbolMasm汇编语言错误注释:在第二遍扫视时,接着又定义一个符号Masm汇编语言错误信息:Illegal use of registerMasm汇编语言错误注释:在指令中使用了8088指令中没有的寄存器Masm汇编语言错误信息:Value is out of rangeMasm汇编语言错误注释:数值大于需要使用的,例如将DW传送到寄存器中Masm汇编语言错误信息:Operand not in IP segmentMasm汇编语言错误注释:由于操作数不在当前IP段中,因此不能存取Masm汇编语言错误信息:Improper operand typeMasm汇编语言错误注释:使用的操作数不能产生操作码Masm汇编语言错误信息:Relative jump out of rangeMasm汇编语言错误注释:指定的转移超出了允许的范围Masm汇编语言错误信息:Index disp1. must be constantMasm汇编语言错误注释:试图使用脱离变址寄存器的变量位移量.位移量必须是常数Masm汇编语言错误信息:Illegal register valueMasm汇编语言错误注释:指定的寄存器值不能放入"reg"字段中.(即"reg"字段大于7) Masm汇编语言错误信息:No immediate modeMasm汇编语言错误注释:指定的立即方式或操作码都不能接收立即数.例如:PUSH Masm汇编语言错误信息:Illegal size for itemMasm汇编语言错误注释:引用的项的长度是非法的.例如:双字移位Masm汇编语言错误信息:Byte register is illegalMasm汇编语言错误注释:在上下文中,使用一个字节寄存器是非法的.例如:PUSH AL Masm汇编语言错误信息:Symbol is multi-definedMasm汇编语言错误注释:重复定义一个符号Masm汇编语言错误信息:CS register illegal usageMasm汇编语言错误注释:试图非法使用CS寄存器.例如:XCHG CS,AXMasm汇编语言错误信息:Must be Ax or ALMasm汇编语言错误注释:某些指令只能用AX或AL.例如:IN 指令Masm汇编语言错误信息:Improper use of segment regMasm汇编语言错误注释:段寄存器使用不合法.例如:1 立即数传送到段寄存器Masm汇编语言错误信息:No or unreachable CSMasm汇编语言错误注释:试图转移到不可到达的标号Masm汇编语言错误信息:Operand combination illegalMasm汇编语言错误信息:Near JMP/CALL to different CSMasm汇编语言错误注释:企图在不同的代码段内执行NEAR转移或调用Masm汇编语言错误信息:Label can't have seg overrideMasm汇编语言错误注释:非法使用段取代Masm汇编语言错误信息:Must have opcode after prefixMasm汇编语言错误注释:使用前缀指令之后,没有正确的操作码说明Masm汇编语言错误信息:Can't override ES segmentMasm汇编语言错误注释:企图非法地在一条指令中取代ES寄存器.例如:存储字符串Masm汇编语言错误信息:Can't reach with segment regMasm汇编语言错误注释:没有使变量可达到的ASSUME语句Masm汇编语言错误信息:Phase error between passesMasm汇编语言错误注释:程序中有模棱两可的指令,以至于在汇编程序的两次扫视中,程序标号的位置在数值上改变了Masm汇编语言错误信息:Must be in segment blockMasm汇编语言错误注释:企图在段外产生代码Masm汇编语言错误信息:Can't use EVEN on BYTE segmentMasm汇编语言错误注释:被提出的一个字节段,但试图使用EVENMasm汇编语言错误信息:Forward needs overrideMasm汇编语言错误注释:目前不使用这个信息Masm汇编语言错误信息:Illegal value for DUP countMasm汇编语言错误注释:DUP计数必须是常数,不能是0或负数Masm汇编语言错误信息:Symbol already externalMasm汇编语言错误注释:企图定义一个局部符号,但此符号已经是外部符号了Masm汇编语言错误信息:DUP is too large for linkerMasm汇编语言错误注释:DUP嵌套太长,以至于连接程序不能得到所要的记录Masm汇编语言错误信息:Usage of ? (indeterminate)badMasm汇编语言错误注释:"?"使用不合适.例如:? +5Masm汇编语言错误信息:Already had ELSE clauseMasm汇编语言错误注释:在ELSE从句中试图定义ELSE从句Masm汇编语言错误信息:Not in conditional blockMasm汇编语言错误注释:在没有提了供条件汇编指令的情况下,指定了ENDIF或ELSE。

汇编开发环境

汇编开发环境

Windows环境下32位汇编语言开发环境的建立在Windows环境下进行汇编语言程序设计之前,首先需要搭建一个汇编语言的开发环境。

现在汇编语言开发工具包常见的是MASM,TASM和NASM。

MASM是微软开发的宏汇编工具,适合在Windows 环境下进行程序设计,性能稳定,持续升级;NASM的语法与MASM略有不同,它可以在不同的环境下使用,LINUX或Windows。

鉴于目前汇编语言程序设计教学中更多的选择了MASM,本文将介绍基于MASM的32位汇编开发环境的几种搭建方法。

其他汇编工具的具体内容可参考相关的手册。

汇编语言的开发分为源代码编辑,汇编和连接三个步骤,在必要的时候还需要对程序进行调试。

因此汇编语言开发环境中应包含编辑软件,汇编软件,连接软件和调试软件。

如果将这些软件集成在一起就是构成一个集成开发环境。

一、命令行环境首先下载一个MASM615开发工具包。

在许多汇编网站和汇编教材的配套光盘中都提供了该工具包。

根据提示,进行安装。

然后就可以用它来开发汇编程序。

(1)源代码编辑汇编源程序是纯文本文件,其扩展名为.asm,可以用任何一种文本编辑软件来编写汇编原代码。

比如EditPlus,UltraEdit,NotePad,Word, VC++等,注意文件保存的时候必须以纯文本格式保存,并取.asm后缀名。

(2)汇编源文件不能直接被机器执行,需要运行汇编软件对它进行汇编生成目标文件,后缀为.obj.,这是一个二进制文件。

如果出现语法错误,汇编程序会产生错误报告,程序员可以根据这些错误报告对源程序进行重新编辑,重新汇编,直到没有语法错误为止。

MASM汇编器的命令是ml.exe,其命令行格式为:Ml [/option] 源文件 [/link option]生成32位应用程序时,常用的命令行是:ML /coff /c /Fl /Zi filename;例如,要汇编test.asm源文件,生成coff格式的目标文件,列表文件和调试信息,可以使用命令行:ML /coff /c /Fl /Zi test.asm;为了避免每次汇编源文件的时候都要输入许多参数,可以建立一个批处理文件。

汇编程序(MASM)常见错误信息

汇编程序(MASM)常见错误信息

汇编程序(MASM)常见错误信息汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息.如操作人员指定的列表文件名(即.LST),汇编程序亦将在列表文件中出错的下面给出出错信息,以便操作人员即时查找错误,给予更正.MASM5.0出错信息格式如下:源程序文件行:WARNING/ERROR错误信息码:错误描述信息其中,错误描述信息码由五个字符组成,第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出错类别:'2'为严重错误,'4'为严肃警告,'5'为建议性警告,最后三位为错误编号.错误编号:错误描述0 Block nesting error嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局1 Extra characters on line 一语句行有多余字符,可能是语句中给出的参数太多2 Internal error-Register already defined这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request 表与Microsoft公司联系3 Unkown type specifer未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等4 Redefinition of symbol符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误5 Symbol is multidefined符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误6 Phase error between passes两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM 时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误7 Already had ELSE clause 已有ELSE语句.在一个条件块里使用多于一个的ELSE语句8 Must be in conditional block 没有在条件块里.通常是有ENDIF或ELSE语句,而无IF 语句9 Symbol not defined 符号未定义,在程序中引用了未定义的标识符10 Syntax error 语法错误.不是汇编程序所能识别的一个语句11 Type illegal in context 指定非法类型.例如对一个过程指定BYTE类型,而不是NEAR或FAR12 Group name must be unique 组名应是唯一的.作为组名的符号作为其他符号使用13 Must be declared during pass 1必须在第一遍扫描期间定义.在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误.14 Illegal public declaration 一个标识符被非法的指定为PUBLIC类型15 Symbol already defferent kind重新定义一个符号为不同种类符号.例如一个段名重新被当作变量名定义使用16 Reserved word used as symbol 把汇编语言规定的保留字作标识符使用17 Forward reference illegal 非法的向前引用.在第一遍扫描期间,引用一个未定义符号.18 Operand must be register 操作数位置上应是寄存器,但出现了标识符19 Wrong type of register 使用寄存器出错20 Operand must be segment or group 应该给出一个段名或组名.例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等21 Symbol has no segment 不知道标识符的段属性22 Operand must be type specifier 操作数应给出类型说明,如NEAR,FAR,BYTE等23 Symbol alread defined locally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识24 Segment paraneters are changed 段参数被改变.如同一标识符定义在不同段内25 Improper align/combin type 段定义时的定位类型/组合类型使用出错26 Reference to multidefined symbol 指令引用了多重定义的标识符27 Operand expected 需要一个操作数,只有操作符28 Operator expected 需要一个操作符,但只有操作数29 Divdsion by 0 or overflow 除以0或溢出30 Negative shift count 运算符SHL或SHR的移位表达式值为负数31 Operand type must match操作数类型不匹配.双操作数指令的两个操作数长度不一致,一个是字节,一个是字32 Illegal use of external 外部符号使用出错33 Must be record field name 应为记录字段名.在记录字段名位置上出现另外的符号34 Must be record name or field name应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号35 Operand must be size应指明操作数的长度(如BYTE,WORD等).通常使用PTR运算即可改正36 Must be variable,label,or constant 应该是变量名,标号,或常数的位置上出现了其他信息37 Must be stucture field name 应该为结构字段名.在结构字段名位置上出现了另外的符号38 Lefe operand must segment操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:"MOV AX,DA1:DA2".DA1位置上应使用某段寄存器名39 One operand must constant 操作数必须是常数.40 Operand must be in same segment or one constant"—"运算符用错.例如"MOV AL,—VAR",其中VAR是变量名,应有一常数参加运算.又如两个不同段的变量名相减出错41 Normal type operand expected 要求给出一个正常的操作数.42 Constant expected 要求给出一个常数.43 Operand must have segment 运算符SEG用错.44 Must be associated with data 在必须与数据段有关的位置上出现了代码段有关的项45 Must be associated with code 在必须与代码段有关的位置上出现了数据段有关的项46 Multiple base registers 同时使用了多个基址寄存器.如"MOV AX ,[SI][BP]"47 Multiple index registers 同时使用了多个变址寄存器.如"MOV AX ,[SI][DI]"48 Must be index or base regiser 指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器.49 Illegal use of register 非法使用寄存器出错50 Value is out of range 数值太大,超过允许值.例如:"MOV AL ,100H"51 Operand not in current CS ASSUME segment操作数不在当前代码段内.通常指转移指令的目标地址不在当前CS段内52 Improper operand type 操作数类型使用不当.例如:"MOV VAR1,VAR2".两个操作数均为存储器操作数,不能汇编出目标代码53 Jump out of range by %ld byte条件转移指令跳转范围超过-128~ 127个字节.出错厂,信息同时给出超过的字节数54 Index displacement must be constant 变址寻址的位移量必须是常数55 Illegal register value 非法的寄存器值.目标代码中表达寄存器的值超过756 Immediate mode illegal 不允许使用立即数寻址.例如"MOV DS,CODE"其中CODE是段名,不能把段名作为立即数传送给段寄存器DS57 Illegal size for operand 使用操作数大小(字节数)出错.例如:使用双字的存储器操作数58 Byte register illegal要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器59 Illegal uer of CS register指令中错误使用了段寄存器CS.如:"MOV CS,AX" CS不能做目的操作数60 Must be accumulator register要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必须使用累加器AX或AL61 Improper uer of segment register不允许使用段寄存器的位置上使用了段寄存器.如"SHL DS,1"62 Missing or unreachable CS试图跳转去执行一个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联63 Operand combination illegal 双操作数指令中两个操作数组合出错64 Near JMP/CALL to different CS试图用NEAR属性的转移指令跳转到不在当前段的一个地址65 Label cannot have segment override 段前缀使用出错66 Must have instuction agter prefix 在重复前缀REP,REPE,REPNE后面必须有指令67 Cannot override ES for destination 串操作指令中目的操作数不能用其他段寄存器替代ES68 Cannot address with srgment register指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联69 Must be in segment block 指令语句没有在段内70 Cannot use EVEN or ALIGN with byte alignment在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令71 Forward needs override or FAR转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定72 Illegal value for DUP count 操作符DUP前的重复次数是非法的或未定义73 Symbol id already external 在模块内试图定义的符号,它已在外部符号伪指令中说明74 DUP nesting too deep 操作数DUP的嵌套太深75 Illegak use of undefinde operand( ) 不定操作符" "使用不当.例如"DB 10H DUP( 2)"76 Too many valer for struc or record initialization 在定义结构变量或记录变量时,初始值太多77 Angle brackets requored around initialized list定义结构体变量时,初始值未用尖括号()括起来78 Directive illegal structure 在结构体定义中的伪指令使用不当.结构定义中的伪指令语句仅二种:分号(;)开始的注释语句和用DB,DW等数据定义伪指令语句79 Override with DUP illegal 在结构变量初始值表中使用DUP操作符出错80 Field cannot be overridden 在定义结构变量语句中试图对一个不允许修改的字段设置初值81 Override id of wrong type 在定义结构变量语句中设置初值时类型出错82 Circular chain of EQU aliases 用等值语句定义的符号名,最后又返回指向它自己.如:A EQU BB EQU A83 Cannot emulate cooprocessor opcode 仿真器不能支持的8087协处理器操作码84 End of file,not END directive 源程序文件无END文件85 Data emitted with no segment 语句数据没有在段内。

Notepad++配置masm32汇编环境

Notepad++配置masm32汇编环境

Notepad++配置masm32汇编环境首先要整的无疑就是学习的开发环境了。

masm32这个东西,比较轻量级,有库,有汇编器,有连接器,外加一个记事本,基本上就能写代码编译成exe了。

书上没指定固定的开发环境和编辑器,编译汇编代码的编译模式都是用的make文件,然后用VS的nmake进行编译。

先说编辑器,编辑器,记事本就行了,不过系统自带的记事本比较简陋,所以就选择了Notepad++来作为代码编辑的工具,选他最主要的就是功能足够(支持多语法高亮,支持各种插件)。

代码写好了,要编译生成可执行文件。

这个可以用写批处理或者自己在命令行下根据ml,link等命令来生成对应的文件。

这里就有我选择notepad++的一个最主要的原因了,因为NotePad++有一个插件叫做NppExec,使用这个插件写上相关的脚本,就可以设置快捷键,然后用快捷键自动来编译生成需要的东西了,相当方便。

先来按照书上的说,制作make文件,然后用nmake的方式来生成我们需要的可执行文件,且让我们看看这个设置的脚本cd $(CURRENT_DIRECTORY)ENV_SET PATH = D:\Develop_Tools\Masm32\binnmake make.makNPP_RUN $(NAME_PART).exe首先进入当前代码文件所在的目录,然后设置汇编器和连接器以及nmake.exe的exe目录,我这里是D:\Develop_Tools\Masm32\bin然后调用nmake make.mak就可以通过make.mak来生成一个exe文件了,至于make文件大致是EXE=hello.exeobjs=hello.objML_FLAG=/c /coff /I D:\Develop_Tools\Masm32\includeLink_FLAG=/LIBPATH:D:\Develop_Tools\Masm32\lib/subsystem:windowshello.exe: hello.objlink $(Link_FLAG) $(objs).asm.obj:ml $(ML_FLAG) $<clean:del *.obj使用这种方式,自然是最好的,不过由于俺是学习,每写一个代码文件就要写一个make文件,如此一来到显得十分麻烦,所以为了方便,就不必每个文件都搞一个make文件了。

MASM的反反汇编技术

MASM的反反汇编技术

MASM的反反汇编技术由于汇编语言是与机器语言机器码一一对应的,所以程序的代码非常简洁,编译、链接程序不会在其中加入任何其它代码,所以,用Win32DASM等把汇编工具反汇编汇编语言写的程序,其列出的汇编代码几乎与编写的顺序、过程、代码一模一样,这也是汇编语言简洁的证据。

但是这种过于简洁的代码却给了破解者提供了方便,破解者只需要有一定的Windows SDK编程与汇编的经验,破解就非常简单,根本不需要用SoftICE这些动态工具就可以破解。

于是,相应的防止跟踪的技术就出来了,比如花指令、不按规则调用API等等,今天就花指令和大家研究研究。

花指令,其实就是在程序中加入一些字节来干扰静态工具反汇编,毕竟汇编工具没有人的思维,所以这招非常好骗。

打开EditPlus,新建一个ASM - Sample文件,输入以下代码:.386.Model Flat, StdCallOption Casemap :NoneInclude windows.incInclude user32.incInclude kernel32.incIncludeLib user32.libIncludeLib kernel32.lib.dataWelcome db "欢迎来到汇编的世界",0.CODESTART:invoke MessageBox,0,offset Welcome,0,0invoke ExitProcess,0END START保存,Ctrl + 1编译。

用Win32DASM打开编译后的文件,可以在其菜单命令[函数]->[输入]中看到我们使用了的MessageBox与ExitProcess名字,在菜单命令[参考]->[字符串]中看到我们定义的字符串Welcome的值,假如您的程序这段代码要做的是在用户输入错误的注册码后报错,那么,破解者只需要找到对话框显示的字符串使用的地址,然后向上查找跳到此地址的跳转指令,更改指令就能轻易破解,我们要做的,就是把字符串隐藏起来,不让破解者轻易找到它的地址,如下:;先关闭Win32DASM(以下同).... ...lea eax,Welcomeinvoke MessageBox,0,eax,0,0... ...也就是说,我们并没有使用花指令,而是在使用字符串时先把字符串的地址传给eax,然后再把eax做为参数传给MessageBox,这样做,Win23DASM这些反汇编工具就无法识别了,好,用Win32DASM重新打开编译的文件,在[参考]菜单中,[字符串]这一项灰色显示,提示这个程序没有字符串,骗过它了!^_^还有就是使用花指令,花指令不但可以使反汇编工具无法识别出字符串,更会让它们把汇编出错误的代码,花指令一般都是使用一些无用的字节来进行干扰,但是干扰反汇编的字节仍是可以使用的,像这样子:... ...jz @Fjnz @Fwww db "欢迎来到汇编世界",0@@:lea eax,wwwlea ebx,Welcomeinvoke MessageBox,0,eax,ebx,0invoke ExitProcess,0... ...编译后再用Win32DASM打开EXE,发现不但[字符串]这一项灰色显示,反汇编出来的代码变得面目全非,现在的程序只有很少的代码,如果代码一多,破解者不晕才怪,不过这样只会把一些初级破解者难倒,有经验的破解者根据jz与jnz的跳转是否指向不存在的地址而知道使用了花指令,还可以根据MessageBox的使用地址来进行分析,我们现在要做的就是使用手工调用API加花指令来骗反汇编工具,如下:... ...lea eax,Welcomepush 0push 0push eaxpush 0jz @Fjnz @Fwww db "欢迎来到汇编世界",0@@:call [MessageBox]invoke ExitProcess,0... ...(上述代码WinDASM32黄金版能正确识别)也就是说,在压入参数后,不要马上使用call来调用API,而是在调用前使用花指令,结果会怎样?编译后进行反汇编,看看吧,不但[字符串]这一项灰色显示,[函数]->[输入]一项也是灰色,哈,骗过了!再看看把汇编出来的代码,天啦,乱七八糟的,如果这些代码是在一个几百K的程序中,我看那个破解者如何应付,哈,他不晕才怪!再来点狠的:;=================;完整API花指令示例:;=================.386.Model Flat, StdCallOption Casemap :None ; 不区分大小写(对API与API常数无效);__________________________________________________________ ___Include windows.incInclude user32.incInclude kernel32.incIncludeLib user32.libIncludeLib kernel32.lib.CODESTART:push 0push 0push offset Welcomepush 0jz @Fjnz @FWelcome db "Welcome",0@@:mov eax,[MessageBox+4]sub eax,4jnz @FWelcome1 db "Welcome",0@@:call eaxinvoke ExitProcess,0END START再看看反汇编的代码,更加!@$$%#!@#$。

MASM汇编语言编程和调试工具

MASM汇编语言编程和调试工具

附录1 汇编语言编程和调试工具一、汇编语言编程工具学习汇编语言的目的就是要用汇编语言编程来解决实际问题,下面介绍二种常用的汇编语言编程环境:宏汇编MASM 6.11和Turbo Assember 5.0。

1.1、宏汇编MASM系统在宏汇编MASM系统中,程序员可用二种方法来处理源程序:命令行和集成环境。

1.1.1 命令行命令1、编写源程序可用计算机系统中各种能编辑文本文件的编辑器来编辑汇编源程序。

常用的编辑器有:EDIT、Q、Word、记事本、写字板、WPS等。

源文件的后缀为:.ASM。

2、汇编程序当源程序编写好后,可用MASM命令来汇编该源程序。

如果源程序没有语法错误,那么,将生成目标文件(.OBJ文件),为最终生成可执行文件作准备,但如果源程序有错误,汇编程序将显示出错误位置和原因,也可用列表文件(.LST文件)来查看出错位置和原因。

下面给出一些使用该命令的实例情况。

例1.1:查看MASM命令的功能…>masm /?(*)……/Zi Generate symbolic information for CodeView/Zd Generate line-number information其中:选项/Zi和/Zd是经常被引用的二个选项,因为它们与符号跟踪有关。

例1.2:用MASM命令汇编源程序…>masm test……Invoking: ML.EXE /I. /Zm /c test.asm……Assembling: test.asm如果MASM命令显示了类似如上的处理结果,那么,表示源文件TEST.ASM已成功汇编,并已生成了其目标文件TEST.OBJ。

(*)用户输入的命令用“下划线”来表示,系统显示的内容没有“下划线”。

以下与此相同。

例1.3:用MASM命令汇编源程序…>masm test……Invoking: ML.EXE /I. /Zm /c test.asm……Assembling: test.asmtest.asm(10): error A2070: invalid instruction operands如果MASM命令显示了类似如上的处理结果,那么,表示源文件有错,没有生成其目标文件。

Masm编译与调试过程

Masm编译与调试过程

用户通过屏幕编辑程序键入源程序,检查无误,可将源程序存到汇编系统盘上,该程
序的扩展名为·ASM。
2. 编写汇编源程序 用汇编语言编写的源程序必须是一个完整的源程序,才能经过宏汇编程序 MASM 的汇 编,生成一个目标程序。为了完成汇编任务,汇编程序一般采用两遍扫描的方法,第一遍 扫描源程序产生符号表、处理伪指令等,第二遍扫描产生机器指令代码、确定数据等。
(3)数据的输出方式 ①在显示器上显示一个字符 调用 02H 号功能调用号,发 21H 号中断,将要显示的字符的 ASCII 码送入 DL,就可 在显示器上显示该字符。 ②在打印机上输出一个字符 调用 05H 号功能调用号,发 21H 号中断,将要打印字符的 ASCII 码送入 DL,就可在 打印机上打印出 DL 中的字符。
1)源程序的书写格式
当 CPU 访问内存时,是把存储器分成若干个段,通过 4 个段寄存器中存放的地址对内
存储器访问,因此在编源程序时必须按段的结构来编制程序。由于每个段的物理空间为≤
64KB,所以程序中各段可以分别为一个或几个。源程序的书写一般有如下形式:
逻辑堆栈段
堆栈段名 SEGMENT STACK
(1)变量与数据的定义
2
《微机系统与接口》实验参考资料之一
变量与数据的定义可以通过符号定义伪指令 EQU、=和数据定义伪指令 DB 或 DW 或 DD 来实现。
EQU 和=可以出现在程序的逻辑段内也可出现在逻辑段外。
(2)汇编程序中数据的提供方法 ①用数据定义伪指令提供数据 如果程序要求原始数据为一批数据时,用数据定义伪指令 DB、DW 和 DD 来提供较为 方便。 ②用立即数的形式提供数据 当原始数据只有几个时,一般用立即数的方法来提供。当然,用立即数的方法只是将 一个数据传送到通用寄存器中,它只是通过通用寄存器传送数据。 ③用编程的方法提供数据 假如原始数据是一组有规律的数据项,则用编程序的方法形成这一组数据,不用专门 为这组数据分配存储单元,节省了存储空间。 ④用键盘提供数据 当原始数据为任意数据时,一般用键盘输入方法,调用 DOS 21H 中断。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不要把MASM32开发环境和MASM汇编器版本搞混了!
MASM32是一个为那些对学习或者编写32位微软汇编(MASM)感兴趣的程序员提供的工作环境,它最流行的版本是8.0版,而我所知道最新版本是9.0版。

但是请大家一定要注意,这里的8.0版和9.0版不是指MASM编译器(即ML)的版本,而是MASM32开发环境的版本。

经常看到网上有网友发的贴把这两个概念都搞混了。

那么MASM(ML)编译器的版本到底有哪些呢?教学上常用的版本是 5.0版的,之前还有个 4.0版的记得“全国计算机等级三级考试”就是用的 4.0版。

5.0版之后有个 5.1版本,在这之后,从 6.0版开始MASM就改名ML了,因为它把编译和连接组合在一起了。

而且 6.0版还对汇编语言进行了大幅改造,使之支持高级语言的很多特性。

6.0版之后常看到的就是6.11、6.13、6.14MASM32(V8.0和V9.0)就是包含有ML6.14版,而不是ML8.0版。

6.14之后就是6.15但不常见,我手头上有6.15的ML,有兴趣的朋友可以向我索取或点此处进入下载。

但Microsoft从 6.15版开始好象就不再单独发布MASM的开发工具包了。

以后的ML还有7.0、7.1版,最新的是ML8.0版。

但它们都只包含在Visual 和Visual Studio 2005里面。

而且如果你安装了Visual Studio 2005的64位开发环境,你将得到一个MASM for x64 (ml64.exe)哈哈,各位这可是支持Intel 和AMD的64位CPU的汇编语言编译器!有志于64位底层开发的赶快去试用看看吧。

MASM 4.00这是最先广泛使用的一个 MASM 版本,适用于 DOS 下的汇编编程。

它很精巧,但使用起来不是很智能化,需要用户自己一板一眼地写出所有的东西。

很多教科书上讲的 8086 汇编语法都是针对这个版本的,对程序员来说。


只比用 Debug 方便一点点
MASM 5.00MASM 5.00 比 4.00 在速度上快了很多,并将段定义的伪指令简化为类
似 .code 与 .data 之类的定义方式,同时增加了对 80386 处理器指令的
支持,对 4.00 版本的兼容性很好
MASM 5.10对程序员来说,这个版本最大的进步是增加了对 @@ 标号的支持。

这样,程序员可以不再为标号的起名花掉很多时间。

另外, MASM 5.10 增加了对 OS/2
1.x 的支持
MASM 5.10B1989 年推出,比上一个版本更稳定、更快,它是传统的 DOS 汇编编译器中最完善的版本
MASM 6.001992 年发布,有了很多的改进。

编译器可以使用扩展内存,这样可以编译更大的文件,可执行文件名相应从 Masm.exe 改为 Ml.exe 。

从这个版本开
始可以在命令行上用 *.asm 同时编译多个源文件,源程序中数据结构的使
用和命令行参数的语法也更像 C 的风格。

最大的改进之一是开始支
持 .if/.endif 这样的高级语法,这样,使用复杂的条件分支时和用高级语
言书写一样简单,可以做到几千行的代码中不定义一个标号;另外增加了
invoke 伪指令来简化带参数的子程序调用。

这两个改进使汇编代码的风格
越来越像 C ,可读性和可维护性提高了很多
MASM 6.00A未发售的版本
MASM 6.00B最后一个支持 OS/2 的 MASM 版本,修正了上一版本中的一些错误
MASM 6.10修正了一些错误,同时增加了 /Sc 选项,可以在产生的 list 文件中列出
每条指令使用的时钟周期数
MASM 6.10A1992 年发布,修正了一些内存管理方面的问题
MASM 6.111993 年 11 月发布,支持 Windows NT ,可以编写 Win32 程序,同时支持Pentium 指令,但不支持 MMX 指令集
MASM 6.11C1994 年发布,增加了对 Windows 95 VxD 的支持
MASM 6.121997 年 8 月发布,增加 .686 , .686P , .MMX 声明和对相应指令的支持
MASM 6.131997 年 12 月发布,增加了 .K3D 声明,开始支持 AMD 处理器的 3D 指令MASM 6.14这是一个很完善的版本,它在 .XMM 中增加了对 Pentium III 的 SIMD 指令集的支持,相应增加了 OWORD ( 16 字节)的变量类型
MASM 6.152000 年 4 月发布。

相关文档
最新文档