x86 PC汇编及BIOS编程
文章平均质量分 61
yunsongice
这个作者很懒,什么都没留下…
展开
-
IBM PC 微型计算机硬件系统组成
典型的微型计算机硬件系统主要由中央处理器 CPU (Central Processing Unit)、存储器(Memory)、输入/输出(Input/Output)设备三个主要组成部分构成,并且用系统总线将他们连接在一起,如图所示:下面,根据上边的那个图,我们来对每个组成部分进行一个粗略的介绍:1.中央处理器CPU 包括运算器和控制器两部分,主要是执行程序功能。2.存储器功能:存放程序和数据存储单元:存储器划分为若干存储单元,存储单元的多少表示存储器的容量。每个单元有相同的二进制位数。物理地址:每个存储单元原创 2010-09-29 22:52:00 · 2795 阅读 · 1 评论 -
BIOS系统服务 —— 并行口服务
7并行口服务(Parallel Port Service——INT 17H) <br />00H —向打印机输出字符<br />01H —初始化打印机端口<br />02H —读取打印机状态<br /> <br />(1) 功能00H<br /> <br />功能描述:向打印机输出字符<br />入口参数:AH=00H<br />AL=输出的字符<br />DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……)<br />出口参数:AH=打印机状态。其各位为1时的含义如下:位7—打印机原创 2010-10-08 16:31:00 · 1229 阅读 · 0 评论 -
Linux 中的汇编语言(一)
<br />在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出现在以.c为扩展名的C文件中,在这种文件中,既有C语言,也有汇编语言,我们把出现在C代码中的汇编语言叫所“内嵌”汇编。不管这些汇编代码出现在哪里,它在一定程度上都成为阅读源代码的拦路虎。<br /> <br />尽管C语言已经成为编写操作系统的主要语言,但是,在操作系统与硬件打交道的过程中,在需要频繁调用的函数中以及某些特殊的场合中,C语言显原创 2010-10-08 17:50:00 · 2387 阅读 · 0 评论 -
Linux 中的汇编语言(四)
4 GCC内嵌汇编编程<br />在Linux的源代码中,有很多C语言的函数中嵌入一段汇编语言程序段,这就是gcc提供的“asm”功能,例如在include/asm-i386/system.h中定义的,读控制寄存器CR0的一个宏read_cr0():<br />#define read_cr0() ({ /<br />unsigned int __dummy; /<br />__asm__( /<br />"movl %%cr0,%0/n/t" /<br />:"=r" (__dummy)); /<br /原创 2010-10-08 17:56:00 · 1977 阅读 · 0 评论 -
汇编语言程序设计(三)
2 程序的基本组成<br />汇编语言源程序的组成部分有:模块、段、子程序和宏等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。<br /> 2.1 段的定义<br />微机系统的内存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。<br /> <br原创 2010-10-08 15:44:00 · 1661 阅读 · 0 评论 -
汇编语言程序设计(六)
5 简化的段定义<br />前面,我们介绍了完整的段定义格式,用完整的段定义格式虽然可以控制段的各种属性,但程序员很少会这样做。现在的汇编程序提供了一种简化的段定义方式,它使定义段更简单、方便。<br /> 5.1 存储模式定义伪指令<br />在使用简化的段定义方式之前,必须使用存储模式说明伪指令来描述源程序所采用的存储模式。该伪指令说程序所使用的存储模式,汇编程序将用该存储模式生成相应的ASSUME和GROUP语句,同时也为其它的简化段创建等价的预定义。<br /> <br />程序存储模式说明伪指令的原创 2010-10-08 15:55:00 · 1928 阅读 · 0 评论 -
BIOS系统服务 —— 串行口服务
4 串行口服务(Serial Port Service——INT 14H) <br />00H —初始化通信口03H —读取通信口状态<br />01H —向通信口输出字符04H —扩充初始化通信口<br />02H —从通信口读入字符<br /> <br />(1) 功能00H<br /> <br />功能描述:初始化通信口<br />入口参数:AH=00H<br />DX=初始化通信口号(0=COM1,1=COM2,……)<br />AL=初始化参数,参数的说明如下:波特率奇偶位停止位字的位原创 2010-10-08 16:22:00 · 1684 阅读 · 0 评论 -
BIOS系统服务 —— 时钟服务
8 时钟服务(Clock Service——INT 1AH) <br />00H —读取时钟“滴答”计数06H —设置闹钟<br />01H —设置时钟“滴答”计数07H —闹钟复位<br />02H —读取时间0AH —读取天数计数<br />03H —设置时间0BH —设置天数计数<br />04H —读取日期 80H —设置声音源信息<br />05H —设置日期<br /> <br />(1) 功能00H<br /> <br />功能描述:读取时钟“滴答”计数<br />入口参数:AH=原创 2010-10-08 16:32:00 · 1564 阅读 · 0 评论 -
保护模式编程实例
<br />前面介绍了保护模式编程的重要指令,接下来需要掌握的是几个重要的保护模式编程要领。保护模式编程最重要的是切换,向保护模式切换的主要步骤是:(1)作切换到保护方式的准备;(2)切换到保护方式;(3)把指定内存区域的内容传送到位于常规内存的缓冲区中;(4)切换回实模式;(5)显示缓冲区内容。<br /> <br />本节,我们通过一个具体实例来开始接触保护模式编程,这个实例的其逻辑功能是,以十六进制数的形式显示从内存地址110000H开始的256个字节的值。本实例指定该内存区域的目的仅仅是想说明切换到原创 2010-10-08 14:03:00 · 2209 阅读 · 1 评论 -
PC 存储器
<br />在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存,港台称之为记忆体)。我们这里讨论的存储器主要是内存,因为当今的计算机体系中,辅存已经被划分成了I/O设备。<br /> <br />内存又称主存,是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是存取速度快。内存是计算机的主要部件,它是相对于外存而言的。我原创 2010-10-08 15:08:00 · 5251 阅读 · 2 评论 -
汇编语言程序设计(一)
<br />在前面内容的学习中,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:CPU功能结构、工作模式,内存单元的寻址方式,各种汇编指令格式。在掌握了这些基本内容之后,就需要学习如何把它们组成一个完整的汇编语言程序。<br /> <br />在汇编语言程序设计中,有三类指令:指令、伪指令和宏指令。<br /> <br />指令:汇编后形成一条机器语言指令,指示CPU进行各种操作。它在程序执行时得到运行,它与机器语言指令一一对应。<br /> <br />伪指令:它只告诉汇编程序(MASM.G原创 2010-10-08 15:24:00 · 3068 阅读 · 2 评论 -
汇编语言程序设计(四)
3 汇编程序基本结构<br />在学习高级语言程序设计时,我们知道了程序的三大主要结构:顺序结构、分支结构和循环结构。在汇编语言的源程序也同样有此三大结构,所不同的是它们的表现形式不同。用高级语言编写程序时,由于不使用“转移语句”而使这三种结构清晰明了。<br /> <br />但在汇编语言的源程序中,很难不使用“转移语句”(除非是一些只有简单功能的程序),有时甚至会有各种各样的“转移语句”。由于存在这些转移语句,就使得:汇编语言源程序的基本结构显得不太明确。如果源程序的编写者思维混乱,编写出来的源程序在结原创 2010-10-08 15:48:00 · 2832 阅读 · 0 评论 -
汇编语言程序设计(五)
4 段的基本属性<br />在通常情况下,一个复杂的应用程序会由若干个模块组成,一个模块又会含有多个段。而不同模块的段之间、同一模块的段之间往往存在某种联系,这种联系就要体现在段属性的说明上。<br /> <br />段定义的一般格式如下:<br /> <br />段名 SEGMENT[对齐类型][组合类型][类别] <br />… <br />段名 ENDS <br /> <br />段属性“对齐类型”、“组合类型”和“类别”要按此顺序说明,但这些可选项可根据需要选择书写。如果源程序中不指定某个属性,那么原创 2010-10-08 15:52:00 · 1590 阅读 · 0 评论 -
BIOS系统服务 —— 直接系统服务
<br />在系统启动后,没有加载任何操作系统。经过了上电自检以后,CPU的各寄存器被初始化成一些列的值,可以直接定位到一个逻辑地址去执行相应的指令。这个地址一般是0xfffffff0,对应的位置就是BIOS所处的ROM芯片上。而这个芯片上存放的程序都是固定的,我们可以通过编程来访问他们,就是所谓的BIOS系统服务。这个服务一般用来初始化操作系统所需要的各种环境,并在屏幕上打印一些提示或交互信息。<br /> <br />接下来,我们就对这些服务进行一下介绍:<br /> 1 直接系统服务<br />INT原创 2010-10-08 16:07:00 · 1702 阅读 · 0 评论 -
BIOS系统服务 —— 键盘服务
6 键盘服务(Keyboard Service——INT 16H) <br />00H、10H —从键盘读入字符03H —设置重复率<br />01H、11H —读取键盘状态04H —设置键盘点击<br />02H, 12H —读取键盘标志05H —字符及其扫描码进栈<br /> <br />(1) 功能00H和10H<br /> <br />功能描述:从键盘读入字符<br />入口参数:AH=00H——读键盘<br />=10H——读扩展键盘,可根据0000:0496H单元的内容判断:扩展键盘原创 2010-10-08 16:27:00 · 1840 阅读 · 0 评论 -
Intel 80486微处理器功能结构
<br />1. 功能模块<br /> <br />在80386基础上, 增加:8KCache;浮点协处理器 FPU。如下图所示:<br /><br /> <br /><br /> ● 内部64位总线连接EU和FPU;<br /> ● 可以禁止分页, 所以SU输出可直接送到Cache;<br /> ● SU和PU首先寻址Cache, 不命中才寻址内存。<br /> <br />2. 内部寄存器<br /> <br />通用寄存器/段寄存器/指令指针与80386相同。 <br /> <br原创 2010-10-08 14:16:00 · 4271 阅读 · 0 评论 -
BIOS系统概述
<br />BIOS技术源于IBM PC/AT机器的流行以及第一台由康柏公司研制生产的“克隆”PC。在PC启动的过程中,BIOS担负着初始化硬件,检测硬件功能,以及引导操作系统的责任。<br />在早期,BIOS还提供一套运行时的服务程序给操作系统及应用程序使用。BIOS程序存放于一个断电后内容不会丢失的只读ROM中;系统过电或被重置 (reset) 时,处理器第一条指令的位址会被定位到该 BIOS 的内存中,让初始化程序开始执行。<br /> <br />英特尔公司从2000年开始,发明了可扩展固件接口(原创 2010-10-08 16:01:00 · 2397 阅读 · 0 评论 -
Linux 中的汇编语言(二)
2 AT&T汇编语言的相关知识<br />在Linux源代码中,以.S为扩展名的文件是“纯”汇编语言的文件。这里,我们结合<br />具体的例子再介绍一些AT&T汇编语言的相关知识。<br /> <br />1.GNU汇编程序GAS(GNU Assembly和连接程序)<br /> <br />当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在Linux下有两种方式,一种是使用汇编程序GAS和连接程序ld,一种是使用gcc。我们先来看一下GAS和ld:<br /> <br />GAS把汇原创 2010-10-08 17:52:00 · 1659 阅读 · 0 评论 -
BIOS系统服务 —— 杂项系统服务
5 杂项系统服务(Miscellaneous System Service——INT 15H) <br />00H —开盒式磁带机马达85H —系统请求(SysReq)键<br />01H —关盒式磁带机马达86H —延迟<br />02H —读盒式磁带机87H —移动扩展内存块<br />03H —写盒式磁带机88H —读取扩展内存大小<br />0FH —格式化ESDI驱动器定期中断89H —进入保护模式<br />21H —读/写自检(POST)错误记录90H —设备等待<br />4FH —键盘截听原创 2010-10-08 16:23:00 · 1643 阅读 · 0 评论 -
BIOS系统服务 —— 直接磁盘服务
3 直接磁盘服务(Direct Disk Service——INT 13H) <br />00H —磁盘系统复位0EH —读扇区缓冲区<br />01H —读取磁盘系统状态0FH —写扇区缓冲区<br />02H —读扇区10H —读取驱动器状态<br />03H —写扇区11H —校准驱动器<br />04H —检验扇区12H —控制器RAM诊断<br />05H —格式化磁道13H —控制器驱动诊断<br />06H —格式化坏磁道14H —控制器内部诊断<br />07H —格式化驱动器15H —读取原创 2010-10-08 16:18:00 · 2107 阅读 · 0 评论 -
Intel 8086/8088微处理器功能结构
<br />1. 8086/8088CPU内部结构<br /> <br />8086/8088内部包括两大部件:总线接口部件 BIU用来取指令、取操作数、存结果;执行部件 EU用来执行指令。 EU执行指令时,BIU同时完成从主存中预取后继指令,两个部件并行工作,提高了指令的执行速度。如图所示:<br /> <br /><br /> <br />(1)执行部件 EU<br /> <br />◆ 从指令队列中取指令代码,由EU控制器译码后产生控制信号送各部件以完成指令规定的操作;<br />◆原创 2010-09-29 23:03:00 · 3650 阅读 · 0 评论 -
Intel 8086/8088系统寻址方式
<br /><br />计算机的指令集合称为指令系统。一条指令主要包括操作码和操作数。<br /> <br />操作码表示该指令要完成的操作,如传送、加、减、乘、除等。操作数字段表示操作码所需操作数的来源和操作结果的去向。<br /> <br />寻址方式是规定如何对指令中操作数字段作出解释以找到操作数的方法。8086/8088有以下几种寻址方式:<br /> <br />寄存器寻址方式、立即数寻址方式、存储器寻址方式(直接寻址方式、寄存器间接寻址方式、变址和基址寻址方式、基址变址寻址方式)、串操作寻址方式原创 2010-10-04 01:06:00 · 4724 阅读 · 1 评论 -
Intel 8086/8088 指令系统(一)
<br />8086/8088 指令系统的指令按操作数地址个数可分为三种类型:<br /> (1)双操作数指令: OPR DEST,SRC<br /> (2)单操作数指令: OPR DEST<br /> (3)无操作数指令: OPR<br /> <br />在8086/8088 指令系统中,除串操作指令外,其余所有指令最多只能有一个操作数存放在存储器中。对于双操作数而言,两个操作数不能同时是存储器操作数。<br /> <br />8086/8088 指令系统的指令按功能可分为六大类:原创 2010-10-04 01:09:00 · 3883 阅读 · 0 评论 -
Intel 8086/8088 指令系统(二)
<br />二、算术运算类指令<br /> <br />这类指令包括加、减、乘、除4种指令。不过注意两个操作数不能同时为存储器操作数,且目的操作数不能是立即数(不然你结果放哪儿?)。<br /> <br />指令名<br />指令格式<br />指令功能<br />标志位备注<br />加法指令<br />ADD DEST,SRC<br />DEST←(SRC)+(DEST)<br />按结果置OF、SF、ZF、AF、PF、CF<br />带进位加法<br />ADC DEST,SRC<br />DEST←原创 2010-10-04 01:13:00 · 1818 阅读 · 0 评论 -
Intel 8086/8088 指令系统(四)
<br />四、串操作类指令<br /> <br />数据串是存储器中一片连续的存储单元,字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的。字符串操作指令可对内存单元按字节、字或双字进行处理,并能根据操作对象的字节数使变址寄存器SI(和DI)增减1、2或4。具体规定如下:<br /> <br />(1)、当DF=0时,变址寄存器SI(和DI)增加1、2或4;<br />(2)、当DF=1时,变址寄存器SI(和DI)减少1、2或4。<br /> <br原创 2010-10-04 01:21:00 · 1862 阅读 · 0 评论 -
Intel 80286微处理器功能结构
<br />1. 主要构成<br /> <br />80286主要由指令部件(IU)、执行部件(EU)、地址部件(AU)、总线部件(BU)组成,前两者相当于8086的EU,后两者相当于8086的BIU。<br /> <br />(1) AU:按EU的请求的寻址方式形成物理地址<br /> 主要由段基地址寄存器、地址加法器、段容量寄存器、描述子表基地址寄存器、段限检查器五个部分组成<br /> <br />(2) BU:按AU形成的物理地址, 完成EU所请求的寻址过程和数据传送<br /> 主要由原创 2010-10-04 02:05:00 · 2669 阅读 · 0 评论 -
Intel 80386微处理器功能结构
<br />1. 功能模块<br /> <br />(1) BIU(总线接口部件):完成指令预取请求和执行单元的数据存取请求,数据存取请求优先于指令预取请求。<br /> <br />(2) IPU(指令预取部件):16字节指令预取队列, 提出预取请求<br /> <br />(3) IDU(指令译码部件):完成指令译码。<br /> <br />(4) SU(分段部件):完成执行单元的地址请求, 将虚地址转换为线性地址。线性地址:不允许分页(实地址模式):线性地址=物理地址;若允许分页(需地址保护模式):原创 2010-10-04 23:35:00 · 2432 阅读 · 0 评论 -
Intel 80386的保护模式
<br />1. 实地址模式<br /> <br />当CPU通电或RESET时,cr0的PE位置0, 进入实地址模式。这里不在赘述。<br /> <br />2. 保护模式<br /> <br />80386提供分段和分页两种存储管理模式<br /> <br />●分段管理的特点:对存储空间的逻辑划分,优点:对模块化(结构化)程序设计方式提供了很好的支持;缺点:①段长可变不固定, 管理更复杂、②空间碎片较多、③访问字节数∕传输字节可能很小<br /> <br />●分页管理的特点:对存储空间的物理划分,优原创 2010-10-04 23:41:00 · 1809 阅读 · 0 评论 -
Intel 8086/8088 指令系统(五)
<br />五、程序转移类指令<br /> <br />转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用,因为指令系统中有大量的转移指令。<br /> <br />1、无条件转移指令<br /> <br />JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-1原创 2010-10-04 01:56:00 · 1961 阅读 · 0 评论 -
Intel 8086/8088 CPU 寄存器结构
<br />1. 段寄存器<br /> <br />需执行程序的各部分(指令代码、数据、堆栈)分别放在主存的指定段中。<br /> <br />段寄存器:用来存放每个段的段基值,即段基址的高16位,每个段寄存器有特定功能,不能互换。<br /> <br />当前段:由CS、DS、SS、ES指向的段,如图:<br /> <br /><br /> <br />CS ----- 代码段用来存放程序的指令代码序列,CS用来存放当前代码段首址的高16位,即段基值。<br /> <br />DS ----- 数据段用来原创 2010-10-04 00:58:00 · 3909 阅读 · 1 评论 -
Intel 80286工作模式
<br />1. 实地址模式<br /> <br />系统开机CPU复位时,自动进入实地址模式,A23~A20自动置为0,以 A19~A0寻址1M的存储空间。<br /> <br />2. 虚地址保护模式<br /> <br />当机器状态字MSW的PE位置1时,进入保护模式。该模式主要针对在多任务机制中的存储管理。其有两个方面的含义:<br /> <br />虚地址——应用程序可以寻址一个比实际物理地址空间(16M)大得多的虚存空间(1024M)。<br /> <br />保护——对存储空间的(数据和程序原创 2010-10-04 02:16:00 · 3459 阅读 · 0 评论 -
Intel 8086/8088 指令系统(三)
<br />三、位操作类指令<br /> <br />包括逻辑运算指令、测试指令和移位指令<br /> <br />指令名<br />指令格式<br />指令功能<br />标志位备注<br />逻辑运算指令<br /> <br /> <br /> <br />逻辑与<br />AND DEST,SRC<br />DEST←(SRC)∩(DEST)<br />SF、ZF、PF,置CF和OF为0,AF不确定<br />逻辑或<br />OR DEST,SRC<br />DEST←(SRC)∪(DEST)<br原创 2010-10-04 01:17:00 · 8764 阅读 · 0 评论 -
Intel 8086/8088 指令系统(六)
<br />六、处理器控制指令<br /> <br />处理器控制指令是一组控制CPU工作方式的指令。这组指令的使用频率不高。<br /> <br />1、标志位操作指令:对CF、IF、DF进行操作<br /> <br />这些指令都是无操作数指令,指令中未直接给出操作数的地址,但隐含指出操作数在标志寄存器的某些标志位上,能直接操作的标志位有CF、IF、DF。<br /> <br />(1)、清除进位标志指令 (Clear carry flag) <br />CLC ;置CF=0<br /> <br />(原创 2010-10-04 01:58:00 · 1549 阅读 · 0 评论 -
保护模式编程
随着80386微处理器体系结构的重大变化,它的指令系统也得到了增强和补充,x86的发展进入了保护模式阶段。首先,介绍一下新增加的一些指令:一、新增高级语言指令1. PUSHA/POPA指令功能: 压入所有通用寄存器 语法: PUSHA/POPA 该指令是重点指令,用于将通用寄存器的内容压入堆栈,这些寄存器按以下顺序存储到堆栈: AX、CX、DX、BX、SP(原始值)、BP、SI 及 DI(如果操作数大小属性为 16)。POPA指令执行它的逆操作。SP 寄存器压入的值是它在原创 2010-10-06 23:29:00 · 2186 阅读 · 0 评论 -
Pentium系列微处理器功能结构
<br />一、主要特征<br /> <br />◆超级标量结构(双指令流水线)<br />◆双Cache(指令Cache和数据Cache分离)<br />◆分支预测技术<br />◆ 64位数据总线<br />◆ RISC和CISC的结合<br /> <br />二、内部结构<br /> <br />1. 功能模块<br /> <br />从功能模块的角度, Pentium在80486的基础上增加了一条指令流水线(包括相应的地址生成部件)和一个Cache。<br />在结构上, 与80486相比, 形成了原创 2010-10-08 14:24:00 · 3038 阅读 · 0 评论 -
80486和Pentium增强和扩充指令
<br />80486和Pentium增强和扩充指令有以下几条:<br /> <br />1. BSWAP指令<br /> <br />功能: 字节交换<br />语法: BSWAP r32<br /> <br />反转 32 位(目标)寄存器的字节顺序:位 0 到 7 位与位 24 到 31 交换,位 8 到 15 位与位 16 到 23 交换。提供此指令是为了将低位在先、高位在后的值转换成高位在先、低位在后的格式,或者正相反。<br /> <br />要交换字值(16 位寄存器)中的字节,请原创 2010-10-08 14:56:00 · 2276 阅读 · 0 评论 -
BIOS系统服务 —— 显示服务
2 显示服务(Video Service——INT 10H) <br />00H —设置显示器模式0CH —写图形象素<br />01H —设置光标形状0DH —读图形象素<br />02H —设置光标位置0EH —在Teletype模式下显示字符<br />03H —读取光标信息0FH —读取显示器模式<br />04H —读取光笔位置10H —颜色<br />05H —设置显示页11H —字体<br />06H、07H —初始化或滚屏12H —显示器的配置<br />08H —读光标处的字符及其属性13原创 2010-10-08 16:11:00 · 2030 阅读 · 0 评论 -
Linux 中的汇编语言(三)
3汇编程序指令(Assembler Directive)<br />上面介绍的.section就是汇编程序指令的一种,GNU汇编程序提供了很多这样的指令(directiv),这种指令都是以句点(.)为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令(以arch/i386/kernel/head.S中的代码为例)。<br /> <br />(1)ascii "string"...<br /> <br />.ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“原创 2010-10-08 17:54:00 · 1883 阅读 · 0 评论