一个基础的汇编语言示例:
1 | TITLE 汇编语言示例程序 |
说明:
- TITLE伪指令将整行标记为注释,改行可以放置任何东西
- 分号是注释符号,编译器会忽略分号右边的所有文本
- .386 指出该程序要求的最低CPU(Intel 386)
- .model 伪指令用于设置程序的内存模型,flat为Windows程序使用的模式(代码和数据使用同一个4GB段),stdcall为API调用时右边的参数先入栈
- option casemap :none 设置符号(函数和变量)大小写敏感,但是汇编指令还是不区分大小写的
- .stack 4096 设置堆栈大小为4096,默认值1024
- include masm32.inc 用于从masm32.inc文件中复制必需的定义和设置信息,查找目录为INCLUDE环境变量定义的目录
- includelib masm32.lib用于链接过程中从对应静态库中链接对应的符号,查找目录为LIB环境变量定义的目录
- .data 伪指令标识了程序包含变量的区域
- .code 伪指令标识了程序包含指令的区域
- PROC 伪指令用于标识一个过程的开始
- invoke 伪指令用于将参数入栈,并调用过程,addr伪指令用于传递指针参数
- ENDP 伪指令用于标识一个过程的结束
- END 伪指令用于标明该行是汇编源程序最后一行,后面的所有内容不参与编译
基本组成:
- 汇编指令
机器码的助记符,有对应的机器码
- 伪指令
没有对应的机器码,由编译器执行,计算机不执行
- 其他符号
如+,-,*,/等,由编译器识别,没有对应的机器码
基本元素
- 整数常量
整数常量由符号(可选)开头,后跟一个或多个数字以及一个表示数制基数的字符后缀:[{+|-}] 数字[基数]。以字母开头的十六进制常量前面必须添加一个0,以防止汇编器将其解释为标识符。
基数 | 进制 | 基数 | 进制 | |
---|---|---|---|---|
h | 十六进制 | r | 编码实数 | |
q/o | 八进制 | t | 十进制(可选) | |
d | 十进制 | y | 二进制(可选) | |
b | 二进制 |
- 整数表达式
整数表达式是包含整数值和算术运算符的数学表达式。整数表达式计算的结果必须是能够以32个数据位存储的整数(0~FFFFFFFFh)。
运算符 | 名称 | 优先级 |
---|---|---|
() | 圆括号 | 1 |
+, - | 一元加、减(符号位) | 2 |
*, / | 乘、除 | 3 |
MOD | 取余数 | 3 |
+, - | 加、减 | 4 |
- 实数常量
有两种类型的实数常量:十进制实数和编码(十六进制)实数。
十进制实数常量由符号( sign)、整数(integer)部分、小数点、表示小数的整数和指数(exponent)部分组成
1
2
3
4
5示例:
2.
+3.0
-44.2E+05
26.E5编码实数:编码实数是以16进制数表示一个实数的,遵循IEEE浮点数格式
1
2示例:
+1.0 可以表示为3F800000r精度 说明 单精度 32 位:1 位符号位,8 位阶码,23 位为有效数字的小数部分。大致的规格化范围:2-126 〜2127 。也被称为短实数 (short real) 双精度 64 位:1 位符号位,11 位阶码,52 位为有效数字的小数部分。大致的规格化范围:2-1022 〜21023 。也被称为长实数 (longreal) 扩展双精度 80 位:1 位符号位,15 位阶码,1 位为整数部分,63 位为有效数字的小数部分。大致的规格化范围:2-16382〜216383。也被称为扩展实数 (extended real)
- 字符常量
字符常量是以单引号或双引号括起来的单个字符。汇编器将其转换为与字符对应的二进制数ASCII码。
- 字符串常量
字符串常量是以单引号或双引号括起来的串字符。
- 保留字
- 指令助记符,如MOV,ADD,和MUL等
- 伪指令,用于告诉MASM如何编译程序
- 属性,用于为变量和操作数提供有关尺寸以及使用方式的信息,如BYTE,WORD等
- 运算符,用在常量表达式中
- 预定义符号,如@data,在编译时返回整数常量值。
- 标识符
标识符是程序员选择的名字,用来标识变量、常量、过程或代码标号。创建标识符时要注意以下几点:
- 标识符可包含1~247个字符。
- 标识符大小写不敏感(MASM默认)。
- 标识符的第一个字符必须是字母(A~Z和a~z)、下划线(_)、@、?或$,后续字符可以是数字。
- 标识符不能与汇编器的保留字相同。
- 伪指令
伪指令是内嵌在程序源代码中,由汇编器识别并执行相应动作的命令。与真正的指令不同,伪指令在程序运行时并不执行。伪指令可用于定义变量、宏以及过程,可用于命名段以及执行许多其他与汇编器相关的簿记任务。MASM 中伪指令大小写不敏感,如.data,.DATA 和.Data 是等价的
- 指令
汇编语言中的指令是一条汇编语句,在程序被汇编后就变成可执行的机器指了。汇编器把汇编指令翻译成机器语言字节码,在运行时可以加载至内存由处理器执行。一条汇编指令包含4个基本部分:
- 标号(可选)
- 指令助记符(必需)
- 操作数(通常是必需的)
- 注释(可选)
- NOP操作符
最安全的指令是NOP(no operation),一条NOP 指令占用一个字节的存储,什么也不做。有
时编译器或汇编器使用NOP指令把代码对齐到偶数地址边界。