那些年,我们一起学过的汇编----之子程序设计

  在我的上一篇博文中,我简单的向大家介绍了汇编语言程序设计的三种基本方式。在一个程序中的不同地方,常常需要多次非循环的使用完成特定功能的程序段,这些程序段除了某些变量的赋值不同外,具有相同的指令序列,这时,我们为了减少重复编写程序,缩短目标代码,节省内存空间,把视线这一功能的指令序列组成一个相对独立的程序段。这也就是我们这片文章中所要讨论的子程序。

子程序相当于高级语言(比如C语言)中的过程和函数,在汇编语言中子程序也称为过程。使用子程序的好处:
a、有利于程序模块化、结构化和自顶向下的程序设计方法,简化了程序设计过程。
b、增加了源程序的可读性,便于调试维护
c、减少了目标代码锁占用的空间
d、子程序一旦编制成功,在开发研制各种软件时都可使用,缩短了软件的开发周期。
 
一、子程序的调用与返回
1、子程序的定义
子程序必须定义在一个逻辑段内,子程序的定义由过程定义伪指令PROC/ENDP来实现,它们分别用在程序的子程序的前后,一般格式如下:
 
       
       
  1. PROC_NAME   PROC    [NEAR/FAR] 
  2. ...... 
  3. PROC_NAME   ENDP 
其中PROC_NAME为子程序名,也极为CALL的操作数,自程序具有3个属性:段属性、偏移量属性和类型属性,段属性表示该子程序所在段的段基值。偏移量属性表示该子程序在段中的偏移量。类型属性也称为距离属性,可以是NEAR或FAR,属性为NEAR的子程序只能在本段内调用,属性为FAR的子程序则可以在本段以内以及其他段中调用。
2、调用指令
当主程序属性是NEAR的子程序时,CPU把当前指令指针IP的内容压入堆栈,作为返回地址保存起来,然后将子程序的偏移量送入IP,当从子程序返回时,将从堆栈弹出2个字节的返回地址送入IP,当调用属性是FAR的过程时,CPU把当前的段寄存器CS与指令指针IP的内容都压入堆栈,作为返回地址保存起来,然后将子程序的段基值与偏移量送入CS与IP,当子程序返回时,将从堆栈弹出4个字节的返回地址分别送入IP与CS。
我们容易知道,当主程序和子程序处于同一逻辑段时,可以把类型属性定义为NEAR,也可以把类型属性定义为FAR,然后进行调用。而当主程序与子程序不在同一逻辑段是,只可把过程的类型定义为FAR,然后调用。
 
二、返回指令
返回指令RET是子程序逻辑上的最后一条指令,也就是最后一条被执行的指令,它使子程序在完成功能后返回到调用它的CALL指令的后续指令处,即返回地址处继续执行。
 
三、子程序设计的基本要求
1、子程序必须有一定的通用性
2、注意寄存器的保存和恢复
3、正确使用堆栈
4、选用适当的方法在主程序与子程序间进行参数传递
5、编制子程序说明信息文件
 
四、子程序与主程序间的参数传递
在汇编语言中最常用的参数传递方式有3种,分别是:用寄存器传递参数、用堆栈传递参数和用地址表达式传递参数。
 
1、用寄存器传递参数
这种方式是通过通用寄存器来传递的参数,即在主程序调用子程序前,将入口参数送到约定的通用寄存器中,子程序可以直接从这些寄存器中取出参数进行加工处理,并将结果放在约定的通用寄存器中,返回主程序,主程序再从约定的寄存器中取出结果,我们一例子来说明问题:
例:将两个给定的二进制数(8位和16位)转换为ASCII码字符串。
分析:主程序提供呗转换的数据和转化后的ASCII码字符串的存储区的首地址。子程序完成二进制的转换。为了提高子程序的代码转换通用性,它可以完成8位或16位数的转换。设调用子程序时,入口参数为:被转换的数在DX中,若位数小于16,则从高到低存放,转换后的ASCII码的存放首地址在DI中。下面给出一种实现方法:
 
       
       
  1. DATA    SEGMENT 
  2.     BIN1    DB  35H 
  3.     BIN2    DW  0AB48H 
  4.     ASCBUF  DB  20H DUP  (?) 
  5. DATA    ENDS 
  6. STACK1  SEGMENT PARA    STACK 
  7.     DW  20H DUP  (0) 
  8. STACK1  ENDS 
  9. CODE    SEGMENT 
  10. ASSUME  CS:CODE, DS:DATA, SS:STACK1 
  11. BEGIN:  MOV AX, DATA 
  12.     MOV DS, AX 
  13.     XOR DX, DX 
  14.     LEA DI, ASCBUF      ;存放ASCII码的单元首地址送DI 
  15.     MOV DH, BIN1            ;待转换的第一个数据送DH 
  16.     MOV AX, 8           ;待转换的二进制数的位数送AX 
  17.     CALL    BINASC   
  18.     MOV DX, BIN2 
  19.     MOV AX, 16 
  20.     LEA DI, ASCBUF 
  21.     ADD DI, 8           ;设置下一个数的存放首地址 
  22.     CALL    BINASC 
  23.     MOV AH, 4CH 
  24.     INT     21H 
  25. BINASC  PROC 
  26.     MOV CX, AX 
  27. LOP:    ROL DX, 1           ;最高位移入最低位 
  28.     MOV AL, DL 
  29.     AND AL, 1           ;保留最低位,屏蔽其他位 
  30.     ADD AL, 30H 
  31.     MOV [DI], AL            ;存结果 
  32.     INC DI          ;修改地址指针 
  33.     LOOP    LOP 
  34.     RET 
  35. BINASC  ENDP 
  36. CODE    ENDS 
  37.     END BEGIN 
2、用堆栈传递参数
这种方法是主程序先将入口参数压入堆栈,子程序从堆栈中把参数读出,进行加工处理。这里要注意从堆栈中读取数据与从堆栈中弹出数据是有区别的,从堆栈中读取数据并不改变堆栈的栈顶指针SP,而从堆栈中弹出的数据,则需修改SP,在使用堆栈传递参数时,要保证堆栈状态的正确。
我们还以上面的例子来说明下问题,这次采用堆栈传递参数
分析:如果使用堆栈,一般用包括:
a、在主程序中,将待转换的数据、存放ASCII码的首地址和转换的位数压入栈中
b、在子程序中保存信息
下面我们依然用程序说明问题,在程序的必要处我已经做了注释
 
       
       
  1. DATA    SEGMENT 
  2.     BIN1    DB  35H 
  3.     BIN2    DW  0AB48H 
  4.     ASCBUF  DB  20H DUP  (?) 
  5. DATA    ENDS 
  6. STACK1  SEGMENT PARA    STACK 
  7.     DW  20H DUP  (0) 
  8. STACK1  ENDS 
  9. CODE    SEGMENT 
  10. ASSUME  CS:CODE, DS:DATA, SS:STACK1 
  11. BEGIN:  MOV AX, DATA 
  12.     MOV DS, AX 
  13.     MOV AH, BIN1 
  14.     PUSH    AX              ;待转换数据压栈 
  15.     MOV AX, 8 
  16.     PUSH    AX              ;待转换位数压栈 
  17.     LEA DI, ASCBUF 
  18.     PUSH    DI          ;存放ASCII码的首地址压栈 
  19.     CALL    BINASC              ;调用转换子程序 
  20.     MOV AX, BIN2 
  21.     PUSH    AX 
  22.     MOV AX, 10H 
  23.     PUSH    AX 
  24.     ADD DI, 8 
  25.     PUSH    DI 
  26.     CALL    BINASC 
  27.     MOV AH, 4CH 
  28.     INT     21H 
  29. BINASC  PROC 
  30.     PUSH    AX 
  31.     PUSH    CX 
  32.     PUSH    DX 
  33.     PUSH    DI   
  34.     MOV BP, SP 
  35.     MOV DI, [BP+10]         ;从堆栈取出入口参数 
  36.     MOV CX, [BP+12] 
  37.     MOV DX, [BP+14]  
  38. LOP:    ROL DX, 1 
  39.     MOV AL, DL 
  40.     AND AL, 1 
  41.     ADD AL, 30H 
  42.     MOV [DI], AL 
  43.     INC DI 
  44.     LOOP    LOP 
  45.     POP DI 
  46.     POP DX 
  47.     POP CX   
  48.     POP AX 
  49.     RET 6           ;返回并从堆栈中弹出6个字节 
  50. BINASC  ENDP 
  51. CODE    ENDS 
  52.     END BEGIN 
3、用地址表传递参数
当要传送的参数较多时,可在主程序中建立一个地址表,在调用子程序前,把所有参数的地址依次存放在该地址表中,然后把地址表的首地址通过寄存器传送到子程序中去,而在子程序中,按照地址表中给出的地址逐个取出参数,用地址表传递参数的方法,在入口参数比较多时很方便,当返回参数较多时,可用同样的方法传递参数,供主程序使用。
 
 
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能综述-(Artificial-Intelligence)全文共15页,当前为第1页。人工智能综述-(Artificial-Intelligence)全文共15页,当前为第1页。 人工智能综述-(Artificial-Intelligence)全文共15页,当前为第1页。 人工智能综述-(Artificial-Intelligence)全文共15页,当前为第1页。 人工智能 "人工智能"(Artificial Intelligence)简称AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学,是计算机科学的一个分支。是计算机科学技术的前沿科技领域。 人工智能虽然是计算机科学的一个分支,但它的研究却不仅涉及到计算机科学,而且还涉及到脑科学、神经生理学、心理学、语言学、逻辑学、认知(思维)科学、行为科学和学以及信息论、控制论和系统论等许多学科领域。因此,人 工智能实际上是一门综合性的交叉学科和边缘学科。 在世界各地对人工智能的研究很早就开始了。但对人工智能的真正实现要从计算机的诞生开始算起,这时人类才有可能以机器实现人类的智能。AI这个英文单词最早是在1956的一次会议上提出的,在此以后.因为一些科学家的努力使它得以发展。但人工智能的进展并不像我们期待的那样迅速,因为人工智能的基本理论还不完整.我们还不能从本质上解释我们的大脑为什么能够思考,这种思考来自于什么,这种思考为什么得以产生等一系列问题。但经过这几十的发展,人工智能正在以它巨大的力量影响着人们的生活[1]。 一、人工智能涉及的技术或方法的基本功能、特点与适用对象 目前,人工智能的研究是与具体领域相结合进行的。基本上有如下领域[2]: 1) 问题求解 人工智能的第一个大成就是发展了能够求解难题的下棋(如国际象棋)程序。在下棋程序中应用的某些技术,如向前看几步,并把困难的问题分成一些比较容易的子问题,发展成为搜索和问题归约这样的人工智能基本技术。今天的计算机程序能够下锦标赛水平的各种方盘棋、十五子棋和国际象棋。另一种问题求解程序把各种学公式符号汇编一起,其性能达到很高的水平,并正在为许多科学家和工程师所应用。有些程序甚至还能够用经验来改善其性能。 2) 逻辑推理与定理证明 逻辑推理是人工智能研究中最持久的子领域之一。其中特别重要的是要找到一些方法,只把注意力集中在一个大型据库中的有关事实上,留意可信的证明,并在出现新信息时适时修正这些证明。对学中臆测的定理寻找一个证明或反证,确实称得上是一项智能任务。为此不仅需要有根据假设进行演绎的能力,而且需人工智能综述-(Artificial-Intelligence)全文共15页,当前为第2页。人工智能综述-(Artificial-Intelligence)全文共15页,当前为第2页。要某些直觉技巧。 人工智能综述-(Artificial-Intelligence)全文共15页,当前为第2页。 人工智能综述-(Artificial-Intelligence)全文共15页,当前为第2页。 3) 理解自然语言 NLP(Natural language Processing)自然语言处理也是人工智能的早期研究领域之一,已经编写出能够从内部据库回答用英语提出的问题的程序。这些程序通过阅读文本材料和建立内部据库,能够把句子从一种语言翻译为另一种语言,执行用英语给出的指令和获取知识等。有些程序甚至能够在一定程度上翻译从话筒输入的口头指令(而不是从键盘打入计算机的指令)。目前语言处理研究的主要课题是:在翻译句子时,以主题和对话情况为基础,注意大量的一般常识一世界知识和期望作用的重要性。 人工智能在语言翻译与语音理解程序方面已经取得的成就。发展为人类自然语言处理的新概念。 4) 自动程序设计 也许程序设计并不是人类知识的一个十分重要的方面,但是它本身却是人工智能的一个重要研究领域。这个领域的工作叫做自动程序设计。已经研制出能够以各种不同的目的描述(例如输入,输出对,高级语言描述。甚至英语描述算法)来编写计算机程序。这方面的进展局限于少几个完全现成的例子。对自动程序设计的研究不仅可以促进半自动软件开发系统的发展。而且也使通过修正自身码进行学习(即修正它们的性能)的人工智能系统得到发展。自动编制一份程序来获得某种指定结果的任务同证明一份给定程序将获得某种指定结果的任务是紧密相关的。后者叫做程序验证。许多自动程序设计系统将产生一份输出程序的验证作为额外收获。 5) 专家系统 专家系统是依靠人类专家已有的知识建立起来的知识系统。目前专家系统是人工智能研究中开展较早、最活跃、成效最多的领域,广泛应用于医疗诊断、地质勘探、石油化工、军事、文化教育等各方面。它是在特定的领域内具有相应的知识和经
习 题 答 案 习题一答案 一、选择题 1. 软件的主要特性是(A B C)。 A) 无形 B) 高成本 C) 包括程序和文档   D) 可独立构成计算机系统 2. 软件工程三要素是(C D)。 A) 技术、方法和工具  B) 方法、工具和过程  C) 方法、对象和类  D) 过程、模型、方法 3. 包含风险分析的软件工程模型是(A)。 A) 螺旋模型 B) 瀑布模型 C) 增量模型 D) 喷泉模型 4. 软件工程的主要目标是(C)。 A) 软件需求  B) 软件设计  C) 风险分析  D) 软件实 现 5. 下列属于面向对象开发方法的是(A B C D)。 A) Booch   B) UML   C) Coad   D) OMT 6. 软件危机的主要表现是(B D)。 A) 软件成本太高 B) 软件产品的质量低劣 C) 软件开发人员明显不足 D) 软件生产率低下 7. 软件开发方法的主要工作模型有(A B C) A) 螺旋模型 B) 循环模型 C) 瀑布模型 D) 专家模型 8. 软件工程的目标有(A B C)。 A) 易于维护 B) 低的开发成本 C) 高性能 D) 短的开发期 9. 软件工程学的目的和意义是( )。 A) 应用科学的方法和工程化的规范管理来指导软件开发 B) 克服软件危机 C) 作好软件开发的培训工作 D) 以较低的成本开发出高质量的软件 二、 判断题 1. 软件就是程序,编写软件就是编写程序。(×) 2. 瀑布模型的最大优点是将软件开发的各个阶段划分得十分清晰。(×) 3. 结构化方法的工作模型是使用螺旋模型进行开发。(×) 4. 结构化方法和JSP方法都不适合于大型软件的开发。(√) 5. 原型化开发方法包括生成原型和实现原型两个步骤。(×) 6. 面向对象的开发方法包括面向对象的分析、面向对象的设计和面向对象的程序设计。( √) 7. 软件危机的主要表现是软件的需求量迅速增加,软件价格上升。(×) 8. 软件工具的作用是为了延长软件产品的寿命。(×) 9. 软件工程过程应该以软件设计为中心,关键是编写程序。(×) 10. RCP法与RSP法的主要区别是前者采用循环渐进的开发方式,原型将成为最终的产品,而后者将被废弃。(√) 三、简答题 1. 软件产品的特性是什么? 答: ● 软件是一种逻辑产品,具有无形性;  ● 软件产品的生产主要是研制;  ● 软件不存在磨损和老化问题,但存在退化问题;  ● 软件产品的生产主要是脑力劳动;  ● 软件产品的成本非常昂贵,其开发方式目前尚未完全摆脱手工生产方式; ● 软件具有“复杂性”,其开发和运行常受到计算机系统的限制。 2. 软件发展有几个阶段?各有何特征? 答: ① 程序设计阶段。    硬件特征:价格贵、存储容量小、运行可靠性差。    软件特征:只有程序、程序设计概念,不重视程序设计方法。   ② 程序系统阶段。    硬件特征:速度、容量及工作可靠性有明显提高,价格降低,销售有爆炸性增长 。    软件特征:程序员量猛增,开发人员素质低。   ③ 软件工程阶段。    硬件特征:向超高速、大容量、微型化及网络化方向发展。    软件特征:开发技术有很大进步,但未获得突破性进展,软件价格不断上升,未完全摆脱软件危机。 3. 什么是软件危机?其产生的原因是什么? 答:“软件危机”(Software Crisis)的出现是由于软件的规模越来越大,复杂度不断增 加,软件需求量增大。而软件开发过程是一种高密集度的脑力劳动,软件开发的模式及技术 不能适应软件发展的需要。致使大量质量低劣的软件涌向市场,有的花费大量人力、财力, 而在开发过程中就夭折。软件危机主要表现在两个方面: (1) 软件产品质量低劣,甚至开发过程就夭折。 (2) 软件生产率低,不能满足需要。 4. 什么是软件生存周期模型?它有哪些主要模型? 答:软件生存周期模型是描述软件开发过程中各种活动如何执行的模型。 主要模型包括:瀑布模型、增量模型、螺旋模型、喷泉模型、变换模型和基于知识的模型。 5. 有哪些主要的软件开发方法? 答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ● 可行性研究与计划(确定系统的目标和规模,分析项目的可行性); ● 需求分析与规格说明(明确系统的规格和要求); ● 设计(包括概要设计和详细设计,将系统分解为模块); ● 编程(用程序语言实现每个模块,简单容易); ● 测试(发现并改正错误,分为模块测试、集成测试和系统联调三级); ● 运行维护(扩充功能、纠错等)。 习题二答案 一、 选择题 1. 需求分析的主要目的是(B C)。 A) 系统开发的具体方案 B) 进一步确定用户的需求 C) 解决系统是“做什么的问题” D) 解决系统是“如何做的问题” 2. 需求分析的主要方法有(C D)。 A) 形式化分析方法 B) PAD图描述 C) 结构化分析(SA)方法 D) OOA法 3. 面向对象的分析方法主要是建立三类模型,即(D)。 A) 系统模型、ER模型、应用模型 B) 对象模型、动态模型、应用模型 C) E-R模型、对象模型、功能模型 D) 对象模型、动态模型、功能模型 4. SA法的主要描述手段有(B)。 A) 系统流程图和模块图 B) DFD图、据词典、加工说明 C) 软件结构图、加工说明 D) 功能结构图、加工说明 5. 画分层DFD图的基本原则有(A C D)。 A) 据守恒原则 B) 分解的可靠性原则 C) 子、父图平衡的原则 D) 据流封闭的原则 6. 在E-R模型中,包含以下基本成分(C)。 A) 据、对象、实体 B) 控制、联系、对象 C) 实体、联系、属性 D) 实体、属性、联系 7. 画DFD图的主要目的是(A D)。 A) 作为需求分析阶段用户与开发者之间交流信息的工具 B) 对系统的据结构进行描述 C) 对目标系统的层次结构进行描述 D) 作为分析和设计的工具 8. 据字典是据流图中所有元素的定义的集合,一般由以下四类条目组成(C)。 A) 据说明条目、控制流条目、加工条目、据存储条目 B) 据流条目、据项条目、文件条目、加工条目 C) 据源条目、据流条目、据处理条目、据文件条目 D) 据流条目、据文件条目、据池条目、加工条目 9. 在需求分析阶段主要采用图形工具来描述的原因是(B C)。 A) 图形的信息量大,便于描述规模大的软件系统 B) 图形工具能够极好地概括描述一个系统的信息,比文字叙述能够更好地表达重 要的细节 C) 图形能够更加直观地描述目标系统,便于用户理解和交流,有利于开发者与用 户之间达成一致的需求 D) 图形比文字描述简单、形象 二、 判断题 1. 在进行了可行性分析后,需求分析就只需要解决目标系统的设计方案。(×) 2. SA法是面向据流,建立在据封闭原则上的需求分析方法。(√) 3. HIPO法既是需求分析方法,又是软件设计方法。(√) 4. 在面向对象的需求分析方法中,建立动态模型是最主要的任务。(×) 5. 加工小说明是对系统流程图中的加工进行说明。(×) 6. 判定表的优点是容易转换为计算机实现,缺点是不能够描述组合条件。(×) 7. 需求分析的主要方法有SD法、OOA法及HIPO法等。(×) 8. 分层的DFD图可以用于可行性分析阶段,描述系统的物理结构。(×) 9. 信息建模方法是从据的角度来建立信息模型的,最常用的描述信息模型的方法是E-R 图。(√)  10. 用于需求分析的软件工具,应该能够保证需求的正确性,即验证需求的一致性、完整性、现实性和有效性。(√) 三、 问答题 1. 什么是需求分析?需求分析阶段的基本任务是什么? 答: 需求分析是当前软件工程中的关键问题,需求分析阶段的任务是:在可行性分析的基础上,进一步了解、确定用户需求。准确地回答 “系统必须做什么?” 的问题。获得需求规格说 明书。还涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及到这些因素和系统的精确规格说明,以及系统进化之间的关系。 需求分析的基本任务包括: (1) 抽取需求 分析现行系统存在需要解决的问题。获取足够多的问题领域的知识,需求抽取的方法一般有问卷法、面谈法、据采集法、用例法、情景实例法以及基于目标的方法等;还有知识工程方法,例如,场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等 。 (2) 模拟和分析需求 需求分析和模拟又包含三个层次的工作。首先是需求建模。需求模型的表现形式有自然语言、半形式化(如图、表、结构化英语等)和形式化表示等三种。需求概念模型的要求包括实现的独立性:不模拟据的表示和内部组织等;需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等。 (3) 传递需求 传递需求的主要任务是书写软件需求规格说明。 (4) 认可需求 就是对需求规格说明达成一致,其主要任务是冲突求解,包括定义冲突和冲突求解两方面。常用的冲突求解方法有:协商、竞争、仲裁、强制、教育等,其中有些只能用人的因素去控制。 (5) 进化需求 客户的需要总是不断(连续)地增长,但是一般的软件开发又总是落后于客户需求的增长,如何管理需求的进化(变化)就成为软件进化的首要问题。对于传统的变化管理过程来说,其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法 ,即产品线方法。多视点方法也是管理需求变化的一种新方法,它可以用于管理不一致性, 并进行关于变化的推理。 2. M公司的软件产品以开发实验型的新软件为主。用瀑布模型进行软件开发已经有近十了,并取得了一些成功。若你作为一名管理员刚加入M公司,你认为快速原型法对公司的软件开发更加优越,请向公司副总裁写一份报告阐明你的理由,切记:副总裁不喜欢报告长度 超过一页(B5)。 参考答案提示: 应先简述瀑布模型的缺点,它已不适宜开发实验型的软件。根据快速原型法的特点,说明它特别适合于开发探索型、实验型的软件。 3. 如何画分层据流图? 答: 总的原则是:至顶而下,逐层分解(画分层据流图)。 比较复杂的系统不能画在一张纸上,逐层分解的画法可以控制每一层的复杂度。 顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解。 底层:由不再进行分解的基本加工组成。 4. 加工小说明有哪些描述方法? 答: ● 结构化语言:介于自然语言和形式语言(如谓词逻辑)之间。 ● 结构化英语:通常由外层和内层结构组成。 ● 汉语的情况:精确、简明扼要、文体可以灵活。 ● 判定表:适用于表述比较复杂的加工逻辑,如具有多项选择条件的操作。 ● 判定树:本质上与判定表相同,图形表示更易于理解。 5. 考察下图中子图、父图的平衡。 图1 图2 参考答案: 图1中子图与父图不平衡。子图是父图中加工2的分解,加工2 有输入据流M和N,输出据流T,而子图则只有一个输入据N,却有两个输出据流T与S。 图2中子图是父图中加工3的分解,虽然表面上加工3只有一个输入据流“订货单”,而子图却有三个输入据流,但是如果“订货单”是由“客户”、“账号”和“量”三部分组成,即有如下据条目,订货单=客户+账号+量(2.2.5据词典),则子、父图平衡。 6. 画出银行取款过程的DFD图。问题描述为:储户用存折取款,首先填写取款单,根据“ 账卡”中的信息检验取款单与存折,如有问题,将问题反馈给储户,否则,登录“储户存款 据库”,修改相应据,并更新“账卡”,同时发出付款通知,出纳向储户付款。 参考答案: 7. 常用的软件需求分析方法有哪些? 答: 结构化分析方法(SA)、功能分解法、信息建模法、面向对象的分析方法(OOA)。 习题三答案 一、 选择题 1. 模块的基本特征是(A C)。 A) 外部特征(输入/输出、功能) B) 内部特征(输入/输出、功能) C) 内部特征(局部据、代码) D) 外部特征(局部据、代码 ) 2. SD方法的设计总则是(C D)。 A) 程序简洁、操作方便 B) 结构清晰、合理 C) 模块内聚性强 D) 模块之间耦合度低 3. 软件设计的主要任务是(A B D)。 A) 将分析阶段获得的需求说明转换为计算机中可实现的系统 B) 完成系统的据结构和程序结构设计 C) 完成模块的编码和测试 D) 对模块内部的过程进行设计 4. 设计阶段应达到的目标有(A D)。 A) 提高可靠性和可维护性 B) 提高应用范围 C) 结构清晰 D) 提高可理解性和效率 5. 从工程管理的角度来看,软件设计分两步完成(D)。 A) ①系统分析②模块设计 B) ①详细设计②总体设 计 C) ①模块设计②详细设计 D) ①总体设计②详细设 计 6. 模块独立性准则由以下定性指标来衡量(BD)。 A) 分解度    B) 耦合度    C) 屏蔽性    D) 内聚性 7. 用户界面设计的任务包括(A B C)。 A) 确定用户界面类型 B) 建立任务模型 C) 建立用户模型 D) 建立功能模型 8. 程序设计语言可以分为(B C D)。 A) 面向过程的语言    B) 机器语言 C) 高级语言    D) 汇编语言  9. 程序效率包括(A C D)几个方面的内容。 A) 代码效率     B) 运行效率    C) 存储效率     D) I/O效率 10. SP方法中的基本控制结构有(A B C)。 A) 顺序结构 B) 选择结构 C) 重复结构 D) GOTO结构 11. 内部文档可用注释语言书写,注释语言分为(A B C D)。 A) 序言性注释 B) 描述性注释 C) 功能性注释 D) 状态性注释 12. 为使程序中据说明更易于理解和维护,必须遵循以下原则(A B C) 。 A) 据说明的次序应当规范化 B) 一个语句说明多个变量时,各变量名按字母顺序排列 C) 对于复杂的据结构,要加注释,说明在程序实现时的特点 D) 定义变量名应按字母顺序排列 13. 源程序的效率与(D)阶段确定的算法的效率直接有关。 A) 概要设计 B) 总体设计 C) 单元设计 D) 详细设计 14. 在详细设计翻译转换成源程序代码后,算法效率反映为对程序的哪几个方面的要求 (C D)。 A) 读写速度 B) 代码长度 C) 存储容量 D) 执行速度 15. 提高程序效率的根本途径在于(B C)。 A) 编程时对程序语句进行调整 B) 选择良好的设计方法 C) 使程序最大限度的简洁 D) 选择良好的据结构与算法 二、判断题 1. 划分模块可以降低软件的复杂度和工作量,所以应该将模块分得越小越好。 (×) 2. 在网状结构中任何两个模块都是平等的,没有从属关系,所以在软件开发过程中常常被使用。(×) 3. 信息隐蔽原则有利于提高模块的内聚性。(√) 4. 中心变换型的DFD图可看成是对输入据进行转换而得到输出据的处理,因此可以使 用事务分析技术得到初始的模块结构图。(×) 5. SD法是一种面向据结构的设计方法,强调程序结构与问题结构相对应。 (×) 6. 所谓结构冲突,是指输入据与输出据之间很少或没有结构上的对应关系。通常解决 的办法是:构造一个或者多个中间结构,在输入和输出结构之间进行转换。(√) 7. 当模块的控制范围是其作用范围的子集时,模块之间的耦合度较低。(×) 8. JACKSON方法是以据流、据封闭性准则逐层分解的。(×) 9. 程序设计语言的工程特性包括:可移植性、可重用性、可维护性、局部性和顺序性。(×) 10. 项目应用领域是选择语言的关键因素。(√) 11. FORTRAN、Pascal、C语言、PL/1和汇编语言都是科学工程计算可选用的语言。(×) 12. 要用快速原型法开发软件,应选用4GL语言。(√) 13. 提高程序效率的根本途径是选择良好的设计方法、据结构与算法。(×) 14. 良好的程序设计风格简单说就是高的编程技巧。(√) 三、简答题 1. 模块内联系和模块间联系有哪些种类? 答:块间联系的各种类型的划分,从以下3方面考虑: ● 按块间联系的方式(可分为直接引用与过程调用); ● 按块间共用信息的作用(可分为据型、控制型与混合型); ● 按块间共用的信息量多少(信息多联系紧密)。 (1) 块间联系的类型,按照耦合度由大到小分为: 内容型:直接引用另一模块的内部信息; 公共型:两个模块引用共同的全程据区; 控制型:模块间传送的信息用于控制模块的内部逻辑; 复合型:模块间传送复合的据结构; 据型:模块间传送单个据项。 (2) 块内联系的类型,按照内聚性从小到大分为: 偶然型:模块内部没有必然联系; 逻辑型:逻辑上相似的功能放进一个模块; 瞬时型:将同时执行的语句放在一个模块; 通信型:模块中的各部分引用共同的据; 顺序型:模块中一部分的输出是另一部分的收入; 功能型: 模块中刚好包含了完成一个基本任务所必需的成分。 2. 分析以下DFD图,说明属于哪种类型的DFD图,并按照相应的变换将其转换为初始的模块 结构图。 参考答案:(略) 3. 下图是修改文件记录的DFD图,请确定其主加工。 解:主加工为:账号、修改、写记录。 4. 按照“降低块间联系,提高块内联系”的设计总则对模块进行修改,具体从哪些方面进 行改进? 解: (1) 尽可能建立功能模块; (2) 消除重复功能; (3) 模块的作用范围与控制范围,即当作用范围为控制范围的子集时,才能获得较低的块间 联系; (4) 模块的大小适当; (5) 模块的扇入扇出不宜太多。 5. 根据模块的作用范围与控制范围的原则,判定a、b两图的正确性。 解:显然,图a不满足作用范围应与控制范围的原则,模块F的作用范围不在控制范围之内。 图b的模块设计合理。 6. 图a中,模块G为判定,判断涉及到模块B、F、G,请指出设计中的错误,再根据改进模 块图的基本原则,画出1~2个改进方案(不改变模块G的判断关系),并说明是按照哪条基本 原则进行改进的。 解:图b为一个改进方案,将模块G的置提高,使其作用范围为控制范围的子集,减少模块 之间的联系。 7. 编码阶段的主要任务是什,应交付的结果是什么? 答:编码阶段的主要任务是为每个模块编写程序。即是:将详细设计的结果转换为用某种计 算机语言写的程序——源程序代码。编码阶段应交付的结果是带有“程序内部文档”的、不 再含有语法错误的程序。 8. SP法的自顶向下,逐步求精方法的优点有哪些? 答:此法符合人们解决复杂问题的普遍规律,可提高软件开发的成功率和生产率;而且用先 全局后局部、先整体后细节、先抽象后具体的逐步求精过程,开发出来的程序具有清晰的层 次结构,因此程序容易阅读和理解。这样,程序自顶向下,逐步细化,分解成一个树型结构 。 因此,在同一层次的节点上做细化工作,相互之间没有联系,它们之间的细化工作相互独立 ;在任何一步发生错误,一般只影响它下层的节点,同一层其他节点不受影响;在以后的测试中,也可以先独立地一个节点一个节点地做,最后再集成。这样,程序清晰和模块化,使 得在修改和重新设计一个软件时,可复用的代码量最大。 9. 为了使程序具有良好的设计风格,应注意哪些方面的问题? 答:(1) 标识符应按意取名。 标识符即符号名,包括:模块名、常量名、标号名、子程序名、据区名、缓冲区名等。 这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能够见名知意,有助于对 程序功能的理解。 (2) 程序应加注释,它分为两类:序言性注释和功能性注释。 序言性注释应置于每个模块的起始部分,主要内容有:①说明每个模块的用途,功能;②说明模块的接口即调用格式、参描述及从属模块的清单;③据描述;④开发历史 。 功能性注释是嵌在源程序体中的,用于说明其后的程序段或语句的功能以及据的状态;也就是解释下面要“做什么”,或是执行下面的语句会发生什么情况;而不是解释下面“怎么做”,因为怎么做常常是与程序重复的,且对读者理解程序没有什么帮助。 10. 样评价程序的执行效率?它与程序清晰性的关系是怎样的? 答:许多程序员往往片面追求效率,其实程序系统的成本不仅包括运行所需的机时,同时还应把程序员及操作员所花费的人力考虑进去。在编程时为追求效率而损害可读性或可靠性,会给以后的维护工作带来困难,所以从整体上看来是不值得的。 此外,还应该认识到,提高程序效率的根本途径在于:选择良好的设计方法、良好的据结构与算法,而不是靠编程时对程序语句进行调整。 (1) 追求建立在不损害程序可读性或可靠性基础上,要先使程序正确、清晰,再提高程序 效率。 (2) 不能因为贪图效率上的小利,而破坏程序的清晰性。 (3) 让编译程序去作简单的优化。 (4) 提高程序效率的根本途径在于:选择良好的设计方法和良好的据结构与算法,而不是靠编程时对程序语句做调整。 11. 假定:需要编一个求解一元二次方程根的子程序,加入到现有的子程序库中,供其他程序员使用。要求: (1) 为该子程序写一个序言性注释; (2) 用PASCAL语言或其他语言写出这个子程序(要把根的性质,如:实根、复根、降为一次方程等有区别地通知调用者),并加上描述性注释。 答案:(略) 习题四答案 一、选择题 1. 面向对象程序设计的基本机制(ABC)。 A) 继承 B) 消息 C) 方法 D) 结构 2. 下列属于面向对象的要素有(BCD)。 A) 分类性 B) 抽象 C) 共享 D) 封装 3. 下列选项中属于面向对象开发方法的有(ACD)。 A) Booch B) CAD C) Coad D) OMT 4. 下列属于Coad方法中面向对象的分析模型的层次有(AB)。 A) 主题层 B) 对象层 C) 应用层 D) 接口层 5. 一个类属性依其特征划分,其类型有(ABCD)。 A) 描述型 B) 定义型 C) 派生型 D) 参考型 6. 在进行面向对象分析时,所采用的模型有(ABD)。 A) 对象模型 B) 动态模型 C) 静态模型 D) 功能模型 7. 状态是对象属性的值的一种抽象,它的性质有(AB)。 A) 时间性 B) 持续性 C) 有序性 D) 有穷性 8. 据流图中的处理必须用对象中的操作来实现常见的操作有(ABCD)。 A) 查询 B) 动作 C) 活动 D) 访问 9. 建立继承关系时所采用的方式有(AC)。 A) 自顶向下 B) 从内到外 C) 自底向上 D) 从复杂到简单 10. 对象是人们要研究的任何事物主要的对象类型有(ABCD)。 A) 有形实体 B) 作用 C) 事件 D) 性能说明 二、判断题 1. 面向对象的的方法是以类作为最基本的元素,它是分析问题解决问题的核心。(×) 2. 类是指具有相同或相似性质对象的抽象,对象是抽象的类,类的具体化就是对象。(√) 3. 继承性是父类和子类之间共享据结构和消息的机制,这是类之间的一种关系(×)。 4. 多态性增强了软件的灵活性和重用性,允许用更为明确、易懂的方式去建立通用软件, 多态性和继承性相结合使软件具有更广泛的重用性和可扩充性。(×) 5. 面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。(√) 6. 面向对象的设计的主要目标是提高生产效率,提高质量和提高可维护性。(√) 7. 对象模型表示了静态的、结构化的系统据性质,描述了系统的静态结构,它是从客观世界实体的对象关系角度来描述,表现了对象的相互关系。(√) 8. 面向对象的分析是用面向对象的方法对目标系统的问题空间进行理解、分析和反映。通过对象层次结构的组织确定解空间中应存在的对象和对象层次结构。(√) 9. 类的设计过程包括:确定类,确定关联类,确定属性,识别继承关系。(√) 10. 复用也叫重用或再用,面向对象技术中的“类”,是比较理想的可重用软构件。有三种重用方式:实例重用、继承重用、多态重用。(√) 11. 主题是一种关于模型的抽象机制,它是面向对象模型的概貌,也是关于某个模型要同时考虑和理解的内容,主题起一种控制作用。(√) 12. 面向对象的分析由对象、结构、继承性和基于消息的通信构成。(×) 13. 支持继承性是面向对象程序设计语言和传统程序设计语言在语言机制方面的根本区别。(√) 14. 面向对象的分析过程主要包括三项内容:理解、表达和验证。(√) 15. 面向对象的设计的主要目标是提高生产效率、提高质量和提高可维护性。(√) 三、 简答题 1. 与传统程序设计模式中的过程调用相比,消息传递机制有何本质区别? 答: (1) 消息传递必须给出信道的信息,通常要指出明显的接受方。 (2) 由于接受方是一通信实体,具有保持状态的能力,所以同一发送方在不同时刻向同一 接受方发送同样的信息,可因接受方的当前状态不同而得到不同的结果。 (3) 消息传递可以是异步的,发送方可以不必等待接受方返回信息就可以继续执行后面的操作,因而支持程序的并发和分布执行,而过程调用只能是同步的,本质上是串行的。 2. 阐述面向对象的特征,并做简要的解释。 答: (1) 对象惟一性。 每个对象都有自身惟一的标识,通过这种标识,可找到相应的对象。 (2) 分类性。 是指将具有一致的据结构(属性)和行为(操作)的对象抽象成类。 (3) 继承性。 是父类和子类之间共享据结构和方法的机制,这是类之间的一种关系。 (4) 多态性。 是指相同的操作或函,过程作用于多种类型的对象上,并获得不同的结果。 3. Coad方法主要由面向对象分析OOA和面向对象设计OOD。OOA方法分析过程和构造OOA概念模型的顺序由5个层次组成,请简述这5个层次。 答: (1) 发现类及对象。描述如何发现类及对象。从应用领域开始识别类及对象,形成整 个应用的基础,然后,据此分析系统的责任。 (2) 识别结构。该阶段分为两个步骤。第一,识别“一般-特殊”结构,该结构捕获了识别出的类的层次结构;第二,识别“整体-部分”结构,该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象。 (3) 定义主题。主题由一组类及对象组成,用于将类及对象模型划分为更大的单,便于理解。 (4) 定义属性。其中包括定义类的实例(对象)之间的实例连接。 (5) 定义服务。其中包括定义对象之间的消息连接。 4. 面向对象程序设计有哪些优点? 解:开发时间短、效率高、可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性 ,可以在应用程序中大量采用成熟的类库,从而缩短开发时间,这样程序更易于维护、 更新和升级。继承和封装使得应用程序的修改带来的影响更加局部 化。 5.比较面向对象方法与结构化方法的特点。 解:分析是问题抽象 (做什么),设计是问题求解 (怎么做),实现是问题的解 (结果)。任 何方法学对客观世界的抽象和求解过程都是如此。在问题抽象阶段,结构化方法面向过程, 按照据变换的过程寻找问题的结点,对问题进行分解。因此,与面向对象方法强调的对象 模型不同,描述据变换的功能模型是结构化方法的重点。如果问题世界的功能比据更复 杂或者更重要,那么结构化方法仍然应是首选的方法学。如果据结构复杂且变换不多, 那么如果以过程主导分析和设计,一旦有系统变更就会给下游开发带来极大混乱。 由于对过程的理解不同,面向过程的功能细分所分割出的功能模块有时会因人而异。而面向 对象的对象细分,从同一问题领域的对象出发,不同人得出相同结论的比率较高。 在设计上,结构化方法学产生自顶向下、结构清晰的系统结构。每个模块有可能保持较强的独立性,但它往往与据库结构相独立,功能模块与据库逻辑模式间没有映射关系,程序与据结构很难封装在一起。如果据结构复杂,则模块独立性很难保证。面向对象方法抽象的系统结构往往并不比结构化方法产生的系统结构简单,但它能映射到据库结构中,很容易实现程序与据结构的封装。 在软件工程基本原则中有一条“形式化原则”,即对问题世界的抽象结论应该以形式化语言 (图形语言、伪码语言等)表述出来。结构化方法可以用据流图、系统结构图、据辞典、状态转移图、实体关系图来进行系统逻辑模型的描述;而面向对象方法可以使用对象模型图、据辞典、动态模型图、功能模型图。其中对象模型图近似系统结构图与实体关系图的结合,动态模型图类似状态迁移图,功能模型图类似据流图。 6.当重要的对象被发现后,通过一组互相关联的模型详细表示类之间的关系和对象的行为,这些模型从四个不同的侧面表示了软件的体系结构、静态逻辑、动态逻辑、静态物理和动态物理。试描述一下这四种特性。 解:静态逻辑模型描述实例化(类成员关系)、关联、聚集(整体/部分)、和一般化(继承)等关系。这被称为对象模型。一般化关系表示属性和方法的继承关系。定义对象模 型的图形符号体系通常是从用于据建模的实体关系图导出的。对设计十分重要的约束,如 基(一对一、一对多、多对多),也在对象模型中表示。 动态逻辑模型描述对象之间的互相作用。互相作用通过一组协同的对象,对象之间消 息的有序的序列,参与对象的可见性定义,来定义系统运行时的行为。 静态物理模型通过模块描述代码的布局。动态物理模型描述软件的进程和线程体系结 构。 习题五答案 一、选择题 1. 下列不是模型元素的是(D)。 A) 关联 B) 聚合 C) 依赖 D) 笔记 2. UML具有扩展性,常见的扩展机制有(BCD)。 A) 修饰 B) 版类 C) 加标签值 D) 约束 3. UML语言支持的建模方式有(ABD)。 A) 静态建模 B) 动态建模 C) 模块化建模 D) 功能建模 4. 下列各种图可用于动态建模的有(ACD)。 A) 状态图 B) 类图 C) 序列图 D) 活动图 5. 下列属于状态的组成部分的有(AB)。 A) 名称 B) 活动 C) 条件 D) 事件 6. UML中包括的事件有(ABCD)。 A) 条件为真 B) 收到另一对象的信号 C) 收到操作调用 D) 时间表达式 7. 属性的可见性有(ABD)。 A) 公有的 B) 私有的 C) 私有保护的 D) 保护的 8. 用例之间的关系有(BCD)。 A) 友元 B) 扩展 C) 使用 D) 组合 9. 应用于通用化约束的方式有(ABCD)。 A) 完整 B) 不相交 C) 不完整 D) 覆盖 10. 消息的类型有(ABC)。 A) 同步 B) 异步 C) 简单 D) 复杂 二、 判断题 1. UML建模语言是由视图、图、模型元素和通用机制构成的层次关系来描述的。 (√) 2. UML是一种建模语言,是一种标准的表示,是一种方法。 (×) 3. 泳道是一种分组机制,它描述了状态图中对象所执行的活动。 (×) 4. 同步消息和异步消息的主要区别是:同步消息的发送对象在消息发送后,不必等待消息处理,可立即继续执行,而异步消息则发送对象必须等待接收对象完成消息处理后,才能继续执行。 (×) 5. 类图中的角色是用于描述该类在关联中所扮演的角色和职责的。 (√) 6. 类图用来表示系统中类和类与类之间的关系,它是对系统动态结构的描述。 (×) 7. 用例模型的基本组成部件是用例、角色和用例之间的联系。 (√)
电子科技大学 实 验 报 告 课程名称 微处理器系统结构与嵌入式系统设计 实验名称 ARM汇编基础实验 任课教师 " "实验教师 " " "姓名 " " " "学号 " " " " "实验地点 " " "分组号 " " "时间 " " " "月 "日 " " " " " " " " " " " " " " " " " "一、实验目的 " " " " " " " " " " " " " " "熟悉并掌握常用ARM汇编指令 1. 熟悉并掌握"C+汇编"混合编程技术 2. 熟练使用ARM软件开发调试工具Keil 二、实验内容 1. 学习使用Keil开发工具 2. 实现累加运算功能(汇编编程,必做) 3. 实现字符串拷贝功能(C+汇编,必做) 4. 实现求和运算功能(C+汇编,必做) 5. 实现冒泡排序算法(汇编编程,选做) 微处理器系统结构与嵌入式系统设计实验报告 三、实验步骤 1.学习使用keil开发工具 1. 点击"Keil uVision5"打开软件主窗口。 2. 点击Project->New uVision Project建立新工程。 3. 为新工程命名。 4. 为工程选择目标器件:三星S3C2440A。 5. 选择是否添加S3C2440.s启动文件:C源程序工程选"是",汇编源程序工程选"否" 。 6. 在工程Source Group上点右键选择添加新工程文件。 7. 选择源文件类型。 8. 录入源代码并保存。 9. 对工程进行build或rebuild。 10. 点击debug按钮进入/退出调试,忽略代码大小限制。使用单步调试, 仔细观察过程中 关键寄存器值的变化。 2.各个实验步骤 实验1.1: 用汇编语言实现1+2+...+N的累加(必做) 1. 建立新工程,加入实验1.2文件夹中的sum.s 2. 用汇编补充算法核心部分,代码参考流程图如下图所示。 3. 使用单步调试,仔细观察过程中关键寄存器值的变化。 实验1.2 : C调用汇编实现字符串拷贝功能(必做) 1. 建立新工程,加入实验1.3文件夹中的main.c和testfile.s(同一个工程下添加两 个文件一起编译)。 2. 补充完成源代码中缺失的部分,实现字符串拷贝功能 3. 运行Debug进行调试 实验1.3: 汇编调用C实现实现求和1+2+...+N(必做) 1. 建立新工程,加入实验1.4文件夹中的sum.c和testfile.s(同一个工程下添加两个 文件一起编译)。 2. 补充完成源代码中缺失的部分,通过调用c函g()实现1+2+3+glovb1,结果存在R 8中。 3. 运行Debug进行调试 实验1.4:ARM汇编实现冒泡算法(选做) 1. 建立新工程,加入实验1.5文件夹中的maopao.s。 2. 补充完成源代码中缺失的部分,实现冒泡排序功能。 3. 运行Debug进行调试 四、实验结果 实验1.1用ARM汇编实现1+2+…+n的运算。 在sum.s文件中,添加如下核心代码: ---------------------------------------------------------------------------- --------------------------------------------- SUN_L1 ADD R0,R1 ;R0,R1求和 BVS SUM_END ;判断是否溢出,溢出则执行SUM_END程序,求和结束 CMP R1,R2 ;R1、R2作差与0进行比较 BHS SUM_END ;R1>=R2,则执行SUM_END程序,否则向下继续执行 ADD R1,#1 ;R1增1 B SUN_L1 ;循环运行SUN_L1 调试过程: 1. 设置N的值并赋值给R0 2. 将R0=N的值复制给R2 3. 判断N是否为0或者,改变标志C 4. 将R0,R1分别初始化为0与1 5. 将R0+R1赋值给R0 6. 判断是否溢出与R1是否大于等于R2=N,改变标志N 7. 令R1+1赋值给R1 8. 通过B语句返回SUN_L1函,实现循环相加 9. 此时判断到R1大于等于R2=100,改变标志 10. 跳转到SUM_END函,并将R0的结果保存在R8中 11. 出栈并返回函,完成1到N=100的累加,结果保存在R8中 实验1.2 : C调用汇编实现字符串拷贝功能(必做) 在testfile.s文件中,添加如下核心代码: ---------------------------------------------------------------------------- --------------------------------------------- Strcopy LDRB R2,[R1],#1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值