文章目录
汇编语言概述
程序处理过程
- 1.编写源程序(文件名 .ASM)
- 2.编译成目标文件(文件名 .OBJ )
-
- 生成可执行文件(文件名 .EXE )
-
- 调试,运行程序
程序的格式
-
每个语句可以由 四项组成
-
指令性语句格式
- [标号 :]指令助记符 [操作数,操作数] [ ; 注释]
- 标号与指令助记符之间用冒号分隔
- 指令助记符与操作数之间用空格分隔
- 操作数之间用逗号分隔
- 操作数与注释之间用分号分隔
- 表示可选项
-
伪指令语句格式
- [名称] 伪指令指示符 [参数] [;注释]
- 名称与伪指令指示符之间用空格分隔
- 伪指令指示符与参数之间用空格分隔
- 参数之间用逗号分隔
- ‘参数与注释之间用分号分隔
- 表示可有可无
-
标号和名称
- 代表该语句的存储器地址
- 标号在一些指令中充当操作数,用来表示转移地址
- 名称可以是常量名,变量名,段名,过程名,宏指令名等。
- 名称在一些指令中充当直接寻址方式的符号地址
-
标号和名称的命名规则
-
可用符号
-
数字
-
字母
-
特殊符号
- ?
- $
- @
- _
-
-
不区分字母的大小写
-
不能使用保留字和关键字
-
长度不能超过31个字符
-
数字不能做开头
-
数据项和表达式
-
数据项
-
常数
- 十进制用D结尾
- 十六进制用H结尾 A~F开头时加 0
- 八进制用Q结尾
- 二进制用B结尾
-
寄存器
-
存储器
-
变量
- 通常指存放在存储单元中的值
-
标号
-
可执行指令语句的地址和符号表示
-
段值:标号所在段的段地址
-
段内偏移地址:标号所在地址与所在段地址之间的偏移量
-
类型:转移指令中标号可转移的距离
- NEAR:表示近标号,段内转移
- FAR:表示远标号,段间转移
-
-
-
表达式
-
运算对象
- 常量
- 变量
- 标号
-
运算符
-
算术运算符
- 加减乘除,MOD,左移SHL ,右移SHR
-
关系运算符
-
EQ = 、 NE != 、 GT >
-
LT < 、LE <= 、 GE >=
-
必须是数值,结果是一个常数
-
字长16位时
-
关系成立
- 结果为 0FFFFH
-
关系不成立
- 结果为 0000H
-
-
-
属性运算符
-
逻辑运算符
- AND,OR,NOT,XOR
- 只能用于数值表示
- 地址表达式没有意义
-
数值返回运算符
- OFFSET 返回偏移地址
- SEG 返回段基址
- TYPE 返回元素字节数
- LENGTH 返回变量单元数
- SIZE 返回变量总字节数
-
-
系统功能调用和动态调试
为了节省系统程序猿的编程工作量和优化程序结构
在DOS中预先设计好了一系列的通用子程序
DOS
- 提供包括基本输入输出管理
- 内存储器读写管理
- 磁盘文件的读写管理
- 时间和日期的设置功能
调用方法
-
使用软中断指令
- INT n
- n为中断类型号
步骤如下
- 在AH寄存器中设置系统功能调用号
- 在指定的寄存器中设置入口参数
- 用INT 21H 指令 执行功能调用
- 根据出口参数分析功能调用执行情况
1号功能
-
从键盘输入一个字符并回显
-
入口参数无
-
出口参数
- AL<——键入字符的ASCII码
2号功能
-
在屏幕当前位置显示DL寄存器中的字符,并将光标后移一格
-
入口参数
- DL<——显示字符的ASCII码
-
出口参数无
10号功能
-
从键盘接受一个字符串,并存入用户定义的输入缓冲区内,回车结束
-
首地址放长度,下一地址放实际长度,随后放接收的第一个字符
-
入口参数
- DS:DX <——缓冲区首地址
-
出口参数无
9号功能
-
将当前数据区DS:DX所指向的以“$"结尾的字符串显示在显示器上
-
入口参数
- DS:DX <——字符串首地址
-
出口参数无
4CH号功能
- 由.EXE文件返回DOS
调试
- 进入调试 debug eg1.exe
- 查看寄存器 R
- 查看标志寄存器 RF
- 查看主存 D
- 反汇编 U
- 单步操作 T
- 执行命令 G
- 退出调试 Q
80X86汇编语言伪指令
伪指令语句在汇编期间进行处理
- 变量定义
- 存储器分配
- 指示程序开始和结束
- 定义段
- 段分配
数据定义伪指令
-
为变量存储空间,赋初值
-
格式
- [变量名] 伪指令 初值表 [ ; 注释 ]
-
类型
- DB 定义字节
- DW 定义字
- DD 定义双字
- DT 定义十字节 用于 BCD 码
- DQ 定义四字
符号定义伪指令
-
给一个数值,字符串或表达式赋予一个名字
-
格式
- [符号名] 伪指令 表达式或数据 [ ; 注释 ]
-
类型
- EQU 等值
- = 等号
- LABEL 类型定义
段和过程定义伪指令
-
段定义伪指令用来定义汇编语言源程序的逻辑段
-
段定义 SEGMENT/ENDS
-
格式
-
段名 SEGMENT [ 定位类型 ] [ 组合类型 ] [ 类别 ]
-
定位类型
- PAGE 段起始地址的低8位为0 ,从页边界开始
- PARA 段起始地址的低4位为 0 , 从节边界开始
- WORD 段起始地址的低1位为0 ,从字边界开始
- BYTE 段起始地址任意定义,从字节边界开始
-
组合类型
- 说明 逻辑段装入内存时,如何与其他段组合
- NONE 表示本段和其他段不发生关系 (默认)
- PUBLIC 同名同类型的段相邻地连接到一起,具有共同的段地址
- STACK 和PUBLIC 一样,但是用于 堆栈段
- COMMON 所有同名类型段具有相同地址,都后面的会覆盖前面的,用于共享数据
- MEMORY 本段定义在其他段之后
- AT 本段定义在表达式指定位置,但是代码段不能用
-
类别
- 用户自定义的类别名
- 单引号括起来
-
-
段名 ENDS
-
-
-
假定 ASSUME
-
出现在代码段中,告诉汇编程序,如何设定各段与对应段寄存器的相互关系
-
格式
- ASSUME 段寄存器名:段名[ ,段寄存器名:段名,……]
- ASSUME CS : CODE , DS : DATA ,SS : STACK
-
-
-
过程定义伪指令用来定义子程序
-
主程序可以按照过程名进行调用
-
格式
- 过程名 PROC [NEAR / FAR ]
- 过程名 ENDP
-
[ NEAR / FAR ] 说明距离属性, 默认 NEAR
-
至少有一条返回指令 RET
-
-
程序结束伪指令 END
-
格式
- END 标号
-
注意
- 源程序中必须有END 结束语句
- 有效语句都要在END之前
- 标号是程序中第一句指令性语句的标号
-
80X86汇编语言程序结构
好的程序
- 结构化,简明,易读,易调试,易维护
- 执行速度快
- 占用存储空间少
常见程序结构
- 顺序结构
- 分支结构
- 循环结构
- 子程序结构