4章汇编程序设计

合集下载

汇编语言程序设计

汇编语言程序设计

汇编语⾔程序设计第4章汇编语⾔程序设计§4.1 汇编语⾔的模式⼀、汇编语⾔源程序的⼀般模式[Name 模块名][Title 标题][定义宏][定义数据段][定义附加段][定义堆栈段]定义代码段源程序结束中括号括起的部分可以省略,可见在⼀个汇编语⾔源程序中必须要定义代码段,并且必须有源程序结束指令。

⼆、8086汇编语⾔程序的⼀个例⼦Pg90。

§4.2 语句⾏的构成汇编语⾔中的语句⼀般分为两种类型:指令性语句和指⽰性语句。

指令性语句的格式为:[标号:] 助记符 [操作数1[,操作数2]] [;注释]指⽰性语句的格式为:[名称] 助记符 [参数1,参数2,……] [;注释]标号和名称都是编程⼈员根据需要和⼀定的规则任意取的。

也可以认为汇编语⾔的语句⾏是由标记和分隔符(空格)构成。

⼀、标记1.IBM宏汇编的字符集(1)字母(2)数字符(3)特殊字符2.界符⽤于定界⼀个标记的结束或⼀个标记的开始,本⾝具有⼀定的意义。

3.常量出现在汇编语⾔源程序中的固定值称为常量。

(1)数值常量①⼆进制:以字母B结束。

②⼗进制:以字母D或⽆字母结束。

③⼋进制:以字母Q(或O)结束。

④⼗六进制:以字母H结束。

(2)字符常量指⽤单引号或双引号引起的字符或字符串。

4.标识符由程序员⾃⼰建⽴的字符序列(标号或名称)。

⼀个标识符不能超过31个字符,不能以数字开头。

5.保留字汇编语⾔中具有特殊意义的字符序列。

6.注释⼀⾏中分号以后的部分。

⽤于对⼀段或⼀⾏程序进⾏说明,便于阅读和理解。

⼆、符号具有⼀定意义的字符序列。

1.寄存器名2.变量段属性、偏移属性、类型属性3.标号段属性、偏移属性、类型属性4.常数5.其它三、表达式由操作数和运算符组合⽽成的序列。

1.操作数(1)⽴即数(2)寄存器操作数(3)存储器操作数2.运算符(1)算术运算符+、-、*、/、MOD(求余)(2)逻辑运算符AND、OR、NOT、XOR(3)关系运算符EQ、NE、LT、LE、GT、GE结果为“假”时,返回0,结果为“真”时,返回⼆进制全1。

汇编语言程序设计

汇编语言程序设计

第4章 汇编语言程序设计
例4.4 显示两位压缩BCD码值(00~99) ,要求不显示前导0。 本例一方面要排除前导0的情况,另一方面 对于全0情况又必须显示一个0,所以形 成了两个双分支结构的程序。
第4章 汇编语言程序设计 DATA SEGMENT BCD DB 04H ; 给出一个BCD码数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA BEGIN: MOV AX, DATA MOV DS, AX MOV DL,BCD ;取BCD码 TEST DL,0FFH ;如果这个BCD码是0,则显示为0 JZ ZERO TEST DL,0F0H ;如果这个BCD码高位是0,不显示 JZ ONE MOV CL,4 ;BCD码高位右移为低位 SHR DL,CL OR DL,30H ;转换为ASCII码 MOV AH,2 ;显示 INT 21H
第4章 汇编语言程序设计 ADC MOV MOV MUL ADD DX,0 W+4,DX AX,A B+2 W+2,AX ;部分积2的高16位与进位相加 ;结果保存到从W+4开始的内存单元 ;取被乘数的低16位 ;与乘数的高16位相乘,得到部分积3 ;部分积3的低16位与W+2开始的内存单元相加 ;结果保存在从W+2开始的内存单元 ;部分积3的高16位与W+4开始的内存单元及 ;进位相加,结果保存在从W+4开始的内存单元 ;把进位值保存在从W+6开始的内存单元 ;取被乘数的高16位 ;与乘数的高16位相乘,得到部分积4 ;部分积4的低16位与W+4开始的内存单元相加 ;结果保存在从W+4开始的内存单元 ;部分积4的高16位与W+6开始的内存单元及 ;进位相加,结果保存在从W+6开始的内存单元

第四章 汇编语言程序设计

第四章 汇编语言程序设计

一、算术运算符
包括:+,-,*,/(取商),MOD(取余),SHL,SHR 特点:①运算对象及结果均为整数 ②地址只能加减 例: DA1 DA2 MOV MOV MOV MOV DB 1,2,3,4 DB 20 AX,30*5 汇编时 AL,31MOD5 AL,31/5 AL,DA2-DA1
MOV MOV MOV MOV
如:加法:1001、1D、2B……
特点:计算机能够直接识别,执行速度快;
但不方便记忆和编程
2、汇编语言(Assembly Language) 用助记符来表示指令,如:加法:ADD…… 特点:机器不能识别,需翻译;但仍然面向硬件, 执行速度较快;多用于编制系统程序、实时控制和通 信程序。 3、高级语言(High-level Language) 用数学语言和自然语言编程; 如:加法:+,输出:Printf… 特点:编程方便简单,无需了解机器硬件;但机器 不能识别,需要庞大的翻译系统,速度较慢。
类型 返回值 1 2 4 类型 返回值 -1 [FFH] -2 [FEH] DB DW DD
变量
标号
NEAR FAR
数值返回运算符(续)
LENGTH:
•对于一般变量,返回1; •对于DUP定义的变量,返回单元数(直接返回第一
个DUP前的N值); 说明:DUP为复制操作符,格式:N DUP(表达式); N表示复制次数,表达式为复制内容 例:2 DUP(1,2) 等价于 1,2,1,2
则:COUNT的值为5
COUNT表示:DA1,DA2占的字节总数(长度之和) 七、优先级(P136 表4-3)
4.3 伪指令语句
在汇编时进行处理,主要完成变量定义,段定义,
段分配,指示程序开始和结束等功能。

第4章 汇编语言程序设计

第4章  汇编语言程序设计

因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)

第四章-汇编语言程序的设计

第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。

(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。

在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。

(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。

汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。

①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。

②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。

(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。

)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。

操作数:给指令的操作提供数据或地址。

注释:是对语句或程序段的解释说明。

(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。

冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。

第4章 汇编 语言程序设计

第4章  汇编 语言程序设计

DJNZ R1,LOOP ;R1减1不为零,则跳LOOP处 NOP
HERE:SJMP
HERE
上述4个字段应该遵守的基本语法规则如下。
10
1.标号字段
语句所在地址的标志符号,才能被访问。如标号 “START”和“LOOP”等。有关标号规定如下: (1)标号后必须跟冒号“:”。 (2)标号由1~8个ASCII码字符组成,第一个字符必须是
8
汇编语言语句是符合典型的汇编语言的四分段格式:
标号字段 (LABLE) 操作码字段 (OPCODE) 操作数字段 (OPRAND) 注释字段 (COMMENT)
标号字段和操作码字段之间要有冒号“:”分隔; 操作码字段和操作数字段间的分界符是空格; 双操作数之间用逗号相隔;
操作数字段和注释字段之间的分界符用分号“;”。
表示的机器语言程序,才能识别和执行。
完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得 到的以“0”、“1”代码形式表示的机器语言程序称为目标 程序。
5
优点:用汇编语言编写程序效率高,占用存储空间小,运行 速度快,能编写出最优化的程序, 缺点:可读性差,离不开具体的硬件,是面向“硬件”的语 言通用性差。 2.高级语言
功能是把P1.6的位地址赋给变量QA。
4.2
汇编语言源程序的汇编
“汇编”?汇编可分为手工汇编和机器汇编两类。
22
4.2.1
手工汇编
通过查指令的机器代码表(表3-2),逐个把助记符指令 “翻译”成机器代码,再进行调试和运行。 手工汇编遇到相对转移偏移量的计算时,较麻烦,易出 错,只有小程序或受条件限制时才使用。实际中,多采用“ 汇 编程序”来自动完成汇编。
16
重叠。例如:
ORG …… ORG …… ORG …… 2000H 2500H 3000H

第4章 单片机汇编语言程序设计

第4章  单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000

单片机第4章汇编语言程序设计

单片机第4章汇编语言程序设计
将汇编语言程序汇编成目标程序后,还要进行 调试,排除程序中的错误。只有通过上机调试并得 出正确结果的程序,才能认为是正确的程序。
4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;取数送A ;除数100送B中 ;商(百位数BCD码)在A中,余数在B中 ;百位数送22H ;余数送A做被除数 ;除数10送B中 ;十位数BCD码在A中,个位数在B中 ;十位数BCD码移至高4位 ;并入个位数的BCD码 ;十位、个位BCD码存人21H
查表
[例4-5]一变量放在内部RAM 的20H,取值为00H-05H。 编写程序,求该变量的平方值,将结果放片内21H ORG 1000H START:MOV DPTR, #2000H; or MOV DPTR, #TABLE MOV A, 20H MOVC A, @A+DPTR MOV 21H, A SJMP $ ORG 2000H TABLE: DB 00, 01, 04, 09, 16, 25 END
Y
循环结束?
N 循 环处理 循 环修改
循环结束?
Y 结 束处理 结束 ( a)先执行后判断 结 束处理 结束 (b)先 判断 后执行
二、程序清单
ORG START : MOV LOOP: MOV MOV DEL1: DEL2: DEL3: MOV MOV DJNZ DJNZ DJNZ RL AJMP END OOOOH A,#01H P1,A R1,#10H R2,#200 R3,#126 R3,DEL3 R2,DEL2 R1,DEL1 A LOOP
4.1.1 汇编语言程序设计步骤
使用汇编语言设计一个程序大致上可分为以下几个步骤。 (1) 分析题意,明确要求。 (2) 确定算法。 (3) 画程序流程图,用图解来描述和说明解题步骤。
图4.1 常用的流程图符号
(4) 分配内存工作单元,确定程序与数据区的存放地址。 (5) 编写源程序 (6) 程序优化。 (7)上机调试、修改和最后确定源程序。
A (41H)
Y
N
A与(61H)交换
A

(60H)
结束
图4.4 [例4-6]程序框图
【例4-8】某温度控制系统,采集的温度值(Ta)放在累加器 A中。此外,在内部RAM54H单元存放控制温度下限(T54), 在55H单元存放控制温度上限(T55)。若Ta >T55,程序转向JW (降温处理程序);若Ta<T54,则程序转向SW(升温处理程 序);T55≥Ta≥T54,则程序转向FH(返回主程序)。 程序如下:
;将C清零 ;送被加数首址 ;送加数首址 ;取被加数低字节 ;两个低字节相加 ;低字节和存人被加数低字节 ;修改指针,指向被加数高字节 ;修改指针,指向加数高字节 ;取被加数高字节 ;高字节相加 ;存结果
【例4-3】编写16位二进制数求补程序 二进制数的求补可归结为“求反加1”的过程,求反可用 CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。 因为现在是16位数,有两个字节,因此要考虑进位问题,即低8 位取反加1,高8位取反后应加上低8位加1时可能产生的进位, 还要注意这里的加1不能用INC指令,因为INC指令不影响CY标 志。 ORG 0200H 程序如下: MOV A ,R0 ;低8位送A CPL A ;取反 ADD A ,#01H ;加l MOV R2 ,A ;存结果 MOV A ,R1 ;高8位送A CPL A ;取反 ADDC A ,#00H ;加进位 MOV R3 ,A ;存结果(R1R0---R3R2) END
4.3 分支程序设计
图4.2 分支程序结构
图4.2(a) 结构使用条件转移指令来实现分支, 当给出的条件成立时,执行程序段A,否则执行程序 段B。 图4.2 (b) 结构使用散转指令JMP来实现多分支转 移,它首先将分支程序按序号的值来实现分支转移。
【例4-6】设补码X放在内部RAM30H单元中,函数 Y与X有如下的关系式:
【例4-4】编程将20H单元中的8位无符号二进制数转换成3位 BCD码,并存放在22H(百位)和21H(10位,个位)两个单元中。 程序如下: ORG 1000H MOV A ,20H MOV B ,# 64H DIV AB MOV 22H ,A MOV A,B MOV B , #0AH DIV AB SWAP A ORL A,B MOV 21H , A END
【例4-9】N路分支程序,N≤8。要求程序根据其运行 中所产生的寄存器R3的值,来决定如何进行分支。
MOV A ,R3 MOV DPTR ,#BRTAB MOVC A ,@A+DPTR JMP @A+DPTR BRTAB AJMP BR0 AJMP BR1 AJMP BR2 AJMP BR3 BR0: SETB P1.0 SJMP BRK BR1: SETB P1.1 SJMP BRK BR2: SETB P1.2 SJMP BRK BR3: SETB P1.3 BRK: SJMP BRK
MOV MOV
A, 40H 61H, 41H
开始 (40H) (40H) A (60H)
CJNE AJMP LOOP:JNC
XCH AGEQ: MOV SJMP END
A , LOOP AGEQ
AGEQ A, 61H 60H, A
41H ,
;A≥(41H)则无借位 ;A<(41H)有借位;A与(61H)交 换
(5)定义字命令 DW 格式:[标号:] DW 16位二进制数表 例如, ORG 1000H TAB: DW 1234H , 0ABH , 10 汇编后: (1000H)=12H (1001H ) = 34H (1002H ) = 00H ( 1003H ) = ABH (1004H ) =00H (1005H) =0AH DB、DW伪指令都只对程序存储器起作用,不能 用来对数据存储器的内容进行赋值或进行其它初始化 的工作。
【例4-11】从内存BLOCK单元开始有一个无符号 数的数据块,其长度为LEN,试求出其最大值,并存 入MAX单元。 这是一个搜索问题。这里采用依次进行比较和取 代的方法来寻找最大值。具体做法是:先取出第一个 数作为基准,和第二个数比较,若比较结果基准数大, 不作变动;若比较结果基准数小,则用大数来代替原 基准数,然后再和下一个数作比较。到比较结束时, 基准数就是所求的最大值。 为了进行两数的比较,采用两数相减以后判断CY 的值来确定哪个数大,这比用CJNE指令更简单。比较 时将基准数放在累加器A中。若A中先放零,比较次数 等于LEN;若A中先放人第一个数,则比较次数等于 LEN-1。采用R2作为计数器,R1作为地址指针。程序 流程如图4.9所示。
X Y 试编写程序,根据X的值求出Y,并放回原单元。 解 取出X后先做取值范围的判断,用累加器A状态转 移指令判断X是否为0,用位状态转移指令判断X是大 于0还是小于0。程序流程图如图4.3所示。 程序如下:
MOV A,30H JZ ZER0 JNB ACC.7,PLUS ADD A,#5 MOV 30H,A PLUS: SJMP $ ZERO: MOV 30H,#20H SJMP $ END
4.2 顺序程序设计
顺序结构程序是一种最简单、最基本的程序(也称为简单 程序),它是一种无分支的直线形程序,按照程序编写的顺序 依次执行。 【例4-1】 两个8位无符号数相加,和仍为8位。 假设两个无符号数X1 , X2 分别存放于内部RAM60H、 61H单元中,求其和并将和送入62H单元。 程序如下: ORG 0000H CLR C MOV R0 ,# 60H ;设R0为数据指针 MOV A ,@R0 ;取X1 1NC R0 ADDC A ,@R0 ;X1+X2 1NC R0 MOV @R0,A ;保存结果 END
【例4-2】两个无符号双字节数相加。设被加数存放在内部存 储器30H(高位字节)、31H(低位字节)单元,加数存放在内 部存储器40H(高位字节)、41H(低位字节)单元,和存入30H (高位字节)、31H(低位字节)单元。 程序如下: ORG 0000H CLR C MOV R0 ,#31H MOV R1 ,#41H MOV A ,@R0 ADD A ,@R1 MOV @R0 ,A DEC R0 DEC R1 MOV A,@R0 ADDC A,@R1 MOV @R0 , A END
;左移一位,下一个发光二极管亮
;使L1灯亮,其它不亮 ;从P1口输出到发光二极管 ;延时1秒,根据机器周期算
;循环
【例4-10】多个单字节数求知。 已 知 有 10 个 单 字 节 数 , 依 次 存 放 在 内 部 RAM 40H单元开始的数据存储区中,求和并将 结果存人寄存器R2、R3中(高位存R2,低位存 R3)。 本题中,要重复进行加法运算,因此采用 循环结构程序。循环次数就是数据块字节数,这 是已知的。在置初值时,将数据块长度置人寄存 器R5;将数据块首地址送人寄存器R0,即以R0 作为数据块的地址指针,采用间接寻址方式:每 做一次加法之后,修改地址指针,以便取出下一 个数来相加,并且使计数器R5减l。到R5减为0 时,求和结束。程序流程图如图4.8所示。
CJNE AJMP LOOPl: JNC CJNE AJMP LOOP2: FH: JC RET A,55H,LOOP1 FH JW A,54H,LOOP2 FH SW ;Ta≠T55,转向LOOPl ;Ta=T55,返回 ;若(CY)=0,表明Ta>T55,转降温处理程序 ;Ta≠T54,转向LOOP2 ;Ta=54,返回 ;若(CY)=1,表明Ta<T54,转升温处理程序 ;T55≥Ta≥T54,返回主程序
开始 (30H) A
A=0?
A>0?
20H (30H)
(30H)
(30H)+5
结束 图4.3 [例4-5]程序框图
【例4-7】内部RAM40H和41H单元中各有 一无符号数,比较其大小,将大数存放于内部 RAM60H单元,小数存放于内部RAM61H单元, 如两数相等,则分别送往这2个单元。 解 用比较不等转移指令CJNE比较力两个 无符号书,先确定它们是否相等,若不相等时 再根据借位标志确定这两个无符号书的大小。 程序框图如图4.4所示。 程序如下:
相关文档
最新文档