汇编语言程序设计第十四章:端口输入输出与外设编程_第1页
汇编语言程序设计第十四章:端口输入输出与外设编程_第2页
汇编语言程序设计第十四章:端口输入输出与外设编程_第3页
汇编语言程序设计第十四章:端口输入输出与外设编程_第4页
汇编语言程序设计第十四章:端口输入输出与外设编程_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

端口输入输出与外设编程《汇编语言程序设计》第十四章|I/OPort&PeripheralProgrammingContents本章目录微机原理与接口技术核心知识模块概览01I/O端口基础概念与编址方式02IN/OUT指令与端口操作机制03可编程接口芯片原理与应用04典型外设编程实战案例05综合项目与系统设计实践CHAPTER01I/O端口基础概念与编址方式理解CPU与外设通信的物理基础和逻辑架构SystemArchitecture什么是I/O端口I/O端口是CPU与外设之间的数据交换接口,本质是位于外设接口电路中的寄存器,每个端口拥有唯一编号(端口地址),CPU通过读写端口实现对设备的控制和数据获取。端口本质:端口是外设接口电路中的寄存器,CPU通过端口地址定位并读写,实现对设备的控制与数据交换RegisterMapping多端口结构:一个外设通常包含数据端口、状态端口和控制端口,分别用于传输信息、反映状态与接收命令Data·Status·Control本质区别:端口连接外设寄存器而非主存,访问方式和时序与内存单元完全不同Port≠Memory独立编址:端口地址空间独立于内存,x86架构支持64KB的I/O端口地址空间(0000H~FFFFH)0000H–FFFFHI/O端口架构示意·寄存器与地址映射I/OAddressing两种I/O编址方式对比I/O端口编址分为统一编址(存储器映射I/O)和独立编址(隔离式I/O)两种方案。x86架构采用独立编址,拥有64KB独立端口地址空间,通过专用IN/OUT指令访问,与内存地址互不干扰。统一编址(存储器映射I/O)Memory-MappedI/O01端口地址纳入内存地址空间统一管理,访问端口与访问内存使用相同的指令和控制信号02代表架构:Motorola68000、ARM、MIPS等;编程灵活,但端口占用内存地址空间03无需专门I/O指令,但地址空间被端口"瓜分",在地址资源有限的系统中影响显著ARM·MIPS独立编址(隔离式I/O)IsolatedI/O01端口拥有独立地址空间(x86为0000H~FFFFH共64KB),通过专用IN/OUT指令访问02不占用内存地址空间,I/O指令短小精悍(最短仅2字节),执行效率高03I/O指令功能有限、寻址方式单一,需CPU提供额外读写控制信号线(IOR/IOW)x86·64KBSYSTEMARCHITECTUREx86系统I/O端口地址分配x86架构的I/O端口地址空间为16位共64KB(0000H~FFFFH),其中低端区域已被系统核心外设固定占用,用户编程时应避免冲突,仅使用扩展槽和保留区域。0000H–0021HDMA控制器占用0000H~001FH,8259A中断控制器占用0020H~0021H(主片)和00A0H~00A1H(从片)0040H–0071H8253/8254定时器占用0040H~005FH,键盘控制器占用0060H~0064H,CMOS/RTC使用0070H~0071H02F8H–03FFH串口COM1/COM2分别位于03F8H和02F8H附近,并口LPT1位于0378H,VGA显示控制器位于03C0H~03CFH0200H+用户可编程区域主要在0200H~03FFH的扩展卡区域以及更高地址段,编程时需查阅硬件手册确认地址x86常用系统I/O端口地址表端口地址外设名称功能说明0020H–0021H8259A主片可编程中断控制器,管理IRQ0~IRQ70040H–0043H8253/8254可编程定时/计数器,3个通道0060H–0064H键盘控制器8042芯片,处理键盘扫描码0070H–0071HCMOS/RTC实时时钟与CMOSRAM访问0061H扬声器控制PC喇叭启停与定时器通道2门控03F8H–03FFHCOM1串口8250UART,RS-232串行通信0378H–037AHLPT1并口标准并行打印机端口x86系统核心外设端口地址固定分配,编程时必须严格遵守,避免冲突导致系统不稳定I/ODataTransferCPU与外设数据传送方式CPU与外设间的数据传送根据设备速度和系统需求分为四种方式:程序查询、中断驱动、DMA直接存取和通道控制。速度由低到高递增,CPU参与度由多到少递减,编程复杂度也相应增加。CPU与外设数据传送原理示意01程序查询方式:CPU循环读取状态端口,等待外设就绪后再通过数据端口读写,实现简单但CPU利用率低02中断驱动方式:外设准备好数据后向CPU发出中断请求,CPU暂停当前任务执行中断服务程序处理I/O03DMA直接存储器存取:由DMA控制器接管总线控制权,在内存与外设间直接传输数据块,无需CPU介入04通道控制方式:使用专门的I/O处理器(通道)执行通道程序,可管理多个设备的复杂I/O操作序列Chapter02IN/OUT指令与端口操作机制掌握x86汇编中I/O端口读写的核心指令与编程技巧x86Assembly·PortI/OIN指令:从端口读取数据IN指令是x86汇编中唯一的端口读入指令,支持8位/16位数据宽度和直接/间接两种寻址方式。直接寻址限于0~255号端口,超过此范围必须通过DX寄存器间接寻址,数据只能送入AL或AX。018-bitDirectINAL,port8—端口号为8位立即数(0~255),从指定端口读取1字节到AL寄存器。这是最常见的端口读入方式,适用于标准设备端口访问。0216-bitDirectINAX,port8—从连续两个端口读取1个字(低字节port8,高字节port8+1)到AX。用于需要一次性读取16位数据的设备接口。03IndirectviaDXINAL,DX/INAX,DX—端口号>255时,必须先将端口号送入DX再做间接寻址。DX作为16位寄存器可访问0~65535号端口,扩展了寻址范围。04NoFlagChangeIN指令不影响标志位,执行时CPU在地址总线输出端口号并发出IOR读信号,外设将数据送上数据总线。程序员需自行确保端口地址合法及数据就绪状态。X86ASSEMBLY·I/OOUT指令:向端口写入数据OUT指令是x86汇编中唯一的端口输出指令,将AL/AX中的数据写入指定端口。语法方向与IN相反(OUTport,AL),直接寻址限于0~255号端口,超过范围须通过DX间接寻址。01直接寻址OUTport8,AL—将AL中的8位数据写入port8号端口,CPU发出IOW写信号8-bit02直接寻址OUTport8,AX—将AX中的16位数据写入连续两个端口(低字节→port8,高字节→port8+1)16-bit03间接寻址OUTDX,AL/OUTDX,AX—端口号>255时先送DX,语法方向与IN指令相反需特别注意DX04不影响标志位—执行时序包括地址输出、数据锁存和IOW脉冲三个阶段,需满足外设的建立/保持时间IOWI/OProgrammingIN/OUT指令编程示例与常见错误IN/OUT指令使用时必须严格遵循操作数限制(只能用AL/AX),端口号超过255时必须借助DX间接寻址。连续I/O操作时需注意总线时序,必要时插入NOP延时指令防止数据冲突。Example典型代码示例INAL,60H读取键盘扫描码;OUT43H,AL向8253写入控制字;MOVDX,3DAH/INAL,DX读VGA状态寄存器。Error1操作数寄存器越限使用非AL/AX寄存器(如INBL,60H)。IN/OUT的数据操作数只能是AL(8位)或AX(16位),其余寄存器非法。Error2端口号直接寻址越界直接寻址端口号超过255(如INAL,3DAH),必须改为间接寻址:先MOVDX,3DAH,再INAL,DX。Timing连续I/O总线时序向同一芯片连续写入时(如8253先写控制字再写计数值),可能需插入NOP指令确保总线就绪,避免数据冲突。BUSTIMING端口操作的总线时序与控制信号IN/OUT指令执行时CPU通过地址总线输出端口号、数据总线传输数据、控制总线发出IOR/IOW信号三线协同。理解总线时序对编写可靠的硬件驱动程序至关重要。01IN指令时序AL/AX锁存CPU输出端口地址→发出IOR读信号→外设将数据送上数据总线→CPU锁存数据到AL/AX02OUT指令时序IOW写信号CPU输出端口地址→将数据送上数据总线→发出IOW写信号→外设锁存数据到内部寄存器03I/O独立寻址M/IO低电平I/O操作占用独立地址空间,地址总线A0~A15输出端口号,M/IO引脚置低电平区分I/O与内存操作04总线周期·4T状态Tw等待总线周期通常需4个T状态(T1地址输出、T2数据准备、T3数据传输、T4完成),慢速外设可插入Tw等待状态Chapter03可编程接口芯片原理与应用8253定时器、8255并行口、8259中断控制器与8250串口ProgrammableTimer8253可编程定时/计数器概述8253芯片内含3个独立16位计数通道,基地址0040H,输入时钟1.19318MHz。通道0用于系统定时(IRQ0),通道1用于DRAM刷新,通道2驱动PC喇叭,是PC系统最核心的定时基础设施。三通道架构8253包含3个独立16位减法计数器(通道0~2),每个通道有独立的计数初值寄存器和控制寄存器。16位×3端口地址映射PC中端口地址分配:通道0→0040H,通道1→0041H,通道2→0042H,控制字寄存器→0043H。0040H频率与时序输入时钟频率为1.19318MHz(1193180Hz),计数初值N与定时时间T的关系:T=N/1193180秒。1.193MHz通道功能分配系统默认用途:通道0产生IRQ0系统时钟中断(18.2Hz),通道1负责DRAM刷新,通道2连接PC喇叭。18.2HzPROGRAMMABLEINTERVALTIMER8253控制字格式解析8253控制字为8位,分为4个字段:通道选择(D7D6)、读写格式(D5D4)、工作方式(D3D2D1)和计数制(D0)。编程时必须先写控制字再写计数初值,顺序不可颠倒。D7D6D5D4D3D2D1D0SC·通道选择RL·读写格式M·工作方式BCD8253控制字各位含义位域字段名称取值与含义D7D6通道选择(SC)00=通道0/01=通道1/10=通道2D5D4读写格式(RL)00=锁存/01=低字节/10=高字节/11=先低后高D3D2D1工作方式(M)000=方式0/001=方式1/x10=方式2/x11=方式3/100=方式4/101=方式5D0计数制(BCD)0=二进制计数(0000H~FFFFH)/1=BCD计数(0000~9999)控制字决定8253的工作通道、数据读写顺序、定时方式和计数制,编程时须先写控制字再写计数初值PROGRAMMABLETIMER8253六种工作方式详解8253提供6种工作方式,输出波形各不相同。方式2(速率发生器)和方式3(方波发生器)最常用,前者产生周期性窄脉冲适合定时中断,后者产生方波适合音频驱动。方式0:计数结束中断写入初值后开始减计数,计到0时OUT变高电平,可用于事件计数和中断触发。Mode0方式1:硬件单稳态GATE上升沿触发,OUT输出宽度为N个时钟周期的低脉冲,适合精确定时控制。Mode1方式2:速率发生器自动重装初值,输出周期性负脉冲(宽度=1个CLK),周期=N个CLK,常用于系统定时。Mode2方式3:方波发生器自动重装,输出占空比约50%的方波,频率=CLK/N,是PC喇叭发声的标准工作方式。Mode3PARALLELINTERFACE8255可编程并行接口芯片8255提供3个8位并行端口(A/B/C口共24条I/O线),支持基本I/O、选通I/O和双向总线三种工作方式。PC中用于连接键盘、打印机及读取系统配置,基地址0060H。三端口结构包含A口(PA0~PA7)、B口(PB0~PB7)和C口(PC0~PC7),共24条可编程I/O线,基地址0060H24条I/O方式0·基本I/O各端口独立设定方向,无握手信号,适合简单设备如开关、LED无握手方式1·选通I/OC口部分引脚作为握手信号线(STB/ACK/IBF/OBF),适合打印机等需要应答的设备STB/ACK方式2·双向总线仅A口支持,C口提供5条控制线,适合与双向数据总线设备通信仅A口8255PROGRAMMING8255控制字格式与编程方法8255有两种控制字:方式选择控制字(D7=1)设定各端口工作方式和方向;C口按位置位/复位控制字(D7=0)可单独控制C口某一位的状态,适合精细控制握手信号线。TYPEA方式选择控制字(D7=1)D71D6D5A口方式D4A方向D3C高方向D2B方式D1B方向D0C低方向01D7=1标识方式选择,D6D5设A口方式(00/01/10),D4设A口方向,D3设C口高4位方向02D2设B口方式(0/1),D1设B口方向,D0设C口低4位方向82HA口输出·B口输出·C口输入TYPEBC口按位置位/复位控制字D70D6D5D4无关位D3D2D1位选择D0置/复01D7=0标识位操作,D3D2D1选择C口位(000~111对应PC0~PC7),D0为1则置位、为0则复位02向控制口写07H(00000111B)使PC3置1,写06H(00000110B)使PC3清0PC0–PC7逐位独立控制·精细操作握手信号MICROPROCESSORSYSTEMS8259A可编程中断控制器8259A管理8级中断请求(IRQ0~IRQ7),PC/AT中两片级联支持15级中断。通过IRR/ISR/IMR三个核心寄存器实现中断的登记、服务和屏蔽控制,主片端口0020H/0021H。01级联架构PC/AT使用两片8259A级联:主片(IRQ0~IRQ7)端口0020H/0021H,从片(IRQ8~IRQ15)端口00A0H/00A1H02IRR/ISRIRR(中断请求寄存器)锁存所有当前中断请求,ISR(中断服务寄存器)标记正在处理的中断优先级03屏蔽控制IMR通过OCW1设置:对应位=1屏蔽该IRQ,=0允许该IRQ;如OUT21H,0FEH仅开放IRQ004响应流程外设拉高IRQ→8259A锁存IRR→判优后向CPU发INT→CPU响应INTA→8259A送中断类型号SerialCommunication8250UART串行通信接口8250UART实现PC的异步串行通信(RS-232),COM1基地址03F8H。通过除数锁存器设定波特率,自动完成串并转换、起始/停止位处理和奇偶校验,是PC间通信和连接串行外设的核心芯片。基址与寄存器COM1基地址03F8H,COM2基地址02F8H;内部含发送保持寄存器、接收缓冲寄存器、线路状态寄存器等多个功能寄存器,用于数据收发和状态监控。03F8H波特率设定先设DLAB=1(线路控制寄存器D7=1),再向DLL/DLM写入除数,除数=1843200/(16×波特率)。常用波特率有9600、19200、115200等。1843200/(16×Baud)数据帧格式通过线路控制寄存器(LCR)设定:数据位长度(5~8位)、停止位(1/1.5/2位)、校验方式(奇/偶/无)。典型配置为8位数据、1位停止、无校验。LCR发送流程检查线路状态寄存器(LSR)的THRE位→写入数据到THR→8250自动加起始位/停止位后逐位移出。THRE=1表示发送保持寄存器为空,可写入新数据。THRE→THRCHAPTER04典型外设编程实战案例从RTC时钟、PC喇叭到数码管显示,用汇编驾驭真实硬件CMOS·RTC实战案例:读取CMOS实时时钟PC主板CMOS芯片内置RTC实时时钟,通过端口70H写索引、71H读数据的方式获取时分秒等信息。数据为BCD码格式,需经高低4位分离后转换为ASCII码才能正确显示。PORT70H/71HCMOSRTC由主板电池供电维持走时,端口70H为地址索引端口,71H为数据读写端口STEPOUT→NOP→IN读取步骤:OUT70H写索引号(如04H=小时)→NOP延时→INAL,71H获取BCD码值CONVERTBCD→ASCII高4位右移4位后加30H,低4位与0FH后加30H,分别得到十位和个位的ASCII字符寄存器索引速查00H秒SEC02H分MIN04H时HOUR06H星期DAY07H日DATE08H月MONTH09H年YEAR所有寄存器值均为BCD码格式Assembly·CMOSCMOS时间读取:汇编代码实现完整的CMOS时间读取程序包含三个核心子程序:CMOS端口读写、BCD码转ASCII码、以及主程序中的时分秒顺序读取与格式化显示。代码结构清晰,可直接在DOS实模式下运行。01READ_CMOS子程序:MOVAL,DL→OUT70H,AL→NOP→INAL,71H,返回AL中为BCD格式的时间值70H/71H02BCD_TO_ASCII子程序:MOVAH,AL→SHRAH,4→ANDAL,0FH→ADDAX,3030H,AH和AL分别为十位、个位字符3030H03主程序流程:依次读取04H(时)、02H(分)、00H(秒),将ASCII结果存入缓冲区,插入':'分隔符后调用INT21H显示INT21H04防抖机制:采用轮询方式每秒刷新时,比较前后两次读取的秒值,仅当秒值变化时才更新显示,避免屏幕闪烁轮询ASSEMBLYI/O实战案例:PC喇叭发声编程PC喇叭发声需协同8253通道2(产生方波频率)和端口61H(控制扬声器开关)。计数初值N=1193180÷目标频率,通过OUT42H写入后开启61H端口低两位即可发声。01配置8253通道2:OUT43H,0B6H(方式3方波),计算N=1193180÷频率,先低字节后高字节写入42H端口02开启扬声器:INAL,61H→ORAL,03H→OUT61H,AL,使能定时器通道2输出并接通扬声器电路03停止扬声器:INAL,61H→ANDAL,0FCH→OUT61H,AL,断开扬声器连接,喇叭静音04FREQUENCYTABLE音阶频率表C4262Hz·N=4553D4294Hz·N=4058E4330Hz·N=3616A4440Hz·N=2712SOUNDCONTROLPC喇叭演奏旋律:音符与节拍控制旋律播放需要音符频率表和节拍时长表的配合:通过数据段预定义频率-节拍数组,循环取出每组数据驱动8253发声并延时,实现软件定义音乐的效果。01数据段定义频率表DW262,294,330,349,392,440,494,523——对应C4到C5的8个音符频率值C4→C502数据段定义节拍表DW4,4,4,4,4,4,2,2——数值代表四分之一拍的倍数,4=1拍,8=2拍4=1拍03演奏循环取频率→计算N写入8253→开启61H喇叭→按节拍延时→关闭61H喇叭→取下一个音符,直至结束标志825304精确延时方案用INT1AH读系统时间戳(18.2Hz精度),等待指定tick数后再继续,避免空循环受CPU主频影响18.2HzPROGRAMMINGPRACTICE实战案例:七段数码管显示编程七段数码管通过8位段码(a~g+dp)控制显示内容,0~9对应固定段码值。通过并行口LPT1(378H)输出段码驱动显示,多位数码管采用动态扫描方式,扫描频率需>60Hz以避免闪烁。段码映射0→3FH·1→06H·2→5BH·3→4FH·4→66H·5→6DH·6→7DH·7→07H·8→7FH·9→6FH单管显示—将段码通过OUT378H,AL写入LPT1数据端口,经驱动电路控制数码管各段LED亮灭多位动态扫描—轮流输出位选信号和段码,每位显示时间<5ms,整组扫描频率>60Hz利用视觉暂留消隐处理—切换位选前先输出全灭段码(00H)避免残影;选通信号(STB)需精确控制时序0~9数字对应的七段数码管段码表数字点亮段段码(HEX)0a,b,c,d,e,f3FH1b,c06H2a,b,d,e,g5BH3a,b,c,d,g4FH4b,c,f,g66H5a,c,d,f,g6DH6a,c,d,e,f,g7DH7a,b,c07H8a,b,c,d,e,f,g7FH9a,b,c,d,f,g6FH段码为共阴极接法,高电平点亮对应段;共阳极接法则需取反(XORFFH)PRACTICALCASE实战案例:RS-232串口通信编程RS-232串口通信通过8250UART实现,编程分为波特率初始化、数据帧配置和数据收发三步。需先检查状态寄存器确认发送/接收就绪,再操作数据寄存器完成通信。01波特率初始化向3FBH写80H(DLAB=1)→向3F8H写除数低字节→向3F9H写除数高字节→恢复DLAB=0DLAB→DIVISOR02数据帧配置向3FBH写入LCR值,如03H表示8位数据、1位停止位、无校验(最常用的9600-8-N-1格式)9600-8-N-103发送数据轮询3FDH的bit5(THRE)→为1时向3F8H写入待发送字节→8250自动加起始/停止位后串行移出THRE→TX04接收数据轮询3FDH的bit0(DR)→为1时从3F8H读取接收到的字节→自动去除起始/停止位得到并行数据DR→RXSERIALCOMMUNICATION串口通信:完整收发程序框架完整的串口通信程序包含初始化和收发两个核心模块。发送端轮询THRE状态后写数据,接收端轮询DR状态后读数据,双方通过交叉串口线(TX-RX)实现点对点数据交换。01发送端流程初始化8250→INT16H读键→轮询3FDHbit5(THRE)→OUT3F8H发送字符→ESC退出循环TX·3F8H02接收端流程初始化8250→轮询3FDHbit0(DR)→INAL,3F8H读字符→INT10H显示→ESC退出RX·3FDH03错误处理读取LSR(3FDH)检查bit1(溢出)、bit2(奇偶错)、bit3(帧错误),异常时丢弃并报警LSR·3FDH04流控机制软件流控用XON/XOFF(11H/13H),硬件流控通过RTS/CTS握手线(MCR/MCR寄存器控制)XON/XOFF·RTS/CTSCHAPTER05综合项目与系统设计实践融合多芯片协同编程,完成完整的系统级汇编项目CourseProject综合项目:系统时间显示与倒计时闹铃系统时间+倒计时+闹铃项目融合CMOS读取、INT10h视频控制和8253喇叭驱动,采用主循环轮询架构,每秒刷新显示并检测键盘事件,是汇编课程设计的经典综合题目。时间显示模块每秒调用CMOS读取子程序获取时分秒,BCD转ASCII后通过INT10h定位光标并彩色显示INT10h倒计时模块用户输入目标秒数,程序计算结束时刻(当前秒+倒计时秒),每秒比对实时秒值判断是否到期实时比对闹铃触发模块倒计时结束时调用PC喇叭子程序,向8253通道2写入频率计数值,响铃3秒后自动停止1000Hz键盘交互模块INT16h非阻塞检测按键,ESC退出程序、空格暂停/继续倒计时、R键重置倒计时INT16hARCHITECTURE项目架构:模块化程序结构设计项目采用代码段/数据段/堆栈段三段式结构,主循环包含时间刷新、倒计时检查和键盘扫描三大模块。各子程序独立封装,通过寄存器传参,遵循PUSH/POP现场保护约定。数据段定义TIME_BUF(8字节ASCII时间串)、COUNT_SEC(倒计时剩余秒数)、STATE_FLAG(状态标志位)▸定义数据缓冲区与状态存储区域▸支持实时时间显示与倒计时功能DataSegment主循环结构CALLTIME_UPDATE→CALLCOUNTDOWN_CHECK→CALLKEY_SCAN→CMPEXIT_FLAG,1→JNEMAIN_LOOP▸顺序调用三大功能模块完成单次循环▸检测退出标志决定是否继续执行MainLoop子程序清单READ_RTC(CMOS读取)、BCD2ASC(码制转换)、DISPLAY_TIME(INT10h定位+输出)、SOUND_BEEP(喇叭驱动)▸封装硬件访问与数据转换逻辑▸通过BIOS中断完成屏幕输出与音效控制Subroutines现场保护约定每个子程序入口PUSHAX/BX/CX/DX,出口POP恢复,确保主循环变量不被意外修改▸严格遵循堆栈平衡原则保护寄存器▸保证模块调用前后执行环境一致性ContextProtectionCOMPREHENSIVEPROJECT综合项目:80C51定时/计数器测速系统80C51测速系统利用T0定时

温馨提示

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

评论

0/150

提交评论