第4章_4+循环+子程序+DOS中断调用(X)
发布时间:2021-06-07
发布时间:2021-06-07
微机教程
第四章 汇编语言程序设计
汇编语言程序设计概述 汇编语言基本语法 汇编语言程序设计 BIOS及DOS功能调用 汇编语言程序设计实例
微机教程
循环结构程序设计 循环程序概述在程序中重复执行相同功能的一段代码,可用循环程序实现。循环程序 通常由五部分组成: 初始化部分——为程序操作、地址指针、循环计数、结束条件等设 置初始值。循环工作部分——循环程序主体,完成基本操作。 循 环 体
循环修改部分——修改循环工作部分的变量,为重复操作做准备。循环控制部分——修改计数器或判断循环结束条件,决定是否终止循环。
循环结束部分——循环终止后,对循环结果的处理部分。
微机教程
循环结构程序设计 循环程序基本结构起 始
起 始
起 始
初始化 循环工作循环修改未完
初始化 循环控制未完 完
初始化
循环修改循环控制完
循环工作 终 止 循环修改
未完
循环控 制完
循环工作
终 止
终 止
先执行后判断
先判断后执行
微机教程
循环结构程序设计 循环控制方式计数循环——重复次数已知,用计数值控制循环的开始与终止。
条件控制循环——重复次数未知或不确定,需找出循环控制的条件。
【例】 编写程序计算C=1+2+3+4+……+100解: 已知循环次数,采用计数循环控制。程序段如下:
MOVMOV MOV LOP: ADD INC
CX,100BX,1 AX,0 AX,BX BX
;确定循环计数器值;确定循环初值 ;和的初值
LOOP LOP
;循环控制
微机教程
计数循环的常见方法: LOOP 短标号
MOVL: …… ……
CX,N
LOOP L 减1循环 MOV L: …… CX,N L: 加1循环 MOV …… CX,-N
DECJNZ
CXL
INCJNZ
CXL
微机教程
【例】 将一个字符串拷贝到另一个存储区中,直到拷贝到字符“$”结束。解:无法确定循环次数,采用条件循环控制。程序段如下: MOV MOV SI,OFFSET ORGSTRIN DI,OFFSET DESSTRIN ;读源串地址 ;读目的串地址
LOP: MOVMOV INC
AL,[SI][DI],AL SI ;循环修改
INCCMP JNZ
DIAL,‘$’ LOP ;循环控制
微机教程
循环结构程序设计 多重循环循环体中又有循环称多重循环。在多重循环程序设计时,应分别考虑每 重循环的控制条件。通常内层循环要受外层循环的控制。【例】 在首地址为Addr的存储单元中有 N个数,编程序将此N个数按照从 小到大的次序排列。 解:采用冒泡排序法,从第一个数开始依次对相邻的两个数进行比较,如 果次序正确则不做任何操作,如果次序不正确则将此两个数交换位置。
微机教程
开 始
ACX←外循环次数 CX←CX-1
DI←最后一个数的地址 BX←0取BX位置上的数到AL 小于
N
CX==0?Y
与后一数比较 大于
结 束
交换两数位置
BX←BX+1 N
是否为最后的
数 ?Y
A
微机教程
DATA
SEGMENT Addr DB N DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N DEC CX LOOPl: MOV DI,CX ;设置外循环次数 MOV BX,0 ;设置内循环条件 LOOP2: MOV AL,Addr[BX] CMP AL,Addr[BX+1] JL CONT XCHG AL,Addr[BX+1] ;让大的数向地址高处移动 MOV Addr[BX],AL CONT: INC BX CMP BX,DI ;内循环判断 JB LOOP2 LOOP LOOP1 ;外循环控制条件 MOV AH,4CH INT 21H CODE ENDS END START
微机教程
【例】统计AX中 1 的个数。
起 始AX←3578H CL←0
MOV MOV L: OR JZ SHL
AX,3578H CL,0 AX,AX ;判断AX是否为0 EXIT AX,1 ;AX=0结束 ;最高位进CF
AX==0? N AX<< 1 N
Y
JNCINC JMP EXIT: INT
LCL L 20H
终 止
CF==1?Y CL←CL+1
微机教程
【例】BUF中有N个有符号数,分离其中的正负数,分别送入BUF1和BUF2中DATA SEGMENT BUF DB 12H, 34H, -56H, -98H, 096H, 68H, 56H, 80H N=$-BUF INC BX BUF1 DB N DUP(0) JMP CC BUF2 DB N DUP(?) BB: MOV [DI],AL DATA ENDS INC DI CODE SEGMENT CC: LOOP AA;DEC CX ASSUME CS:CODE,DS:DATA ;JNZ AA START: MOV DX,DATA MOV AH,4CH MOV DS,AX INT 21H LEA SI,BUF CODE ENDS LEA DI,BUF1 END START LEA BX,BUF2 MOV CX,N AA: MOV AL,[SI] (1)若DW定义BUF怎样修改? INC SI CMP AL,0 (2)能改为条件控制循环吗? JGE BB MOV [BX],AL
微机教程
子程序设计程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当 需要执行这个程序段时,用调用指令(CALL)调用该程序段即可。具有这 种独立功能的程序段称为过程或子程序。
子程序适用范围适合编成子程序的程序有两种: ① 程序需要反复使用,这类程序编写成子程序可避免重复编写程序,并可 以节省存储空间。 ② 程序具有通用性,这类程序大家都要用到,如键盘管理程序、磁盘读写 程序、标准函数程序等,编成子程序后便于功能共享。
微机教程
子程序设计 子程序的结构子程序必须有一个名称,方便其他程序调用;子程序出口是一条返回指令 RET。 过程名 过程类型
NAME PROC NEAR (FAR) PUSH AX 现场保护 PUSH BX…… …… …… POP POP ……
程序部分
BX AX
现场恢复
RET NAME ENDP
必须用RET结束
微机教程
子程序设计 子程序的调用和返回主程序调用子程序通过CALL指令来实现,子程序执行结束后,通过RET 指令返回主程序,转到主程序中CALL指令的下一条指令继续执行主程序。一个子程序可以由主程序在不同时刻多次调用。如果在子程序中又调用 了其它的子程序,称为子程序嵌套。特别当子程序又调用子程序本身时, 这种调用称为递归调用。
微机教程
子程序设计 子程序文件子程序通常应以独立的文件形式编写,形成模块。子程序文件由子程序 说明和子程序体构成。 (1)子程序说明 ① 功能描述,如子程序
名、功能,性能指标等; ② 所用寄存器和存储单元; ③ 子程序入口、出口参数; ④ 子程序中调用的其它子程序; ⑤ 调用实例(可无)。 (2)子程序体
子程序本身常以“过程”形式存放在代码段中,以过程名开始,以 RET指令结束。
微机教程
子程序设计 子程序设计应用注意事项(1)现场保护如果子程序中要临时修改某些寄存器或存储单元时,为了不破坏原有的 信息,要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄 存器或存储单元中。 PUSH AX PUSH BX PUSH SI
…………………… POP SI
注意:现场保护的入栈和出栈顺 序正好相反
POPPOP RET
BXAX
微机教程
子程序设计 子程序设计应用注意事项(2)参数传递主程序在调用子程序时一般需要传递参数给子程序,这些参数是子程 序运行时所需要的原始数据。常用的方法有: 寄 存 器 —— 适用于参数少的情况,其特点是参数传递速度快 。 约定单元 —— 适用于参数多的情况,要事先建立参数缓冲区。
堆
栈 —— 适用于参数较多、子程序嵌套或递归调用的情况。
微机教程
【例4.13】利用寄存器传递参数。…… MOV MOV CALL MOV MOV MOV CALL …… ADDROC ADD DAA RET ADDROC
BX,OFFSET M1 AX,[BX] ADDROC [BX+2],AL BX,OFFSET M2 AX,[BX] ADDROC PROC AL,AH NEAR ;AH,AL作子程序的入口参数 ;调用子程序 ;AL作为子程序的返回参数 ;读第二组待处理数据 ;再次调用子程序处理第二个数据 ;子程序定义 ;将AL,AH中的参数相加,结果存AL ;子程序返回 ENDP
微机教程
【例4.14】利用存储器传递参数。……
MOV CALL MOV CALL …… ADDROC2 PUSH MOV ADD DAA MOV POP RET ADDPROC2
BX,OFFSET M1 ADDROC2 BX,OFFSET M2 ADDROC2PROC AX NEAR
;待处理数据的地址用BX传递 ;调用子程序 ;将第二组数据地址放到BX中
AL,[BX]
;BX中存放待处理数据的地址
AL,[BX+1][BX+2],AL AX ENDP
;直接对该地址中的数据做运算;结果存回到内存中
微机教程
【例4.15】利用堆栈传递参数到子程序,由子程序对参数进行处理。 将两个给定的二进制数BIN1、BIN2转换为对应的二进制数的ASCⅡ码串。…… MOV MOV PUSH LEA PUSH MOV PUSH CALL MOV PUSH ADD PUSH MOV PUSH CALL …… AX,0 AH,BIN1 AX DI,ASCBUF DI AX,8H AX BINTOASC AH,BIN2 AX DI,10H DI AX,10H AX BINTOASC
;将待转换二进制数压入堆栈 ;将ASCII码存放地址压入堆栈 ;将二进制数的位数压入堆栈 ;调用转换子程序 ;开始对第二个数处理
微机教程
BINTOASC PUSH PUSH PUSH MOV MOV MOV MOV LOP: ROL MOV AND ADD MOV INC LOOP POP POP POP RET BINTOASC
PROC NEAR DI CX DX BP,SP DX,[BP+12] DI,[BP+10] CX,[BP+8] DX,1 AL,DL AL,1 AL,'0' [DI],AL DI LOP DX CX DI 6 ENDP
;转换子程序 ;保护现场
;获取堆栈地址 ;取出
堆栈中的数据
;二进制数最高位放到DL中
;转换为ASCⅡ码 ;存入相应内存