FAT32引导扇区代码_第1页
FAT32引导扇区代码_第2页
FAT32引导扇区代码_第3页
FAT32引导扇区代码_第4页
FAT32引导扇区代码_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

FAT32引导扇区代码;====================================================================;;FlyingDragonOSBootSectorFORFAT32;;Author:Jack;V0.012005-07-2317:39;V0.022005-08-0709:29;;Build:nasm-fbinFAT32.ASM-oFAT32.BIN;;====================================================================================;;BIOS在启动中的角色:;(1)BIOS装载引导驱动器上的0扇区(CHS=0:0:1)内容到内存线性地址7C00H处;;(2)BIOS检查所装载的扇区是否有启动标记(510、511字节分别为55H和AAH);;(3)CPU寄存器DL被设置为分配给引导驱动器的驱动器号,00H为软驱A,80H为硬盘C;;(4)BIOS跳转到其装载的扇区中的代码(即7C00H处),将控制权转交给引导代码。;;引导代码应该初始化以下寄存器:;(1)DS:某些BIOS设置其值为0,某些设置其为40H,它应该被设置为(7C00H-BOOT_ORG)/16;;其中,BOOT_ORG为引导代码的ORG值,该值通常为7C00H(这意味着DS应设置为0);;(2)SS和SP(堆栈):这两个寄存器的初始值依赖于BIOS;;(3)CS个IP(通过JMP指令):大多数的BIOS进入启动代码的地址为0000:7C00H,但是某些;BIOS却跳转到07C0:0000H。由于短跳转和条件跳转是IP相关的,因此如果没有使用;远跳转或者绝对跳转,则不需要重置CS和IP;然而,DS仍旧必须是正确的值。;;=====================================================================================;;常规内存(00000000H-000FFFFFH,即0-1MB)在系统启动时的使用情况;;=====================================================================================;;---------------------------------;|00000000-000003FF|1024BIDTreadonly;|-------------------------------|;|00000400-000004FF|256BBIOSDataArea,readonly;|-------------------------------|;|00000500-00007BFF|*30464BFreeMemory,read/write(29.75KB);|------------------------------|;|00007C00-00007DFF|512BBootSector,read/write;|------------------------------|;|00007E00-00007FFF|512BFreeMemory,read/write;|------------------------------|;|00008000-0009FBFF|607KBFreeMemory,read/write(32K-639KB);|------------------------------|;|0009FC00-0009FFFF|**1KBEBDAextendedBIOSdataarea;|------------------------------|;|000A0000-000AFFFF|64KBVideoMemory;|------------------------------|;|000B0000-000B7FFF|32KBMonoVideoTextMemory;|------------------------------|;|000B8000-000BFFFF|32KBColorVideoTextMemory;|------------------------------|;|000C0000-000C7FFF|32KBVideoBIOS,readonly;|------------------------------|;|000C8000-000EFFFF|160KBAdapterROM,readonly;|------------------------------|;|000F0000-000FFFFF|64KBSystemBIOS,readonly;|------------------------------|;|00100000-0010FFEF|***64KB-16HighMemoryArea,read/write(1MB开始处);|------------------------------|;|0010FFF0-|FreeExtendedMemory,read/write;|------------------------------|;;*空闲内存实际并非从00000500处开始,BIOS数据区实际上会利用从00000500开始的少量字节,例如;00000500处保存的是打印屏幕状态,当按下打印屏幕(PrintScreen)键时,低级键盘BIOS初始化打印屏;幕功能,键盘BIOS触发中断5打印屏幕处理程序。正因为BIOS数据区越过了256B的界限,因此DOS实际;上是从00000522开始装载的。为保险起见,可从00000600开始利用空闲内存。(1.5K-31K29.5KB);;**有些机器上没有这段BIOS扩展数据区。;;***如果没有使用扩展高端内存区域程序(例如Emm386.exe),则从00100000(1MB)开始的内存都是可用的。;;;=====================================================================================;BITS16;生成16位代码而不是32位代码SECTION.TEXT;代码段ORG7C00H;指定程序被装入内存的起始位置;====================================================================;;宏和常量定义;;====================================================================EQU0;NASM不支持DW?这样的语法,可以使用这样的定义;模拟,以使代码的可读性更强DATA_BUF_SEGEQU0200H;用于读取根目录或文件内容的缓冲区(8K)段地址DATA_BUF_OFFEQU2000HSTACK_ADDREQU7BD0H;堆栈栈顶(注意:堆栈大小约为20K)OSLOADER_ADDREQU8000H;FDOSLDR.BIN放入内存中的起始位置,这就意味着;装载程序及相关资源的尺寸不能超过608K;8000H-A000H(32K-640K)OSLOADER_SEGEQU0800H;起始段地址SECOND_SECTOREQU03H;第二个引导扇区的扇区号(第四个扇区)SECOND_ADDREQU7E00H;第二个引导扇区的装载位置;====================================================================;用堆栈保存若干中间变量(SS=0BP=7C00H);====================================================================FAT_START_SECTOREQU4;FAT表的起始扇区号DWORDROOT_START_SECTOREQU8;根目录的起始扇区号DWORDDATA_START_SECTOREQU12;数据区起始扇区号DWORDFAT_ENTRY_SECTORSEQU14;FAT表所占的扇区数WORDROOT_ENTRY_SECTORSEQU16;根目录所占的扇区数WORDDIR_PER_SECTOREQU17;每个扇区所容纳的目录BYTEDISK_EXT_SUPPORTEQU18;磁盘是否支持扩展BIOSBYTECURRENT_CLUSTEREQU40;当前正在处理的簇号DWORD;====================================================================;扩展磁盘服务所使用的地址包;====================================================================DAP_SECTOR_HIGHEQU24;起始扇区号的高32位(每次调用需要重置)DWORDDAP_SECTOR_LOWEQU28;起始扇区号的低32位(每次调用需要重置)DWORDDAP_BUFFER_SEGEQU30;缓冲区段地址(每次调用需要重置)WORDDAP_BUFFER_OFFEQU32;缓冲区偏移(每次调用需要重置)WORDDAP_RESERVED2EQU33;保留字节DAP_READ_SECTORSEQU34;要处理的扇区数(1-127)DAP_RESERVED1EQU35;保留字节DAP_PACKET_SIZEEQU36;包的大小为16字节;====================================================================;;目录项结构(每个结构为32字节);;====================================================================OFF_DIR_NAMEEQU0;目录项的偏移BYTE[11]OFF_DIR_ATTRIBUTEEQU11;目录属性BYTEOFF_NT_RESERVEDEQU12;保留属性BYTEOFF_CREATE_TIME_HUNDREDTHEQU13;创建时间BYTEOFF_CREATE_TIMEEQU14;创建时间WORDOFF_CREATE_DATEEQU16;创建时间WORDOFF_LAST_ACCESS_DATEEQU18;上次访问时间WORDOFF_START_CLUSTER_HIGHEQU20;起始簇号高位WORDOFF_LAST_UPDATE_TIMEEQU22;上次更新时间WORDOFF_LAST_UPDATE_DATEEQU24;上次更新时间WORDOFF_START_CLUSTER_LOWEQU26;起始簇号低位WORDOFF_FILE_SIZEEQU28;文件尺寸DWORD;相关常量DIR_NAME_DELETEDEQU0E5H;该项已经被删除DIR_NAME_FREEEQU00H;该项是空闲的(其后也是空闲的)DIR_NAME_DOTEQU2EH;特殊目录.或..DIR_NAME_SPACEEQU20H;不允许的字符DIR_ENTRY_SIZEEQU32;每个目录项的尺寸,其结构如上所示;文件属性DIR_ATTR_READONLYEQU01H;只读文件DIR_ATTR_HIDDENEQU02H;隐藏文件DIR_ATTR_SYSTEMEQU04H;系统文件DIR_ATTR_VOLUMEEQU08H;卷标号(只可能出现在根目录中)DIR_ATTR_SUBDIREQU10H;子目录DIR_ATTR_ARCHIVEEQU20H;归档属性DIR_ATTR_LONGNAMEEQU0FH;长文件名DIR_ATTR_LONGNAME_MASKEQU3FH;长文件名掩码;簇属性CLUSTER_MASKEQU0FFFFFFFH;簇号掩码(FAT32=>FAT28)CLUSTER_FREEEQU00000000H;簇是空闲的CLUSTER_RESERVEDEQU00000001H;簇是保留的CLUSTER_MIN_VALIDEQU00000002H;最小有效簇号CLUSTER_MAX_VALIDEQU0FFFFFF6H;最大有效簇号CLUSTER_BADEQU0FFFFFF7H;坏簇CLUSTER_LASTEQU0FFFFFF8H;0xFFFFFFF8-0xFFFFFFFF表示文件的最后一个簇;====================================================================;;启动扇区(512字节);;====================================================================_ENTRY_POINT:;3字节的跳转指令JMPSHORT_BOOT_CODE;跳转到真正的引导代码NOP;空指令以保证字节数为3;8字节的OEMNameOEMNameDB"FDOS1.00";====================================================================;;BPB(BIOSParameterBlock);;====================================================================BytesPerSectorDW?;每个扇区的字节数(512102420484096)SectorsPerClusterDB?;每个簇的扇区数(1248163264128);两者相乘不能超过32K(簇最大大小)ReservedSectorsDW?;从卷的第一个扇区开始的保留扇区数目;;该值不能为0,对于FAT12/FAT16,该值通常为1;;对于FAT32,典型值为32;NumberOfFATsDB?;卷上FAT数据结构的数目,该值通常应为2RootEntriesDW?;对于FAT12/FAT16,该值表示32字节目录项的数目;;对于FAT32,该值必须为0;NumberOfSectors16DW?;该卷上的扇区总数,该字段可以为0,如果该字段;为0,则NumberOfSectors32不能为0;对于FAT32,;该字段必须为0MediaDescriptorDB?;介质类型SectorsPerFAT16DW?;该字段标识一个FAT结构占有的扇区数(FAT12/FAT16),;对于FAT32卷,该字段必须为0;SectorsPerTrackDW?;用于INT0x13中断的每个磁道的扇区数HeadsPerCylinderDW?;用于INT0x13中断的每个柱面的磁头数HiddenSectorsDD?;包含该FAT卷的分区之前的隐藏扇区数NumberOfSectors32DD?;该字段包含该卷上的所有扇区数目,对于FAT32,该字段;不为0;FAT12/FAT16可根据实际大小是否超过65536个扇;区数决定是否采用该字段;;====================================================================;;EBPB(ExtendedBIOSParameterBlock);;====================================================================SectorsPerFAT32DD?;对于FAT32,该字段包含一个FAT的大小,而SectorsPerFAT16;字段必须为0;ExtFlagsDW?;标志FSVersionDW?;这是文件系统的版本,高字节为主版本,低字节为次版本;RootDirectoryStartDD?;根目录的起始簇号,通常为2;FSInfoSectorDW?;FSINFO结构在FAT32卷保留区域的扇区号BackupBootSectorDW?;如果该字段不为0,则表示在保留区域保存的启动记录的扇区号;通常为6,不推荐其他值;Reserved1TIMES12DB?;保留字段,格式化程序应将该字段清0DriveNumberDB?;用于INT0x13的驱动器号,0x00为软盘,0x80为硬盘NTReservedDB?;保留字节(用于WindowsNT,即NTFS),对于FAT文件;系统,应始终为0BootSignatureDB29H;扩展引导标志(值为0x29)VolumeIdDD?;卷的序列号VolumeLabeltimes11DB?;卷标号,该字段与根目录中的11字节卷标相同;NASM目前尚不支持DUP语法FileSystemTypeDB'FAT32';文件系统类型;====================================================================;;真正的启动代码从这开始(偏移:0x3E);其功能是搜索磁盘的根目录,查找FDOSLDR.BIN文件,将其读入内存并运行。;;====================================================================_BOOT_CODE:;初始化相关寄存器及标志位CLI;先关掉中断CLD;方向为向前递增XORAX,AX;AX=0MOVDS,AX;设置数据段寄存器DS:SIMOVES,AX;设置附加段寄存器ES:DIMOVSS,AX;设置堆栈段寄存器MOVBP,7C00H;设置基址寄存器MOVSP,STACK_ADDR;设置堆栈栈顶STI;允许中断;====================================================================;保存启动的磁盘编号;====================================================================MOV[DriveNumber],DL;该值由BIOS设置,如果是从USB启动,该值为0x80;即为第一个硬盘的编号,该值将用于后续的磁盘;读取调用;====================================================================;准备FAT32文件系统常用的常数,以便后面的操作;====================================================================;;[隐藏扇区][保留扇区][FAT][DATA];;====================================================================;====================================================================;检查是否支持磁盘中断INT13H的扩展;====================================================================MOVBYTE[BP-DISK_EXT_SUPPORT],00H;00H表示不支持磁盘扩展MOVDL,[DriveNumber]MOVAH,41HMOVBX,055AAHINT13HJC_NO_DISK_EXTENSION;如果失败,进位标志为1或者BX值不对(AA55or55AA);设置磁盘支持扩展中断标志MOVBYTE[BP-DISK_EXT_SUPPORT],01H;01H表示支持磁盘扩展;不支持磁盘扩展_NO_DISK_EXTENSION:;检查是否为FAT32分区;对于FAT32分区,其根目录项为0CMPWORD[RootEntries],0JNZNEAR_DISK_ERROR;检查保留扇区数(保留扇区必须大于等于4,我们将;第二个扇区的代码存在第四个扇区)CMPWORD[ReservedSectors],4JBNEAR_DISK_ERROR;检查每FAT扇区数;SectorsPerFAT16==0;SectorsPerFAT32!=0CMPWORD[SectorsPerFAT16],0JNZNEAR_DISK_ERRORCMPDWORD[SectorsPerFAT32],0JZNEAR_DISK_ERROR;计算每个扇区包含的目录项(512/32=16=10H)MOVAX,WORD[BytesPerSector]MOVCL,DIR_ENTRY_SIZEDIVCL;AH:AL=BytesPerSector/32(AH=Remainder=0)MOVBYTE[BP-DIR_PER_SECTOR],AL;AL=DirEntriesPerSector;FAT起始扇区;FAT起始扇区=Hidden+ReservedMOVAX,WORD[ReservedSectors]CWD;AX=>DX:AXADDAX,WORD[HiddenSectors]ADCDX,WORD[HiddenSectors+2]MOVWORD[BP-FAT_START_SECTOR],AXMOVWORD[BP-FAT_START_SECTOR+2],DX;FAT表所占的扇区数;FAT_SECTORS=NumberOfFAT*SectorsPerFATXOREAX,EAXMOVAL,BYTE[NumberOfFATs];FAT的数目MOVEBX,DWORD[SectorsPerFAT32]MULEBX;乘积放入EDX:EAXMOVDWORD[BP-FAT_ENTRY_SECTORS],EAX;计算数据区起始扇区ADDEAX,DWORD[BP-FAT_START_SECTOR]MOVDWORD[BP-DATA_START_SECTOR],EAX;====================================================================;;初始化DiskAddressPacket;使用时只需要修改字段:DATA_BUFFER_OFFDATA_BUFFER_SEG;DAP_SECTOR_LOWDAP_SECTOR_HIGH;;====================================================================MOVDWORD[BP-DAP_SECTOR_HIGH],00HMOVBYTE[BP-DAP_RESERVED1],00HMOVBYTE[BP-DAP_RESERVED2],00HMOVBYTE[BP-DAP_PACKET_SIZE],10HMOVBYTE[BP-DAP_READ_SECTORS],01HMOVWORD[BP-DAP_BUFFER_SEG],00HMOVBYTE[BP-DAP_READ_SECTORS],01H;每次只读取一个扇区;装载第二个启动扇区MOVWORD[BP-DAP_BUFFER_OFF],SECOND_ADDRMOVEAX,DWORD[HiddenSectors]ADDEAX,SECOND_SECTORMOVDWORD[BP-DAP_SECTOR_LOW],EAXCALLReadSector;下面开始查找根目录并且装载FDOSLDR.BINJMP_SEARCH_LOADER;====================================================================;错误处理;====================================================================_MISSING_LOADER:;显示没有装载程序MOVSI,MessageMissLoaderCALLShowMessageJMP_REBOOT_DISK_ERROR:;显示磁盘错误信息MOVSI,MessageDiskErrorCALLShowMessage_REBOOT:;重启MOVSI,MessageRestartCALLShowMessage;调用键盘中断,等待用户按键MOVAH,00HINT16H;重启计算机INT19H;死循环JMP$;====================================================================;;子过程;;====================================================================;====================================================================;;读取一个磁盘扇区;输入:已经设置了DAP中相应的字段;限制:不能读取超过一个簇的内容;;====================================================================ReadSector:PUSHA;保存寄存器;检查是否使用扩展方式CMPBYTE[BP-DISK_EXT_SUPPORT],00HJZ.NoDiskExtension;====================================================================;INT13HAH=42H扩展磁盘调用;====================================================================;每次读取一个扇区MOVAH,42H;功能号LEASI,[BP-DAP_PACKET_SIZE];地址包地址;驱动器号MOVDL,[DriveNumber];驱动器号INT13HJC_DISK_ERROR;读取失败JMP_READ_SECTOR_OK;读取成功;====================================================================;;INT13H;AH=2柱面号:0-1023;AL=要读取的扇区数磁头号:0-255;CH=柱面号低8位扇区号:1-63;CL=柱面号高2位:6位扇区号;DH=磁头号;DL=驱动器号;;LBA=((cylinder*HeadsPerCylinder+heads)*SectorsPerTrack)+sector-1;;Sector=LBA%SectorsPerTrack+1;Head=(LBA/SectorsPerTrack)%HeadsPerCylinder;Cylinder=(LBA/SectorsPerTrack)/HeadsPerCylinder;;====================================================================.NoDiskExtension:;====================================================================;首先需要将扇区号转换为CHS地址;====================================================================;首先计算扇区号MOVAX,WORD[BP-DAP_SECTOR_LOW]MOVDX,WORD[BP-DAP_SECTOR_LOW+2]DIVWORD[SectorsPerTrack];AX=LBA/SectorsPerTrackDX=LDA%SectorsPerTrackMOVCX,DXINCCX;CL=SectorANDCL,3FH;1-63;再计算磁头号和柱面号XORDX,DX;DX:AX=LBA/SectorsPerTrackDIVWORD[HeadsPerCylinder];DX=(LBA/SectorsPerTrack)%HeadsPerCylinder=Head;AX=(LBA/SectorsPerTrack)/HeadsPerCylinder=CylinderMOVCH,AL;柱面号低8位SHLAH,6ORCL,AH;CL=柱面号高2位:6位扇区号MOVDH,DL;DL=磁头号;准备读取磁盘MOVAX,WORD[BP-DAP_BUFFER_SEG]MOVES,AXMOVBX,WORD[BP-DAP_BUFFER_OFF]MOVAX,0201H;每次只读取一个扇区;驱动器号MOVDL,[DriveNumber];驱动器号INT13HJC_DISK_ERROR;读取失败_READ_SECTOR_OK:POPA;恢复寄存器RET;====================================================================;;显示一个字符串;输入:;DS:SI=字符串的起始地址(以NULL结束);;====================================================================ShowMessage:LODSB;AL=DS:[SI]SI=SI+1ORAL,AL;检测是否遇到NULL字符串JZ_SHOW_ENDMOVAH,0EHMOVBX,07HINT10HJMPShowMessage_SHOW_END:RET;====================================================================;数据区;====================================================================LoaderNamedb"FDOSLDRBIN";第二阶段启动程序FDOSLDR.BINMessageMissLoaderdb"NOFDOSLDR.BIN.",0DH,0AH,00H;没有找到装载程序MessageDiskErrordb"DiskError.",0DH,0AH,00;磁盘错误消息MessageRestartdb"Pressanykeytorestart.",0DH,0AH,00;提示重启消息;====================================================================;扇区最后的标记字节(NASM不支持重复ORG);====================================================================PaddingTIMES510-($-$$)db00HSectorSignaturedw0AA55H;====================================================================;第二个扇区的代码(该代码位于分区的第四个扇区);====================================================================;====================================================================;查找根目录,检查是否有FDOSLDR.BIN文件;====================================================================_SEARCH_LOADER:;设置缓冲区MOVWORD[BP-DAP_BUFFER_OFF],DATA_BUF_OFF;0000:1000H;根目录起始扇区号MOVEAX,DWORD[RootDirectoryStart]MOVDWORD[BP-CURRENT_CLUSTER],EAX;检查下一个簇_NEXT_ROOT_CLUSTER:;根据簇号计算扇区号DECEAXDECEAX;EAX=EAX-2XOREBX,EBXMOVBL,BYTE[SectorsPerCluster]MULEBXADDEAX,DWORD[BP-DATA_START_SECTOR]MOVDWORD[BP-DAP_SECTOR_LOW],EAXMOVDL,[SectorsPerCluster];检查下一个扇区_NEXT_ROOT_SECTOR:;依次读取每个根目录扇区,检查是否存在FDOSLDR.BIN文件CALLReadSector;检查该扇区内容MOVDI,DATA_BUF_OFFMOVBL,BYTE[BP-DIR_PER_SECTOR];检查每一个目录项_NEXT_ROOT_ENTRY:CMPBYTE[DI],DIR_NAME_FREEJZ_MISSING_LOADER;NOMOREDIRENTRY;检查是否装载程序PUSHDI;保存DIMOVSI,LoaderNameMOVCX,11REPECMPSBJCXZ_FOUND_LOADER;装载Loader并运行;是否还有下一个目录项(内层循环)POPDIADDDI,DIR_ENTRY_SIZEDECBLJNZ_NEXT_ROOT_ENTRY;检查是否还有下一个扇区可读(外层循环)DECDLJZ_CHECK_NEXT_ROOT_CLUSTERINCDWORD[BP-DAP_SECTOR_LOW];增加扇区号JMP_NEXT_ROOT_SECTOR;检查下一个簇_CHECK_NEXT_ROOT_CLUSTER:;计算FAT所在的簇号和偏移;FatOffset=ClusterNum*4XOREDX,EDXMOVEAX,DWORD[BP-CURRENT_CLUSTER]SHLEAX,2XORECX,ECXMOVCX,WORD[BytesPerSector]DIVECX;EAX=SectorEDX=OFFSETADDEAX,DWORD[BP-FAT_START_SECTOR]MOVDWORD[BP-DAP_SECTOR_LOW],EAX;读取扇区CALLReadSector;检查下一个簇MOVDI,DXADDDI,DATA_BUF_OFFMOVEAX,DWORD[DI];EAX=下一个要读的簇号ANDEAX,CLUSTER_MASKMOVDWORD[BP-CURRENT_CLUSTER],EAXCMPEAX,CLUSTER_LAST;CX>=0FFFFFF8H,则意味着没有更多的簇了JB_NEXT_ROOT_CLUSTERJMP_MISSING_LOADER;====================================================================;装载FDOSLDR.BIN文件;====================================================================_FOUND_LOADER:;目录结构地址放在DI中POPDIXOREAX,EAXMOVAX,[DI+OFF_START_CLUSTER_HIGH];起始簇号高32位SHLAX,16MOVAX,[DI+OFF_START_CLUSTER_LOW];起始簇号低32位MOVDWORD[BP-CURRENT_CLUSTER],EAXMOVCX,OSLOADER_SEG;CX=缓冲区段地址_NEXT_DATA_CLUSTER:;根据簇号计算扇区号DECEAXDECEAX;EAX=EAX-2XOREBX,EBXMOVBL,BYTE[SectorsPerCluster]MULEBXADDEAX,DWORD[BP-DATA_START_SECTOR]MOVDWORD[BP-DAP_SECTOR_LOW],EAXMOVDL,[SectorsPerCluster];设置缓冲区MOVWORD[BP-DAP_BUFFER_SEG],CXMOVWORD[BP-DAP_BUFFER_OFF],00H;每个簇需要读取的扇区数MOVBL,BYTE[SectorsPerCluster]_NEXT_DATA_SECTOR:;读取簇中的每个扇区(内层循环);注意:通过检查文件大小,可以避免读取最后一个不满簇的所有大小;读取数据扇区CALLReadSector;更新地址,继续读取MOVAX,WORD[BytesPerSector]ADDWORD[BP-DAP_BUFFER_OFF],AXINCDWORD[BP-DAP_SECTOR_LOW];递增扇区号DECBL;内层循环计数JNZ_NEXT_DATA_SECTOR;检查下一个簇;更新读取下一个簇的缓冲区地址MOVCL,BYTE[SectorsPerCluster]MOVAX,WORD[BytesPerSector]SHRAX,4MULCLADDAX,WORD[BP-DAP_BUFFER_SEG]M

温馨提示

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

最新文档

评论

0/150

提交评论