汇编语言源程序
- 汇编语言源程序:用助记符编写
- 汇编程序:源程序的编译程序
程序执行过程
语句类型和格式
语句类型
- 指令性语句:CPU执行的语句,能够生成目标代码
- 指示性语句:CPU不执行,由汇编程序(编译器)执行的语句,不生成目标代码
语句格式
指令性语句:
$$[标号:]\quad[前缀]\quad助记符\quad[操作数],[操作数]\quad[;注释]$$
- 串操作指令的助记符前面可以加前缀,前缀不是指令,它表示一种循环重复执行的概念,和助记符连在一起可构成循环体
- 无条件重复前缀
- 条件重复前缀
- 标号代表指令的符号地址
- 标号后要有冒号
指示性语句:
$$[名字]\quad伪指令助记符\quad操作数[,操作数,···]\quad[;注释]$$
- 名字是变量的符号地址,其后不加冒号
语句中的操作数
- 寄存器
- 存储器单元
- 常量
- 变量或标号
- 表达式
- 算术运算:加减乘除、取模
- 逻辑运算:与或非异或
- 关系运算
- 取值运算和属性运算
- 其他运算
- LENGTHOF运算符:计算数组中元素的个数
- TYPE运算符返回变量单个元素的大小,这个大小是以字节为单位计算
伪指令
- 伪指令:由汇编程序(编译器)执行的“指令系统”
- 作用: 帮助计算机理解指令性语句
- 定义变量;
- 分配存储区
- 定义逻辑段;
- 指示程序开始和结束;
- 定义过程
数据定义伪指令
- 用于定义数据区中变量的类型及其所占内存空间的大小
- 格式:
- 数据定义伪指令助记符:
- DB(Define Byte):定义的变量为字节型
- 每一个操作数占一个字节单元
- DW(Define Word):定义的变量为字类型
- 每一个操作数占一个字单元
- DD(Define Double Word):定义的变量为双字型
- DQ(Define Quadword):定义的变量为四字型
- DT(Define Tenbytes):定义的变量为十字节型
- DB(Define Byte):定义的变量为字节型
定义字符串必须用DB伪指令助记符
【例】数据定义伪指令定义的变量在内存中的分布
- 重复操作伪指令助记符:用于分配存储区
- “?“的作用:
【例】变量在内存中的存储分配
符号定义伪指令
- 作用类似C语言中的宏
段定义伪指令
- 用来定义一个逻辑段
- 逻辑段的段名就是段基地址(一个数)
【例】段定义伪指令
设定段寄存器伪指令
- 用段寄存器标识逻辑段是什么段
- 数据段
- 附加段
- 堆栈段
- 代码段
结束伪指令
- 标号通常是第一条指令性语句前的标号
源程序基本结构
【例】一个完整源程序结构
- 段寄存器初始化后次系统才会分配前面定义的内存空间
过程定义伪指令
- 用来定义一个子程序
- 过程名是子程序第一条指令性语句在内存的符号地址
- 若为近过程,
NEAR
可省略 - 过程体的最后一条指令必须是
RET
【例】过程定义及调用
- 子程序用到的寄存器,为了不影响调用程序的寄存器原来的值,需要在执行子程序之前,将调用程序原来寄存器的值保存到堆栈,在执行子程序结束后,将调用程序原来寄存器的值从堆栈恢复(先进后出)
宏命令伪指令
- 与子程序的不同:不能通过编译链接,成为一个独立的程序,只能是源程序的一部分,不能被其他源程序调用
【例】宏定义与宏调用
- 该宏的作用:X+Y赋给Z
调整偏移量伪指令
流程控制伪指令
.REPEAT 伪指令执行循环体,然后测试 .UNTIL 伪指令后面的运行时条件:
|
|
.WHILE 伪指令在执行循环体之前测试条件:
|
|
INVOKE伪指令
- 将参数入栈并调用过程
- INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:
|
|
- ArgumentList 是可选项,它用逗号分隔传递给过程的参数