顺序结构和汇编语言程序设计’
第5章 顺序结构程序设计

LDS BX, TABLE
; (BX)=0040H
; (DS)=3000H
LES BX, TABLE
; (BX)=0040H
注意:
* 不影响标志位 * REG 不能是段寄存器 * SRC 必须为存储器寻址方式
; (ES)=3000H
标志寄存器传送指令
标志寄存器传送指令用来传送标志寄存器
0000 1001 + 0111 1100 1000 0101
带: ( +9 ) + ( +124 ) = -123 OF = 1 无: 9 + 124 = 133 CF = 0 带符号数溢出
例5.9 编程序实现两个双精度数 20034980H和1008E699H加法运算
;5-1.asm XLAT EXAMPLE 查十六进制数的ASCII码表
DATA SEGMENT TABLE DB 30H,31H,32H,33H,34h,35h,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 3 ;要查的十六进制数 ASCII DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE MOV AL,HEX XLAT MOV ASCII,AL MOV DL,AL MOV AH,02H INT 21H 显示单个字符! MOV AH,4CH INT 21H CODE ENDS END START
带:( +4 ) + ( +11 ) = +15 OF = 0 无:4 + 11 = 15 CF = 0
汇编语言程序设计

6)组合运算符(属性修改运算符) ① PTR运算符:运算符PTR可以指定或修改存储器操作数的 类型。注意,这种修改是临时性的,仅在该语句内有效。 下面是使用PTR运算符的例子: 例10 INC BYTE PTR[BX] 该语句的目的操作数是内存单元,用寄存器作为地址指 针。如果仅仅使用[BX]来表示该操作数,则汇编该语句时 ,不能确定该存储单元是字节单元还是字单元。因此,必 须使用BYTE PTR说明它为字节操作数(若为字操作数, 则使用WORD PTR说明)。
4)分析运算符:分析运算符有:SEG、OFFSET、TYPE、 LENGTH和SIZE。 ① SEG运算符:利用SEG运算符可以得到一个标号或变量的段 基值。下面的指令将ARRAY的段基值送给DS寄存器。 例4 MOV AX,SEG ARRAY MOV DS,AX ② OFFSET运算符:利用OFFSET运算符可以得到一个标号或 变量的偏移量。下面的指令将STRING的偏移地址送给DX。 例5 MOV DX,OFFSET STRING ③ TYPE运算符:运算符TYPE的运算结果是一个数值,这个数 值与操作数类型的对应关系见表4-1。
4.1.3
汇编语言的表达式
(3)表达式。表达式是操作数常见的形式,它由常数、变量 、标号通过操作运算符连接而成。 汇编语言中有:算术运算符、逻辑运算符和关系运算符等 。 1)算术运算符:常用的有:+(加)、–(减)、*(乘)、/ (除)和MOD(模运算)等,算术运算的结果是一个数值 。 例1 MOV AX,VARX+2 表示VARX的地址加2后对应的存储字单元内容送给AX。 2)逻辑运算符:AND(逻辑“与”)、OR(逻辑“或”) 、NOT(逻辑“非”)和XOR(逻辑“异或”)。逻辑运算 用于数值表达式中对数值进行按位逻辑运算,并得到一个数 值结果。 例2 MOV AL,0FH AND 35H 表示将0FH与35H按位相与后得到05H送给AL, 这条指令 与MOV AL, 05H 等效。
单片机学习第四章汇编语言程序设计

ORG START:CLR
MOV SUBB JC MOV XCH MOV NEXT: NOP SJMP END
1000H C A,60H A,61H NEXT A,60H A, 61H 60H,A
$
;0→CY
;做减法比较两数 ;若(60H)小,则转移
;交换两数
整理课件
【例4.6】将R2中的一位十六进制数转换为 ASCII码,结果仍存放于R2中。
MOV R0, #0 SJMP NEXT4 NEXT2:MOV R0,A DEC R0 NEXT4:MOV 31H,R0 SJMP $ END
;取X ;与5比较
;X<5,则转NEXT2 ; ;设10<X,Y=X十1
;与1l比较 ;x>10,则转NEXT4
;5≤X≤10,Y=0
;X<5,Y=X-1 ;存结果
MOV
@R0,A
;保存结果
SJMP $
;原地踏步
END
整理课件
【例4.2】假设两个双字节无符号数,分别存 放在R1R0和R3R2中,高字节在前,低字 节在后。编程使两数相加,用R2R1R0存放 和。 对多字节的加法,存在最高位的进位问题。 如果最高位有进位,则和的字节数要比加 数或被加数的字节数多一个。
经常用于定义一个地址表。Yi为双字节数据, 它可以为十进制或十六进制的数,也可以 为一个表达式。高位数在前,低位数在后。
整理课件
• 例如: ORG 1000H DATA:DW 3241H,1234H,78H 上述程序将对从1000H单元开始的6个单元 赋值,赋值情况如何呢? (1000H)=32H,(1001H)=41H, (1002H)=12H,(1003H)=34H, (1004H)=00H,(1005H)=78H。
实验4 顺序结构程序设计

河北工业大学城市学院《汇编语言程序设计》实验报告实验4 顺序结构程序设计一、实验目的1.掌握汇编语言集成开发环境下编写完整汇编程序的书写方法。
2.掌握汇编语言集成开发环境下汇编程序的汇编、连接、执行和调试。
3.常用伪指令的使用。
4. 掌握顺序结构程序的编写方法。
二、实验内容1.从键盘输入一个大写字母,将其转换为小写字母并显示在屏幕上解:程序代码为:DATAS SEGMENTDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV AH,1;功能号为1,键盘输入单字符并回显INT 21HADD AL,32MOV DL,ALMOV AH,2;功能号为2,显示输出单字符INT 21HMOV AH,4CHINT 21HCODES ENDSEND START运行结果如图所示:2.在内存X和Y单元各存放了一个非压缩BCD码,将它们组合为压缩BCD码并存于Z单元(高地址做高位)。
解:程序代码为:DATAS SEGMENTX DB 00000101BY DB 00000110BZ DB?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV CL,4SHL X,CLMOV CL,YOR CL,XMOV Z,ALMOV AH,4CHINT 21H CODES ENDSEND START运行结果如图所示:3.在内存TAB开始的16个单元连续存放了0-15的平方值(0-225),任给一个数X(0 ≤X ≤15),求X的平方值,并把结果存放在Y单元中。
解:程序代码为:DATAS SEGMENTTAB DB 0,1,4,9,16,25,36DB 49,64,81,100,121DB 144,169,196,225X DB 6Y DB? DATAS ENDS CODESSEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXLEA BX,TABMOV AL,XMOV AH,0ADD BX,AXMOV AL,[BX]MOV Y,ALMOV AH,4CHINT 21H CODES ENDSEND START。
汇编语言程序设计的基本方法

01
例2 编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
02
例3 把非压缩十进制数DAT1转换为压缩十进制数
例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
通常,编制一个汇编语言源程序应按如下步骤进行:
1
明确任务,确定算法。
2
绘制流程图(包括确定内存单元和分配寄存器)。
3
根据流程图编写汇编语言程序。
4
上机调试程序。
5
程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。
6
5.6 汇编语言程序设计的基本方法
5.6.1 顺序程序设计
顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1
条件
N
…
例4用比较指令和条件转移指令实现两路分支的程序段。
两路分支程序设计
例4用比较指令和条件转移指令实现两路分支的程序段。 … MOV AX,M ;假定M和N为有符号数 MOV BX,N CMP AX,BX ;比较 M和N的大小,影响标志位,准备条件 JG NEXT ;M>N时转移,注意若M、N为无符号数时用JA指令 …… ;分支程序2 JMP DONE NEXT: …… ;分支程序1 …… DONE:RET
X+20 (X≥0)
8051单片机汇编语言程序设计

8051单片机汇编语言程序设计一、顺序结构1.有两个4位压缩BCD码,分别存放在30H,31H,40H,41H单元,要求求和,结果送至51H,52H中(高位在前,地位在后),给出程序流程图ORG 0000HCLR CMOV A,31HADD A,41HDA AMOV 52H,AMOV A,30HADDC A,40HDA AMOV 51H,AEND若需要求和的数为5271和6489,请分析每条指令后A和PSW的对应的数据二、分支结构2.求双字节有符号数的补码(双字节数为16位二进制数,其最高位D15为符号位),给出程序流程图和程序代码(单分支结构)CPT16:MOV A,R7JNB ACC.7,EXTMOV C,ACC.7MOV F0,CCPL AMOV R7,AMOV A,R6CPL AADD A,#01MOV R6,ACLR AADDC A,R7MOV C,F0MOV ACC.7,CMOV R7,AEXT: RET验证以上程序对-12597和6831两数的结果是否正确。
3.求分段函数的值,X是自变量存放在30H单元,Y是因变量存放在31H单元,给出程序流程图和程序代码(多分支结构A:逐次比较法)100010X X Y X X +>⎧⎪==⎨⎪-<⎩ FUNC1:MOV A,30HCJNE A,#00H,NZEROAJMP NEGTNZERO: JB ACC.7,POSITADD A,#1AJMP NEGTPOSIT: MOV A,#81HNEGT: MOV 31H,ARET4. 根据31H (高字节)、30H (低字节)的内容(分支转移参数)转向不同的处理程序(PRGX(X=0~n ,n>256)),给出程序流程图和程序代码(多分支结构B :转移表)JUMP1:MOV DPTR,#TAB1MOV A,30HMOV B,#3MUL ABMOV R3,AMOV A,BADD A,DPHMOV DPH,AMOV A,31HMOV B,#3MUL ABADD A,DPHMOV DPH,AMOV A,R3JMP @A+DPTRTAB1: LJMP PRG0LJMP PRG1LJMP PRGn若(31H30H )=364,则分析每条指令后A ,B ,DPTR 对应的数值。
第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
实验2 顺序与分支汇编语言程序设计实验

ARM技术原理与应用实验报告实验2 顺序与分支汇编语言程序设计实验专业电子信息工程班级14电信班学生姓名陈定光学号2014010243101指导教师曹计昌2017年4月19 日实验2 顺序与分支汇编语言程序设计实验1、实验目的(1)掌握顺序结构汇编语言程序设计;(2)掌握分支结构汇编语言程序设计;(3)掌握AXD环境下顺序结构和分支结构汇编语言程序的运行、调试。
2、实验要求1、实验必须在在ADS1.2环境下进行。
2、工程名、汇编语言源文件名按照下面规则命名:工程名:pj+学号最后4位+其它字符汇编语言源文件名:p+学号最后4位+其它字符+.s例如:张维智同学学号最后4位是3134因此,pj3134、pj3134a、pj31341等都是允许的工程名;而 p3134a.s、p3134b.s等都是允许的源文件名。
3、实验报告中需要说明实验中在ADS、AXD环境下进行的实际操作;4、实验报告中应给出实际的实验操作、编写的源程序、及计算机的调试观察结果;5、按照规定格式打印实验报告。
3、实验内容1、编写程序p2xxxx1.s完成下面任务:(1)将1、2、3、4、5、6、7、8依次传送给寄存器R1-R8;分析:如上图显示,寄存器r1-r8分别是存放1-8(2)用STMIA指令将R1-R8保存到刚好能够存储8个字数据ARY_A数组中。
分析:如上图显示,地址0x8058-0x8078分别存放1-8(3)用STMIB指令将R1-R8保存到刚好能够存储8个字数据ARY_B数组中。
分析:如上图显示,地址0x8088-0x80A7分别存放1-8(4)用STMDA指令将R1-R8保存到刚好能够存储8个字数据ARY_C数组中。
分析:如上图显示,地址0x8094-0x80B3分别存放1-8(5)用STMDB指令将R1-R8保存到刚好能够存储8个字数据ARY_D数组中。
(6)用LDMIA指令将ARY_A数组中数据5、6、7、8传送到R1-R4寄存器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k←十进制串长
十进制转化完毕,用 k保存串长。
二十互化的测试程序
为了检验长整数转换的程 序正确性。编写一段 检验程序,先输入, 然后调用十化二子程 序将输入的十进制数 转化为二进制,然后 调用二化十程序转化 为十进制,再输出, 与输入串比较,如果 相等,则表明两个转 换过程是正确的。这 样的方法可以推广到 其他过程的正确性验 证。 程序流程
十化二数据结构和算法
数据结构 1. 来自调用者的十进制ASCII数字串 2. 来自调用者的二进制结果串 注意:利用寄存器传送串地址,由于自然的原因,十进制串的高位数 字在低地址,而二进制串的高位在高地址。 算法 输入的十进制数为
a n 10 n + a n − 1 10 n − 1 + L + a 1 10 + a 0
n n n Cm = Cm−1 + Cm −1 −1
C
n m
m − n + 1 n −1 = Cm n
C
n m
m! = n! (m − n)!
算法一程序流程
input m,n c(m,n) output m,n来自 主程序 子程序 c(m,n)
n=0 or n=m
return c(m-1,n-1)+c(m-1,n)
1. 2. 来自调用者的二进制数字串 来自调用者的十进制ASCII结果串
注意:利用寄存器传送串地址,由于自然的原因,十进制串的高 位数字在低地址,而二进制串的高位在高地址。 算法 二进制串表示的长整数除以10,余数作为十进制数的个位, 商再除以10,余数作为十位,如此继续,直至商为0。
二化十的程序流程
直线 左上 右上
i=8 output k←i+1 8q(k) j←j+1 J>8
子程序流程
主程序
长整数运算
80x86CPU只提供字操作,字节操作,也就是对于数据宽度 超过16位(386以上可以使用32位字的指令)的整数运算,直 接使用机器指令将无法完成,必须由程序员自己设法解决。 解决的办法并不复杂,简而言之,无非是教会计算机运算过 程中进位,另外由于人们习惯使用十进制,而计算机中自然的 进位制是二进制,因此,在进行长整数运算时,经常会遇到长 整数十进制,二进制互化的问题。 长整数十化二 将输入的ASCII数字串装化为机内二进制 长整数二化十 将机内二进制转化为ASCII十进数字串 长整数加法 计算两个长整数的和 实例: 实例:大阶乘 计算大数的阶乘
输入十进制数 十化二 二化十 输出十进制数
交互的长整数运算程序
二进制串地址b 二进制串长m 十进制串地址d, 十进制串长k
数据来自调用者,为了方便操 作,串长占一个字。二进制串 存放待转换的数,十进制串存 放转换结果。
i←0 d全串除以10 余数送b[i] b[i]调整为ASCII
二进制长整数除以 10,类似于多位数 除以一位数的除法。
加30h 即可
i←i+1 商=0?
参数传递问题
这类程序比较通用,因此 应该写成过程,供其他程序调 用,因此需要规范程序接口, 并且通知有关程序。所谓接口, 就是主程序与子程序之间参数 传递的方式,在这里,需要传 递的参数是,待转化的十进制 串和转化之后的结果串,可用 于参数传递的媒介一般是堆栈 和寄存器,这两者都要求参数 不能太大,因此不能把串作为 参数传递,一般是只传送串的 地址。
子程序定义
上一章,讨论伪操作时,已经介绍了子程 序定义。至于子程序定义中的属性选择, 如果该子程序只在局部共享,即只在同 一段内被调用,可以说明为NEAR,否则 应说明为FAR.
子程序的参数传递问题
利用高级语言编程序时,子程序或函数原型中要 声明参数表,包括参数名和参数类型,称为形 式参数,子程序调用时,要根据参数表填写对 应的变量或数值,称为实参。 利用汇编语言编程时,子程序定义不要求说明参 数表。但是,调用者只有在了解参数的类型, 数目和传递方式的前提下才能正确地进行调用。 因此,子程序的定义者必须以其它方式通知调 用者该子程序的上述相关信息。
八皇后问题
皇后的威力
解的例子
求解思路—递归,回溯
数据结构
10000000 00001000 00000001 00000100 00100000 00000010 01000000 00010000 用8个字节记载各 行的状态,如左 图所示。另用1个 字节记载各列的 状态,某位是1表 示对应的列已被 占领, 是0则表示 该列空闲。
程序结构和汇编语言程序设计
顺序结构 分支结构 循环结构 子程序结构
程序结构对于程序设计极 为重要,不讲究结构的 程序有如一团乱麻难以 理清头绪。结构较好的 程序逻辑严谨,流程清 晰。对于高级语言,程 序的基本结构已经包含 在语言的设计考虑之内; 而用汇编语言编程,程 序员有必要对程序结构 给予更多的关注。
子程序递归调用
子程序直接或间接(通过其它子程序)调 用自身,称为递归调用。使用递归调用 常常可以使源程序简化。但要注意,递 归调用有可能导致堆栈溢出,有可能使 开销恶性膨胀。可以使用递归调用的例 子:
n!
C
n m
Fn
子程序嵌套
子程序嵌套是指在子程序体内定义其他子 程序,不同的程序设计语言对此问题用 不同办法处理,C语言不允许函数嵌套, 而PASCAL语言允许过程嵌套。汇编语 言允许子程序嵌套定义,但建议大家不 要随便使用。因为子程序嵌套使程序结 构复杂化。
求65535以内的奇素数
p←3 t←3 t*t>p 输出p p←p+2
p=65535
t不整除p
P为待测试的数,t为 用来试除的数。对每 一个p,从3开始试除, 若除尽,则表明p是 合数,测试下一个数; 否则除数加2,继续 试除;直到除数平方 大于p,表明p是素数。
t←t+2
计算组合数
贾宪三角,Pascal三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 常用的组合数计算公式
j←1
程序流程
i←1 8q(i) 子程序从主程序接 受参数i,该参数表 示目前正在为第几 个(行)皇后安排 位置,子程序的变 量j表示目前正在尝 试的列,从第一列 开始,依次进行直 线,斜线检查,通 过则为下一皇后安 排(递归调用), 如果已经是第八个 则输出结果。检查 不通过则尝试下一 列,8列都试过, 返回调用者。
顺序结构
程序逐条向下执行,称 为顺序结构,是最简 单的程序结构。
分支结构
常用的程序结 构之一,有 两分支结构 和多分支结 构,即高级 语言中的 CASE结构, 两分支结构 是基础,多 分支可以通 过两分支嵌 套实现。
条件
条件
语句序列
语句序列1
语句序列2
左边的更基本,条件满足则执行语句序 列,条件不满足则跳过。
长整数十化二
为什么要进行转化
输入的数据往往是十进制数,如果 这个数要经过反复运算,最好在处理 之前把它转化为二进制,这样可以使 运算过程效率更高,存储空间的利用 率也将提高。 例如,输入数据为255时,在计算机 内以ASCII码格式存放,将得到字符串: 32 35 35共三个字节,与其他数进行加 法运算,需要执行三条加法指令(逐 位相加),还要人工考虑进位,并进 行十进制调整。化为二进制,得到 ff, 进行运算时只需一条指令,并且不必 调整。
利用汇编语言编程时,调用子程序之前,先传递 参数,一般放在寄存器或堆栈中。实际上,用 高级语言编程也是这样做,只不过参数传递的 细节交给编译程序,高级语言为程序员提供简 单,直观的参数传递方法。汇编就麻烦一些, 程序员必须了解要调用的子程序有几个参数, 参数的类型,哪个参数应该存入哪个寄存器, 或者参数应该以什么顺序压入堆栈。哪些参数 应该传值,哪些参数应该传地址等。
转换为
10( a1 + 10( a2 + L + 10( an −1 + 10 an ) L)) + a0
十化二程序流程
十进制串地址d, 十进制串长k 二进制串地址b 二进制串长m
数据来自调用者,为了方便操 作,串长占一个字。十进串存 放待转换的数,二进串存放转 换结果。
i←0
b[0] ←d[i]+b[0] b全串乘10
主程序 注意:输入的 m,n应该满足: 0<=n<=m
return 1
算法二程序流程
input m,n c(m,n) output 主程序 注意:输入的 m,n应该满足: 0<=n<=m m,n来自 主程序 子程序 c(m,n)
n=0
return c(m,n-1)*(m-n+1)/n
return 1
十进串从高位到低位逐位处理, 每次将当前位加到二进制当前 串然后乘以10,注意是多字节 运算,进位可能涉及许多位。
i←i+1
二进制当前串乘以10,相当于 多位数乘以一位数,需要考虑 进位,还需要考虑串长的增长。 十进制串的最后一位处理完毕, 保存二进制串长,返回调用者。
i=k
m←b的串长
二化十的数据结构和算法
循环结构
也是重要的程序 结构之一,有 前判循环和后 判循环的区别, 汇编的LOOP指 令为后判循环, 但JMP和条件 转移指令配合 可以实现前判 循环。
条件 循环体
循环体
条件
子程序
程序设计过程中,需要共享代码的情形十分普遍,把功 用的程序段写成命名的子程序,并声明子程序的调用 格式,可以方便共享,大幅度节省程序开发的成本。 因此子程序是一种普遍采用的程序结构。关于子程序 需要讨论以下问题: • 汇编语言源程序中子程序的定义方法 • 参数传递问题 • 子程序的递归调用 • 子程序的嵌套定义