32位微机原理与接口技术钱晓捷课件_第1页
32位微机原理与接口技术钱晓捷课件_第2页
32位微机原理与接口技术钱晓捷课件_第3页
32位微机原理与接口技术钱晓捷课件_第4页
32位微机原理与接口技术钱晓捷课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第7章

输入输出接口7.1I/O接口概述7.2无条件传送和程序查询传送7.3中断控制系统7.4DMA传送7.1I/O接口概述微机的外部设备多种多样工作原理、驱动方式、信息格式、以及工作速度方面彼此差别很大它们不能与CPU直接相连必须经过中间电路(I/O接口)再与系统相连I/O接口是位于基本系统与外设间、实现两者数据交换的控制电路在PC机主板上的可编程接口电路系统总线插槽中的电路卡(Card)7.1.1I/O接口的典型结构I/O地址=外设端口,对应接口寄存器1.内部结构数据寄存器保存处理器与外设之间交换的数据数据输入寄存器:保存从输入设备获取的数据,处理器选择合适的方式进行读取数据输出寄存器:保存处理器发往输出设备的数据,适时到达输出设备状态寄存器保存接口电路和外设当前的工作状态信息控制寄存器保存处理器控制接口电路和外设操作的有关信息2.外部特性接口电路的外部特性由其引出信号来体现I/O接口处于处理器与外设之间:面向微处理器一侧的信号与处理器总线或系统总线类似有数据信号、地址信号和控制信号等面向外设一侧的信号与外设有关外设数据信号、外设状态信号和外设控制信号3.基本功能数据缓冲匹配快速的处理器与相对慢速的外设的数据交换缓冲:实现接口双方数据传输的速度匹配信号变换把信号相互转换为适合对方的形式计算机直接处理的信号数字量(0和1组成的信号编码)开关量(只有两种状态的信号)脉冲量(低脉冲信号,高脉冲信号)4.软件编程接口芯片具有可编程性(Programmable)命令字(控制字)写入接口芯片、选择工作方式、控制数据传输初始化程序选择I/O接口工作方式、设置原始工作状态等驱动程序操纵I/O接口完成具体工作硬件接口电路需要软件编程配合工作7.1.2I/O端口的编址I/O端口=I/O地址,对应I/O接口的寄存器一个接口电路可以具有多个I/O端口,每个端口用来保存和交换不同的信息数据寄存器、状态寄存器和控制寄存器占有的I/O地址常依次被称为数据端口、状态端口和控制端口输入、输出端口可以是同一个I/O地址如何编排存储器地址和I/O地址?1.I/O端口与存储器地址独立编址I/O端口单独编排地址,独立于存储器地址优点:I/O端口的地址空间独立控制和地址译码电路相对简单专门的I/O指令使程序清晰易读缺点:I/O指令没有存储器指令丰富80x86采用I/O端口独立编址主存空间I/O空间FFFFF0FFFF2.I/O端口与存储器地址统一编址将I/O端口与存储器地址统一编排优点:不需要专门的I/O指令I/O数据存取灵活缺点:占去部分存储器空间程序不易阅读主存部分I/O部分存储器空间00000FFFFF3.I/O地址译码与存储器地址译码在原理和方法上完全相同I/O地址不太强调连续,多采用部分译码7.1.3输入输出指令输入指令IN:数据从I/O接口输入到微处理器

INAL/AX/EAX,i8/DX输出指令OUT:数据从微处理器输出I/O接口

OUTi8/DX,AL/AX/EAX串输入INS指令串输出OUTS指令INAL,21HINAL,DX举例OUT

21H,ALOUTDX,AL举例1.I/O寻址方式直接寻址I/O指令直接提供8位I/O地址只能寻址最低256个I/O地址(00~FFH)用i8表示I/O地址,表达形式上与立即数一样DX间接寻址用DX寄存器保存访问的I/O地址可寻址全部I/O地址(0000~FFFFH)直接书写成DX,表示I/O地址64K个I/O地址,不分段2.I/O数据传输量8位I/O传输:I/O指令使用AL16位I/O传输:I/O指令使用AX32位I/O传输:I/O指令使用EAXout

20h,alout20h,axout

20h,eaxmovdx,3fchout

dx,alout

dx,axout

dx,eax举例in

al,20hinax,20hineax,

20hmovdx,3fchin

al,dxin

ax,dxin

eax,dx举例3.I/O保护I/O敏感指令

IN、OUT和INS、OUTS,CLI和STIIA-32处理器保护方式下,I/O特权和I/O许可位图限制I/O敏感指令的执行程序的当前特权高于或等于程序的I/O特权,I/O敏感指令才可以执行I/O许可位图给特权低的程序或虚拟8086方式的程序提供有限的I/O地址访问权限Windows限制应用程序访问I/O地址教材将利用DOS操作系统实践I/O程序7.1.416位DOS应用程序16位DOS操作系统运行于Intel8086和8088处理器IA-32处理器的实地址工作方式DOS平台下使用实地址存储模型只能访问1MB存储空间,分成不大于64KB的段默认采用16位操作数尺寸: 使用16位或8位寄存器、操作数和寻址方式 堆栈以16位为单位压入PUSH和弹出POP数据IA-32处理器的实地址工作方式还允许使用32位寄存器、操作数和寻址方式执行大多数新增的32位通用指令1.DOS平台的源程序框架;eg0700.asminDOS

includeio16.inc ;包含16位输入输出文件

.data ;定义数据段

…… ;数据定义(数据待填)

.code ;定义代码段start: ;程序执行起始位置

mov

ax,@data

mov

ds,ax …… ;主程序(指令待填)

exit0 ;程序正常执行结束

…… ;子程序(指令待填)

endstart ;汇编结束〔例7-1〕DOS应用程序

includeio16.inc ;包含16位输入输出文件

.data ;数据段msg byte'Hello,Assembly!',13,10,0

.code ;代码段start: ;程序起始位置

mov

ax,@data

mov

ds,ax

mov

eax,offset

msg

calldispmsg ;调用I/O子程序显示信息

exit0 ;程序正常执行结束

endstart ;汇编结束运行于DOS环境MAKE16.BAT汇编连接操作演示DOS应用程序END温馨提示:EXIT命令关闭DOS窗口2.DOS功能调用DOS操作系统的系统函数(功能)以中断服务程序形式提供,采用软件中断进行功能调用,使用寄存器传递参数基本输入输出系统ROM-BIOS、操作系统DOS和Linux都采用中断调用方式提供系统功能DOS系统调用一般有如下4个步骤:(1)在AH寄存器中设置系统功能调用号(2)在指定寄存器中设置入口参数(3)用中断调用指令(INTN)执行功能调用(4)根据出口参数分析功能调用执行情况输出一个字符dispc proc pusheax pushedx

movah,2

mov

dl,al

int21h popedx popeax retdispc

endp功能编号AH=02H入口参数DL=输出字符的ASCII码功能说明在屏幕当前光标出显示字符输出字符串dispm2: popedx

popebx popeax retdispmsg endp输入一个字符readc proc

movah,1

int21h retreadc

endp功能编号AH=01H出口参数AL=输入字符的ASCII码功能说明从键盘输入一个字符,并回显在屏幕上输入字符串readmsg proc pushebx pushecx movebx,eax movecx,eaxrdm1: movah,1 int21h cmpal,0dh jzrdm2 mov[ebx],al incebx jmprdm1rdm2: movbyteptr[ebx],0 cmpebx,ecx jzrdm1 subebx,ecx moveax,ebx popecx popebx retreadmsg endp〔例7-2〕读取CMOSRAM数据程序-1;eg0702.asminDOS includeio16.inc .codestart:

moval,9 ;AL=9(准备从9号单元获取年代数据)

out70h,al ;从70H的I/O地址输出,选择CMOSRAM的9号单元

inal,71h ;从71H的I/O地址输入,获取9号单元的内容

calldisphb ;显示AL内容,即年代

moval,'-' ;显示分隔符“-”

calldispc〔例7-2〕读取CMOSRAM数据程序-2

moval,8 ;AL=8(从8号单元获取月份数据)

out70h,al inal,71h

calldisphb ;显示月份

moval,'-' ;显示分隔符“-”

calldispc

moval,7 ;AL=7(从7号单元获取日期数据)

out70h,al inal,71h

calldisphb ;显示日期

exit0 endstart31-Dez-25显示结果7.2无条件传送和程序查询传送计算机主机有多种与外设传送数据的方式通过处理器执行I/O指令完成无条件传送查询传送中断传送以硬件为主,加快传输速度直接存储器存取(DMA)使用专门的I/O处理机7.2.1无条件传送处理器与慢速变化的设备交换数据外设总是处于“就绪”状态,随时可以进行数据传送无条件传送的接口电路:只考虑数据缓冲无条件传送的软件编程:十分简单输入时执行输入IN指令

movdx,8000h

inal,dx

mov

bufin,al输出时执行输出OUT指令

mov

al,bufout

movdx,8000h outdx,al1.三态缓冲器三态缓冲器:加有控制端的同相器或反相器控制端T有效时,控制输入A端输出到Y端控制端T无效时,输出Y端呈现高阻状态74LS244:双4位三态同相缓冲器双向三态缓冲器:两个三态缓冲器构成输出允许控制端OE*:控制数据的输出方向控制端DIR:控制数据驱动的方向74LS245:8位双向三态缓冲器芯片示意图三态缓冲器返回2.锁存器使用D触发器构成输入端为D端,控制端为C端两个相反的输出信号Q和Q*复位R或置位S控制端电平锁存:电平控制输出能跟随输入变化边沿锁存:输出只能锁存输入的状态74LS273:上升沿锁存的8位边沿锁存器74LS373:电平锁存的8位三态缓冲锁存器74LS374:边沿锁存的8位三态缓冲锁存器示意图D触发器返回3.接口电路输入接口电路连接开关:读取开关状态输出接口电路连接发光二极管LED功能要求:开关闭合时,将相应LED点亮调用延时子程序DELAY保持一定时间

movdx,8000h ;DX指向输入端口

inal,dx ;从输入端口读开关状态

notal ;求反

outdx,al ;送输出端口显示

calldelay ;调子程序DELAY进行延时示意图无条件传送接口返回7.2.2程序查询传送查询传送有查询和传送两个环节首先查询外设工作状态检测、等待外设准备就绪进行数据传输1.查询过程设计实现查询功能的电路连接外设的状态输入信号保存在状态寄存器中通过状态端口读取外设的工作状态在状态寄存器中使用一位或若干位表达,查询通过输入指令来实现有多个状态,按照一定原则轮流查询,先检测到就绪的外设先开始数据传送实际中常引入超时判断查询传送工作可靠,具有较广的适用性查询需大量时间,效率较低2.查询输入接口示意图查询输入接口返回3.查询输出接口示意图查询输出接口返回7.3中断控制系统中断是微机系统中非常重要的一种技术利用外部中断微机系统可以实时响应外部设备的数据传送请求、能够及时处理外部意外或紧急事件利用内部中断处理器为用户提供了发现、调试并解决程序执行时异常情况的有效途径7.3.1中断传送处理器在执行程序过程中,被内部或外部的事件所打断,转去执行一段预先安排好的中断服务程序;服务结束后,又返回原来的断点,继续执行原来的程序中断源 引起中断的事件或原因内部中断外部中断可屏蔽中断非屏蔽中断1.中断工作过程中断请求中断响应关中断断点保护

中断源识别现场保护中断服务恢复现场开中断中断返回数据交换的实质性环节响应条件每条指令执行完时允许中断(可屏蔽中断)没有更高级的请求发生……2.中断源的识别向量中断在中断响应周期,处理器获得中断向量号一个中断向量号对应一个中断自动转向相应的中断服务程序中断查询中断请求保存在中断状态寄存器处理器依次查询中断状态寄存器某个中断请求状态有效说明其提出请求转向对应的中断服务程序示意图中断查询接口与流程返回3.中断优先权排队中断优先权每个中断源被处理的级别中断优先权排队事先为每个中断源所确定的优先处理顺序查询中断时依次查询,先查询的中断具有较高的优先权硬件电路实现时分布方式的菊花链排队电路集中方式的编码电路和比较电路多个中断同时请求4.中断嵌套高于当前正在服务的中断:暂停当前工作先行服务于级别更高的中断接着处理被打断的中断低于或等于当前正在服务的中断:不予理会,待完成当前中断服务后再处理中断嵌套:中断处理中又响应中断中断处理又有请求7.3.2IA-32中断系统采用向量中断机制能够处理256个中断用中断向量号0~255区别可屏蔽中断需要中断控制器实现优先权管理1.内部中断内部中断是由于处理器内部执行程序出现异常引起的程序中断(异常Exception)除法错异常(向量号0)调试异常(向量号1)断点异常(向量号3)溢出异常(向量号4)无效代码异常(向量号6)通用保护异常(向量号13)页面失效异常(向量号14)……除法错异常执行除法指令时,若除数为0或商超过了寄存器所能表达的范围,产生的一个向量号为0的内部中断〔例7-3〕产生除法错中断的程序

;数据段msg byte0dh,0ah,'Nodivideoverflow!',0 ;代码段

callreaduiw

movbl,1

divbl

mov

eax,offset

msg;没有除法错,显示信息

calldispmsg操作演示除法错异常程序-16位DOS环境除法错异常程序-16位DOS环境除法错异常程序-32位控制台除法错异常程序-32位控制台END溢出异常执行溢出中断指令INTO时,若溢出标志OF为1,产生的一个向量号4的内部中断〔例7-4〕产生溢出中断的程序

;数据段msg byte0dh,0ah,'Nooverflow!',0 ;代码段

callreaduib addal,100

jno

noflow ;没有溢出,转移

into ;有溢出,产生溢出中断

jmpdonenoflow: mov

eax,offset

msg ;显示无溢出信息

calldispmsgdone:操作演示溢出异常程序-16位DOS环境溢出异常程序-16位DOS环境溢出异常程序-32位控制台溢出异常程序-32位控制台END2.外部中断非屏蔽中断外部通过非屏蔽中断NMI请求信号提出的中断处理器在当前指令执行结束予以响应非屏蔽中断的中断向量号是2非屏蔽中断主要用于处理系统的意外或故障可屏蔽中断外部通过可屏蔽中断INTR请求信号提出的中断允许可屏蔽中断的条件下、当前指令执行结束予以响应输出可屏蔽中断响应信号INTA*,产生可屏蔽中断响应总线周期,读取中断向量号需要中断控制器负责处理中断优先权排队等管理工作可屏蔽中断主要用于与外设进行数据交换中断标志IF=1,处理器开中断可以响应,允许中断,中断开放IF=0,处理器关中断不能响应,禁止中断,中断被屏蔽关中断的情况系统复位后任何一个中断被响应后执行关中断指令CLI后开中断的方法执行开中断指令STI执行中断返回指令IRET恢复中断前IF状态3.中断和异常的响应过程标志寄存器压入堆栈,保护标志位;被中断指令的逻辑地址压入堆栈,保护断点如果有错误代码,将其压入堆栈 实地址方式的异常不返回错误代码根据向量号获得中断服务程序(中断或异常的处理程序)的段选择器和指令指针对于中断,设置IF为0,禁止可屏蔽中断控制转移至中断服务程序入口地址,开始执行中断或异常处理程序4.中断描述符表和中断向量表保护方式下,使用中断描述符表IDT中断服务程序由中断描述符指向每个中断描述符包含8个字节,保存16位段选择器和32位偏移地址中断特权层实地址方式下,使用中断向量表物理地址00000H,对应向量号从0开始依次每4个字节安排一个中断向量含有16位段地址和16位偏移地址的逻辑地址低字部分是偏移地址、高字部分是段地址256个中断占用1KB区域,形成中断向量表示意图实方式的中断向量表结构返回7.3.3内部中断服务程序编写内部中断服务程序与编写子程序类似利用过程定义伪指令PROC/ENDP第1条指令通常为开中断指令STI最后用中断返回指令IRET通常采用寄存器传递参数主程序需要调用中断服务程序调用前,需要设置中断向量表对应项利用INTn指令调用中断服务程序设置中断向量表项:AH=25H号DOS功能调用获取中断向量表项:AH=35H号DOS功能调用〔例7-5〕内部中断服务程序-1

;数据段intoff word? ;用于保存原中断服务程序的偏移地址intseg word? ;用于保存原中断服务程序的段基地址intmsg byte'AInstructionInterrupt!',0dh,0ah,0 ;字符串(以0结尾)

;代码段

movax,3580h ;获取系统的原80H中断向量表项

int21h

mov

intoff,bx ;保存偏移地址

movintseg,es ;保存段基地址35H调用〔例7-5〕内部中断服务程序-2

pushds

mov

dx,offsetnew80h

mov

ax,segnew80h

mov

ds,ax

movax,2580h ;设置本程序80H中断向量表项

int21h

popds

mov

dx,offset

intmsg

int80h ;调用80H中断服务程序

mov

dx,intoff ;恢复原80H中断向量表项

mov

ax,intseg ;注意先设置DX、后设置DS

mov

ds,ax

movax,2580h

int21h25H调用〔例7-5〕内部中断服务程序-3new80h proc ;过程定义

sti ;开中断

pushax ;保护寄存器

pushbx pushsi

mov

si,dxnew1: mov

al,[si] ;获取欲显示字符

cmpal,0 ;为“0”结束

jznew2

movbx,0 ;ROM-BIOS调用显示一个字符

movah,0eh

int10h

incsi

jmpnew1功能编号AH=0EHINT10H入口参数AL=ASCII字符,BX=0功能说明显示字符〔例7-5〕内部中断服务程序-4new2: popsi ;恢复寄存器

popbx popax

iret ;中断返回new80h endp ;中断服务程序结束

;80H内部中断服务程序

;显示字符串(以0结尾) ;DS∶DX=缓冲区首地址AInstructionInterrupt!显示结果获取和设置中断向量表项返回功能编号AH=35H入口参数AL=向量号出口参数ES∶BX=中断向量功能说明获取中断向量表项功能编号AH=25H入口参数AL=向量号DS∶DX=中断向量功能说明设置中断向量表项7.3.4中断控制器管理多个中断请求并进行优先权排队等工作IBMPC/AT机使用两个Intel8259A可编程中断控制器PIC,32位PC机兼容了它们的功能每个管理8级中断,请求引脚:IR0~IR7每一级中断可单独被屏蔽或允许多个芯片级联最多扩展至64级中断为每级中断提供中断向量号Pentium处理器内部集成局部APIC,外部配合集成在芯片组的I/OAPIC高级可编程中断控制器APIC1.8259A的寄存器中断请求寄存器IRR保存8条外界中断请求信号IR0~IR7的请求状态Di位为1表示IRi引脚有中断请求中断服务寄存器ISR保存正在被8259A服务的中断状态Di位为1表示IRi中断正在服务中中断屏蔽寄存器IMR保存对中断请求信号IR的屏蔽状态Di位为1表示IRi中断被屏蔽(禁止)2.8259A的工作方式普通全嵌套方式中断优先权顺序固定不变,从高到低依次为IR0,IR1,IR2,……IR7对当前请求中断中优先权最高的中断IRi予以响应送出向量号,对应ISR的Di位置位,至到中断结束在ISR的Di位置位期间,禁止再发生同级和低级优先权的中断,允许高级优先权中断的嵌套普通中断结束方式中断结束是指8259A结束中断的处理,以中断服务寄存器ISR某位复位作为该中断结束的标志发出普通中断结束EOI命令,把正在服务的中断中优先权最高的ISR位复位3.8259A的编程指定其工作方式和控制中断处理过程开始工作前,必须进行初始化编程写入初始化命令ICW:选择工作方式工作期间,需要中断操作编程写入操作命令字OCW:按新要求工作,读取信息OCW1:写入IMR,控制中断屏蔽OCW2:产生EOI命令,改变优先权顺序OCW3:控制读取IRR、ISR、IMR和查询字4.8259A的应用主片I/O地址:20H和21H从片I/O地址:A0H和A1H16级中断使用情况:IRQ0用做微机系统的日时钟中断请求IRQ1用来请求处理器读取键盘扫描码……工作方式:上升沿为中断请求IRQ有效信号IRQ0~IRQ7和IRQ8~IRQ15中断向量号依次为08H~0FH,70H~77H优先权顺序:IRQ0~IRQ2,IRQ8~IRQ15,IRQ3~IRQ7普通中断结束EOI方式:需要发送普通EOI命令一般采用普通屏蔽方式,通过写入IMR允许中断7.3.5可屏蔽中断服务程序可屏蔽中断服务程序随时中断,注意:发送中断结束命令一般只能采用存储单元传递参数不要使用DOS系统功能调用中断服务程序尽量短小主程序需要修改中断向量,还要注意:控制处理器的中断允许标志设置中断屏蔽寄存器〔例7-6〕可屏蔽中断服务程序-1

;数据段intmsg byte'A8259AInterrupt!',0dh,0ah,0counter byte0 ;中断次数记录单元

;代码段

movax,3508h ;获取原中断向量表项

int21h

pushes ;利用堆栈保存

pushbx

cli ;关中断

pushds ;设置新中断向量表项

mov

ax,segnew08h

mov

ds,ax

mov

dx,offsetnew08h

movax,2508h

int21h popds〔例7-6〕可屏蔽中断服务程序-2

inal,21h ;读出IMR

pushax ;保存原IMR内容

andal,0feh ;允许IRQ0,其他不变

out21h,al ;设置新IMR内容

movcounter,0 ;设置中断次数初值

sti ;开中断start1: cmpcounter,10 ;主程序仅循环等待中断

jbstart1 ;中断10次退出

cli ;关中断

popax ;恢复IMR

out21h,al

popdx ;恢复原中断向量表项

popds

movax,2508h

int21h

sti ;开中断〔例7-6〕可屏蔽中断服务程序-3new08h proc

sti ;开中断

pushax ;保护寄存器

pushsi pushds

mov

ax,@data ;设置DS

mov

ds,ax inccounter ;中断次数加1

mov

si,offset

intmsg ;显示信息

calldpstri

moval,20h ;发送EOI命令

out20h,al中断服务程序〔例7-6〕可屏蔽中断服务程序-4 popds ;恢复寄存器

popsi popax

iret ;中断返回new08h endp

(1)INTR有效,请求中断(2)中断响应……(6)执行中断服务程序(7)中断返回中断服务程序

start1: cmpcounter,10

jb

start1

cli主程序〔例7-6〕可屏蔽中断服务程序-5dpstri proc ;显示字符串子程序

pushax ;入口参数:DS:SI=字符串首址

pushbxdps1: mov

al,[si]

cmpal,0

jzdps2

movbx,0 ;调用ROM-BIOS功能显示AL中字符

movah,0eh

int10h incsi

jmpdps1dps2: popbx popax retdpstri

endpA8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!A8259AInterrupt!显示结果7.3.6驻留中断服务程序没有驻留的程序执行结束后,使用的主存空间被DOS回收用于其他程序驻留TSR程序:程序执行结束保存在主存中断服务程序要让其他程序使用必须驻留用DOS功能调用的31H号实现程序驻留并返回功能编号AH=31H入口参数AL=返回代码DX=驻留长度(单位:节)功能说明程序驻留返回DOS〔例7-7〕驻留中断服务程序-1

includeio16.inc .codenew04h proc ;中断服务程序

sti

pushax ;保存寄存器

pushbx pushsi pushds

mov

ax,cs ;数据在代码段中,故DS=CS

mov

ds,ax movsi,offsetintmsgdps1: moval,[si]

温馨提示

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

评论

0/150

提交评论