微机原理笔记分享 课程链接:www.bilibili.com/video/BV1qv…
微机原理第四章
汇编语言程序设计
汇编指令
汇编语言特点
汇编语言
- 面向机器/硬件程序代码效率高
- 执行速度快,占内存少
- 应用:实时控制、仪器仪表、系统软件等
高级语言
- 可移植性好
- 程序易编/易读/易学
- 应用:科学计算、信息管理等
汇编语言的结构
完整的汇编语言源程序由段(代码段、数据段、附加段或堆栈段)组成;一个汇编语言源程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
每个段由若干语句行组成。语句行是汇编的编程基础。所有的指令必须位于某个代码段内,伪指令可根据需要位于任一段内。
段以“SEGMENT”开始,以“ENDS”结束由用户定义。
指令性语句
标号: 指令助记符 操作数; 注释
标号
- 表示指令的符号地址,常作为转移指令的操作数,后面必须加“ : ”
- 特殊字符和标记字
- 具有段基址、偏移量和类型三种属性
指令助记符
- 必不可少,表示操作码
操作数
- 操作数数目,操作数组成类型和数制表示
注释
- 注释前必须加“ ; ”
例
- BEGIN: MOV AX,BX
伪指令语句(指示性语句)
名字 伪指令助记符 操作数; 注释
名字
- 用符号地址表示,可有可无,名字后面不能跟“ : ”
指令助记符
- 必不可少
- 常见的伪指令语句有段定义语句、段分配指令、过程(子程序)定义指令、变量定义语句和程序结束语句等
操作数
- 数目视具体要求决定
注释
- 前必须加“ ; ”
例
- 段定义语句 SEGMENT和ENDS
- 段分配语句 ASSUME
- 定义变量语句 DB,DW,DD,DQ
- 等程序结束语句 END
- 过程定义语句 PROC,ENDP
MASM中的表达式和运算符
算术运算符 : 十 , 一 , * , / , MOD,SHL,SHR
-
例
- DA EQU 300
- MOV AX, DA一80
- MOV BX,DA MOD 100
- MOV CX,DA/100
- MOV DH,01100100B SHR 2
逻辑运算符:AND,OR,XOR,NOT
-
例
- MOV AL,NOT OFFH
- MOV BL,8CH AND 73H
- MOV AH,8CH OR 73H
- MOV CH,8CH XOR 73H
关系运算符:EQ、NE、LT、LE、GT、GE
-
例
- MOV AX,10 H GT 16
- ADD BL,6 EQ 0110B
数值返回运算符:OFFSET,SEG,TYPE,LENGH,SIZE
-
例
- MOV BX,OFFSET DA1
- MOV AX,SEG M1
- MOV DS,AX
-
TYPE返回值
-
变量:DB/DW/DD/DQ: 1/2/ 4/8
-
标号:NEAR/FAR:一1/ 一2
-
例
-
-
LENGTH返回值
-
SIZE返回值
伪指令语句
数据定义语句:DB,DW,DD,DUP()
表达式赋值语句:EQU
-
例
-
COUNT EQU 100 DATA EQU COUNT+2 B1 EQU OFFSET A1 C1 EQU ADD
-
段定义语句
-
样式
-
定位类型:表示该段的起始边界要求
- 有PAGE/PARA/WORD/BYTE四种,分别以页/节/字/字节为边界。
-
组合类型:告诉链接程序,本段与其它段的组合关系共6种:
- NONE,PUBLIC, COMMON,STACK,MEMORY,AT
-
‘类别’:使所有类别相同的段组成一个段组
- 典型类别:‘STACK'、‘CODE'、‘DATA'
段分配语句ASSUME
- 告诉汇编程序各段与段寄存器的关系,保证生成正确的目标程序.
- CS:指向代码段自动将段基址→CS
- DS:数据段名
- SS:堆栈段名
- ES:附加段名
过程(子程序)定义语句
伪指令
段定义指令
-
段分配指令assume
- 关联某一段寄存器和程序中某一个定义的段
-
程序结束指令end
- 汇编程序结束标志
-
例
-
运算2^3
-
实现求1+2+...+4之和。
-
数聒段
-
例
-
考虑一个程序,编程计算以下8个数据的和,结果存放在AH寄存器:O1h,02h,05h,07h,10h,16h,17h,18h
-
包含多个段的程序
DOS系统与中断
DOS系统概述
-
中断处理程序
- 中断的概念
- 中断类型分类:256类中断
- DOS中断:20H~2EH (DOS提供功能程序)
- DOS系统功能调用:INT21H
-
DOS系统功能调用
- DOS规定用中断指令INT21H进入各功能调用总入口,再为每个功能调用规定一个功能号,以便进入相应子程序入口。
-
DOS功能调用的步骤
-
系统功能号→AH
-
调用参数→指定寄存器
-
INT 21H
-
按规定取的出口参数
- 返回参数:或在寄存器中 或直接显示等
-
-
键盘功能调用
-
1号功能调用:从键盘输入单字符并显示
-
入口参数:无
-
出口参数:AL寄存器存放输入字符的ASCI码值
- MOV AH,1 INT 21H
-
执行上述指令,系统将扫描键盘,一旦有键按下,就将键值(ASCII)读入,先检查是否为Ctrl-Break,若是,则退出;否则,将键值→ AL,同时将字符显示在屏幕上。
-
例
-
-
2号功能调用:显示一个字符
-
功能
- 功能:单字符输出。即将以DL寄存器内容为ASCII码值的ASCi字符输出到屏幕上。
-
入口参数:DL=要显示字符的ASCII码值
-
出口参数:无
-
格式
- MOV DL,要显示的字符 MOV AH,2 INT 21H
-
说明
- 掌握的回车符和换行符的使用
-
例
-
-
9号功能调用
-
显示字符串
-
入口:字符串首址→DS:DX‘$’作结束符
-
例
-
-
5号功能调用
-
将DL中字符→打印机
-
例
-
-
-
设置日期与时间
-
2BH功能调用:设置日期 入口:CX/DH/DL:年/月/日 出口:AL=0/OFFH:有效/无效
-
2AH功能调用:取得日期 入口:无 出口:CX/DH/DL:年/月/日
-
2DH功能调用:设置时间 入口:CH/CL/DH/DL:时/分/秒/秒% 出口:AL=0/0FFH:有效/无效
-
2CH功能调用:取得时间 入口:无 出口:CH/CL/DH/DL:时/分/秒/秒%
-
例
-
汇编语言程序的基本结构
基本结构说明
一个汇编语言源程序一般具有代码段、数据段、堆栈段和附加段。8086允许同时使用四个段。在程序中,只有代码段是必需段,其他段都为可选段。在实地址模式下,每个段的大小为小于等于64KB;
ASSUME伪指令只说明各段寄存器和逻辑段的关系,开没有为段寄存器赋值。因此,在源程序中,除代码段CS和堆栈段SS(在组合类型中选择了STACK参数)外,其他定义的段寄存器由用户在代码段起始处进行段基址装入。
源程序代码段中都必须含自及回DU上尔分时下础.止当前程序,使其正确返回DOS状态的方法有以下几种:
- 采用DOS功能调用中的4CH号功能调用。
- 采用标准程序法,适用于定义为FAR的过程中
- 利用DOS的0号功能
- 利用20H号软中断调用
汇编程序设计基本步骤
与高级语言程序设计类似,用汇编语言进行程序设计同样按以下步骤进行:
- 分析问题,建立数学模型。
- 确定算法。
- 编制程序流程图。
- 编写程序。
- 上机调试。
汇编语言程序设计
顺序程序设计
-
完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构。
-
主要用到数据传送类指令、算术运算类指令、逻辑运算和移位类指令
-
例
-
两双字的二进制数加法。在内存的First和 Second开始的区域中分别存放着2F365H和5E024 H两个数,要求求其和,并存入Third中。
-
循环程序设计
-
两种结构
-
至少执行一次循环体用于次数固定的程序
-
例
-
例:下列程序执行后,AL、BL、CX和DX寄存器内容分别是多少?
-
-
分支程序设计
-
例
-
例:将BX中的16进制数转换为ASCII,存放到BUF开始的单元中,并显示出来。(十六进制数一ASCH)
-
例:AX寄存器中有一个16位二进制数,统计其中1的个数,并存入CL中。
-
比较两个字符串
-
子程序设计
-
子程序(过程)调用应处理好三个问题:
-
保护断点:CS, IP入栈及出栈(CPU自动完成)
-
保护现场:子程序中用到的寄存器/存储单元需保护
-
参数传递:
- 寄存器传递:速度快,参数少
- 存储器传递
- 堆栈传递
-
-
寄存器传递参数
-
名称:BCD2BIN
-
功能:将一个字节BCD码
-
转换成二进制数
-
使用寄存器:CX
-
入口参数:AL存放两位BCD码
-
出口参数:AL存放二进制数
-
调用其它子程序:无
-
-
存储单元传递参数
-
数据段定义两个数组,分别求两数组元素之和(不计溢出)
-
宏汇编
独立程序段,定义后可被调用,与子程序相似
宏定义
-
格式:宏名 MACRO[形式参数1,形参2,...] 又称哑元,可有1个/多个/无
宏调用
- 格式:宏名[实际参数1,实参2,...] 又称实元,个数、顺序、类型与哑元一 一对应
宏展开
- 汇编时对每个宏展开
例
宏与子程序的区别
宏执行速度快
- 子程序CALL/RET需入栈/出栈操作
宏使用灵活
- 子程序仅入口参数可变,而宏的哑元形式多样
宏占内存多
- 子程序只占一段空间;宏调用多少次,就插入/展开多少次