指令格式
汇编指令的代码格式(Instruction Format)也称为机器代码(Machine Code)格式。它由操作码和地址码组成:
其中,mod reg r/m
表示寻找操作数的方法,'位移量'表示相对基地址的偏移量,而立即数
表示操作数本身。
1、数据传送指令的助记符MOV
功能是将数据从一个位置传送到另一个位置:
mov dest,src ;dest <-- src
其中src表示要传送的数据,称为源操作数(Source);dest表示数据将要传送到的位置,称为目的操作数(Destination)。
2、将16位寄存器BX的数据传送到AX寄存器的指令:
mov ax,bx ;指令功能:AX <-- BX
语句格式
汇编语言每条语句占据一行,每行不超过132个字符(MASM6.0是512字符)。
汇编语言的语句由分隔符分成的四个部分组成,有两种格式,分包是处理器指令和汇编程序伪指令。
1、执行性语句--表达处理器指令的语句:
标号: 处理器指令助记符 操作数,操作数 ;注释
2、说明性语句--表达汇编程序命令的语句:
名字 伪指令助记符 参数,参数,,...... ; 注释
汇编语言的自定义标志符(Identifier)有如下规则:
一般由31个字母、数字及规定的特殊符号组成。
不能以数字开头。
不能使用汇编语言中的关键字(Key Word)和保留字等。
汇编语言大小写不敏感,程序中一般使用小写字母形式,功能注释、文字说明通常采用大写字母形式。
注意:MASM也支持续行符“”,表示本行内容与上一行内容属于同一个语句。
源程序框架
汇编语言编程时也常将源程序分成代码段、数据段或堆栈段。
MASM各版本支持多种汇编语言源程序格式,MASM 6.x版本的简化段定义源程序格式,程序模板如下:
;example.asm in DOS
.model small ;定义程序的存储模型(small表示小型模型)
.stack ;定义堆栈段(默认是1KB空间)
.data ;定义数据段
...... ;数据定义(待填)
.code ;定义代码段
.startup ;程序执行起始,同时设置数据段寄存器DS执行程序的数据段
...... ;主程序(执行填)
.exit ;程序执行结束,返回DOS
...... ;子程序(指令待填)
end ;汇编结束
针对代码中出现的字段,下面会详细的讲述。
- 存储模型
存储模型(Memory Model)决定程序的规模,也确定进行子程序调用、指令转移和数据访问的默认属性。
当使用简化段定义的源程序格式时,必须有存储模型.MODEL语句,且位于所有简化段定义语句之前。其格式为:
.model 存储模型,语言类型
.MODEL语句确定了程序采用的存储模型,MASM有7种可以选择:
运行于DOS下的应用程序可以根据需要选择前六种模型。FLAT模型只用于32位Windows程序中。
- 逻辑段
堆栈段定义伪指令.STACK创建一个堆栈段,段名是:STACK。堆栈段名可用@STACK预定义操作符表示。
数据段定义伪指令.DATA创建一个数据段,段名是:_DATA。数据段名可用@DATA预定义操作符表示。
代码段定义伪指令.CODE创建一个代码段,后可选一个标识符型参数指定该代码段的段名。如果没有给出段名,则采用默认段名,默认的代码段名是:_TEXT。代码段名可用@CODE预定义操作符表示。
- 执行开始
MASM 6.0引入的.STARTUP指令指明了本程序开始执行的位置,并同时使数据段寄存器DS等于用.DATA伪指令定义的数据段的段基地址。
如果不使用.STARTUP指令,通常可以用如下两条语句代替:
start: mov ax,@data ;@DATA表示数据段的段地址,先传送给AX寄存器
mov ds,ax ;设置DS等于AX,即数据段的段地址
标号start也可以使用其他标志符,需要利用最后结束的END指令作为参数来指明开始执行的位置。
- 程序终止
程序的终止有两种意义上的终止,一种是程序的终止,一种是源程序的汇编结束。
1、程序执行终止使用.exit实现,其实是调用4CH号功能实现:
mov ah,4ch ;DOS功能调用的4CH号
int 21h ;主要以第21H号中断的形式使用
2、源程序的汇编结束表示将源程序翻译成目标模板代码的过程,并不是程序的终止。
end start ;前面使用start标号的结束方式
例:现在我们用上述程序格式,编写一个在屏幕上显示信息的程序。将这段代码内容填入程序开始执行指令之后,就形成了完整的MASM汇编语言的源程序。
;hello.asm(文件名)
.model small
.stack
.data
msg db'Hello,Assembly!',13,10,'$' ;定义要显示的字符串
.code
.startup
mov dx,offset msg ;指定字符串在数据段的偏移地址
mov ah,9 ;AH赋值9
int 21h ;利用功能调用显示信息
.exit
end
注意:DOS功能9号调用要求以字符“$”结尾,无法显示“$”本身。
其中8086支持255个中断,即中断0-中断255。在DOS系统中主要分配21H号中断。
下面罗列在DOS中使用的基本功能: