第二章8086微处理器与汇编语言(下).ppt_第1页
第二章8086微处理器与汇编语言(下).ppt_第2页
第二章8086微处理器与汇编语言(下).ppt_第3页
第二章8086微处理器与汇编语言(下).ppt_第4页
第二章8086微处理器与汇编语言(下).ppt_第5页
已阅读5页,还剩174页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理及其应用,普通高等教育“十一五”国家级规划教材,作者 丁新民,2007年5月,第二章 8086微处理器与汇编语言 (下),学习目标,1、识记80X86汇编语言指令集、伪指令和宏、MASM表达式。 2、理解程序设计中顺序、分支、循环、子程序的基本结构,以及实现方法。 3、识记汇编语言编程、上机调试的基本方法。 4、识记DOS功能调用和BIOS中断调用的方法和应用,以及混合编程的概念。,2.3 指令系统 2.4 汇编语言 2.5 汇编语言程序设计 2.6 系统功能调用 2.7 宏指令、条件汇编及上机过程 2.8 模块化程序设计与混合编程,第二章微处理器与汇编语言(下),1. 传送类指令 2

2、. 算术运算类指令 3. 位操作类指令 4. 串操作指令 5. 循环和转移指令 6. 子程序的调用和返回指令 7. 输入输出指令,三、指令系统,第一节 传送类指令,1. 传送类指令,(1)数据传送指令 格式:MOV DEST,SRC; 即DEST(SRC)。 MOV指令对标志寄存器各位无影响。MOV指令的数据传送方向如图2-3-1所示。,1. 传送类指令,(2)交换指令 格式:XCHG DEST,SRC; 即(DEST)(SRC)。 指令对标志寄存器各位无影响。如图2-3-2所示。 (3)堆栈操作指令 进栈指令 格式:PUSH SRC; 即SP=(SP)- 2,SP (SRC)。 退栈指令 格

3、式:POP DEST; 即DEST(SP),SP =(SP)+ 2。 堆栈指令对标志寄存器的各位无影响。,1. 传送类指令,(4)标志传送指令 取标志寄存器指令 格式:LAHF 把标志寄存器的低8位传送给AH寄存器。指令执行后对标志寄存器的各位无影响。 存储标志寄存器 格式:SAHF 把寄存器AH中第7、6、4、2和0位分别送入标志寄存器的SF、ZF、AF、PF、CF标志位。标志寄存器的其他位均不受影响。,1. 传送类指令,(4)标志传送指令(续) 标志位进栈 格式:PUSHF 将标志寄存器压入堆栈。标志寄存器中各标志位本身不受影响。 标志位出栈 格式:POPF 将堆栈顶部的内容弹入标志寄存器

4、。,1. 传送类指令,(5)地址传送指令 装入有效地址 格式:LEA DEST,SRC 指令对标志寄存器各位无影响。 装入地址指针 格式:LDS DEST,SRC 或 LES DEST,SRC 把寄存器AH中第7、6、4、2和0位分别送入标志寄存器的SF、ZF、AF、PF、CF标志位。标志寄存器的其他位均不受影响。,第二节 算术运算类指令,2. 算术运算类指令,(1)加法类指令 加法指令 格式:ADD DEST,SRC; 即DEST(DEST)+(SRC)。 相加结果影响标志寄存器的CF、PF、AF、ZF、SF和OF。 带进位加法指令 格式:ADC DEST,SRC 即DEST(DEST)+(

5、SRC)+CF 相加结果影响标志寄存器的CF、PF、AF、ZF、SF和OF。,2. 算术运算类指令,(1)加法类指令(续) 加“1”指令 格式: INC DEST 执行结果设置标志寄存器中的PF、AF、ZF、SF和OF,但不影响CF。 ASCII加法校正指令 格式: AAA (无操作数) 受影响的标志位有AF、CF 。,2. 算术运算类指令,(1)加法类指令(续) 十进制加法校正指令 格式:DAA (无操作数) 受影响的标志位有AF、CF、SF、ZF和PF。 (2)减法类指令 减法指令 格式:SUB DEST,SRC; 即DEST(DEST)-(SRC)。 受影响的标志位有CF、PF、AF、Z

6、F、SF和OF。,2. 算术运算类指令,(2)减法类指令(续) 带借位减法指令 格式:SBB DEST,SRC 受影响的标志位有CF、PF、AF、ZF、SF和OF 。 减“1”指令 格式:DEC DEST 执行结果设置标志寄存器中的PF、AF、ZF、SF和OF,但不影响CF。,2. 算术运算类指令,(2)减法类指令(续) ASCII减法校正指令 格式:AAS (无操作数) 受影响的标志位有AF、CF 。 十进制减法校正指令 格式:DAS (无操作数) 受影响的标志位有AF、CF、SF、ZF和PF。 求负数指令 格式:NEGDEST 受影响的标志位有PF、AF、ZF、SF、CF和OF。,2. 算

7、术运算类指令,(3)乘法类指令 无符号乘法指令 格式:MUL SRC 受影响的标志位有CF和OF 。 带符号整数乘法指令 格式:IMUL SRC 受影响的标志位有CF和OF 。,2. 算术运算类指令,(4)除法类指令 无符号除法指令 格式:DIV SRC 带符号除法指令 格式:IDIV SRC (5)字节/字扩展指令 格式:CBW (无操作数) 或 CWD (无操作数),第三节 位操作类指令,3. 位操作类指令,(1)逻辑运算指令 逻辑与指令:AND DEST,SRC 逻辑或指令:OR DEST,SRC 逻辑异或指令:XOR DEST,SRC 逻辑非指令:NOT,3. 位操作类指令,(2)测试

8、指令 格式:TEST DEST,SRC; 即(DEST)(SRC) 受影响的标志位与AND指令完全相同。 (3)移位/循环移位指令 算术移位 算术左移:SAL DEST,COUNT 算术右移:SAR DEST,COUNT 逻辑移位 逻辑左移:SHL DEST,COUNT 逻辑右移:SHR DEST,COUNT,3. 位操作类指令,(3)移位/循环移位指令(续) 循环移位 循环左移:ROL DEST,COUNT 循环右移:ROR DEST,COUNT 带进位循环左移:RCL DEST,COUNT 带进位循环右移:RCR DEST,COUNT,3. 位操作类指令,(3)移位/循环移位指令(续) 上

9、述八条指令的操作如图2-3-5所示。,第四节 串操作指令,4. 串操作指令,(1)取串指令 格式:LODS 源串 对标志寄存器无影响 。 (2)存串指令 格式:STOS目的串 对标志寄存器无影响 。 (3)串传送指令 格式:MOVS 目的串,源串 对标志寄存器无影响 。,4. 串操作指令,(4)串比较指令 格式:CMPS 源串,目的串 对标志寄存器无影响 。 (5)串搜索指令 格式:STOS目的串 对标志寄存器有影响,与减法指令相似 。 (6)重复前缀指令 格式:REP 对标志位ZF有影响 。,第五节 循环和转移指令,5. 循环和转移指令,(1)转移指令 无条件转移指令 格式:JMPDEST

10、段内转移时,JMP指令和要转移的“目标”指令属同一个段。 段间转移是转移到另一个代码段。因此,要修改CS和IP。,5. 循环和转移指令,(1)转移指令(续) 条件转移指令 基本格式:JXX DEST “J”后面的“XX”是指“条件”。这类指令有18条,转移距离只能在-128+127个字节之间。 不影响标志寄存器各位。,5. 循环和转移指令,(1)转移指令(续) 条件转移指令(续) 简单条件转移指令,5. 循环和转移指令,(1)转移指令(续) 条件转移指令 (续) 无符号数条件转移指令 带符号数条件转移指令,5. 循环和转移指令,(2)比较指令 格式:CMP DEST,SRC 受影响的标志位与减

11、法指令相似 。 (3)循环指令 LOOP指令 格式:LOOPDEST LOOPE/LOOPZ指令 格式:LOOPE DEST 或 LOOPZ DEST,5. 循环和转移指令,(3)循环指令(续) LOOPNE/LOOPNZ指令 格式:LOOPNE DEST 或 LOOPNZ DEST JCXZ指令 格式:JCXZDEST,第六节 子程序的调用和返回指令,6. 子程序的调用和返回指令,(1)子程序调用指令 格式:CALL 过程名 不影响标志寄存器各位。 (2)返回指令 一般返回指令 格式:RET 带弹出值的返回指令 格式:RETn ;n总是偶数,第七节 输入输出指令,7. 输入输出指令,(1)输

12、入指令 格式:IN OPRN1,OPRN2 OPRN1是累加器,OPRN2是端口地址。 (2)输出指令 格式:OUT OPRN1,OPRN2 OPRN1是端口地址,OPRN2是累加器。,1. 汇编语言语句的种类及其格式 2. 汇编语言数据 3. 符号定义语句 4. 表达式与运算符 5. 程序的段结构 6. 过程定义伪指令 7. 定位伪指令和当前位置计数器 8. 连接伪指令 9. 标题伪指令,四、汇编语言,第一节 汇编语言语句的种类及格式,1. 汇编语言语句的种类及格式,(1)指令语句 每一条指令语句在汇编时,都要产生一个可供执行的目标代码,所以这种语句又叫可执行语句。格式如图2-4-1所示。

13、标号,以冒号“:”作为结束符。 指令助记符,不可省略的主要成分。 操作数,可以有多个,用逗号“,” 隔开。 注释,以分号“;”为开始。,1. 汇编语言语句的种类及格式,(2)伪指令语句 伪指令本身不产生目标代码。其格式如图2-4-2所示 符号名,不得用冒号“:” 。 伪指令,不可省略的主要成分。 操作数,可以有多个,用逗号“,” 隔开。 注释,以分号“;”为开始。,1. 汇编语言语句的种类及格式,(3)标识符 指令语句中的标号和伪指令语句中的符号名统称为标识符。其组成规则如下: 字符个数:131。 第一个字符必须是字母、问号“?”、“”、下划线“_”中的一个。 从第二个字符开始,可以是字母、问

14、号“?”、“”、数字或下划线“_”中的一个。 不能使用系统专用保留字。,第二节 汇编语言数据,2. 汇编语言数据,(1)常数 二进制数:以字母B结尾的数字序列。 八进制数:以字母O结尾的数字序列。 十六进制数:以字母H结尾的序列。 十进制数:以字母D结尾的数字序列。 实数:包含整数、小数和指数三个部分, 字符串常数:用引号括起来的一个或多个字符。,2. 汇编语言数据,(2)变量 变量代表存放在存储单元的数据,在程序运行时可修改。变量定义的格式如下:, 变量的属性 段属性(SEG) 偏移量属性(OFFSET) 类型属性(TYPE),2. 汇编语言数据,(2)变量(续) 表达式 数值表达式 ?表达

15、式,表示可预置任何内容 字符串表达式 必须是用单引号括起来,不超过255个字符。例如: STRING DBABCDEF,2. 汇编语言数据,(2)变量(续) 带DUP表达式 DUP是定义重复数据操作符。格式如下: 表达式1是重复次数,表达式2是重复的内容。例如: D_STR DB 10H DUP(ABCD),2. 汇编语言数据,(3)标号 标号是一条指令目标代码的符号地址。具有以下三个属性: 段属性(SEG) 偏移量属性(OFFSET) 距离属性(DISTANCE),分为NEAR和FAR两类。,第三节 符号定义语句,3. 符号定义语句,(1)等值语句 格式:符号 EQU 表达式 (2)等号语句

16、 格式:符号=表达式,第四节 表达式与运算符,4. 表达式与运算符,(1)算术运算符 表2-4-1列出的算术运算符。,4. 表达式与运算符,(2)逻辑运算符 表2-4-2列出的逻辑运算符。 例如: MOV AX,NOT 0F0H MOV AL,NOT 0A3H,4. 表达式与运算符,(3)关系运算符 表2-4-3列出的关系运算符。,4. 表达式与运算符,(4)数值返回运算符 格式:运算符变量名或标号 SEG运算符 OFFSET运算符 TYPE运算符 LENGTH运算符 SIZE运算符,4. 表达式与运算符,(5)属性修改运算符 PTR运算符 格式:类型 PTR 地址表达式 HIGH/LOW运算

17、符 格式:HIGH 表达式 或 LOW 表达式,第五节 程序的段结构,5. 程序的段结构,(1)段定义伪指令 格式: 段名 SEGMENT 定位类型组合类型类别名 语句 ;本段语句序列(程序或数据) 段名 ENDS 段名 定位类型 PAGE(页),表示本段从内存一个页的边界开始。 PARA(节),如果用户未选择定位类型,则隐含为PARA。,5. 程序的段结构,(1)段定义伪指令(续) 定位类型(续) WORD(字),表示本段从一个偶字节地址开始。 BYTE(字节),表示本段起始单元可以从任一地址开始。 组合类型 NONE:这是隐含选择。 PUBLIC:在满足定位类型的前提下,本段与同名段连接,

18、形成一个公用的段基址。,5. 程序的段结构,(1)段定义伪指令(续) 组合类型(续) COMMON:产生一个覆盖段。 STACK:把所有同名堆栈段连接成一个连续段,首址作为SS初始值,并初始化SP。 AT 表达式:表示本段可定位在表达式所指示的小节边界上。 MEMORY:表示本段可定位在所有其它段的最高地址。,5. 程序的段结构,(2)段寻址伪指令 ASSUME伪指令,格式如下: ASSUME 段寄存器名:段名,段寄存器名:段名, 设置删除 例如: ASSUME ES:NOTHING 删除全部设置 例如: ASSUME NOTHING,5. 程序的段结构,(3)段寄存器的装入 段寄存器的装入,

19、例如: MOV AX,DATA1 ;假定DATA1为段基值 MOV DS,AX MOV ES,AX SS的装入,例如: ASSUME CS:CODE,SS:STACK1 ;命令指派 或者 MOV AX,STACK1 ;取STACK1地址 MOV SS,AX,第六节 过程定义伪指令,6. 过程定义伪指令,过程定义伪指令格式如下: 过程名 PROC (NEAR/FAR) RET 过程名 ENDP 与标号类似,它也有段、偏移量和距离三个属性。,第七节 定位伪指令和当前位置计数器,7. 定位伪指令和当前位置计数器,定位伪指令ORG,语句格式: ORG表达式 表示把表达式的值赋给当前位置计数器;表达式给

20、定的值作起始偏移量。符号“$”代表当前位置计数器的现行值。例如: DATA SEGMENT ORG 30H DB1 DB 12H,23H ORG $+20H STRING DBABCDEFGHI COUT EQU $-STRING DATA ENDS,第八节 连接伪指令,8. 连接伪指令,(1)共用符号伪指令 格式:PUBLIC (符号名1,符号名2,) (2)引用符号伪指令 格式:EXTRN (符号名1:类型,符号名2:类型,) (3)插入伪指令 格式:INCLUDE (模块名) (4)合段伪指令 格式:组名 GROUP (段名1,段名2,段名3,),第九节 标题伪指令,9. 标题伪指令,格

21、式: TITLE 文本 给程序指定一个标题,以便在列表文件中的每一页的第一行都显示这个标题。该伪指令的文本可以是用户任意选用的名字或字符串,但字符不得超过60个。,1. 顺序程序设计 2. 分支程序设计 3. 循环程序设计 4. 子程序设计,五、汇编语言程序设计,第一节 顺序程序设计,1. 顺序程序设计,与高级语言程序一样,无论程序是复杂还是简单,其基本结构形式有四种,即顺序结构、分支结构、循环结构和子程序。 汇编语句程序设计时,都要有下列步骤: 分析问题,建立数学模型,确定算法 画出程序流程图 合理分配存储空间和寄存器 编制程序 调试和执行程序,1. 顺序程序设计,顺序程序是最简单,也是最基

22、本的一种程序结构形式。它从开始到结尾一直是顺序执行的,中途没有分支。 例:编制一程序,求出下列公式中x=3时,y的值。 =64+53+22+7+8 由于本题运算的结果大于256,所以采用字运算。另外,尽量利用寄存器进行运算。 为使运算方便,可对上式进行变换,得: =(6+5)+2+7+8,1. 顺序程序设计,画出程序框图如图2-5-2所示。编写的源程序为: SSEG SEGMENT STACK STA DW 100 DUP(?) SSEG ENDS DSEG SEGMENT Y DW 0 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG, SS:SS

23、EG BAA:MOV AX,DSEG MOV DS,AX MOV AX,3,1. 顺序程序设计,MOV BX,3 MOV CX,6 MUL CX ADD AX,5 MUL BX ADD AX,2 MUL BX ADD AX,7 MUL BX ADD AX,8 MOV Y,AX MOV AH,4CH INT 21H CSEG ENDS END BAA,第二节 分支程序设计,2. 分支程序设计,分支程序有完全分支和不完全分支两种结构,如图2-5-3所示。分支程序判定的条件,是根据算术或逻辑运算的结果对标志位的影响,以决定执行的分支。一般采用条件转移指令完成,如JXX指令。,2. 分支程序设计,(1

24、)利用比较转移指令实现分支 例:有符号函数 假定任意给定的值存放在XX单元,函数值存放在YY单元,那么根据的不同取值,赋给y的程序如下: DATA SEGMENT XX DB ? YY DB ? DATA ENDS,2. 分支程序设计,(1)利用比较转移指令实现分支(续) STACK SEGMENT PARA STACKSTACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AL,XX CMP AL,0 JGE BIGR ;x0,转移至

25、BIGR处执行 MOV AL,0FFH ;x0,则赋给-1的补码值 JMP EQUL ;转移至EQUL处执行,2. 分支程序设计,(1)利用比较转移指令实现分支(续) BIGR:JE EQUL ;x=0,转移至EQUL处执行 MOV AL,1 ;x0,则赋给1的补码值 EQUL:MOV YY,AL ;将各值存入YY单元 MOV AH,4CH INT 21H CODE:ENDS END START 本例中,CMP AL,0指令可以用SUB AL,0、OR AL,AL或AND AL,AL指令代替,因为执行这些指令都可以影响标志位。,2. 分支程序设计,(2)利用跳转表实现分支 跳转表可以放在内存中

26、,表中存放一系列跳转地址、跳转指令或关键字等。表中的第一个单元的地址称作表基地址,要查找的元素在表中的地址叫表地址。表地址相对于基地址的偏差字节数称为偏移量。 许多键盘管理程序和应用程序,经常要用到跳转表。在这些跳转表中存放的可以是跳转地址,也可以是跳转指令。例如8086/8088就是将中断向量以表的形式存放于内存中的。,2. 分支程序设计,(2)利用跳转表实现分支 例:某工厂八种产品的加工程序R0R7分别存放在以SBR0、SBR1、SBR7为首地址的内存区域中,而这八个首地址偏移量连续存放在以BASE为首地址的跳转表中,如图2-5-4所示。,假设八种产品的编号分别为0、1、7。如果已知目前要

27、加工的产品的编号,若要编写一段程序,利用此跳转表自动转入该种产品的,2. 分支程序设计,(2)利用跳转表实现分支(续) 加工程序,并根据已知的编号从表中查出该种产品加工程序的入口地址,这就要求出该种产品对应的表地址。 表地址=表基地址+偏移量。 其中,表基地址是已知的。通过分析表达结构可知:偏移量可由产品编号乘以2求得。根据这种思路,可画出流程图如图2-5-5所示。并编制程序如下: DATA SEGMENT BASE DW SBR0,SBR1,SBR2,SBR3,SBR4,SBR5,SBR6,SBR7,2. 分支程序设计,(2)利用跳转表实现分支(续) BN DB ? DATA ENDS ST

28、ACK SEGMENT PARA STACKSTACK DB 100 H DUP(?) STACK ENDS COSEG SEGMENT ASSUME CS:COSEG,DA:DATA START PROC FAR PUSH DS MOV AX,0 PUSH AX,2. 分支程序设计,(2)利用跳转表实现分支(续) MOV AX,DATA MOV DS,AX MOV AL,BN MOV AH,0 MOV BX,OFFSET BASE ADD BX,AX MOV AX,BX JMP AX RET START ENDP COSEG ENDS END START,2. 分支程序设计,(3)根据关键字

29、分支 例:有一台主机为八台外设服务,为每台外设服务的程序已经编好,并已分别存放在以首址为SR0、SR1、 、SR7的主机的内存中,每一条连接线与主机的寄存器相连,如图2-5-6所示。,2. 分支程序设计,(3)根据关键字分支(续) 平时所有连接线上均为“0”信号,当其中一台(且同一时刻只许一台)外设要求为之服务时,就在其连接线上发出“1”信号,这样,由主机寄存器中的内容(称为关键字)就可以得知是那台外设要求服务,关键字与外设的对应关系如下:,2. 分支程序设计,(3)根据关键字分支(续) 为了使机器可以根据关键字的值转到相应的服务程序上,同样要在内存中造一张表,存放关键字的值和与其对应的外设服

30、务程序入口地址,如图2-5-7所示,表的首地址为BASE。,2. 分支程序设计,(3)根据关键字分支(续) 现设主机中寄存器的端口地址是5FH,那么,根据从寄存器中获得的关键字,并利用跳转表,可画出实现分支的程序流程图如图2-5-8所示。具体程序如下: DATA SEGMENT BASE DB 1 ;关键字 DW SR0 ;外设服务程序入口入口地址 DB 2 DW SR1 DB 4 DW SR2,2. 分支程序设计,(3)根据关键字分支(续) DB 80H DW SR7 DATA ENDS STACK SEGMENT DB 100H DUP(?) STACK ENDS CODE SEGMENT

31、 ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0,2. 分支程序设计,(3)根据关键字分支(续) PUSH AX MOV AX,DATA MOV DS,AX LOP:IN AL,5FH CMP AL,0 JE LOP MOV BX,OFFSET BASE RSH:CMP AL,BX JE BRCH INC BX INC BX INC BX,2. 分支程序设计,(3)根据关键字分支 (续) JMP RSH BRCH:MOV CX,BX+1 JMP CX SR0: RET SR1: RET ,2. 分支程序设计,(3)

32、根据关键字分支(续) SR7: RET START:ENDP END START,第三节 循环程序设计,3. 循环程序设计,(1)循环程序的组成部分 循环程序结构由五部分组成。 初始化部分:为循环作准备工作,包括建立指针,置计数器,设置其它变量的初值等。 循环体:是循环的主体,完成循环操作。 修改部分:修改一些继续循环所需要的参数。 控制部分:用来修改计数器、查看循环条件、决定控制是否继续进行等。 结束处理:对循环结束处理,如存储结果。,3. 循环程序设计,(2)循环程序的基本结构形式 “先执行、后判断”结构 进入这种循环体,先执行一次循环体后,再判断循环是否结束。如图2-5-9所示。 “先判

33、断、后执行”结构 进入这种循环体,首先判断循环结束的条件,再根据判断的结果,决定是否执行循环体。如图2-5-10所示。,3. 循环程序设计,(3)循环控制方法 用计数控制循环 只要编制程序时,循环次数已知,就可以使用这种循环方法设计程序。 例:将16位带符号的二进制数转换成十进制数,并将十进制数的ASCII码存入存储器字节单元中。 首先分析题意,确定本题的解题步骤是:首先处理符号;其次将二进制数转换成十进制数(二翻十);最后把BCD码变成ASCII数字。,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) 程序流程图,如图2-5-11所示。源程序如下: DATA SEGMENT

34、 COUNT DW 10000,1000,100,10,1 BINARY DW 7FFFH BUF DB 6 DUP(?) DATA ENDS STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS CODE SEGMENT,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,BINARY ;取二进制数 OR AX,AX JNS PLUS ;数为负吗? NEG AX ;求绝对值 MOV BUF, ;“”送BUF JMP SHORT

35、,CUD PLUS:MOV BUF,+ ;“+”送BUF CUD:MOV SI,1,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) MOV CX,5 MOV BX,OFFSET CONT ;取首地址 CUDL:CWD ;AX符号扩展到DX DIV WORD PTR BX ADD AL,30H ;AX变换成ACSII码 MOV BUFSI,AL ;存入BUF+SI INC SI ;修改SI MOV AX,DX ;余数DX送AX ADD BX,2 ;修改BX值 LOOP CUDL ;CX-1=0?否,转CUDL,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续)

36、 MOV AX,4CH ;返回DOS INT 21H CODE ENDS END START 用条件控制循环 与问题中的某些条件有关,可以通过指令来测试。若测试比较的结果表明满足循环条件,则继续循环,否则结束循环。,3. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续) 例:在一串字符串中查找某一关键字,如果查到,则记下存放该关键字的偏移地址;若未找到,则将送标志单元。程序流程图如图2-5-12所示。源程序如下: STACK SEGMENT PARA STACK STACK DW 50 DUP(?) TOPS LABEL WORD STACK ENDS DATA SEGMENT,3

37、. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续) CHAR EQU $ STRING DBTHIS IS A $ OF STRING COUNT EQU $STRING FLAGDW? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET STRING MOV AL,CHAR,3. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续) MOV CX,COUNT LOP:CMP AL,SI JE FOUND INC SI DEC CX JNZ LOP

38、MOV FLAG,1 JMP L FOUND:MOV FLAG,SI L:NOP CODE:ENDS END START,第四节 子程序设计,4. 子程序设计,(1)编制子程序的基本要求 子程序要有一定的通用性 编制的子程序的功能具有一定的通用性,以适合较多的使用场合。 选用适当的方法在主程序与子程序之间进行参量传递 传递参量的方法通常有三种:寄存器传递参量,存储单元传递参量和堆栈传递参量。 注意信息的保存 。 正确使用堆栈 。,4. 子程序设计,(2)子程序设计举例 例:将两个给定的二进制数转换成二进制数表示的ASCII码。 DATA SEGMENT BIN1 DB 35H BIN2 DW

39、0AB48H ASCBUF DB 20H DUP(?) DATA ENDS STACK1 SEGMENT PARASTACK DW 20H DUP(?) STACK1 ENDS COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1,4. 子程序设计,(2)子程序设计举例(续) START:MOV AX,DATA MOV DS,AX MOV DX,0 MOV DH,BIN1 ;待转换数在DX中 LEA DI,ASCBUF ;存放ASCII码首址 MOV AX,8 ;转换二进制位数 PUSH DI ;保留信息 CALL BINASC ;调用转换子程序 PO

40、P DI ;恢复信息 MOV DX,BIN2 ;待转换数在DX中 ADD DI,10H ;存放ASCII码首址 MOV AX,10H ;转换二进制位数 CALL BINASC ;调用转换子程序 MOV AH,4CH ;返回DOS,4. 子程序设计,(2)子程序设计举例(续) INT 21H ;转换子程序 BINASC PROC MOV AX,AX LOP:ROL DX,1 ;取一位二进制数 MOV AL,DL AND AL,1 ADD AL,30H ;构成相应的ASCII码 MOV DI,AL ;存结果 INC DI LOOP LOP RET BINASC ENDP COSEG ENDS EN

41、D START,1. DOS系统功能调用 2. BIOS中断调用,六、系统功能调用,第一节 DOS系统功能调用,1. DOS系统功能调用,调用DOS系统功能,需要采用软中断指令:INT n,遵照如下调用方法: 送入口参量给指定寄存器。 AH功能号。 INT 21H。 DOS系统根据给出的信息,自动转入相应的子程序去执行。调用结束后,出口参数在指定的寄存器或存储单元中。,1. DOS系统功能调用,(1)键盘输入(1号调用) 等待从标准输入设备输入一个字符,并送入寄存器AL,不需入口参数。例: MOV AH,1 INT 21H (2)不带显示的键盘输入(8号调用) 与1号调用类同,只是不在屏幕上显

42、示输入的字符。 (3)打印输出(5号调用) 将DL中的字符输出到打印机上。例如:,1. DOS系统功能调用,MOV DL,A MOV AH,5 INT 21H (4)直接输入和输出(6号调用) 6号功能即可以执行键盘输入操作,也可以向屏幕上输出字符。并且不检查Ctrl+Break,由DL寄存器的内容决定。 (DL)=0FFH时,表示从键盘输入。 若键盘已输入字符,则字符的ASCII码在AL中,且标志位ZF为“0”。若没有键按下,则ZF为“1”。例如:,1. DOS系统功能调用,(4)直接输入和输出(6号调用) CHAR_IN:MOV DL,0FFH ;置输入标志 MOV AH,6 INT 21

43、H JZ CHAR_IN ;等待键盘输入 (DL)=0FEH时,表示显示输出。 这时显示输出字符的ASCII码在DL中,如同2号功能。例如在屏幕上显示美元符号“$”。 MOV DL,24H MOV AH,6 INT 21H,1. DOS系统功能调用,(5)不带显示的键盘字符输入(7号调用) 与1号功能类似,它仅等待键盘输入一个字符,并将字符的ASCII码送入AL中,但按下Ctrl+C组合键和TAB制表键无反应。调用方法如下: MOV AH,7 INT 21H (6)输出字符串(9号调用) 调用时,要求DS:DX须指向内存中一个以“$”作为结束标志的字符串。字符串中每一个字符(不包括$)都要输出

44、显示或打印。如:,1. DOS系统功能调用,(6)输出字符串(9号调用) DATA SEGMENT BUF DB HOW DO YOU DO? $ DATA ENDS CODE SEGMENT MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,9 INT 21H CODE ENDS,1. DOS系统功能调用,(7)字符串输入(0A号调用) 从键盘接收字符串到内存输入缓冲区。要求先定义输入缓冲区,缓冲区内第一个字符指出缓冲区能容纳的字符个数,不能为零。第二个字节保留,用以作填写输入字符的个数。从第三个字节开始存放从键盘上接收的字符,直到Enter键结束

45、。若实际输入的字符个数少于定义的字节数,缓冲区内其余字节填零;若多于定义的字节个数,则后来输入的字符丢掉,且铃响。调用时,要求DS:DX指向输入缓冲区的首地址,例如:,1. DOS系统功能调用,(7)字符串输入(0A号调用) DATA SEGMENT BUF DB 50 ;缓冲区长度 DB ? ;保留为填入实际字符个数 DB 50 DUP(?) ;定义50个字节存储空间 DATA ENDS CODE SEGMENT MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,0AH INT 21H CODE ENDS,1. DOS系统功能调用,(8)异步通信口

46、输入(03H) 从标准异步通信接口等待输入一个字符,然后送到寄存器AL中。启动时DOS把一个异步通信端口初始化为2400波特,字长为8位,1位停止位,不设奇偶校验位。 (9)异步通信口输出(04H) 将DL中的数据被输出到异步通信口。关于异步通信口的输入/输出,推荐使用ROM BIOS中断调用14H。,1. DOS系统功能调用,(10)设置日期(2BH) 调用2BH功能时,CX:DX中必须有一个有效的日期,CX中存放年份(19802099),DH中存放月份(112),DL中放日期。若日期有效,则设置成功,AL返回00H;否则AL返回0FFH。 例:下列程序可将日期设置为2000年8月4日。 M

47、OV CX,2000H MOV DH,8 MOV DL,4 MOV AH,2BH INT 21H,1. DOS系统功能调用,(11)取得日期(2AH) 调用2AH后,返回日期在CX:DX中,为二进制数。CX为年份,DH为月份,DL为日期。如果日时钟转到下一天,日期将自动调整,也考虑每月的天数和闰年。调用不需要入口参数。 (12)设置时间(2DH) 时间格式是四个8位二进制数,即:CH为小时,CL为分,DH为秒,DL为百分之一秒。 要求CX:DX中存放要求的时间。设置成功,AL返回00H,反之,为0FFH。,1. DOS系统功能调用,(13)取得时间(2CH) 时间格式如同2DH功能调用。不需要

48、入口参数。调用结束时,CX:DX中为返回的时间,参数同上。例如: MOV AH,2DH MOV CX,5FH MOV DX,00H INT 21H 将把系统的时间设置为5时15分9秒。 MOV AH,2CH INT 21H,第二节 BIOS中断调用,2. BIOS中断调用,BIOS的主要功能是驱动系统中所配置的常用外设,如显示器、键盘、打印机、磁盘驱动器以及异步通信接口等的控制。 (1)显示器I/O中断调用(10H) 可用INT 10H 调用显示器的驱动程序。该调用共有16种不同功能,编号为015,按AH所置功能不同,完成不同的功能调用。 设置显示方式(功能号0) 入口参数(AH)=0,(AL

49、)=方式(07),出口参数:无。,2. BIOS中断调用,(1)显示器I/O中断调用(10H) 设置光标大小(功能号1) 入口参数:(AH)=1,(CH)=光标开始值,(CL)=光标结束行,出口参数:无。 设置光标位置(功能号2) 入口参数:(AH)=2,(BH)=页号,(DH)=行号,(DL)=列号。出口参数:无。,2. BIOS中断调用,(1)显示器I/O中断调用(10H) 屏幕上滚(功能号6) 入口参数(AH)=6,出口参数:无。其它寄存器参数设置如下: 屏幕下滚(功能号7) 入口参数:(AH)=7,其余同6号功能,只是窗口顶部为空白行。出口参数:无。,2. BIOS中断调用,(1)显示

50、器I/O中断调用(10H) 在当前光标位置写字符和属性(功能号9) 入口参数:(AH)=9,出口参数:无。其它参数设置如下: 在当前光标位置写字符(属性不变)(功能号0AH) 入口参数:(AH)=0AH,除无属性参数外,其余类同9号功能。出口参数:无。,2. BIOS中断调用,(1)显示器I/O中断调用(10H) 设置彩色或背景颜色(功能号0BH) 入口参数:(AH)=0BH,出口参数:无。其它参数设置如下: 在指定光标位置写点(功能号0CH) 入口参数:(AH)=0CH ,出口参数:无。其它参数设置如下:,2. BIOS中断调用,(1)显示器I/O中断调用(10H) 读当前显示状态(功能号0

51、FH) 入口参数:(AH)=0FH,出口参数:无。其它参数设置如下: 例:在第9行第40列的位置显示“方块”(ASCII码为04),要求“方块”为黑色且闪动,背景选为白色(即白底黑字)。 程序清单如下:,2. BIOS中断调用,(1)显示器I/O中断调用(10H) STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START:MOV AH,0 MOV AL,2 INT 10H MOV AH,15 INT 10H MOV DX,0928H MOV AH,2,2. BIOS中断调用,(

52、1)显示器I/O中断调用(10H) INT 10H MOV AL,04 MOV BL,0F0H MOV CX,1 MOV AH,9 INT 9H MOV AH,4CH INT 21H CODE ENDS ENDSTART,2. BIOS中断调用,(2)键盘I/O中断调用(16H) 中断类型号为16H,用指令INT 16H调用。 (AH)=0 从键盘读一个字符到AL中,为ASCII码。 (AH)=1 从键盘缓冲区读字符到AL中,按任一键,ZF为“0”;否则,置ZF为“1”。 (AH)=2 读取特殊功能键的状态,AL中为各特殊功能键的状态。,2. BIOS中断调用,(3)打印机I/O中断调用(17

53、H) 中断类型号为17H,用指令INT 17H调用。规定打印机号在DX中,编号分别是0、1、2。 (AH)=0 将AL中的字符在打印机上打印。入口参数:(AH)=0,(DX)=打印机号,(AL)=字符ASC码。出口参数:AH为打印机状态信息。 (AH)=1 对打印机初始化。入口参数:(AH)=1,(DX)=打印机号,(AL)=初始化命令码。出口参数:AH为打印机状态信息。,2. BIOS中断调用,(3)打印机I/O中断调用(17H) (AH)=2 读取打印机的状态信息。入口参数:(AH)=2,(DX)=打印机号。出口参数:AL中为打印机状态。 例如:打印机上列印字符B的程序片段: MOV AH

54、,0 ;功能号0AH MOV AL,B ;待打印字符B的ASCIIAL MOV DX,0 ;打印机0DX INT 17H ;调用打印机驱动程序 执行后,在0号打印机上打印字符B。,1. 宏指令 2. 条件汇编和重复汇编,七、宏指令、条件汇编及上机过程,第一节 宏指令,1. 宏指令,(1)宏指令的概念 汇编语言程序中,若某段程序需要多次使用,为了避免重复书写,可以用宏指令来代替。 例如:将AL寄存器内容左移4位的指令: MOV CL,R SAL AL,CL 用宏指令代替如下: SHIFT MACRO MOV CL,4 SAL AL,CL ENDM,1. 宏指令,(2)宏定义 宏定义格式如下: 宏

55、指令名 MACRO 语句 ;宏体 ENDM 其中,宏定义名是一个宏定义调用的依据,其规定与标识符相同。 宏定义中的形式参量是调用的替换参数,以逗号分隔可任选;可以没有形式参量。形式参量的个数没有限制,一行不可超过132个字符。,1. 宏指令,(3)宏调用 宏调用格式:宏指令名 实参量表的每一项在宏扩展时,要替换形式参量的相应项,用逗号分隔。实参的个数,无须和宏定义时的形式参量个数相同。实参量和形式参量在形式上必须一一对应,而且遵守先定义后调用的原则。,第二节 条件汇编和重复汇编,2. 条件汇编和重复汇编,(1)重复汇编 这是重复汇编某一语句序列的伪指令。重复汇编伪指令可以出现在宏定义中,也可以单独出现在源程序中。有以下三种: 定重复 格式:REPT 表达式 语句 ;重复语句序列 ENDM 表达式的值就是REPT与ENDM之间的语句序列重复汇编的次数。,2. 条件汇编和重复汇编,(1)重复汇编(续) 不定重复 格式: IRP 形参 语句 ;重复语句序列 ENDM IRP与ENDM之间语句序列的重复次数由实参的个数所确定。每次重复汇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论