1、第四章 汇编语言程序设计,汇编语言程序设计概述 汇编语言基本语法汇编语言程序设计BIOS及DOS功能调用汇编语言程序设计实例,在程序中重复执行相同功能的一段代码,可用循环程序实现。循环程序通常由五部分组成:,初始化部分为程序操作、地址指针、循环计数、结束条件等设置初始值。,循环工作部分循环程序主体,完成基本操作。 循环修改部分修改循环工作部分的变量,为重复操作做准备。 循环控制部分修改计数器或判断循环结束条件,决定是否终止循环。,循环结束部分循环终止后,对循环结果的处理部分。,循环结构程序设计,循环程序概述,先执行后判断,循环程序基本结构,循环结构程序设计,计数循环重复次数已知,用计数值控制循
2、环的开始与终止。 条件控制循环重复次数未知或不确定,需找出循环控制的条件。,解: 已知循环次数,采用计数循环控制。程序段如下:MOV CX,100 ;确定循环计数器值MOV BX,1 ;确定循环初值MOV AX,0 ;和的初值 LOP: ADD AX,BXINC BXLOOP LOP ;循环控制,【例】 编写程序计算C=1+2+3+4+100,循环控制方式,循环结构程序设计,计数循环的常见方法:,减1循环MOV CX,N L : DEC CXJNZ L,加1循环MOV CX,N L: INC CXJNZ L,LOOP 短标号MOV CX,N L: LOOP L,解:无法确定循环次数,采用条件循
3、环控制。程序段如下:MOV SI,OFFSET ORGSTRIN ;读源串地址MOV DI,OFFSET DESSTRIN ;读目的串地址 LOP: MOV AL,SIMOV DI,ALINC SI ;循环修改INC DICMP AL,$ JNZ LOP ;循环控制,【例】 将一个字符串拷贝到另一个存储区中,直到拷贝到字符“$”结束。,循环体中又有循环称多重循环。在多重循环程序设计时,应分别考虑每重循环的控制条件。通常内层循环要受外层循环的控制。,解:采用冒泡排序法,从第一个数开始依次对相邻的两个数进行比较,如果次序正确则不做任何操作,如果次序不正确则将此两个数交换位置。,【例】 在首地址为A
4、ddr的存储单元中有N个数,编程序将此N个数按照从小到大的次序排列。,多重循环,循环结构程序设计,DATA SEGMENTAddr DB N DUP(?) DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV CX,NDEC CX LOOPl: MOV DI,CX ;设置外循环次数MOV BX,0 ;设置内循环条件 LOOP2: MOV AL,AddrBX CMP AL,AddrBX+1 JL CONTXCHG AL,AddrBX+1 ;让大的数向地址高处移动MOV AddrBX,AL CONT:
5、 INC BXCMP BX,DI ;内循环判断JB LOOP2 LOOP LOOP1 ;外循环控制条件MOV AH,4CHINT 21H CODE ENDSEND START,MOV AX,3578HMOV CL,0 L: OR AX,AX ;判断AX是否为0JZ EXIT ;AX=0结束SHL AX,1 ;最高位进CFJNC L INC CLJMP L EXIT: INT 20H,【例】统计AX中 1 的个数。,【例】BUF中有N个有符号数,分离其中的正负数,分别送入BUF1和BUF2中,(1)若DW定义BUF怎样修改? (2)能改为条件控制循环吗?,程序设计过程中常常把多次引用的相同程序段
6、编成一个独立的程序段,当需要执行这个程序段时,用调用指令(CALL)调用该程序段即可。具有这种独立功能的程序段称为过程或子程序。,子程序设计,子程序必须有一个名称,方便其他程序调用;子程序出口是一条返回指令RET。,子程序的结构,子程序设计,主程序调用子程序通过CALL指令来实现,子程序执行结束后,通过RET指令返回主程序,转到主程序中CALL指令的下一条指令继续执行主程序。一个子程序可以由主程序在不同时刻多次调用。如果在子程序中又调用了其它的子程序,称为子程序嵌套。特别当子程序又调用子程序本身时,这种调用称为递归调用。,子程序的调用和返回,子程序设计,子程序通常应以独立的文件形式编写,形成模
7、块。子程序文件由子程序说明和子程序体构成。 (1)子程序说明 功能描述,如子程序名、功能,性能指标等; 所用寄存器和存储单元; 子程序入口、出口参数; 子程序中调用的其它子程序; 调用实例(可无)。 (2)子程序体子程序本身常以“过程”形式存放在代码段中,以过程名开始,以RET指令结束。,子程序文件,子程序设计,子程序设计应用注意事项,子程序设计,(2)参数传递主程序在调用子程序时一般需要传递参数给子程序,这些参数是子程序运行时所需要的原始数据。常用的方法有:寄 存 器 适用于参数少的情况,其特点是参数传递速度快 。约定单元 适用于参数多的情况,要事先建立参数缓冲区。堆 栈 适用于参数较多、子
8、程序嵌套或递归调用的情况。,子程序设计应用注意事项,子程序设计,MOV BX,OFFSET M1MOV AX,BX ;AH,AL作子程序的入口参数CALL ADDROC ;调用子程序MOV BX+2,AL ;AL作为子程序的返回参数MOV BX,OFFSET M2MOV AX,BX ;读第二组待处理数据CALL ADDROC ;再次调用子程序处理第二个数据 ADDROC PROC NEAR ;子程序定义ADD AL,AH ;将AL,AH中的参数相加,结果存ALDAARET ;子程序返回 ADDROC ENDP,【例4.13】利用寄存器传递参数。,MOV BX,OFFSET M1 ;待处理数据的
9、地址用BX传递CALL ADDROC2 ;调用子程序MOV BX,OFFSET M2 ;将第二组数据地址放到BX中CALL ADDROC2 ADDROC2 PROC NEARPUSH AXMOV AL,BX ;BX中存放待处理数据的地址ADD AL,BX+1 ;直接对该地址中的数据做运算DAAMOV BX+2,AL ;结果存回到内存中POP AXRET ADDPROC2 ENDP,【例4.14】利用存储器传递参数。, MOV AX,0 MOV AH,BIN1 PUSH AX ;将待转换二进制数压入堆栈 LEA DI,ASCBUF PUSH DI ;将ASCII码存放地址压入堆栈 MOV AX,
10、8H PUSH AX ;将二进制数的位数压入堆栈 CALL BINTOASC ;调用转换子程序 MOV AH,BIN2 ;开始对第二个数处理 PUSH AX ADD DI,10H PUSH DI MOV AX,10H PUSH AX CALL BINTOASC ,【例4.15】利用堆栈传递参数到子程序,由子程序对参数进行处理。 将两个给定的二进制数BIN1、BIN2转换为对应的二进制数的ASC码串。,BINTOASC PROC NEAR ;转换子程序PUSH DI ;保护现场PUSH CXPUSH DXMOV BP,SP ;获取堆栈地址 MOV DX,BP+12 ;取出堆栈中的数据MOV DI
11、,BP+10 MOV CX,BP+8 LOP: ROL DX,1 ;二进制数最高位放到DL中MOV AL,DL AND AL,1 ADD AL,0 ;转换为ASC码MOV DI,AL ;存入相应内存INC DILOOP LOPPOP DXPOP CXPOP DIRET 6 BINTOASC ENDP,MS-DOS操作系统内置了几十个子程序(API),这些子程序能够完成大量底层功能,用户程序可以通过软中断调用方式使用这些子程序(称为DOS系统功能调用),软中断号为21H。 指令为: INT 21H,DOS系统功能调用的基本过程如下:(1)传送入口参数到指定寄存器中;(2)调用子功能的功能编号放在
12、AH寄存器中;(3)执行INT 21H指令。调用结束后返回相应结果,并由CF标志表示调用是否成功,当出现调用错误时CF=1,AX返回出错编号。,BIOS及DOS功能调用,DOS系统功能调用,(1)MOV REG,XX ;传送入口参数到指定寄存器中;(部分无入口参数) (2)MOV AH,功能号 ;功能号送入AH寄存器中 (3)INT 21H ;DOS功能调用,1、键盘单字符输入(1号)MOV AH,1INT 21H功能:等待从键盘输入一个字符。返回:(AL)=ASCII码,并回显在显示器上。 DEBUG演示,常用DOS功能调用介绍,2、键盘输入字符串(0AH号)MOV DX,OFFSET BU
13、F ;DS:DX为键盘缓冲区MOV AH,0AHINT 21H功能:等待从键盘输入一串字符,回车结束。字符串存入键盘缓冲区。键盘缓冲区定义(示例):BUF DB 81 ;缓冲区的大小DB ? ;实际输入的字符个数,不含0DHDB 80 DUP (?) ;字符串存放区,3、输出单字符(2号)MOV DL,A MOV AH,02INT 21H功能:将DL中字符从屏幕上输出。返回:无。 DEBUG演示,4、输出字符串(09号)MOV DX,OFFSET BUFMOV AH,09INT 21H功能:BUF中以“$”为结束标志的字符串显示在屏幕上。DATA SEGMENTBUF DB “80X86 CP
14、U $”DATA ENDS DEBUG演示,5、控制台输入/输出单字符(06)MOV AH,06MOV DL,0FFH ;DL为0FFH时从键盘读一字符到ALINT 21H ;否则将DL中的字符送显示器 DEBUG演示,6、无回显控制台输入单字符(08)MOV AH,08INT 21H 功能:从键盘输入一个字符但不显示,常用于口令和控制键的输入。 DEBUG演示,7、返回操作系统(4CH)MOV AH,4CHMOV AL,返回码INT 21H 功能:将控制权交给操作系统。 DEBUG演示,PC机的系统板上有一个用于存放系统启动程序的ROM存储器,这个程序用于完成硬件的检测和操作系统的引导等工作。该程序中包括了大量的基本输入/输出功能,因此被称为BIOS(Basic Input/Output System,基本输入输出系统)。BIOS功能调用同DOS系统调用相似,也需要使用软中断INT n来调用:, 设置入口参数 使用INT n指令进入中断,ROM BIOS系统调用,4.20,4.21,4.24,课后作业:,