前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书
汇编语言程序设计
一,汇编语言程序设计概述
1,程序设计语言
- 机器语言
用二进制表示,能够被机器直接识别 - 汇编语言
采用助记符表示机器指令 - 高级语言
接近自然语言
2,汇编语言源程序
汇编语言源程序是程序员根据具体问题的算法,用汇编语言的语句编写的程序文本,通常以 .asm 作为扩展文件名。
汇编语言程序设计中由于开发环境支持不同,可以有完整段程序和简化段程序。
3,汇编语言程序开发过程
-
基本步骤:
①编辑:保存 XXX.ASM
②汇编:生成 XXX.OBJ
③连接:生成 XXX.EXE
④调试运行
二,汇编语言基本语法(重点)
1,汇编语言的语句类型
-
指令性语句:由指令构成,与机器指令一一对应。如:
START: MOV AX,DATA ;初始化程序段
-
指示性语句:由命令(伪指令)构成,是程序员发给汇编程序的命令,没有相应的机器指令。如:
DATA SEGMENT
2,常量、标识符和表达式
- 常量
指令中出现的固定值,在程序运行期间不会变化。 分为数字常量、字符常量和符号常量三种(指令中的立即数,MEM直接地址) - 标识符
有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等。(注意**?**不能单独作为标识符。 - 表达式
由操作数(常量、变量、标号)和运算符构成。在汇编时完成相应的运算(数字常数)、(OBJ)目标程序中不存在表达式,应用程序的DEBUG调试中不可能看到任何表达式。
3,汇编语言程序伪指令(重点)
-
程序结束伪指令
格式:END 标号
说明:标号为程序中第一条指令性语句标号
-
段定义伪指令
- 1,段定义语句
8086分段访问存储器。
格式:
段名 SEGMENT [定位方式] [组合方式] [‘类别名’]
…
段名 ENDS
-
2,段寄存器说明伪指令
格式:ASSUME 段寄存器:段名1,段寄存器:段名2…说明:在代码段,告诉汇编程序CS、DS、ES、SS 应具有的符号段基址,但是段寄存器(CS除外)还必须用传送指令赋值。一般紧跟在SEGMENT语句之后。
-
过程定义的伪指令
格式:
过程名 PROC NEAR[FAR]…
过程名 ENDP
说明:NEAR 近过程(主、子同段)
FAR 远过程(主、子在两个不同的代码段) -
数据定义伪指令
数据定义语句用来为数据分配存储单元,数据段、附加段和堆栈段都是存放数据的,其中所用的语句主要是数据定义语句。
- 命令:表示符号及功能如下
DB 字节 (8位)一个字节存储单元 DW 字 (16位)两个连续字节存储单元 DD 双字 (32位)四个连续字节存储单元 DQ 双字 (64位)8个连续字节存储单元 DT 双字 (80位)10个连续字节存储单元 -
参数
相应内存单元中的数据,可以是数字常量、字符常量或符号常量,当它是保留时就以问号(?)表示。参数可以有多个,相互间用逗号(,)隔开,若连续多个数据是重复的,可用复制符DUP 以简化书写,DUP的用法为:
赋值次数 DUP(数据)
例如:ARRAY DB 10 DUP(12H)
-
符号定义伪指令
-
(1) 应用命令EQU和PURGE
格式:符号常量 EQU 表达式
说明:如需对已赋值的名字赋以新值,则先用PURGE语句撤销原赋值,其格式为:
PURGE 名字
PURGE 可同时撤销几个已赋值。例如:
COUNT EQU 20 ADD AX,COUNT PURGE COUNT COUNT EQU 30 ADD AX,COUNT
-
(2)应用命令“=”
格式:符号常量=表达式
说明:其功能与EQU 类似,唯一的区别是命令 “=” 可随时对名字赋新值,而不必使用PURGE命令。例如:
COUNT=20 ADD AX,COUNT COUNT=30 ADD AX,COUNT
-
-
变量
-
(1) “$” 的含义
DATA SEGMENT ARRAY DB 10H, 5AH, 0C7H, 98H, 'ABCD' COUNT EQU $-ARRAY MAX DB 12H DATA ENDS
说明:$表示该行的偏移地址,此处COUNT 表示ARRAY 有多少个元素。
-
(2) 变量的五种属性
- 段基址
- 偏移地址
- 符号名的类型值
- 长度属性
- 规模属性
-
(3) 类型指定运算符 PTR
格式:类型 PTR 表达式
说明:类型可以是BYTE、WORD、DWORD、NEAR、FAR
作用:按PTR 前面指定的类型去寻址例:INC BYTE PTR [2000H]
-
4,DOS系统功能调用(重点)
什么叫DOS 系统功能调用
为提高汇编程序的编程效率,减少重复开发过程,MS-DOS操作系统内置了几十个子程序,这些子程序能够完成大量底层功能,用户程序可以通过软中断的方式使用这些子程序,软中断号为21H。指令为INT 21H。
-
DOS 系统功能子程序使用的基本要求有:
1)传送入口参数到指定寄存器中;
2)调用子功能的功能编号放在AH 寄存器中;
3)执行INT 21H指令。
-
1、键盘单字符输入(1号)
MOV AH,1
INT 21H
功能:等待从键盘输入一个字符。
返回:(AL)=ASCII 码,并回显在显示器上。 -
2、输出单字符(2号)
MOV DL,‘A’
MOV AH,2
INT 21H
功能:将DL中字符从屏幕上输出。返回:无返回
-
3、输出字符串(09号)
MOV DX,OFFSET BUF
MOV AH,09
INT 21H
功能:BUF中以’$'为结束标志的字符串显示在屏幕上。当无结束标志时会出现乱码。 -
4、键盘输入字符串 (OAH号)
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
功能:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。
键盘缓冲区定义:
BUF DB 81 ;缓冲区的大小
DB? ;实际输入的字符个数
DB 80 DUP(?) ;字符串存放区 -
5、返回操作系统(4CH)
MOV AH,4CH
INT 21H
功能:将控制权交给操作系统。
-
三,汇编语言程序设计
1,子程序的调用
格式:CALL 过程名(子程序地址)
功能:
- 下条指令的地址压入堆栈。
主子同段(段内调用):只将IP的值压入堆栈
段间调用:先将CS的值压入堆栈,再将IP的值压入堆栈。
- 转入子程序运行(子程序的地址送入CS: IP)
2,子程序的返回
格式:RET
说明:子程序的最后一条指令,用于返回CALL指令的下条指令继续执行。无论对哪一种调用方式其返回指令都相同。
功能:
- 段内调用只将当前[SP] 弹进IP,从而使程序正常返回。
- 对于段间调用则先弹IP,再弹CS。
3,参数的传递
主程序调用子程序必须传递入口参数,子程序返回必须传递出口参数。
常用的方法有:
- 寄存器:适用于参数少的情况。
- 约定单元:适用于参数多的情况。要事先建立参数数据缓冲区。
- 堆栈:适用于参数较多,且子程序嵌套,递归调用的情况。