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)。 退栈指令格式:POP DE
3、ST; 即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将堆栈顶部的内容弹入标志寄存器。,1. 传送类指令,(5)地址传
4、送指令 装入有效地址格式: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)+(SRC)+CF相加结果影响标志寄存器的CF、
5、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、ZF、SF和OF。,2. 算术运算类指令,(2)减法类指
6、令(续) 带借位减法指令格式: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。 求负数指令格式:NEG DEST受影响的标志位有PF、AF、ZF、SF、CF和OF。,2. 算术运算类指令,(3)乘法类指令 无符号乘法指令格式:MUL SRC
7、受影响的标志位有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)测试指令 格式:TEST DEST,SRC; 即(DEST)(SRC) 受影
8、响的标志位与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)移位/循环移位指令(续) 上述八条指令的操作如图2-3-5所示。,第四节 串操作指令,4. 串操作指令,(1)取串指令
9、 格式:LODS 源串 对标志寄存器无影响 。(2)存串指令 格式:STOS 目的串 对标志寄存器无影响 。(3)串传送指令 格式:MOVS 目的串,源串 对标志寄存器无影响 。,4. 串操作指令,(4)串比较指令 格式:CMPS 源串,目的串 对标志寄存器无影响 。(5)串搜索指令 格式:STOS 目的串 对标志寄存器有影响,与减法指令相似 。(6)重复前缀指令 格式:REP 对标志位ZF有影响 。,第五节 循环和转移指令,5. 循环和转移指令,(1)转移指令 无条件转移指令 格式:JMP DEST 段内转移时,JMP指令和要转移的“目标”指令属同一个段。 段间转移是转移到另一个代码段。因此
10、,要修改CS和IP。,5. 循环和转移指令,(1)转移指令(续) 条件转移指令 基本格式:JXX DEST “J”后面的“XX”是指“条件”。这类指令有18条,转移距离只能在-128+127个字节之间。 不影响标志寄存器各位。,5. 循环和转移指令,(1)转移指令(续) 条件转移指令(续) 简单条件转移指令,5. 循环和转移指令,(1)转移指令(续) 条件转移指令 (续) 无符号数条件转移指令 带符号数条件转移指令,5. 循环和转移指令,(2)比较指令 格式:CMP DEST,SRC受影响的标志位与减法指令相似 。(3)循环指令 LOOP指令 格式:LOOP DEST LOOPE/LOOPZ指
11、令 格式:LOOPE DEST 或 LOOPZ DEST,5. 循环和转移指令,(3)循环指令(续) LOOPNE/LOOPNZ指令 格式:LOOPNE DEST 或 LOOPNZ DEST JCXZ指令 格式:JCXZ DEST,第六节 子程序的调用和返回指令,6. 子程序的调用和返回指令,(1)子程序调用指令 格式:CALL 过程名 不影响标志寄存器各位。(2)返回指令 一般返回指令 格式:RET 带弹出值的返回指令 格式:RET n ;n总是偶数,第七节 输入输出指令,7. 输入输出指令,(1)输入指令 格式:IN OPRN1,OPRN2 OPRN1是累加器,OPRN2是端口地址。 (2
12、)输出指令 格式: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)变量(续) 表达式 数值表达式 ?表达式,表示可预置任何内容 字符串表达式必须是用单引号括起来,不超过255个字符。例如:STRI
15、NG DBABCDEF,2. 汇编语言数据,(2)变量(续) 带DUP表达式 DUP是定义重复数据操作符。格式如下:表达式1是重复次数,表达式2是重复的内容。例如:D_STR DB 10H DUP(ABCD),2. 汇编语言数据,(3)标号 标号是一条指令目标代码的符号地址。具有以下三个属性: 段属性(SEG) 偏移量属性(OFFSET) 距离属性(DISTANCE),分为NEAR和FAR两类。,第三节 符号定义语句,3. 符号定义语句,(1)等值语句 格式:符号 EQU 表达式 (2)等号语句 格式:符号=表达式,第四节 表达式与运算符,4. 表达式与运算符,(1)算术运算符 表2-4-1列
16、出的算术运算符。,4. 表达式与运算符,(2)逻辑运算符 表2-4-2列出的逻辑运算符。例如:MOV AX,NOT 0F0HMOV AL,NOT 0A3H,4. 表达式与运算符,(3)关系运算符 表2-4-3列出的关系运算符。,4. 表达式与运算符,(4)数值返回运算符 格式:运算符变量名或标号 SEG运算符 OFFSET运算符 TYPE运算符 LENGTH运算符 SIZE运算符,4. 表达式与运算符,(5)属性修改运算符 PTR运算符 格式:类型 PTR 地址表达式 HIGH/LOW运算符 格式:HIGH 表达式 或 LOW 表达式,第五节 程序的段结构,5. 程序的段结构,(1)段定义伪指
17、令 格式:段名 SEGMENT 定位类型组合类型类别名语句 ;本段语句序列(程序或数据)段名 ENDS 段名 定位类型 PAGE(页),表示本段从内存一个页的边界开始。 PARA(节),如果用户未选择定位类型,则隐含为PARA。,5. 程序的段结构,(1)段定义伪指令(续) 定位类型(续) WORD(字),表示本段从一个偶字节地址开始。 BYTE(字节),表示本段起始单元可以从任一地址开始。 组合类型 NONE:这是隐含选择。 PUBLIC:在满足定位类型的前提下,本段与同名段连接,形成一个公用的段基址。,5. 程序的段结构,(1)段定义伪指令(续) 组合类型(续) COMMON:产生一个覆盖
18、段。 STACK:把所有同名堆栈段连接成一个连续段,首址作为SS初始值,并初始化SP。 AT 表达式:表示本段可定位在表达式所指示的小节边界上。 MEMORY:表示本段可定位在所有其它段的最高地址。,5. 程序的段结构,(2)段寻址伪指令 ASSUME伪指令,格式如下:ASSUME 段寄存器名:段名,段寄存器名:段名, 设置删除例如:ASSUME ES:NOTHING 删除全部设置 例如:ASSUME NOTHING,5. 程序的段结构,(3)段寄存器的装入 段寄存器的装入,例如:MOV AX,DATA1 ;假定DATA1为段基值MOV DS,AXMOV ES,AX SS的装入,例如: ASS
19、UME CS:CODE,SS:STACK1 ;命令指派或者MOV AX,STACK1 ;取STACK1地址MOV SS,AX,第六节 过程定义伪指令,6. 过程定义伪指令,过程定义伪指令格式如下: 过程名 PROC (NEAR/FAR)RET过程名 ENDP与标号类似,它也有段、偏移量和距离三个属性。,第七节 定位伪指令和当前位置计数器,7. 定位伪指令和当前位置计数器,定位伪指令ORG,语句格式:ORG 表达式 表示把表达式的值赋给当前位置计数器;表达式给定的值作起始偏移量。符号“$”代表当前位置计数器的现行值。例如:DATA SEGMENTORG 30HDB1 DB 12H,23HORG
20、$+20HSTRING DBABCDEFGHICOUT EQU $-STRINGDATA ENDS,第八节 连接伪指令,8. 连接伪指令,(1)共用符号伪指令格式:PUBLIC (符号名1,符号名2,) (2)引用符号伪指令格式:EXTRN (符号名1:类型,符号名2:类型,)(3)插入伪指令格式:INCLUDE (模块名) (4)合段伪指令格式:组名 GROUP (段名1,段名2,段名3,),第九节 标题伪指令,9. 标题伪指令,格式:TITLE 文本 给程序指定一个标题,以便在列表文件中的每一页的第一行都显示这个标题。该伪指令的文本可以是用户任意选用的名字或字符串,但字符不得超过60个。,
21、1. 顺序程序设计 2. 分支程序设计 3. 循环程序设计 4. 子程序设计,五、汇编语言程序设计,第一节 顺序程序设计,1. 顺序程序设计,与高级语言程序一样,无论程序是复杂还是简单,其基本结构形式有四种,即顺序结构、分支结构、循环结构和子程序。汇编语句程序设计时,都要有下列步骤: 分析问题,建立数学模型,确定算法 画出程序流程图 合理分配存储空间和寄存器 编制程序 调试和执行程序,1. 顺序程序设计,顺序程序是最简单,也是最基本的一种程序结构形式。它从开始到结尾一直是顺序执行的,中途没有分支。 例:编制一程序,求出下列公式中x=3时,y的值。=64+53+22+7+8由于本题运算的结果大于
22、256,所以采用字运算。另外,尽量利用寄存器进行运算。为使运算方便,可对上式进行变换,得:=(6+5)+2+7+8,1. 顺序程序设计,画出程序框图如图2-5-2所示。编写的源程序为:SSEG SEGMENT STACK STA DW 100 DUP(?)SSEG ENDSDSEG SEGMENTY DW 0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG, DS:DSEG, SS:SSEGBAA:MOV AX,DSEGMOV DS,AXMOV AX,3,1. 顺序程序设计,MOV BX,3MOV CX,6MUL CXADD AX,5MUL BXADD AX,2MUL B
23、XADD AX,7MUL BXADD AX,8MOV Y,AXMOV AH,4CHINT 21HCSEG ENDSEND BAA,第二节 分支程序设计,2. 分支程序设计,分支程序有完全分支和不完全分支两种结构,如图2-5-3所示。分支程序判定的条件,是根据算术或逻辑运算的结果对标志位的影响,以决定执行的分支。一般采用条件转移指令完成,如JXX指令。,2. 分支程序设计,(1)利用比较转移指令实现分支例:有符号函数假定任意给定的值存放在XX单元,函数值存放在YY单元,那么根据的不同取值,赋给y的程序如下:DATA SEGMENTXX DB ?YY DB ?DATA ENDS,2. 分支程序设计
24、,(1)利用比较转移指令实现分支(续)STACK SEGMENT PARA STACKSTACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AL,XXCMP AL,0JGE BIGR ;x0,转移至BIGR处执行MOV AL,0FFH ;x0,则赋给-1的补码值JMP EQUL ;转移至EQUL处执行,2. 分支程序设计,(1)利用比较转移指令实现分支(续)BIGR:JE EQUL ;x=0,转移至EQUL处执行MOV AL,1 ;x0,则赋给1的
25、补码值EQUL:MOV YY,AL ;将各值存入YY单元MOV AH,4CHINT 21HCODE:ENDSEND START本例中,CMP AL,0指令可以用SUB AL,0、OR AL,AL或AND AL,AL指令代替,因为执行这些指令都可以影响标志位。,2. 分支程序设计,(2)利用跳转表实现分支 跳转表可以放在内存中,表中存放一系列跳转地址、跳转指令或关键字等。表中的第一个单元的地址称作表基地址,要查找的元素在表中的地址叫表地址。表地址相对于基地址的偏差字节数称为偏移量。 许多键盘管理程序和应用程序,经常要用到跳转表。在这些跳转表中存放的可以是跳转地址,也可以是跳转指令。例如8086/
26、8088就是将中断向量以表的形式存放于内存中的。,2. 分支程序设计,(2)利用跳转表实现分支 例:某工厂八种产品的加工程序R0R7分别存放在以SBR0、SBR1、SBR7为首地址的内存区域中,而这八个首地址偏移量连续存放在以BASE为首地址的跳转表中,如图2-5-4所示。,假设八种产品的编号分别为0、1、7。如果已知目前要加工的产品的编号,若要编写一段程序,利用此跳转表自动转入该种产品的,2. 分支程序设计,(2)利用跳转表实现分支(续) 加工程序,并根据已知的编号从表中查出该种产品加工程序的入口地址,这就要求出该种产品对应的表地址。表地址=表基地址+偏移量。其中,表基地址是已知的。通过分析
27、表达结构可知:偏移量可由产品编号乘以2求得。根据这种思路,可画出流程图如图2-5-5所示。并编制程序如下:DATA SEGMENTBASE DW SBR0,SBR1,SBR2,SBR3,SBR4,SBR5,SBR6,SBR7,2. 分支程序设计,(2)利用跳转表实现分支(续) BN DB ?DATA ENDSSTACK SEGMENT PARA STACKSTACKDB 100 H DUP(?)STACK ENDSCOSEG SEGMENTASSUME CS:COSEG,DA:DATA START PROC FARPUSH DS MOV AX,0PUSH AX,2. 分支程序设计,(2)利用跳
28、转表实现分支(续) MOV AX,DATAMOV DS,AXMOV AL,BNMOV AH,0MOV BX,OFFSET BASEADD BX,AXMOV AX,BXJMP AXRETSTART ENDPCOSEG ENDSEND START,2. 分支程序设计,(3)根据关键字分支 例:有一台主机为八台外设服务,为每台外设服务的程序已经编好,并已分别存放在以首址为SR0、SR1、 、SR7的主机的内存中,每一条连接线与主机的寄存器相连,如图2-5-6所示。,2. 分支程序设计,(3)根据关键字分支(续) 平时所有连接线上均为“0”信号,当其中一台(且同一时刻只许一台)外设要求为之服务时,就在
29、其连接线上发出“1”信号,这样,由主机寄存器中的内容(称为关键字)就可以得知是那台外设要求服务,关键字与外设的对应关系如下:,2. 分支程序设计,(3)根据关键字分支(续) 为了使机器可以根据关键字的值转到相应的服务程序上,同样要在内存中造一张表,存放关键字的值和与其对应的外设服务程序入口地址,如图2-5-7所示,表的首地址为BASE。,2. 分支程序设计,(3)根据关键字分支(续) 现设主机中寄存器的端口地址是5FH,那么,根据从寄存器中获得的关键字,并利用跳转表,可画出实现分支的程序流程图如图2-5-8所示。具体程序如下:DATA SEGMENTBASE DB 1 ;关键字DW SR0 ;
30、外设服务程序入口入口地址DB 2DW SR1DB 4 DW SR2,2. 分支程序设计,(3)根据关键字分支(续) DB 80HDW SR7DATA ENDSSTACK SEGMENTDB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0,2. 分支程序设计,(3)根据关键字分支(续) PUSH AXMOV AX,DATAMOV DS,AXLOP:IN AL,5FHCMP AL,0JE LOPMOV BX,OFFSET BASERSH:CMP AL,BXJE
31、 BRCHINC BXINC BXINC BX,2. 分支程序设计,(3)根据关键字分支 (续)JMP RSHBRCH:MOV CX,BX+1JMP CXSR0:RETSR1:RET,2. 分支程序设计,(3)根据关键字分支(续) SR7:RETSTART:ENDPEND START,第三节 循环程序设计,3. 循环程序设计,(1)循环程序的组成部分 循环程序结构由五部分组成。 初始化部分:为循环作准备工作,包括建立指针,置计数器,设置其它变量的初值等。 循环体:是循环的主体,完成循环操作。 修改部分:修改一些继续循环所需要的参数。 控制部分:用来修改计数器、查看循环条件、决定控制是否继续进行
32、等。 结束处理:对循环结束处理,如存储结果。,3. 循环程序设计,(2)循环程序的基本结构形式 “先执行、后判断”结构进入这种循环体,先执行一次循环体后,再判断循环是否结束。如图2-5-9所示。 “先判断、后执行”结构进入这种循环体,首先判断循环结束的条件,再根据判断的结果,决定是否执行循环体。如图2-5-10所示。,3. 循环程序设计,(3)循环控制方法 用计数控制循环 只要编制程序时,循环次数已知,就可以使用这种循环方法设计程序。 例:将16位带符号的二进制数转换成十进制数,并将十进制数的ASCII码存入存储器字节单元中。首先分析题意,确定本题的解题步骤是:首先处理符号;其次将二进制数转换
33、成十进制数(二翻十);最后把BCD码变成ASCII数字。,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) 程序流程图,如图2-5-11所示。源程序如下:DATA SEGMENTCOUNT DW 10000,1000,100,10,1BINARY DW 7FFFHBUF DB 6 DUP(?)DATA ENDSSTACK SEGMENT STACKDB 256 DUP(?)STACK ENDSCODE SEGMENT,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,
34、AXMOV AX,BINARY ;取二进制数OR AX,AXJNS PLUS ;数为负吗?NEG AX ;求绝对值MOV BUF, ;“”送BUFJMP SHORT,CUDPLUS:MOV BUF,+ ;“+”送BUFCUD:MOV SI,1,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) MOV CX,5MOV BX,OFFSET CONT ;取首地址CUDL:CWD ;AX符号扩展到DXDIV WORD PTR BXADD AL,30H ;AX变换成ACSII码MOV BUFSI,AL ;存入BUF+SIINC SI ;修改SIMOV AX,DX ;余数DX送AXADD
35、 BX,2 ;修改BX值LOOP CUDL ;CX-1=0?否,转CUDL,3. 循环程序设计,(3)循环控制方法(续) 用计数控制循环(续) MOV AX,4CH ;返回DOSINT 21HCODE ENDSEND START 用条件控制循环 与问题中的某些条件有关,可以通过指令来测试。若测试比较的结果表明满足循环条件,则继续循环,否则结束循环。,3. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续) 例:在一串字符串中查找某一关键字,如果查到,则记下存放该关键字的偏移地址;若未找到,则将送标志单元。程序流程图如图2-5-12所示。源程序如下: STACK SEGMENT PAR
36、A STACK STACKDW 50 DUP(?)TOPS LABEL WORDSTACK ENDSDATA SEGMENT,3. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续)CHAR EQU $STRING DBTHIS IS A $ OF STRINGCOUNT EQU $STRINGFLAG DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET STRINGMOV AL,CHAR,3. 循环程序设计,(3)循环控制方法(续) 用条件控制循环(续) MOV
37、 CX,COUNTLOP:CMP AL,SIJE FOUNDINC SIDEC CXJNZ LOPMOV FLAG,1JMP LFOUND:MOV FLAG,SIL:NOPCODE:ENDSEND START,第四节 子程序设计,4. 子程序设计,(1)编制子程序的基本要求 子程序要有一定的通用性 编制的子程序的功能具有一定的通用性,以适合较多的使用场合。 选用适当的方法在主程序与子程序之间进行参量传递 传递参量的方法通常有三种:寄存器传递参量,存储单元传递参量和堆栈传递参量。 注意信息的保存 。 正确使用堆栈 。,4. 子程序设计,(2)子程序设计举例 例:将两个给定的二进制数转换成二进制数
38、表示的ASCII码。 DATA SEGMENTBIN1 DB 35HBIN2 DW 0AB48HASCBUF DB 20H DUP(?)DATA ENDSSTACK1 SEGMENT PARA STACKDW 20H DUP(?)STACK1 ENDSCOSEG SEGMENTASSUME CS:COSEG,DS:DATA,SS:STACK1,4. 子程序设计,(2)子程序设计举例(续) START:MOV AX,DATAMOV DS,AXMOV DX,0MOV DH,BIN1 ;待转换数在DX中LEA DI,ASCBUF ;存放ASCII码首址MOV AX,8 ;转换二进制位数PUSH DI
39、 ;保留信息CALL BINASC ;调用转换子程序POP 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,AXLOP:ROL DX,1 ;取一位二进制数MOV AL,DLAND AL,1ADD AL,30H ;构成相应的ASCII码MOV DI,AL ;存结果INC DILOOP LOPRETBINASC ENDPC
40、OSEG ENDSEND START,1. DOS系统功能调用 2. BIOS中断调用,六、系统功能调用,第一节 DOS系统功能调用,1. DOS系统功能调用,调用DOS系统功能,需要采用软中断指令:INT n,遵照如下调用方法: 送入口参量给指定寄存器。 AH功能号。 INT 21H。DOS系统根据给出的信息,自动转入相应的子程序去执行。调用结束后,出口参数在指定的寄存器或存储单元中。,1. DOS系统功能调用,(1)键盘输入(1号调用)等待从标准输入设备输入一个字符,并送入寄存器AL,不需入口参数。例:MOV AH,1INT 21H(2)不带显示的键盘输入(8号调用)与1号调用类同,只是不
41、在屏幕上显示输入的字符。(3)打印输出(5号调用)将DL中的字符输出到打印机上。例如:,1. DOS系统功能调用,MOV DL,AMOV AH,5INT 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,6INT 21H JZ C
42、HAR_IN ;等待键盘输入(DL)=0FEH时,表示显示输出。这时显示输出字符的ASCII码在DL中,如同2号功能。例如在屏幕上显示美元符号“$”。MOV DL,24HMOV AH,6INT 21H,1. DOS系统功能调用,(5)不带显示的键盘字符输入(7号调用)与1号功能类似,它仅等待键盘输入一个字符,并将字符的ASCII码送入AL中,但按下Ctrl+C组合键和TAB制表键无反应。调用方法如下: MOV AH,7INT 21H(6)输出字符串(9号调用)调用时,要求DS:DX须指向内存中一个以“$”作为结束标志的字符串。字符串中每一个字符(不包括$)都要输出显示或打印。如:,1. DOS
43、系统功能调用,(6)输出字符串(9号调用)DATA SEGMENTBUF DB HOW DO YOU DO? $DATA ENDSCODE SEGMENTMOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,9INT 21HCODE ENDS,1. DOS系统功能调用,(7)字符串输入(0A号调用)从键盘接收字符串到内存输入缓冲区。要求先定义输入缓冲区,缓冲区内第一个字符指出缓冲区能容纳的字符个数,不能为零。第二个字节保留,用以作填写输入字符的个数。从第三个字节开始存放从键盘上接收的字符,直到Enter键结束。若实际输入的字符个数少于定义的字节数,缓冲区内其余
44、字节填零;若多于定义的字节个数,则后来输入的字符丢掉,且铃响。调用时,要求DS:DX指向输入缓冲区的首地址,例如:,1. DOS系统功能调用,(7)字符串输入(0A号调用)DATA SEGMENT BUF DB 50 ;缓冲区长度 DB ? ;保留为填入实际字符个数DB 50 DUP(?) ;定义50个字节存储空间DATA ENDS CODE SEGMENTMOV AX,DATA MOV DS,AXMOV DX,OFFSET BUFMOV AH,0AHINT 21HCODE ENDS,1. DOS系统功能调用,(8)异步通信口输入(03H)从标准异步通信接口等待输入一个字符,然后送到寄存器AL
45、中。启动时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日。MOV CX,2000HMOV DH,8MOV DL,4MOV AH,2BHIN
46、T 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功能调用。不需要入口参数。调用结束时,CX:DX中为返回的时间,参数同上。例如:MOV AH,2DHMOV CX
47、,5FHMOV DX,00HINT 21H将把系统的时间设置为5时15分9秒。MOV AH,2CHINT 21H,第二节 BIOS中断调用,2. BIOS中断调用,BIOS的主要功能是驱动系统中所配置的常用外设,如显示器、键盘、打印机、磁盘驱动器以及异步通信接口等的控制。 (1)显示器I/O中断调用(10H)可用INT 10H 调用显示器的驱动程序。该调用共有16种不同功能,编号为015,按AH所置功能不同,完成不同的功能调用。 设置显示方式(功能号0)入口参数(AH)=0,(AL)=方式(07),出口参数:无。,2. BIOS中断调用,(1)显示器I/O中断调用(10H) 设置光标大小(功能号1)入口参数:(AH)=1,(CH)=光标开始值,(CL)=光标结束行,出口参数:无。 设置光标位置(功能号2)入口参数:(AH)=2,(BH)=页号,(DH)=行号,(DL)=列号。出口参数:无。,