《微机与操作系统贯通教程》第2章:指令系统与汇编语言_第1页
《微机与操作系统贯通教程》第2章:指令系统与汇编语言_第2页
《微机与操作系统贯通教程》第2章:指令系统与汇编语言_第3页
《微机与操作系统贯通教程》第2章:指令系统与汇编语言_第4页
《微机与操作系统贯通教程》第2章:指令系统与汇编语言_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

新世纪高职高专实用规划教材 微机与操作系统贯通教程,王宝军 著 清华大学出版社,微机与操作系统贯通教程 王宝军 著 清华大学出版社,第2章 指令系统与汇编语言,学习目的与要求 熟练掌握8086/8088 CPU的功能结构以及内存储器的分段组织,对于学习汇编语言程序设计至关重要,甚至对全课程的学习都有很大的帮助。汇编语言虽然已不作为应用软件开发的主要编程语言,但用它编写的程序能够充分发挥硬件系统的特性,时空效率高,在I/O接口、操作系统内核、实时控制系统的开发以及程序调试、加密解密等方面具有其他高级语言无法替代的作用。通过本章的学习和上机操作,要求理解8086/8088寻址方式与常用指令、DOS和BIOS功能调用、四种基本结构的程序设计方法,能读懂和编写简单功能的汇编语言程序,并正确运用DEBUG工具,熟练掌握上机调试过程。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2.1 CPU的功能结构与内存的组织,主要内容,重点关注:本节内容对于理解微机原理和汇编语言程序设计都 至关重要,甚至对全课程的学习都有很大的影响。,2. CPU内部寄存器组,3. 存储单元的地址和内容,4. 内存储器地址的分段,微机与操作系统贯通教程 王宝军 著 清华大学出版社,1. CPU的编程结构,从指令队列取出指令代码,并在ALU中进行计算,运算结果的特征保存在标志寄存器FLAG中。,负责与存储器、输入输出端口传送信息。,正因为有了指令队列(8086为6 Byte,8088为4 Byte),才使8086/8088 的EU和BIU能够基本做到并行工作,减少了CPU的等待时间,提高了效率,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. CPU内部寄存器组(一),微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. CPU内部寄存器组(二),有关CPU内部寄存器的说明 四个16位数据寄存器(AX、BX、CX、DX)一般用于存放参与运算的数据或运算结果。每个数据寄存器又可以将高8位和低8位分别作为两个独立的8位寄存器使用,高8位记作AH、BH、CH、DH,低8位记作AL、BL、CL、DL。 指令指针寄存器IP用于存放当前需取指令的偏移地址,CPU从CS:IP指向的内存单元取出指令代码后,IP自动加N(该指令所占的字节数),指向下一条指令代码的位置。但要注意,用户程序不能直接访问IP寄存器。 在8086/8088 CPU中,16位标志寄存器FLAG只用了9位,包括6个状态标志位和3个控制标志位,如下图所示。在编程时,常常需要通过当前状态标志位的值来对运算结果作出判断,或者通过设置控制标志位的值来改变某种工作方式。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 内存单元的地址和内容,注意:,字数据的存放遵循“低位字节存入低地址,高位字节存入高地址”规则。 尽量从偶地址开始存放字数据,即成为对准字,以提高访问速度。 内存单元的内容“取之不尽”,只有存入新的信息后才会被覆盖而丢失。 地址总线的条数决定了可访问的最大物理内存空间(或容量)。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 内存储器地址的分段,为何将内存分段组织?,将1MB的存储空间划分为多个逻辑段,每个段最大空间为64KB; 用一个16位段寄存器来存放需要访问哪个段,即段的起始地址或称段地址; 用一个16位的地址来表示需要访问段内的哪个单元,即段内偏移地址,也就是段内相对于段起始地址的偏移量; 由一个20位地址加法器来生成20位物理地址,计算方法是: 物理地址16段地址偏移地址,由于8086/8088 CPU外部提供了20位地址,可以访问的最大物理存储空间为1MB,而CPU内部字长为16位,其内部寄存器、运算器及片内总线都是16位的,只能提供16位地址,访问64KB的最大空间。为此采用了内存分段方法。,内存分段组织的方法:,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2.2 8086/8088指令系统,主要内容,2. 常用数据传送指令,3. 常用算术运算指令,5. 程序控制指令,6. 处理器控制指令,1. 8086/8088寻址方式,4. 逻辑运算和移位指令,重点关注: 指令格式与组成 操作数寻址方式的合法运用 常用指令的基本功能 指令执行对标志位的影响,微机与操作系统贯通教程 王宝军 著 清华大学出版社,1. 8086/8088寻址方式(一),(1)指令格式,立即数操作数就是直接包含在指令中的常量数据。 寄存器操作数即指定寄存器中存放的内容。 存储器操作数即指定存储单元中存放的内容。 I/O端口地址即指明数据来自于指定输入设备的端口,或者将数据送出到指定输出设备的端口。 转移地址操作数用于转移、循环、调用子程序等指令中指明需要跳转的目的地址。,8086/8088系统的指令由操作码和操作数两部分组成,格式如下: , 其中,操作码指定指令做何种操作;操作数可以有02个,用于指明参加操作的数据的来源和去向。,(2)操作数的种类,微机与操作系统贯通教程 王宝军 著 清华大学出版社,1. 8086/8088寻址方式(二),(3)七种寻址方式:,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. 常用数据传送指令,说明,数据传送指令操作后均不影响标志位。 MOV指令中,不能在两个存储单元之间传送,除立即数外,两个操作数必定有一个是寄存器;也不允许在2个段寄存器之间传送数据,不允许使用CS。 输入/输出操作只能使用IN/OUT指令完成外设与累加器AX或AL之间传送信息。其中,PORT是指外部设备的I/O端口号,基于80x86的PC机的端口地址空间为1KB,即1024个端口地址(0003FFH)。当PORT255(即0FFH)时,可以直接在指令中指定;当PORT256(即100H3FFH)时,必须先把PORT暂存到DX寄存器中,然后在IN/OUT指令中指定DX寄存器作为PORT。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 常用算术运算指令(一),(1)加、减法运算指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 常用算术运算指令(二),(2)乘、除法运算指令,注意:算术运算指令执行后都将影响CF、ZF、SF、OF、PF、AF等标志位值。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 逻辑运算和移位指令(一),(1)逻辑运算指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 逻辑运算和移位指令(二),(2)移位操作指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,5. 程序控制指令,说明:表中的JCC只是符号,实际的条件转移指令分为三类。 根据单个标志位判断转移的JC/JNC、JZ/JNZ、JS/JNS、JO/JNO、JP/JNP指令; 无符号数比较转移指令JA/JAE、JB/JBE; 带符号数比较转移指令JG/JGE、JL/JLE。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,6. 处理器控制指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2.3 汇编语言程序设计基础,主要内容,2. 数据与表达式,3. 常用伪指令,5. 上机操作过程,6. 上机操作内容预备,1. 汇编语言语句格式,4. 汇编语言源程序格式,重点关注: 汇编语言语句的格式规范 汇编语言的源程序格式 常用伪指令的功能与用法 汇编语言上机操作过程,微机与操作系统贯通教程 王宝军 著 清华大学出版社,1. 汇编语言语句格式,(1)语句分类:, ,分为指令语句和伪指令语句两种:指令语句是可执行的语句,汇编时产生可供机器执行的二进制目标代码;伪指令不属于CPU指令系统,只是在源程序中用于定义变量和段以及指示程序的结束等,汇编后不产生目标代码。,(2)语句格式:,名字标号、变量名、常量名、段名、子程序名等的统称,仅标号需后跟冒号。它应具有唯一性,命名规则是,以字母或下划线开头,最多包含31个字符,可用的合法字符有:az AZ 09 ? ; _ $ 操作码指令的助记符,不可缺,它与名字、操作数之间以空格间隔。 操作数可以是立即数、寄存器或存储单元,立即数在语句中可以是常量,也可以是变量、标号、表达式。有2个操作数时以逗号间隔。 注释可以放在语句行的末尾,以分号(;)开头,称为行尾注释;也可以直接在行首以分号(;)开头加注释,这种称为注释行。,(3)格式说明:,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. 数据与表达式,(1)常量,常数以D(十进制数,可缺省)、B(二进制数)、Q(八进制数)、H(十六进制数)结尾。 符号常量用EQU或“=”号为一个常数定义的符号。 字符型常量用引号定界的字符串,字符ASCII码即为该字符型常量的值。,是一个或一组连续存储单元的名字,用DB(字节)、DW(字)、DD(双字)、DQ(四字)、DT(十个字节)伪指令定义,同时也就说明了变量的类型。 变量有段(SEG)、偏移(OFFSET)和类型(TYPE)属性,即通过变量名可得到其段地址、偏移地址和类型值(分别是1、2、4、8、10)。,(2)变量,表达式由运算符与常量、变量或标号等结合而构成。常用的算术运算符有:+、-、*、/、MOD;逻辑运算符有:NOT、AND、OR、XOR;比较运算符有:EQ、NE、LT、GT、LE、GE;分析操作符有SEG、OFFSET等。,(3)表达式,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 常用伪指令(一),(1)变量定义和数据预置伪指令, 一个语句可分配指定类型的一个或多个存储单元并预置初值,参数表以逗号间隔预置初值,但变量名引用的只是第一个存储单元的值。 参数表中可以使用“?”号,以表示保留空间但不赋初值。 参数表中可以使用重复操作符DUP来复制某些参数,格式为: DUP () ;n为重复次数,参数表为重复内容 例: DATA1 DB 10, 10H DB 3*20 DATA2 DW ? CHAR DB Hi!, EQU = 两者区别:对于同一个符号常量名,用EQU伪指令定义后在程序中不允许重复定义,而“=”伪指令定义后允许重新定义。,(2)符号常量定义伪指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 常用伪指令(二),(3)段定义和段装配伪指令, SEGMENT ;段定义 ENDS ASSUME :, ;段装配 上述段定义只是最基本的默认格式,实际还包含段类型等多个参数。 ASSUME伪操作须紧跟在段定义之后,用于明确段名和段寄存器的关系。,END 标号,(4)程序结束伪指令,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 汇编语言源程序格式,; *这是一个典型的汇编语言源程序结构* datarea segment ; 定义数据段 ; 数据定义 datarea ends ; 数据段结束 ; * prognam segment ; 定义代码段 assume cs: prognam, ds: datarea ; 装配代码段和数据段 start: ; 程序开始标号 mov ax , datarea ; 数据段段地址装入DS mov ds , ax ; 主程序内容 mov ah , 4ch ; 返回DOS int 21h prognam ends ; 代码段结束 ; * end start ; 程序(汇编)结束,说 明,一个汇编语言源程序至少包含一个代码段,数据段根据程序需要而定,可以没有,也可以既有数据段又有附加段。 ASSUME伪指令只是明确段名和段寄存器的关系,程序开始后还必须将数据段(如果有的话)段首地址装入DS寄存器。 调用4CH号DOS功能的指令用于返回DOS环境。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,5. 汇编语言上机操作过程,使用EDIT编辑器编辑源程序,并保存文件。 使用MASM对源程序进行汇编,生成二进制目标文件。 使用LINK对目标文件进行装配连接,生成可执行文件。 在DOS提示符下运行可执行文件。 如果汇编、连接过程中出错,或者有运行错误,则修改源程序,然后按上述步骤操作,直至程序运行正确。,操作步骤:,微机与操作系统贯通教程 王宝军 著 清华大学出版社,6. 上机操作内容预备,data segment ; 定义数据段 string db Hello, World!, $ ; 定义字符串,以”$”作为串结束符 data ends ; 数据段结束 code segment ; 定义代码段 assume cs: code, ds: data ; 装配代码段和数据段 start: mov ax,data ; 数据段段地址装入DS mov ds,ax mov dx,offset string ; 取字符串首地址存入DX mov ah,9 ; 调用9号DOS功能,输出字符串 int 21h mov ah,4ch ; 调用4ch号DOS功能,返回DOS环境 int 21h code ends ; 代码段结束 end start ; 程序(汇编)结束,(1)认真阅读本教程实训1指导书内容,(2)理解以下简单的汇编语言源程序,(3)按以下要求编写程序,求X+Y的值并存入Z单元(X、Y、Z均为字变量),微机与操作系统贯通教程 王宝军 著 清华大学出版社,2.4 汇编语言程序设计应用,主要内容,2. DOS和BIOS调用,3. DEBUG应用,5. 循环结构程序设计,6. 子程序设计,1. DOS与BIOS的关系,4. 分支结构程序设计,重点关注: DOS与BIOS的层次关系 分支与循环的实现 DEBUG在程序调试中的运用 子程序结构与设计方法,微机与操作系统贯通教程 王宝军 著 清华大学出版社,1. DOS与BIOS的层次关系,说 明,从地址0FE000H开始的8KB ROM中装有BIOS(Basic Input/Output System)例行程序,提供了系统加电自检、引导装入、主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。 DOS(Disk Operating System)是IBM PC机的磁盘操作系统,由一个引导程序(BOOT)和三个主要的功能模块组成。,从程序员来说,BIOS是硬件之上的第一层软件。但由于BIOS以硬件芯片的形式安插在主板上,所以人们往往把它看作是硬件系统的一部分,而把操作系统看作是最靠近硬件的系统软件。,注意,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. 常用DOS和BIOS功能调用(一),(1)常用的DOS功能调用,说 明,调用DOS功能分为三个步骤: 根据需要置入口参数 将DOS调用的功能号置AH 使用INT 21H指令请求中断(21H为DOS调用的中断类型号) DOS系统提供了87个功能调用子程序,功能编号为057H,微机与操作系统贯通教程 王宝军 著 清华大学出版社,2. 常用DOS和BIOS功能调用(二),(1)常用的BIOS功能调用,说明,ROM BIOS使用的中断类型号为81FH ROM BIOS中断调用的方法与DOS调用类似,也分为三个步骤,但有些BIOS中断类型仅有一项功能,则无需置功能号到AH的步骤。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,3. 调试程序DEBUG应用,(1)DEBUG使用格式,DEBUG是用于DOS下调试二进制可执行文件的一种实用工具,可以通过单步运行、设置断点等多种方式为汇编语言程序员提供了非常有效的调试手段。 启动DEBUG程序的命令格式为: C:DEBUG 文件标识 参数1 参数2 DEBUG命令均以单个字母的命令名后跟参数的形式。参数通常是指定某内存单元地址或某地址范围,地址范围的表示有两种基本格式: ; 或者 ,(2)常用DEBUG命令,A汇编 D显示内存单元 E修改内存单元 G运行 I从端口输入 L从磁盘装入内存 N指令文件名 O输出到端口 Q退出DEBUG R修改寄存器内容 T单步跟踪执行 U反汇编 W从内存写入磁盘,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 分支结构程序设计(一),(1)分支结构程序设计实例,【例2-2】 从键盘上接收1位十进制数,判断其奇偶性。在内存中定义Y变量,若为奇数,则Y=1;若为偶数,则Y=0。,(2)问题分析,从键盘上接收1位十进制数可以使用DOS中断的1号功能调用。 键盘上取得的是数字字符“0”“9”的ASCII码,即30H39H,它要减掉30H后才可得到相应的数值。但由于该问题只是判断奇偶性,数字字符ASCII码的奇偶性与相应数值的奇偶性一致,故不需转换。 对于以二进制形式存储的数据来说,判断奇偶性最为简单的方法就是判断其最低位是1还是0即可。具体做法是将其最低位移入CF标志位,然后用JC或JNC条件转移指令形成两种不同情形的处理,即:CF=1则为奇数,CF=0则为偶数。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,4. 分支结构程序设计(二),(3)代码设计,data segment ; 定义数据段 Y db ? ; 定义变量Y data ends ; 数据段结束 code segment ; 定义代码段 assume ds:data,cs:code begin:mov ax,data mov ds,ax ; 数据段段地址装入DS mov ah,01h int 21h ; 调用1号DOS功能 clc ; CF清0 rcr al,1 ; 带进位循环右移1位 jnc evn ; 无进位则转EVN mov Y,1 ; 有进位则Y单元置1 jmp exit ; 跳转到EXIT evn: mov Y,0 ; 偶数,则Y单元置0 exit: mov ah,4ch int 21h ; 返回DOS code ends ; 代码段结束 end begin ; 程序结束,(4)问题的进一步思考,程序运行后直接返回DOS而无结果输出,如何使用DEBUG查看运行结果? 如何改进程序,利用DOS的2号功能调用,把结果直观地显示在屏幕上,若为奇数则显示“O”,偶数显示“E”。 在显示结果之前,如何输出回车和换行,以避免输出结果覆盖掉键盘输入的字符。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,5. 循环结构程序设计(一),(1)循环结构程序设计实例,【例2-3】 以X单元开始的30个连续字节单元中存放有30个无符号数,从中找出最大数存入Y单元中。,(2)问题分析,该问题是一个典型的循环次数已知的计数式循环,可以利用循环指令LOOP来实现。 可以先将第一个数(即X变量值)置入AL,然后将其后的29个数逐个与AL进行比较。每次比较后,若大于AL的值,则将其置入AL而覆盖原有的数;若小于或等于AL的值,则不做任何操作而直接进入下一个数的比较。这样,通过29次比较后,存放在AL中的最终值就是30个数中的最大值。 为了能使用地址去引用每个数,方便地实现循环,把X单元的地址存入BX中,每次循环后将BX的值加1即可指向下一个数的地址值。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,5. 循环结构程序设计(二),(3)代码设计,data segment X db 11,22,13,56,76,78,55,64,44,24 db 56,34,67,44,88,34,80,79,34,12 db 68,44,10,23,55,91,18,20,60,22 Y db ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax ; 数据段段地址装入DS mov al,X ; 把第1个数置入AL mov bx,offset X ; 把X的偏移地址置入BX mov cx,29 ; 把循环次数29置入CX rtat: inc bx ; 地址指针加1 cmp al,bx ; 比较AL和BX的内容 jae gore ; 若ALBX则转GORE mov al,bx ; 否则,ALBX gore: loop rtat ; CX0则转循环点RTAT mov Y,al ; 循环结束, YAL mov ah,4ch int 21h ; 返回DOS code ends end start,(4)问题的进一步思考,如果把程序的功能改为从30个数中取出最小数存入Y单元,则只需修改其中的一个语句即可实现,如何修改请思考。 如果30个数是字类型的数据,则应修改哪些地方? 如何把结果(即最大数)在屏幕上显示出来?在此,我们先把问题简化,假设这30个数中最大为两位十进制数。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,6. 子程序设计(一),(1)为何使用子程序结构?,在设计一个功能较大的程序时,往往把功能相对独立单一、会多次重复使用的程序段设计为子程序,然后在主程序中调用它。使用这种结构不仅有利于功能模块的划分,便于分工协作,也使整个程序结构变得更为清晰,便于调试。,(2)子程序定义与调用格式, PROG 子程序属性 ; 定义子程序 ; 子程序内容 RET ; 子程序返回 ENDP ; 子程序结束 CALL ; 子程序调用,(3)子程序属性的选择,子程序属性有两种:一种是NEAR属性,表明只能供与它在同一个代码段中的程序调用,即段内调用;另一种是FAR属性,表明可以供与它不在同一个代码段中的程序调用,即段间调用。因此,正确选择子程序属性非常重要,它同时决定了该子程序结尾处的子程序返回指令RET和调用它的CALL指令的属性。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,6. 子程序设计(二),(4)子程序设计实例,【例2-4】 从键盘取得一个十进制数,以十六进制形式在屏幕上显示出来。,(5)问题分析,该问题可划分为两大功能:首先是从键盘读取十进制数,以二进制数值形式保存在BX中;然后将BX中的数值以十六进制形式显示出来。这里, BX在子程序之间充当了参数传递的作用。 为使键盘输入并回显的数据保留在屏幕上,输出内容换行显示,把输出换行符和回车符的功能也单独设计成一个子程序。 子程序BINIHEX的实现方法:BX中的16位二进制可以用4次循环来完成相应4位十六进制数符的转换。 子程序DECIBIN也采用循环接收各数位而累积成为一个十进制数值的方法。,微机与操作系统贯通教程 王宝军 著 清华大学出版社,6. 子程序设计(三),(6)代码设计,decihex segment assume cs:decihex main proc far repeat: call decibin call crlf call binihex call crlf mov ah,4ch int 21h main endp decibin proc near mov bx,0 newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9 jg exit cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add bx,ax jmp newchar exit: ret decibin endp,binihex proc near mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al, 3ah jl printit add al,7h printit:mov dl,al mov ah,2 int 21h dec ch jnz rotate ret binihex endp crlf proc near mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp decihex ends end main,(7)问题思考,在DECIBIN子程序中,为何要两次使用XCHG指令交换AX和BX的内容? 在BINIHEX子程序中,总共循环4次是已知的,能否使用LOOP指令实现循环?,微机与操作系统贯通教程 王宝军 著 清华大学出版社,第2章小结(一),从程序员角度来看,8086/8088 CPU由两大功能部件组成,即执行部件(EU)和总线接口部件(BIU)。EU包含8个通用寄存器、1个标志寄存器和ALU,它负责从指令队列取出指令并完成指令的执行;BIU包含4个段寄存器、1个指令指针寄存器、指令队列和地址加法器,它一方面利用总线空闲时间不断从内存中取出指令填入指令队列,另一方面则根据执行指令的需要而存取内存或I/O端口数据。

温馨提示

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

评论

0/150

提交评论