
1王爽-汇编语言(第二版)这是16位汇编打好基础,2Intel汇编语言程序设计:从16位实模式下BIOS、DOS实模式文本及图形程序设计到32位保护模式的Windows程序设计,这本书比上面那本介绍的更全面,但却未必适合你,建议你先看王爽汇编然后再看这本
3IBMPC汇编语言程序设计,清华大学的这本算是正统的本科教材了,内容中规中矩,也有不少网友推荐本书适合自学
480x86汇编语言程序设计,这本书像国内版的Intel汇编语言程序设计,内容都差不多,从16位实模式到32位保护模式编程,是王爽汇编的进阶教程放在王爽汇编之后和第二本书中挑一本学
5罗云彬Windows环境下32位汇编语言程序设计,这本书就是汇编版的windows程序设计,适合汇编爱好者进阶windows编程用的,放到最后吧!学完这本后面的发展方向就很丰富了
c语言可以嵌套汇编:
按照TC20的帮助系统所以说的,在TC20下是可以用汇编的,方法是使用asm关键字:其格式是:
asm opcode <operands> <;newline>,如同别的注释一样,<>之间的表示可选的;例如:
main()
{
char c="hello,world/n/r$";
asm mov ah,9;asm mov dx,c;asm int 33;
printf("You sucessed!/n");
}
或者是:
main()
{
char c="hello,world/n/r$";
asm mov ah,9
asm mov dx,c
asm int 33
printf("You sucessed!");
}
两种格式其实是一种如果你用的是第一种的样式,记住:
每一句汇编语句都要以asm开头,如果一行内有多个句子,
那么千万不要忘记在两个句子之间的这个semicolon(分号),
但是最后一句汇编后面(如果后面没有其它的语句)的分号可有可无,象第一个例子中的
asm int 33;后面的分号就可以不要,因为它的后面没有其它
的语句了但如果是这样:
asm mov ah,9; asm mov dx,c;asm int 33; printf("You sucessed!");
那么asm int 33;后面的分号便还是留下好,以免出现编译错误!
在这一点上颇象C语言
还有一种格式是
asm{ assembly language statement},这种格式应该被普遍的欢迎
它们的例子如下(其中的语句排列格式与上面两种相同):
asm{
mov ax,var1
add ax,var2
}
但是要注意这种格式TC20是不支持的!
只有后来的TC++30及后来的IDE支持!
工具的使用:
一旦你的C源文件里包括了这些好东西,则必须用TCCEXE的COMMAND-LINE来编译,具体的命令参数TCCEXE已经提供,这里不复阐述了最简单的是:TCC C源文件名(使用这个方法,TCC会自动调用TASMEXE和TLINKEXE,并且能够使TLINKEXE正确的找到需要的obj和lib文件,如果你单步编译的话,可能会碰到很多的问题,主要是TLINKEXE它自己并不会去找obj和lib文件,你自己可以建一个bat文件,如果要指定lib文件的目录的话可以用/L参数,在文章的后面有一个例子)但大家要注意了,看一下你的TC目录下面到底是否有TASMEXE文件,并在TURBOCCFG(这个文件包括TCCEXE运行期参数,这里面所有参数在运很期都将被自动TCCEXE使用,例如:-IH:/TC/INCLUDE/
-LH:/TC/LIB/)文件中设置好一些参数,并确认TASMEXE的版本号要20以上,以及是否能够向下兼容但是在大多数的情况下TC的目录是没有TASMEXE的,或是版本不正常
如果你有TASMEXE文件并且TURBOCCFG文件也已经写好了,但是还要注意一个
问题:运行TCCEXE时要在独立的DOS SHELL下面(不要害怕,这不是一个新东西,我的意思
是,不在诸如TC下的DOS SHELL下面运行,我曾经败在这个问题下,当我发现时直想揍电脑
一顿,还好没有,不然就没有这篇文件了)
还有一句重要的话:TC20支持大部分8086指令(当然用法有一些约定,不过现在我并不打算
进行详细说明,因为那是一件很繁杂的事,以后有时间或许会写出来----如果大家需要的话)
如果说上面我所说的那些约定很繁杂的话,那么下面的方法该是多么简单啊!
让我们使用Borland为TC20内建的变量来进行伪汇编
或许你还不知道在TC20中还有一些内建的pseudo寄存器(可以看作是register 型的变量,但是它们比register型的变量好用的多)
_AX,_AH,_AL,
_BX,_BH,_BL,
_CX,_CH,_CL,
_DX,_DH,_DL,
_DI,_SI,_SP,
_CS,_DS,_ES,_SS
注意这些寄存器的size,_AX,_BX,_CX,_DX,_CS,_DS,_ES,_SS,_SI,_DI,_SP等都是16位的寄存器相当于C语言的unsigned int类型,其余的都是8位的寄存器(相当于unsigned char)(TC怎么可能支持32位的寄存呢,所以EAX等是不能用的,FS,GS和IP寄存器都是无效的),还有就是在传递参数的时候千万不要忘记使用强制类型转换
中断调用指令是:__int__(interrupt_#)(注意int的前辍和后辍都是两个underscores)
For example:
#include<dosh>
unsigned int _stklen=0x200;
unsigned int _heaplen=0;
main()
{
_DX=(unsigned int)"Hello,world/r/n$";
_AX=0x900;
__int__(0x21);
}
dosh它是包含__int__()内建中断调用语句的头文件,因此是不可
缺少的_stklen和_heaplen是定义运行期堆栈和堆大小的两个内部
引用变量(这是个我自己想的名词,意指如果这两个变量在源文件中
显式的声明了,那么编译程序会自会引用来构造编译时期的信息以产生
用户希望的目标文件,如果不显式的声明则编译程序自动确定)
这两个变量也有一些约定,如果_stklen不显式声明,_heaplen赋值为零
都表示栈和堆都是defult的
最后在TC20中还有一个没有说明的标志位寄存器flags,它也是内建
pseudo寄存器是:_FLAGS,是一个16位寄存器这些内建的寄存器都可以进行
运算,但是要注意它们所代表的类型(必要时进行类型转换);
看起来这是不是一种好的办法啊(而且使用这种方法只要用个一个dosh头文件就好,
不需要用TCC编译,可以直接在TC20的IDE下编译)
TC20中也提供了一些简单好用的函数来实现对DOS功能的调用如:
int86(),int86x()(但是这些方法实际仍然要调用函数,所以不如使用
伪寄存器,又因为要牵涉到union REGS结构的内存分配所以系统的开销是增大了,
而使用伪寄存器是最简洁的),端口通信函数如:inportb(),inport(),
outportb(),outport(),指针转换函数:FP_OFF,FP_SEG,MK_FP,这些函数在
帮助系统中都有,有用时大家可以查阅
tlinkbatbat的例子:
rem The lib environment variable is the directory of the obj and lib file
set lib=h:/tc/lib/
rem 这下面的句子中的c0s(C 零S)是一个OBJ文件,是一个C程序的STARTUP文件
tlink %lib%c0s %1,%1,%1,/L%lib%emulib %lib%mathslib %lib%cslib
set lib=
(使用时可将以rem开头的句子删除)
___________________________________________________
一些约定:
我们先说一下在TC20下写汇编(内联汇编--自己起的名字,大家可以想叫什么叫什么)时的编译器的编译原则:
1所有在main()函数外的的汇编语言的语句都作为数据声明语句处理,也即在编译器编译时会将它放在数据段中,如:
asm string1 db "Hello",,,'world!',0ah,0xd,"$"
main()
{
asm mov dx,offset string1
asm mov ah,9
asm int 33
asm mov dx,offset string2
asm int 33
}
asm string2 db "the string can be declared after the main() function!$"
象这些样子在main()外面的汇编语言的数据定义语句(事实上不管是什么汇编语句,
只要是在main()之外,包括这个句子:asm mov ax,0x4c00),在编译后都放在数据段中,而C语言的数据声明语句仍按C的规则!
2所有在main()函内的汇编语言的语句在编译后都放在代码段中,包括这个句子:
asm string2 db "the string can be declared after the main() function!$"
3不要在以asm 开头的语句中使用C语言的关键字,这会导致编译阶段的错误
那么,根据这三条大家会得到什么样的结论呢(先闭上眼想一想,你可能会由此变的
很赞赏自己,是的你应该这样相信自己是对的!)
让我们一起看一下这个结论:
1根据编译原则1得到:不可以在main()外面写汇编命令语句(不要笑,正是与C语言相同才值得注意!),在任何地方都不要进行任何的段定义和宏定义(这是因为编译后的形式决定的,也即:在TC20下所有的汇编格式的语句只能是,直接性的数据定义和语句指令)!
2根据编译原则2得到:不可以在main()之内使用汇编的语句进行数据定义(同样不要笑,
大多数人在第一次在TC20下写汇编都会有这样的错误的)
3如同类强制类型这样的事是不可以在以asm开头的汇编语句中使用的
好了,天即朗,气瞬清!这样一说,一个大体的框架就出来了!只要遵守这个原则写,就可避免很多莫名其妙的错误出现!
通俗的说:
汇编语句的数据定义放在main()外面,指令放在main()里面
如果你没有更好的文档,那么记住我的这些话!
一些细节的问题:
在以asm开头的内联汇编语句中是不支持C的转义字符的,但是用C语言声明一个字符数组(含有转义字符的),然后用int 33 ah=9这功能时输出这个字符串时,其中的转义字符是有效的(这主要是因为编译后其内部表示形式不同造成的,自己想想会有答案的)
内联汇编支持C的一些如数值表示,字符串声明格式等,
如:一个十六进制的数据可以用两种方式表示:0xa 和0ah,字符串可以是这样:
"Hello,world!$"(如同C)也可以这样'Hello,world!$'(用汇编自己的方式)
象C一样你同样要注意赋值的类型,而且要比C更严格(汇编从来不自己动手做
如同类型转换啊这样事),所以一切的事完全要你自己做好!而且你不要企图以C的形式
做这件事,如这样的格式 asm mov dx,(unsigned)a(a是一个这样的东西,
char a[ ]="hello,world!";),而且这样句子也会导致错误:asm mov dx,word ptr a(逻辑错误),不过这不是在编译时的错误,而是运行期的错误(具体的原因自己想一想,象word label这样的东西的运算作用和会导致的后果),你可以这样用一个句子做"中间人"如int i=(unsigned)a;asm mov dx,i(也千万不要用asm mov dx,(unsigned)a 这样的句子但是,告诉大家一个好消息,你可以用指针指向一个字符串,然后你会惊讶你竟然可以这样:
char p="hello,world";asm mov dx,p,然后用int 33 ah=9的功能输出这个字符串而不会有错误(这也表现出指针的特点,它是一个二字节的(TC20下)变量,含有的是一个地址,这与其指向的变量的类型是毫无关系的)
内汇汇编语句不支持->这个运算符还有标号的问题,在最后的例子中你会年看到一些特别之处!
上面所说的只是很细小并微少的一些事(也是很常遇到的),尚有很多的细节要说,但由于本人时间有限不能一一列举,如C的结构在内联汇编的应用等大家可以按照其运行机理去想想一下用法;另外,由于这只是一件学习的事,所以还是大家自己学(找一下有关文档,当然现在已经没有什么比较完整的了),情况会好的多,我在对内联汇编的学习过程中领会到了不少的东西,例如编译原理方面的知识,以及如何做会使代码更高效,占空间最少等的方法最后向大家推荐一种方法,在利用TCC的-S开关可以生成C源文件的汇编代码
(或许很多的人都用过)是很好的学习材料!祝大家学有所成!
Cstarter
02-11-17
/ 由于个人的时间和能力有限,难免有错误和不详细的地方,请大家见谅!
My Email:wxe85@sinacom Cstarter1985@hotmailcom QQ:170594633 /
一些例子:
下面这个例子是对沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章程序的改写
可直接在命令行上键入 tcc filename 就可以,当然你要有TASMEXE
/
asm mus_frep dw 330,294,262,294,3 dup(330)
asm dw 3 dup(294),330,392,392
asm dw 330,294,262,294,4 dup(330)
asm dw 294,294,330,294,262,-1
asm mus_time dw 6 dup(25),50
asm dw 2 dup (25,25,50)
asm dw 12 dup(25),100
/
asm mus_frep dw 330,392,330,294,330,392,330,294,330
asm dw 330,392,330,294,262,294,330,392,294
asm dw 262,262,220,196,196,220,262,294,330,262
asm dw -1
asm mus_time dw 3 dup (50),25,25,50,25,25,100
asm dw 2 dup (50,50,25,25),100
asm dw 3 dup (50,25,25),100
main()
{
asm jmp start
/设置发声的频率,这一段在沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章有详细的说明 /
sound:
asm mov al,0b6h
asm out 43h,al
asm mov dx,12h
asm mov ax,533h896
asm div di
asm out 42h, al
asm mov al,ah
/ 这个延时是用来防止两次IO *** 作的最后一次 *** 作的错误,
因为CPU比总线的速度快很多,所以 要延时等待第一次 *** 作完成后再进行第二次 *** 作/
asm mov cx,1000
delay:
asm loop delay
asm out 42h,al
asm in al,61h
asm mov ah,al
asm or al,3
asm out 61h,al
/ 使用中断15H功能86H延时CX:DX=微秒数/
asm mov ax,2710h
asm mul bx
asm mov cx,dx
asm mov dx,ax
asm mov ah,86h
asm int 15h /可用__int__(0x15);代替/
asm mov al,ah
asm out 61h,al
asm jmp add_count
/------------------/
start:
asm mov si,offset mus_frep
asm lea bp,mus_time
frep:
asm mov di,[si]
asm cmp di,-1
asm je end_mus
asm mov bx,[bp]
asm jmp sound
add_count: /标号不能用汇编语言写/
asm add si,2
asm add bp,2
asm jmp frep
end_mus:;
}
对于上面的程序大家可用伪寄存器的方法写一个,要容易的多!
/一个发声程序!(引自<<PC技术内幕>>电力版--这个版不好,不如清华版的)/
#include"dosh"
main()
{
static union REGS ourregs;
outportb(0x43,0xb6);
outportb(0x42,0xee);
outportb(0x42,0);
outportb(0x61,(inportb(0x61)|0x03));
ourregshah=0x86;
ourregsxcx=0x001e;
ourregsxdx=0x8480;
int86(0x15,&ourregs,&ourregs);
outportb(0x61,(inportb(0x61)&0xfc));
}
基础方面:(应该无需解释啦)
⒈ 高等数学
⒉ 线性代数
⒊ 复变函数与积分变换
⒊ 概率统计
硬件方面:(最终应该达到可以看懂并分析电路图;可以设计专用计算机系统的程度)
⒈ 电路分析基础 一切电子方向的基础
⒉ 模拟电子技术基础 一切电子方向的基础(开始分化方向)
⒊ 数字电子技术基础 数字电子(计算机)专业的基础
⒋ 计算机组成原理 抽象的数字电子的“可以用来计算的机器”的大原理
⒌ 微机原理及接口技术 基于8086的PC微型计算机系统的原理
⒌ IBM PC汇编语言程序设计 8086CPU指令系统程序设计
⒌ 计算机系统与结构 抽象的数字电子计算机系统(非单指计算机)的原理
⒌ 单片机及接口技术 单芯片计算机系统的基本原理
⒍ (计算机)信号与系统 从数字电路角度理解的计算机系统的接口与通讯
软件方面:(最终应该达到可以阅读并分析程序(不单指源码);可以设计计算机程序系统)
⒈ 离散数学
⒈ C语言程序设计 或 C++面向对象程序设计 或 Pascall语言程序设计
⒉ 数据结构 计算机中数据的组织与管理方式(启发式,非结论式)
⒊ 计算方法 计算机数值计算提高计算精度的方法
⒋ *** 作系统 计算机系统基础管理软件的组成与实现技术
⒌ 编译原理 从源码到可执行代码的翻译过程快速有效的实现方法
⒍ 数据库系统概论 计算机中大批量数据的管理与检索方法
⒍ SQL Server数据库 一个具体的数据库系统的应用
⒍ 软件工程 从工程管理的角度来管理“软件制造业”的方法
其它方向:
(电子)信号与系统
通信原理
计算机网络
TCP/IP技术
分布式应用原理
图形学
多媒体技术基础
计算机专业课程自学参考
有人说,计算机专业的人编的程序要比非计算机专业的人编的要好也许这是在大多数情况下适用的,但是并不是绝对的你在这个方面经验比别人多,研究的比别人深入,那你就比别人专业,所以要相信自己
我本不是计算机专业的,但是本专业也学过许多计算机课程准备把没学的补补下面是计算机专业课程,供大家自学参考,当然这些都是基础
一
离散数学,数据结构,计算机组成原理,汇编语言程序设计,面向对象技术,数据通信
原理,数字电路与逻辑设计,程序设计课程设计,数据结构课程设计,计算机组成原理试验,
数字电路与逻辑设计试验,计算机文化基础,计算机程序设计,线性代数A,概率论与数理统计B,
普通物理B,电路电子学
数据库系统, *** 作系统,计算机网络,计算机系统结构,光通信技术,嵌入式系统设计,
Internet与web编程,Cisio/Solaris网络体系设计与实现,综合布线系统
编译原理,数字系统设计VHDL,信号与系统,微机系统与接口技术,数字信号处理,
软件工程,IT项目管理,七号信令系统,电子商务概论,多媒体技术,UNIX *** 作系统,计算机信息安全移动通信,卫星通信,计算机系统维护技术
二
基础方面:(应该无需解释啦)
⒈ 高等数学
⒉ 线性代数
⒊ 复变函数与积分变换
⒊ 概率统计
硬件方面:(最终应该达到可以看懂并分析电路图;可以设计专用计算机系统的程度)
⒈ 电路分析基础 一切电子方向的基础
⒉ 模拟电子技术基础 一切电子方向的基础(开始分化方向)
⒊ 数字电子技术基础 数字电子(计算机)专业的基础
⒋ 计算机组成原理 抽象的数字电子的“可以用来计算的机器”的大原理
⒌ 微机原理及接口技术 基于8086的PC微型计算机系统的原理
⒌ IBM PC汇编语言程序设计 8086CPU指令系统程序设计
⒌ 计算机系统与结构 抽象的数字电子计算机系统(非单指计算机)的原理
⒌ 单片机及接口技术 单芯片计算机系统的基本原理
⒍ (计算机)信号与系统 从数字电路角度理解的计算机系统的接口与通讯
软件方面:(最终应该达到可以阅读并分析程序(不单指源码);可以设计计算机程序系统)
⒈ 离散数学
⒈ C语言程序设计 或 C++面向对象程序设计 或 Pascall语言程序设计
⒉ 数据结构 计算机中数据的组织与管理方式(启发式,非结论式)
⒊ 计算方法 计算机数值计算提高计算精度的方法
⒋ *** 作系统 计算机系统基础管理软件的组成与实现技术
⒌ 编译原理 从源码到可执行代码的翻译过程快速有效的实现方法
⒍ 数据库系统概论 计算机中大批量数据的管理与检索方法
7 SQL Server数据库 一个具体的数据库系统的应用
8 软件工程 从工程管理的角度来管理“软件制造业”的方法
9 汇编语言
其它方向:
(电子)信号与系统
通信原理
计算机网络
TCP/IP技术
分布式应用原理
图形学
多媒体技术基础
三
很多朋友可能跟我一样,想学习计算机专业知识,又没机会接受正规的大学计算机教育。在此我作为过来人跟大家谈谈自己自学的感受。
★确立学习方向
计算机专业人才的培养目标有很多,就大学计算机专业的设置来看,大致可以概括为以下几个方面:
一、计算机软件与理论
本专业主要培养具有较强理论基础和设计、开发软件能力的软件人才,以满足软件开发、技术管理、科学研究和高等教育等多层次的社会需要。
二、计算机应用技术
本专业主要培养计算机应用技术领域的各类开发、研究、应用人才。
毕业生适合的工作有:高等院校计算机科学与技术的教师和研究人员、中小型控制系统的设计实施人员、大型控制系统的应用人员、企业级MIS/ERP建设人员、基于Internet/Intranet的多媒体应用程序开发人员、数字通讯领域各类应用人员、大中型企业及涉外企业IT部门的工作人员。
三、计算机系统(体系)结构
本专业以并行处理、容错计算等为主要研究方向,所开设的课程反映当前国内外计算机系统结构学科的发展水平。培养学生的计算机软硬件基础,以及熟练的以计算机为手段独立研究与设计计算机系统的能力和计算机应用、软件开发能力。
★如何挑选教材
好的教材对于自学者来说是至关重要的,因此下面我们重点介绍一下适合自学用的计算机专业教材。
一、数学
数学是计算机专业的基础,学好数学是学好计算机专业的关键。高等数学课程主要学习微积分、空间解析几何和微分方程,一般高校通用的教材是同济大学编的《高等数学》,目前已经有了第五版,也可以使用自考教材——西安交通大学陆庆乐编的《高等数学》,可以买一些配套的辅导书和习题解答。
还有两门重要的数学课程是《线性代数》和《概率统计》。可以分别采用高等教育出版社出版、同济大学编写的《线性代数》和浙江大学编写的《概率统计》。注意:自学一定要多做习题,而且最好一门课有一本习题解答和辅导书。
除了上面数学基础课外,在计算机专业中举足轻重的就是《离散数学》,这门课要多花点力气来学。可以采用左孝凌教授等编的《离散数学》,上海科学技术文献出版社。也可以用北大、清华的教材,还可以参考左教授编的自学教材,经济科学出版社。
其他课程还有《复编函数》、《计算方法》等,有余力的朋友可以选学。
二、专业基础课
1《程序设计》:学习内容一般为C和C++。C语言可以采用谭浩强教授的《C程序设计》,内容比较浅显,C++方面的书推荐钱能编写的《C++程序设计》,清华大学出版社。
2《数据结构》:这门课程比较难,可以采用严蔚敏教授编写的《数据结构(C语言版)》,有配套习题册。好好做题,有时间多编几个大的程序。
3《模拟电路》和《数字电路》:这是难度较高的两门课程,选用自考教材相对来说容易些,也可以参考清华大学出版社出版的相关教材。
三、专业课
1《计算机组成原理》:推荐白中英主编的《计算机组成原理》(第三版),科学出版社;黄爱英主编的《计算机组成原理》(第三版),清华大学出版社。
2《 *** 作系统》:汤子赢编写的《计算机 *** 作系统》(第三版),西安电子科技大学出版社。还可以参考高教司司长张尧学教授编写的教材,清华大学出版社。
3《汇编语言》:可以用清华大学出版社出版的教材,也可以用自考教材。
4《数据库原理》:人民大学教授王珊编的《数据库系统概论》(第三版),高等教育出版社,复旦大学施伯乐老师编写的教材也不错。
5《编译原理》:国防科技大学陈火旺院士编写的教材十分不错,最新版本是2000年出的,国防工业出版社。
四、选修课
包括计算机网络与通讯、软件工程、图形学、人工智能、系统结构、图形学等。此类课程的教材可选用全国高等教育自学ks指定教材,或参考各高校所采用的计算机专科和本科教材及配套辅导书。英文基础好的朋友可以用国外著名大学的影印版教材。
需要提醒大家的是,除了教材,网上有许多相关课堂录像和课件,有条件的朋友要充分利用。
我自己通过上述课程的学习和实践,已经考完了计算机本科自学ks的大部分课程,并已通过计算机四级考试,下半年还准备参加高级程序员考试。希望我的经验对大家能有所帮助。
总结一下,没学过的课程大概有:
1离散数学
2计算机组成原理,计算机系统结构,嵌入式系统设计,编译原理,Unix系统
3Internet与web编程,Cisio/Solaris网络体系设计与实现,TCP/IP技术
4综合布线系统,信号与系统,数字信号处理,单片机及接口技术,分布式应用原理
5IT项目管理
6多媒体
号的一定会看,其他的课可能会看除了以上的,其他基本都在本科学过需要进一步加强的有:
1汇编语言, *** 作系统,微机原理
2数据库,计算机网络,软件工程
补充:研一第一学期计算机专业课:
并行程序设计,算法设计与分析,组合数学,高级计算机网络,程序设计语言理论,高级数据库系统,现代密码学理论与实践,智能计算模型与方法,高级计算机图形学,计算机辅助设计与制造,嵌入式系统设计方法、工具与环境,高性能处理器体系结构,数据库技术前沿,人工智能前沿,软件安全的理论与方法,普适计算
以上就是关于几本汇编语言书籍的不同_汇编语言哪本书比较好全部的内容,包括:几本汇编语言书籍的不同_汇编语言哪本书比较好、如何C语言与汇编混编、我现在要自考专科,选择的专业是计算机及其应用,请大家指引一下学习路线等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)