程序设计概要.pptx

上传人:莉*** 文档编号:87324520 上传时间:2023-04-16 格式:PPTX 页数:54 大小:422.22KB
返回 下载 相关 举报
程序设计概要.pptx_第1页
第1页 / 共54页
程序设计概要.pptx_第2页
第2页 / 共54页
点击查看更多>>
资源描述

《程序设计概要.pptx》由会员分享,可在线阅读,更多相关《程序设计概要.pptx(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、支持写入单片机或仿真调试的目标程序有两种文件格式:支持写入单片机或仿真调试的目标程序有两种文件格式:BINBIN文件和文件和 HEXHEX文件文件 BINBIN文件是由编译器生成的二进制文件,是程序的机器码,文件是由编译器生成的二进制文件,是程序的机器码,HEXHEX文文件件是是由由INTERINTER公公司司定定义义的的一一种种格格式式,这这种种格格式式包包括括地地址址、数数据据和和校校验验码码,并并用用ASCIIASCII码码来来存存储储,可可供供显显示示和和打打印印。HEXHEX文文件件需需通通过过符符号号转转换换程程序序OHS51OHS51进进行行转换转换 两种语言的操作过程见图两种语

2、言的操作过程见图3-13-1。第1页/共54页连接连接/定位器定位器L51汇编语言汇编语言源程序源程序汇编器汇编器A51符号转换程序符号转换程序OHS51绝对地址绝对地址目标程序目标程序.BINC语言程序语言程序浮浮动动地地址址目目标标程程序序编译器编译器C51HEX图图3-1两种语言源程序转换成目标程序两种语言源程序转换成目标程序第2页/共54页 目目前前很很多多公公司司将将编编辑辑器器、汇汇编编器器、编编译译器器、连连接接/定定位位器器、符符号号转转换换程程序序做做成成集集成成软软件件包包,用用户户进进入入该该集集成成环环境境,编编辑辑好好程程序序后后,只只需需点点击击相相应应菜菜单单就就

3、可可以以完完成成上上述述的的各各步步,如如WAVEWAVE、KEIL KEIL,WAVEWAVE集集成成软软件件的使用见附录。的使用见附录。汇编:将汇编语言源程序转换成机器语言汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。目标程序的过程称为汇编。汇编程序:能将汇编语言源程序转换成机汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。器语言目标程序的系统软件称为汇编程序。第3页/共54页汇编的方法:汇编的方法有两种汇编的方法:汇编的方法有两种1.1.手工汇编:手工汇编:人人工工查查指指令令表表,查查出出程程序序中中每每条条指指令对应的机器代码。早期的计算机使用

4、。令对应的机器代码。早期的计算机使用。2.2.机器汇编:机器汇编:用用计计算算机机中中的的汇汇编编程程序序对对用用户户源源程程序进行汇编。序进行汇编。用用机机器器汇汇编编要要提提供供给给汇汇编编一一些些信信息息,遵遵循循汇汇编编程程序序的的一一些些约约定定。这这些些由由伪伪指指令指定。令指定。第4页/共54页3)提供错误信息4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST)地址 机器码 源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 汇编的主要任务汇编的主要任务1)确定程序中每条汇编语言指令的指令机器

5、码2)确定每条指令在存储器中的存放地址第5页/共54页1.机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。2.伪指令:汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。一.汇编语言指令类型3.宏指令 宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。第6页/共54页宏定义过程宏调用过程:宏指令名 实际参数 宏指令名 实际参数宏指令名 MACRO 形式参数 ;被定义的程序段 ENDM第7页/共54页二伪指令二伪指令 常用伪指令及功能常用伪指令及功能1.1.起始指令起

6、始指令 ORG nnORG nn功能:定义程序或数据块的起始地址。指示此语句功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以后面的程序或数据块以nnnn为起始地址,连续存放在为起始地址,连续存放在程序存储器中。程序存储器中。指令地址指令地址 机器码机器码源程序源程序 ORG 2000HORG 2000H 2000H 78 30 2000H 78 30 MAIN MAIN:MOV R0MOV R0,#30H#30H 2002H E6 2002H E6 MOV A MOV A,R0R0 ORG 3000H 3000H 23 TAB:DB 23H,100,A 3001H 64 300

7、2H 41第8页/共54页2.字节定义 标号:DB(字节常数,或字符或表达式)功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。例如 LN:DB 32,C,25H,-1LNLN+3 地址单元依次存放20H,43H,25H,FFH地址地址数据数据LN20LN+143LN+225LN+3FF3.3.字定义字定义 标号:标号:DW DW(字常数或表达式)(字常数或表达式)作用:作用:指示在程序存储器中以标号为指示在程序存储器中以标号为起始地址的单元里存放的数为字数据起始地址的单元里存放的数为字数据(即(即1616位的二进制数),例如:位的二进制数),例如:GH GH

8、:DW 1234HDW 1234H,5678H5678H,0808GH1234GH+25678GH+40008第9页/共54页 5 5.等值指令等值指令 标号标号 EQUEQU(数值表达式)(数值表达式)表示表示EQUEQU两边的量等值,用于为标号或标识符赋两边的量等值,用于为标号或标识符赋值。值。例如:例如:X1 EQU 2000HX1 EQU 2000H X2 EQU 0FH X2 EQU 0FH MAIN:MOV DPTR MAIN:MOV DPTR,#X1 ;DPTR=2000H#X1 ;DPTR=2000H ADD A ADD A,#X2 ;A=A+0FH#X2 ;A=A+0FH4.

9、4.保留字节保留字节 标号:标号:DS DS(数值表达式)(数值表达式)作用:指示在程序存储器中保留以标号为起始地作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。址的若干字节单元,其单元个数由数值表达式指定。例如例如 L1L1:DS 32;DS 32;从从L1L1地址开始保留地址开始保留3232个存储单元。个存储单元。第10页/共54页6.6.位定义位定义 标号标号 BIT BIT 位地址位地址 作用:作用:同同EQUEQU指令,不过定义的是位操作地址。指令,不过定义的是位操作地址。例如例如 AIC BIT P1.1AIC BIT P1.1。7.7.汇编

10、结束汇编结束 ENDEND作用:作用:指示源程序段结束。指示源程序段结束。ENDEND指令放在程序的最后。指令放在程序的最后。A51A51汇编程序还有一些其它的伪指令,列在教材汇编程序还有一些其它的伪指令,列在教材表表3-13-1中,以备查阅。中,以备查阅。第11页/共54页3-2 3-2 汇编语言程序设计步骤汇编语言程序设计步骤一一.确定方案和计算方法确定方案和计算方法二二.了解应用系统的硬件配置、性能指标了解应用系统的硬件配置、性能指标三三.建立系统数学模型,确定控制算法和操作步骤建立系统数学模型,确定控制算法和操作步骤四四.合理分配存储器单元和了解合理分配存储器单元和了解I/OI/O接口

11、地址接口地址五.编制源程序1.按功能设计程序,明确各程序之间的相互关系2.用流程图表示程序结构和功能3.程序中用注释说明指令在程序中的作用,方便阅读、调试和修改第12页/共54页顺序程序设计顺序程序设计例例3-1 3-1 编程将外部数据存编程将外部数据存储器的储器的000EH000EH和和000FH000FH单元单元的内容相换。的内容相换。常用程序结构常用程序结构 顺序程序、分支程序顺序程序、分支程序 循环程序、子程序循环程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析分析:外部数据存储器的数据外部数据存储器的数据操作只能用操作只能用MOVXMO

12、VX指令,且只能指令,且只能和和A A之间传送,因此必须用一个之间传送,因此必须用一个中间环节作暂存,设用中间环节作暂存,设用20H20H单元。单元。用用R0R0、R1R1指示两单元的低八位指示两单元的低八位地址,高八位地址由地址,高八位地址由P2P2指示指示。编程过程如下:编程过程如下:000EH000FH000EH000FH000EH000FH第13页/共54页 ORG 0000H MOV P2,#00H ;送地址高八位至P2口 MOV R0,#0EH ;R0=0EH MOV R1,#0FH ;R1=OFH MOVX A,R0 ;A=(000EH)MOV 20H,A ;(20H)=(000

13、EH)MOVX A,R1 ;A=(000FH)XCH A,20H ;A=(000EH),(20H)=(000FH)MOVX R1,A MOV A,20H MOVX R0,A ;交换后的数送各单元 SJMP$END第14页/共54页3-3 3-3 顺序程序顺序程序顺序程序顺序程序(简单程序简单程序),程序走向只有一条路径,程序走向只有一条路径例3-2:将R4R5双字节符号数求补码程序。ORG 0000H MOV A,R4 JB ACC.7,CPLL;判符号位 SJMP$;正数的补码原码CPLL:MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A

14、,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 ORL A,#80H ;恢复负号 MOV R4,A SJMP$第15页/共54页地址数据TAB0TAB+1 1TAB+2 4TAB+3 9TAB+4 16TAB+5 25例例3-5 3-5 设变量放在片内设变量放在片内RAMRAM的的20H20H单元单元,其值为其值为00H-05H00H-05H之间之间,要求编查表程序要求编查表程序,查出变量的平方值查出变量的平方值,并放入片内并放入片内RAMRAM的的21H21H单元。单元。ORG 0000H ORG 0000H MOV DPTR,#TAB MOV DPTR,#TAB MOV

15、A,20H MOV A,20H MOVC A,A+DPTR;MOVC A,A+DPTR;查表查表 MOV 21H,AMOV 21H,A SJMP$SJMP$TAB:DB 0,1,4,9,16,25 TAB:DB 0,1,4,9,16,25 END END分析分析 :在程序存储器安排一张平方表,首地址为:在程序存储器安排一张平方表,首地址为TABTAB,以,以DPTRDPTR指向指向表首址,表首址,A A存放变量值,利用查表指令存放变量值,利用查表指令MOVC AMOVC A,A+DPTRA+DPTR,即可求得,即可求得表中数据用表中数据用BCDBCD码存放合乎人们的习惯码存放合乎人们的习惯.如

16、果平方值为两个字节,程序应如何编。如果平方值为两个字节,程序应如何编。DPTRA第16页/共54页 ORG 0000H MOV A,R2 JNB ACC.7,N ;为正数?CPL A ;负数变补 INC A MOV R2,AN:SJMP$;结束3.4 分支程序的设计由条件转移指令构成程序判断框部分,形成分支结构3.4.1 单分支程序一个判断决策框,两种分支结构图。条件满足条件满足?N影响条件影响条件Y处理处理1处理处理2例1 求8位有符号数的绝对值。方法:正数不变,负数变补条件满足条件满足?N影响条件影响条件Y处理段处理段第17页/共54页 例例2 2 用单片机加重力传感器作磅秤,称出重量后算

17、用单片机加重力传感器作磅秤,称出重量后算出行李运费价格,其称出的重量以出行李运费价格,其称出的重量以10kg10kg为为1 1个计价单个计价单位位G,GG,G已存入已存入40H40H单元。最终运费存放在单元。最终运费存放在41H41H单元。单元。计价方法计价方法为为50kg50kg以内按以内按3 3元元/G,50kg/G,50kg以上以上计价计价:总重按总重按3 3元元/G,/G,,超过,超过50kg50kg部分加收部分加收2 2元。元。由此列出算式:由此列出算式:G3+(G-5)2;当G5M=M=G3 ;G3 ;当当G5 G5 3G3G因重复使用,先暂存在因重复使用,先暂存在R2R2。流。流

18、程见左程见左,程序如下:程序如下:第18页/共54页 ORG 0100HFRT:MOV A,40H;取行李重量计价单位GMOV R3,AMOV B,#03H;运费M=G3MUL ABMOV R2,A;暂存3G MOV A,R3 ;取回G CJNE A,#05H,L1;G 5?SJMP WETCL1:JC WETC ;小于5,转至WETCSUBB A,#05H;否则 M=3G+2(G-5)RLC AADD A,R2 MOV R2,AWETC:MOV 41H,R2 ;存运费 M RET第19页/共54页多分支散转程序的设计多分支散转程序的设计有一类分支程序有一类分支程序,它根据不同的输入条件或不它

19、根据不同的输入条件或不同的运算结果同的运算结果,转向不同的处理程序转向不同的处理程序,称之为散转称之为散转程序。这类程序通常利用程序。这类程序通常利用JMP A+DPTRJMP A+DPTR间接转移指间接转移指令实现转移。有如下两种设计方法:令实现转移。有如下两种设计方法:1.1.查转移地址表查转移地址表:将将转移地址转移地址列成表格,将表格的内容作转移列成表格,将表格的内容作转移的目标地址。的目标地址。2.2.查转移指令表查转移指令表:将转移到不同程序的将转移到不同程序的转移指令转移指令列成表格,判列成表格,判断条件后查表,转到表中指令执行断条件后查表,转到表中指令执行,下面用两个例下面用两

20、个例子说明。子说明。第20页/共54页1.1.利用转移地址表实现转移利用转移地址表实现转移 例例3-7 3-7 根据根据R3R3的内容转向对应的程序,的内容转向对应的程序,R3R3的内容为的内容为0 0n,n,处理程序的入口符号地址分别为处理程序的入口符号地址分别为PR0PR0PRn PRn(n128)(nR1MOVR2,#0;存放结果的高位清零;存放结果的高位清零MOVA,R0;BCD码千位数码千位数AMOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;R3*10低低8位位R3MOVA,BXCHA,R2;R3*10高高8位暂存位暂存R2MOVB,#10MULABA

21、DDA,R2;R2*10(R3*10)高)高8位位第40页/共54页MOVR2,AINCR0;取下一个;取下一个BCD数数MOVA,R3ADDA,R0MOVR3,AMOVA,R2ADDCA,#0;加低字节来的进位;加低字节来的进位MOVR2,ADJNZR1,LOOPSJMP$END第41页/共54页 MCS-51MCS-51单片机有着优异的位逻辑功能单片机有着优异的位逻辑功能,可以方便可以方便的实现各种复杂的逻辑运算的实现各种复杂的逻辑运算.这种用软件替代硬件这种用软件替代硬件的方法的方法,可以大大简化甚至完全不用硬件可以大大简化甚至完全不用硬件,但比硬件但比硬件要多花运算时间。要多花运算时间

22、。例例3-17 3-17 编写一程序编写一程序,以实现图以实现图3-73-7中的逻辑运算电路中的逻辑运算电路.3.6 3.6 位操作程序设计位操作程序设计第42页/共54页 其中其中P1.1P1.1和和P2.2P2.2分别是端口线上的信息分别是端口线上的信息,TF0,TF0和和IE1IE1分别是定时器定时溢出标志和外部中请求标志分别是定时器定时溢出标志和外部中请求标志,25H25H和和26H26H分别是两个位地址分别是两个位地址,运算结果由端口线运算结果由端口线P1.3P1.3输出。输出。.图图3-4硬件逻辑运算电路硬件逻辑运算电路第43页/共54页程序如下:START:MOV C,P2.2

23、ORL C,TF0 ANL C,P1.1 MOV F0,C MOV C,IE1 ORL C,/25H ANL C,F0 ANL C,/26H MOV P1.3,C SJMP$第44页/共54页例3-18 设累加器A的各位ACC.0ACC.7分别记为X0X7,编制程序用软件实现下式:Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7 X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BIT ACC.4 X5 BIT ACC.5 X6 BIT ACC.6 X7 BIT ACC.7第45页/共54页 ORG 0000HMOV

24、 C,X0ANL C,X1ANL C,X2MOV 00H,C ;X0X1X2MOV C,X0ANL C,/X1MOV 01H,C ;X0X1ANL C,/X2ORL C,00HMOV 00H,C MOV C,X2ANL C,01HANL C,X3 ;X0X1X2X3ORL C,/00HMOV 00H,C MOV C,X7ANL C,/X6ANL C,/X5ANL C,/X4 ;X4 X5 X6 X7ORL C,00H ;最终结果 YC SJMP$第46页/共54页 子程序是构成单片机应用程序必不可少的部子程序是构成单片机应用程序必不可少的部分,通过分,通过ACALLACALL和和LCALLLC

25、ALL两条子程序调用指令,可两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。以十分方便地用来调用任何地址处的子程序。子程序节省占用的存储单元,使程序简短清子程序节省占用的存储单元,使程序简短清晰,善于灵活的使用子程序,是程序设计的重要晰,善于灵活的使用子程序,是程序设计的重要技巧之一。技巧之一。子程序必须以子程序必须以RETRET指令结尾指令结尾.在调用子程序时,有以下几点应注意:在调用子程序时,有以下几点应注意:3.7 3.7 子程序子程序 当一段程序需多次应用当一段程序需多次应用,或为多人应用时或为多人应用时,这这段程序编为子程序段程序编为子程序.第47页/共54页 1 1)

26、保护现场。)保护现场。如果在调用前主程序已经使用了某些存储单元或寄存器,如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。程序使用不同的寄存器组。2 2)设置入口参数和出口参数。)设置入口参数和出口参数。用之前主程序要按子程序的要求设置好地址单元或存储

27、器用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;得输入数据;子程序经运算或处理后的结果存放到指定的地址单元或寄子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。主程序间的数据的正确传递。3 3)子程序中可包括对另外子程序的调用,称为子

28、程序嵌套。)子程序中可包括对另外子程序的调用,称为子程序嵌套。第48页/共54页例例3-16 3-16 用程序实现用程序实现c=ac=a2 2+b+b2 2,设,设a,ba,b均小于均小于1010。a a存放存放在在31H31H单元,单元,b b存放在存放在32H32H单元,把单元,把c c存入存入34H34H和和33H33H单单元。(和要求为元。(和要求为BCDBCD码)。码)。解:因该算式两次用到平方值,所以在程序中解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。求平方采用查表采用把求平方编为子程序的方法。求平方采用查表法法,主程序和子程序编写如下:主程序和子程序编写

29、如下:第49页/共54页主程序:ORG 0000H MOV SP,#3FH MOV A,31H ;取aLCALL SQR ;求a方MOV R1,AMOV A,32H ;取bLCALL SQR ;求b方ADD A,R1 ;求和DA A ;调整MOV 33H,A MOV A,#0ADDC A,0 MOV 34H,A SJMP$子程序:ORG 0030HSQR:INC A MOVC A,A+PC RETTAB:DB 00H,01H,04H,09H,16H,25H,36H,49H64H,81H END第50页/共54页例例3 317 17 求求两两个个无无符符号号数数据据块块中中的的最最大大值值的的乘

30、乘积积。数数据据块块的的首首地地址址分分别别为为60H60H和和70H70H,每每个个数数据据块块的的第第一一个个字字节节都都存存放数据块长度。结果存入放数据块长度。结果存入5FH5FH和和5EH5EH单元单元 分分析析 本本例例可可采采用用分分别别求求出出两两个个数数据据块块的的最最大大值值,然然后后求求积积的的方方法法,求求最最大大值值的的过过程程可可采采用用子子程程序序。子子程程序序的的入入口口参参数数时时数数据据块块首首地地址址,存存放放在在R1R1中中,出出口口参参数数即即为为最最大值,存放在大值,存放在A A中。下面分别列出主程序中。下面分别列出主程序 和子程序。和子程序。主程序:

31、主程序:ORG 0100HORG 0100H MOV R1,#60H ;MOV R1,#60H ;置入口条件参数置入口条件参数 ACALL QMAXACALL QMAX ;调求最大值子程序调求最大值子程序 MOV B,A ;MOV B,A ;第一个数据块的最大值暂存第一个数据块的最大值暂存B B MOV R1,#70H;MOV R1,#70H;置入口条件参数置入口条件参数 ACALL QMAXACALL QMAX ;调求最大值子程序调求最大值子程序 MUL AB ;MUL AB ;求积求积第51页/共54页MOV5EH,A;存积低位;存积低位MOV5FH,B;存积高位;存积高位SJMP$子程序

32、:子程序:ORG0030HQMAX:MOVA,R1;取数据块长度;取数据块长度MOVR2,A;设置计数值;设置计数值CLRA;设;设0为最大值为最大值LP1:INCR1;修改地址指针;修改地址指针CLRC;0CSUBBA,R1;两数相减,比较大小;两数相减,比较大小JNCLP3;原数仍为最大值转;原数仍为最大值转LP3MOVA,R1;否,用此数代替最大值;否,用此数代替最大值SJMPLP4;无条件转;无条件转LP4LP3:ADDA,R1;恢复原最大值(因用;恢复原最大值(因用SUBB作比较指令)作比较指令)LP4:DJNZR2,LP1;若没比较完,继续比较;若没比较完,继续比较RET;比较完,

33、返回;比较完,返回END第52页/共54页3.8 3.8 小小 结结 1 1、程序设计的关键在于指令熟悉和算法、程序设计的关键在于指令熟悉和算法(思路思路)正确、清晰,对复杂的程序应先画出流程图。正确、清晰,对复杂的程序应先画出流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。2 2、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。3 3、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法,并能熟练应用查表技术简化程序的设计。应用查表技术简化程序的设计。第53页/共54页感谢您的观看!第54页/共54页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁