资源描述
课程设计
设计名称: 微型计算机技术及应用——简易计算器
学 院: 信息工程学院
课 程: 微型计算机技术及应用
姓 名:
学 号:
班 级: 2014级 计算机科学与技术二班
目录
摘要 3
一、 前言 4
1.1背景 4
1.2项目介绍 4
二、 课程设计的目的与任务 5
2.1设计目的 5
2.2设计任务 5
三、 设计过程 5
3.1基础理论 5
3.1.1DOSBox简介 5
3.1.2中断 8
四、 设计 11
4.1总体方案 11
4.2原理框图 12
4.3程序代码 13
五、 系统模块详细设计与调试 24
5.1系统模块详细设计 24
5.1.1设置屏幕显示方式 24
5.1.2显示主菜单 24
5.1.3从键盘接收一个数字 24
5.1.4接收键入用于计算的数 25
5.1.5显示结果 25
5.1.6子程序A2——将数的ASCII码转为二进制数 25
5.1.7将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段) 27
5.2程序编译、运行与调试 27
六、 设计总结 29
七、 参考文献 31
摘要
本次课程设计是通过使用DOSBox汇编语言编程软件实现的利用汇编语言编写的较为复杂的程序设计。该课程设计主要是设计一个较为简单的计算器,界面显示要求用户从键盘上分别输入两个随机数,完成四则运算,然后将运算结果显示到屏幕上。该设计智能实现简单的正整数之间的四则运算,无法对小数进行精确地识别。而除法运算可以精确到3位小数,减法可以显示出负数的结果。采用DOS调用(INT 21H)来完成键盘的输入和屏幕的输出。
通过这次的课程设计能够进一步加深对专业知识和理论知识学习的认识和理解。
关键词:DOSBox;微机原理;计算器;汇编语言
一、 前言
1.1背景
计算器是现代人发明的可以进行数字运算的电子机器。现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构比电脑简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱。随着微机和手机的普及,计算器逐渐退出了人们的视野,只能被局限于在课堂之上的计算工具。虽然计算器的使用范围逐渐缩小,但计算器依旧在不断发展。即使科技的发展带动着小型计算器成为一个移动的计算实验室。但它的核心却依然没有逃脱最简单的四则运算:加、减、乘和除。
1.2项目介绍
本次课程设计就是根据微机原理与接口的相关知识,利用BIOS和DOS的中断来设计一个简易计算器,能够实现加减乘除四则运算,并在屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除四种计算功能和结束程序的功能。同时利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
二、 课程设计的目的与任务
2.1设计目的
为了使学生加深对所学的微机原理知识的理解,培养学生的专业素质,提高其利用微机原理知识处理问题的能力,为今后专业课程的学习、毕业设计和工作打下良好的基础。使学生能比较扎实地掌握微机原理的基础知识和基本理论,掌握控制系统及有关设备的分析、开发等基本技能,受到必要工程训练、初步的科学研究方法训练和实践锻练,增强分析问题和解决问题的能力,了解微机原理和接口技术的新发展。
2.2设计任务
本课程设计是制作出一个简易的计算器,并可以在DOCBOX上运行,并且正确地完成加、减、乘、除等四则运算。
三、 设计过程
3.1基础理论
3.1.1DOSBox简介
由于微软公司对windos7的64位操作系统取缔了为汇编程序开放的Edit、Masm、Link以及Debug等的功能。所以我选择了一款比较简单但同样适用的Dos环境仿真器——DOSBox。
DOSBox是一种创造类DOS环境的开源x86仿真器,通常用于运行近代计算机或者非IBMPC兼容机的MS-DOSIBMPC兼容程序。不仅如此,它还是一个完整的中央处理器仿真器,并不是一个兼容层如dosemu或者依赖386类处理器虚拟化能力的Windows与OS/2VDM。不需要x86中央处理器或者任何DOS版本以运行,并且能运行真实模式与保护模式的程序。
虽然DOSBox是Dos的仿真器,但它只是具有搭载环境的能力,却并没有自带汇编程序的运行环境,。我们需要下载相对应的运行环境masm或tasm。当在下载完成后,我们需要对DOSBox进行相对应的设置。
当配置好环境后,现在我们就可以使用它进行Edit,Masm,Link,Debug了
EDIT:
Masm和Link:
完成masm和link两步以后,我们就得到了可以运行的程序exe文件了:
Debug:
通过这几个步骤,我们就可以得到我们需要的可以正确执行地exe文件了。
3.1.2中断
3.1.2.1 何谓中断
所谓中断,是指CPU在执行当前程序时,由于外部事件和内部事件,使得CPU中断正在执行的程序,转到为外部与内部事件服务的程序中去执行。当服务程序执行完毕,再返回带刚才被中断的程序的断点处,继续执行。
8086有一个强有力的中断系统,可以处理256种不同的中断,每个中断对应一个类型号,所以,256种中断对应的中断类型号为0~255.
这256种中断可以分成两大类:一类叫硬件中断;一类叫软件中断。硬件中断是通过外部的硬件产生的,所以,也常常把硬件中断。硬件中断又分为两类:一类叫非屏蔽中断;另一类叫可屏蔽中断。非屏蔽中断是通过CPU的NMI引脚进入,它不受中断允许标志IF的屏蔽,并且整个系统中只有一个非屏蔽中断。可屏蔽中断是通过CPU的INTR引脚进入的,并且只有当中断允许标志IF为1时,可屏蔽中断才能进入,如果中断允许标志IF为0,则可屏蔽中断受到禁止。软件中断是CPU根据某条指令或者软件对标志寄存器的设置而产生的,从软件中断的产生过程来说,完全和硬件电路无关。典型的软件中断是除数为0引起的中断和中断指令引起的中断。
3.1.2.2中断向量和中断向量表
8086的中断系统以位于内存0段的0~3FFH区域的中断向量表为基础,中断向量表中最多可容纳256个中断向量。所谓中断向量,实际上就是中断处理子程序的入口地址,每个中断类型对应一个中断向量。
中断向量并不是任意存放的。一个中断向量占4个存储单元,其中,前两个单元存放中断处理子程序入口地址的偏移量(IP),低位在前,高位在后,后两个单元存放中断处理子程序入口地址的段地址(CS),同样也是低位在前,高位在后。
256个中断的前5个是专用中断。类型0的中断称作除数为0中断;类型1的中断称为单步中断;非屏蔽中断对应类型2;类型3的中断为断点中断;而类型4的中断为溢出中断。除了非屏蔽中断外,其他几个中断都是软件中断。
3.1.2.3中断方式
为了提高CPU的效率和使系统有实时性能,可采用中断传送方式。在中断方式下,外设具有申请CPU服务的主动权,当输入设备将数据准备好或输出设备可接收数据时,便可向CPU发中断请求,使CPU暂时停下来目前的工作而和外设进行一次数据传输。等输入操作或输出操作完成后,CPU继续进行原来的工作。(如左图:)
四、 设计
4.1总体方案
利用BIOS中断的10号功能调用来设置显示方式。
利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。
设置屏幕显示方式。
MOV AH,00H
MOV AL,NUM
INT 10H
接着从键盘上接受键值,并判别后转到相应的子模块进行运算,并显示结果。
MOV AH,01H
INT 21H ;AL=键入字符的ASCII码
从键盘上接收一串字符串命令:
MOV AH,0AH
MOV DX,OFFSET BUF ;BUF为数据段中定义的数据缓冲区
INT 21H
显示单个字符命令:
MOV AH,02H
INT 21H
显示一串字符串的命令:
MOV AH,09H
MOV DX,OFFSET BUF ;BUF为被显示字符串的首地址
INT 21H
十进制数显示过程:将十进制数送到BX中,BX除以1000,余数送BX中,商在AL中,范围为0~9,显示AL中的内容。BX除以100,余数送BX中,商在AL中,显示AL中的内容,依次类推,直到分出个位数字。
如最高位为0,则不应显示,而非最高位的0则显示。可利用设标志位并结合商的方法来决定是否显示0。
4.2原理框图
主程序
提示输入第一个数
提示输入第二个数
计 算
判断结果正负,并储存结果
将结果转为ASCII码,并显示结果
提示返回DOS还是重新计算
将第一个数的ASCII码转为二进制并保存
将第二个数的ASCII码转为二进制并保存
结 束
子程序
4.3程序代码
DATA SEGMENT
N=15
TOP DB 5 DUP(0AH)
DB N DUP(' '),' Please input a number to choose the arithmetic operation', 0DH,0AH
DB N DUP(' '),' ', 0DH,0AH
DB N DUP(' '),'1—add', 0DH,0AH
DB N DUP(' '),'2—subtract', 0DH,0AH
DB N DUP(' '),'3—multiply ', 0DH,0AH
DB N DUP(' '),'4—divide', 0DH,0AH
DB N DUP(' '),'5—return to DOS ', 0DH,0AH
DB N DUP(' '),' ', 0DH,0AH
DB N DUP(' '),'CHOICE (1.2.3.4.5):$'
MESG1 DB 0DH,0AH,'PLEASE PRESS NUMBER 1.2.3.4.5 !$'
MESG2 DB 0DH,0AH,'PLEASE INPUT THE FIRST NUMBER :$'
MESG3 DB 0DH,0AH,'PLEASE INPUT THE SECOND NUMBER :$'
MESG4 DB 0DH,0AH,'PLAY ADD :$'
MESG5 DB 0DH,0AH,'PLAY SUBTRACT :$'
MESG6 DB 0DH,0AH,'PLAY MULTIPLY :$'
MESG7 DB 0DH,0AH,'PLAY DIVIDE :$'
MESG8 DB 0DH,0AH,'THE RESULT :$'
MESG9 DB 0DH,0AH,'PRESS Q RETURN DOS,ANY PRESS RETURN START!$'
BUF1 DB 6 ;十进制数的缓冲区,可接收6个字符
DB ? ;保留,用于10号调用时DOS填入实际输入字符数
DB 6 DUP(?) ;一个符号位,四位数字ASCII码,加上一个回车符
BUF2 DW ? ;将第一个数转换为二进制后,放于这里
BUF3 DB 6 DUP(?),'$' ;将结果转换为ASCII码后,放在这
DATA ENDS
STACK SEGMENT STACK'STACK'
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,00H ;设置屏幕显示方式
MOV AL,0
INT 10H
MOV AH,09H ; 显示菜单
MOV DX,OFFSET TOP
INT 21H
AA: MOV AH,01H ;从键盘接收一个数字
INT 21H
CMP AL,'1' ; 与1比较
JNE NEXT1 ; 不等于1就转到NEXT1
JMP JIA ;等于1就转到加法程序
NEXT1: CMP AL,'2' ; 与2比较
JNE NEXT2 ; 不等于2就转到NEXT2
JMP JIAN ; 等于2就转到减法程序
NEXT2: CMP AL,'3' ; 与3比较
JNE NEXT3 ; 不等于3就转到NEXT3
JMP CHENG ; 等于3就转到乘法程序
NEXT3: CMP AL,'4' ; 与4比较
JNE NEXT4 ; 不等于4就转到NEXT4
JMP CHU ; 等于4就转到除法程序
NEXT4: CMP AL,'5' ; 与5比较
JNE NEXT5 ; 不等于5就转到NEXT5
MOV AH,4CH ; 返回DOS
INT 21H
NEXT5: MOV AH,09H ; 显示MESG1
MOV DX,OFFSET MESG1
INT 21H
JMP AA ; 跳到AA
A1 PROC NEAR
MOV AH,09H ; 提示输入第一个数
MOV DX,OFFSET MESG2
INT 21H
MOV AH,0AH ; 接收第一个数
MOV DX,OFFSET BUF1
INT 21H
CALL A2 ; 调用A2进行ASCII-二进制的转换
MOV BUF2,AX ; 把第一个数转换的二进制放在BUF2
MOV AH,09H ; 提示输入第二个数
MOV DX,OFFSET MESG3
INT 21H
MOV AH,0AH ; 接收第二个数
MOV DX,OFFSET BUF1
INT 21H
CALL A2 ; 调用A2把第二个数进行ASCII-二进制转换
RET
A1 ENDP
A2 PROC NEAR
MOV CL,BUF1+1 ; 把BUF1+1中的实际键入的字符数放入CL
MOV CH,0 ; CH清零
MOV BX,OFFSET BUF1+2 ; 把第一个数字的地址放在BX
PUSH BX ; 保护BX
PUSH CX ; 保护CX
L1: MOV AL,[BX]
AND AL,0FH ; 把ASCII码转换为十进制
MOV [BX],AL ; 存放十进制
INC BX ; 下一个数字的地址
LOOP L1
POP CX ; 恢复CX
POP BX ; 恢复BX
MOV AX,0 ; 将累加和赋零
MOV SI,10
L2: MUL SI
ADD AL,[BX]
ADC AH,0
INC BX
LOOP L2 ; 累加乘10
L3: RET
A2 ENDP
JIA: MOV AH,09H ; 加法程序
MOV DX,OFFSET MESG4
INT 21H
CALL A1 ; 调用A1
ADD AX,BUF2 ; 把转换后的放在BUF2中的第一个数和放在AX的第二个数相加
JMP A3
JIAN: MOV AH,09H ; 减法程序
MOV DX,OFFSET MESG5
INT 21H
CALL A1
MOV BX,AX ; 把转换后的放在AX的第二个数放到BX
MOV AX,BUF2 ; 把转换后放在BUF2中的第一个数放到AX
SBB AX,BX ; 两数相减
JMP A3
CHENG: MOV AH,09H ; 乘法程序
MOV DX,OFFSET MESG6
INT 21H
CALL A1
MOV BX,AX ; 把转换后的放在AX的第二个数放到BX
MOV AX,BUF2 ; 把转换后的放在BUF2中第一个数放到AX
MUL BX ; 两数相乘
JMP A3
CHU: MOV AH,09H ; 除法程序
MOV DX,OFFSET MESG7
INT 21H
CALL A1
MOV DX,AX ; 把转换后的放在AX的第二个数放到DX
MOV AX,BUF2 ; 把转换后的放在BUF2中第一个数放到AX
DIV DL ; 两数相除,商在AL里
MOV AH,0H ; 使AH清零
JMP A3
A3: MOV BUF3,'+' ; 把BUF3放'+'
CMP AX,0 ; 把结果于0比较
JGE L4 ; AX>0转到 L4
NEG AX ; AX<0将AX取反
MOV BUF3,'-' ; 把BUF3放'-'
L4: CWD
MOV BX,10000
DIV BX ; 商为第一位数字放在AL,余数放在DX
CALL BB
MOV BUF3+1,AL ; 把第一个数放在BUF3+1单元中
MOV AX,DX ; 把放在DX中的余数放到AX
CWD
MOV BX,1000
DIV BX ; 商为第二位数字放在AL,余数放在DX
CALL BB
MOV BUF3+2,AL ; 把第二个数放在BUF3+2单元中
MOV AX,DX ; 把放在DX中的余数放到AX
MOV BL,100
DIV BL ; 商为第三位数字放在AL,余数放在AH
CALL BB
MOV BUF3+3,AL ; 把第三个数放在BUF3+3单元中
MOV AL,AH ; 把放在AH 中的余数放到AL
CBW
MOV BL,10
DIV BL ; 商为第四位数字放在AL,余数放在A
CALL BB
MOV BUF3+4,AL ; 把第四个数放在BUF3+4单元中
ADD AH,30H ; 把个位转为ASSCII码
MOV BUF3+5,AH ; 把第五个数放在BUF3+5单元中
MOV AH,09H ; 提示结果
MOV DX,OFFSET MESG8
INT 21H
MOV AH,09H
MOV DX,OFFSET BUF3 ; 把放在BUF3缓冲区中的结果显示出来
INT 21H
MOV AH,09H ; 提示是返回DOS还是重新计算
MOV DX,OFFSET MESG9
INT 21H
MOV AH,01H ; 接收键盘数字
INT 21H
CMP AL,'Q'
JE A4
JMP NEXT5 ; 其他数字重新计算
BB PROC NEAR
CMP AL,0H ; 与零比较
JE L5
JMP L6
L5: MOV AL,20H ; 等于零,赋AL空格
JMP L7
L6: ADD AL,30H ; 不等于零,把数转为ASSCII码
L7: RET
BB ENDP
A4: MOV AH,4CH ; AL等于'Q'就返回DOS
INT 21H
CODE ENDS
END START
五、 系统模块详细设计与调试
5.1系统模块详细设计
5.1.1设置屏幕显示方式
MOV AH,00H
MOV AL,0
INT 10H
通过调用BOIS的OOH号功能来设置屏幕显示方式。此处AL=0,即设置屏幕显示方式为40*25黑白文本。
5.1.2显示主菜单
MOV AH,09H
MOV DX,OFFSET TOP
INT 21H
先在数据段中定义主菜单中要显示的字符串,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
5.1.3从键盘接收一个数字
MOV AH,01H
INT 21H
通过调用DOS系统的01H号功能——键入字符并回车来实现,其出口参数为键入字符的ASCII码,存在AL中。
5.1.4接收键入用于计算的数
MOV AH,0AH
MOV DX,OFFSET BUF1
通过调用DOS系统的0AH号功能——键入字符串至内存缓冲区来实现,其入口参数如下:DS:DX=存放键入字符串的缓冲区的首地址;(DS:DX)=用户规定的缓冲区;(DS:DX+1)=实际键入的字符数;从(DS:DX+2)开始放键入的字符串。因此,在下面的程序中运用所键入的数字时要注意字符串的首地址。
5.1.5显示结果
MOV AH,09H
MOV DX,OFFSET BUF3
INT 21H
将结果存入数据段中定义的缓冲区BUF3中,再通过调用DOS系统的09H号功能——显示字符串(串尾字符为$,但不显示)来完成。
5.1.6子程序A2——将数的ASCII码转为二进制数
A2 PROC NEAR
MOV CL,BUF1+1 ; 把BUF1+1中的实际键入的字符数放入CL
MOV CH,0 ; CH清零
MOV BX,OFFSET BUF1+2 ; 把第一个数字的地址放在BX
PUSH BX ; 保护BX
PUSH CX ; 保护CX
L1: MOV AL,[BX]
AND AL,0FH ; 把ASCII码转换为十进制
MOV [BX],AL ; 存放十进制
INC BX ; 下一个数字的地址
LOOP L1
POP CX ; 恢复CX
POP BX ; 恢复BX
MOV AX,0 ; 将累加和赋零
MOV SI,10
L2: MUL SI
ADD AL,[BX]
ADC AH,0
INC BX
LOOP L2 ; 累加乘10
L3: RET
A2 ENDP
入口:十进制数的ASCII在BUF1内;出口:转换后的二进制数在AX内。
算法:先将其转换为十进制,再用累加和乘10加X的方法变为二进制,如将163转换为二进制数,可先将累加和赋0,再计算(((0*10+1)*10+6)*10+3)结果为二进制数。
5.1.7将计算结果的二进制数转换为对应的十进制数ASCII码并输出显示(A3程序段)
入口:二进制数在AX内;出口:转换后的ASCII码在BUF内。
算法:AX内的数范围在+32767到-32768之间,先检查AX符号位,决定输出‘+’还是‘-’,若为负,先求补码得到原码后可与正数统一处理。方法:把将被转换的二进制数先除以10000,商为万位数,再将余数除以1000,商为千位数,以此类推,求出百十位数,剩下的为个位数。最后各个数加上30H,即为对应字符。
5.2程序编译、运行与调试
在DOS环境下,键入EDIT。启动全屏幕编辑软件EDIT,输入源程序。输入完毕,按Alt+F选择SAVE保存程序(规定扩展名为*.ASM),按Alt+X退出EDIT状态。
退出EDIT环境后,输入ASM或MASM 文件名↙(省略扩展名,系统默认为.ASM),对源程序进行汇编。源程序经汇编后产生三个输出文件:第一个是OBJ文件,即二进制目标文件,这是汇编的主要目的;第二个是LST文件,即列表文件;第三个是CRF文件,对于一般的程序可以不建立后两个文件。
汇编时,计算机会询问汇编后生成的OBJ文件名、LST文件名和CRF文件名,问句的右侧是示范回答,如果不想生成LST文件和CRF文件,则按回车键回答。汇编过程中,如果源程序中有语法错误,则汇编过程结束后,汇编程序会指出源程序中的错误,这时,可以再用编辑程序来修改源程序中的错误,最后,得到没有语法错误的OBJ文件。
汇编程序产生的二进制目标文件不是可执行文件,还必须用连接程序(LINK)把OBJ文件转换成可执行的EXE文件。LINK程序有两个输入文件OBJ和LIB,两个输出文件EXE和MAP。连接时,输入LINK 文件名↙,对汇编生成的*.OBJ文件进行连接,计算时会询问生成的EXE文件名、MAP文件名以及参与连接的库文件名,如果不想生成MAP文件,没有库文件参与连接,则按回车键作答。最后,生成相应的*.EXE文件。从LINK过程的提示信息中,可看到最后给出了一个“无堆栈段”的警告性错误,这并不影响程序的执行。至此,产生了一个EXE文件,在DOS环境下可以直接运行该文件。
在程序得到正确的结果之前,会产生一些错误,只有经过调试阶段才能纠正程序中的错误,从而的到正确的结果。在程序编译过程中会提示语法错误,可再用编辑程序来修改源程序中的错误。当没有语法错误而得不到正确结果时,可用调试程序DEBUG来调试。它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
六、 设计总结
本次为期一周的微机原理与接口课程设计已经结束了,在这并不算长的时间里我却获益良多。
第一,我对本学期所学的理论知识有了更加深刻的理解。首先是对汇编语言的编程思想、程序设计流程有了更加深刻的认识。另外,我的课程设计中运用了许多BIOS中断和DOS中断的功能,例如利用BIOS中断的10号功能调用来设置显示方式,利用DOS中断的01号、02号子功能来完成键盘接受、结果显示。从而加深了我对BIOS和DOS中断的理解。以前在课堂上一些一知半解的东西,经过这次的实际应用也顿时觉得豁然开朗。
第二,提高了我理论联系实际的能力。在本科生的学习中,大部分是对理论知识的学习,很少有真正实际应用与实践的机会。每个学期末的课程设计无疑是十分难得的,我们应好好利用并倍加珍惜。在上理论课时,对各种程序设计思想都只是有一种肤浅的认识,并没有特别深刻的了解。即使是实验课也只是停留在比较浅显的阶段,并不能对所学知识进行深入的研究。但这次的课程设计却让我对学习的理论知识有了更加深刻的认识,并将其运用到实际的软件设计中,在学会运用的过程中再一次对理论进行了升华。为以后的工作打下了良好的基础。
第三,使我认识到了团结协作的重要性。完成本次课程设计也不是一件轻松的事情,设计的过程中也总会出现这样那样的问题。有些问题凭自己绞尽脑汁的空想是很难解决的,这个时候我们就需要其他同学或老师的帮助。在遇到疑难时,有时看着很困难的问题,在通过与同学们的讨论分析之后就迎刃而解了。由此可见,同学间的互帮互助是非常重要的。同时,在有些问题实在无法解决之时,老师的指点总是关键性的。
课程设计的开设不仅巩固了我们对理论知识的掌握,激发了我们对学习的兴趣,同时也锻炼了我们实际动手与应用的能力,使我们对专业领域的知识有了初步的了解,并且提高了我们应用理论知识解决生活中实际存在的问题的能力,这对我们今后走向社会做了良好的开端与铺垫。
七、 参考文献
[1] 戴梅萼 史嘉权.微型计算机技术及应用(第4版).北京:清华大学出版社,2008.3
[2]凌志浩 张建正.微机原理与接口技术.上海:华东理工大学出版社,2013
[3]王爽.汇编语言(第2版).北京:清华大学出版社,2008.4
[4]微型计算机原理及应用课程设计.广东:广东海洋大学,2011.12
[5]邓学坚 周斌.微型计算机原理及应用
目 录
第一章 总论 1
一、项目概况 1
二、项目提出的理由与过程 6
三、项目建设的必要性 8
四、项目的可行性 12
第二章 市场预测 15
一、市场分析 15
二、市场预测 16
三、产品市场竞争力分析 19
第三章 建设规模与产品方案 22
一、建设规模 22
二、产品方案 22
三、质量标准 22
第四章 项目建设地点 25
一、项目建设地点选择 25
二、项目建设地条件 25
第五章 技术方案、设备方案和工程方案 28
一、技术方案 28
二、产品特
展开阅读全文