分支与循环程序设计
汇编语言程序设计_第5章 分支循环程序设计(参考答案)

第5章分支、循环程序设计本章要点: 转移指令的寻址方式及其执行过程,控制转移类指令的使用,分支和循环程序的设计和应用。
程序调试的方法,常见问题的程序设计方法。
一、单项选择题5.1.1条件转移是根据标志寄存器中的标志位来判断的,条件判断的标志位共有( B )位。
A. 4B. 5C. 6D. 95.1.2用一条条件转移指令一次可以实现( A )个分支。
A. 2B. 3C. 4D. N5.1.3 条件转移指令的转移范围是(A)。
A. -128~127B. 0~255C. 0~65535D. -32768~327675.1.4 设A为字变量,B为标号,下列指令中不正确的是(D)。
A. MOV AX,AB. JNZ BC. JMP [SI]D. JMP B[BX]5.1.5 下述指令中影响CF标志位的是(A)。
A. SHL AL,1B. MOV AL,1C. JC LD. JNC L5.1.6 下述指令中不影响CF标志位的是(A)。
A. INC SIB. SUB SI,0C. NEG ALD. TEST AL,15.1.7 在多重循环程序设计中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B)。
A. 不必考虑B. 必须重新设置C. 必须清0D. 必须置15.1.8 当设计一个程序时,最重要的是(B)。
A. 程序的结构化B. 能使程序正常运行并实现功能C. 程序的执行速度快D. 程序占用的存储空间小*5.1.9 如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一指令的操作码,那么这条指令的位移量是(C)。
A. 1EHB. 20HC. 0DEHD. 0E0H*5.1.10 如果“JGE P”指令的操作码放在0050H,该指令的位移量是34H,执行完这条指令转移取下一条指令的偏移地址是(C)。
A. 82HB. 84HC. 86HD. 88H二、填空题5.2.1 当下面循环程序中的划线处填上一个什么数字时,执行的循环次数最多?MOV CX,____0______MOV AX,0L:INC AXLOOP L5.2.2 当两个数进行比较后,执行__JE L(JZ L)表示两数相等则转移到L。
常见的程序设计方法

常见的程序设计方法在计算机程序设计中,常见的程序设计方法有许多种。
程序设计是将问题转化为计算机可以理解和执行的指令或代码的过程,而不同的问题和需求通常需要使用不同的程序设计方法来解决。
下面将介绍一些常见的程序设计方法。
1. 顺序程序设计顺序程序设计是最基础的程序设计方法之一。
顺序程序设计按照指令的顺序逐步执行,从上到下,从左到右。
开发者需要按照问题的逻辑和需求,将指令按照正确的顺序编写。
这种方法简单明了,适用于一些简单的问题,但对于复杂的问题可能会显得不够灵活。
2. 分支程序设计分支程序设计基于条件语句,根据不同的条件选择不同的执行路径。
常见的条件语句有if语句和switch语句。
开发者可以根据不同的条件,执行不同的代码块,从而实现问题的不同分支。
分支程序设计适用于需要根据条件进行不同操作的问题,可以增加程序的灵活性和适应性。
3. 循环程序设计循环程序设计允许程序根据需要重复执行一段代码块。
循环语句的常见形式有for循环、while循环和do-while循环。
循环程序设计可以逐次迭代一个过程,直到满足退出条件为止。
这种方法适用于需要重复执行相同或类似操作的问题,提高了程序的效率和可重用性。
4. 递归程序设计递归程序设计是指一个函数或过程在执行过程中调用自身的方法。
通过递归,一个复杂的问题可以被拆分为多个相同或类似的子问题,从而简化解决步骤。
递归程序设计适用于问题可以自我分解为更小规模问题的情况,但需要注意递归深度和终止条件以避免无限循环。
5. 面向对象程序设计面向对象程序设计是一种以对象和类为基本单位的程序设计方法。
它将数据和操作这些数据的函数封装成对象,通过对象之间的交互来解决问题。
面向对象程序设计具有抽象、封装、继承和多态等特性,可以更好地模拟和解决现实世界中的问题。
面向对象程序设计适用于复杂的问题,提高了代码的可读性和可维护性。
6. 函数式程序设计函数式程序设计是一种基于数学函数概念的程序设计方法。
第5章 汇编语言程序

Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。
结构化程序设计的三种基本结构

结构化程序设计共有以下3种基本结构: 顺序结构 分支结构 (选择结构 )
循环结构,
(1)顺序结构,如图3.1(a)所示,该结构先执行A,再 执行B,两者是顺序执行的关系
A B 流程图
A B
N-S结构图
(2)分支结构,也叫选择结构,如图3.1(b)所示, 该结构先判断条件是否成立,当条件成立时执 行A,否则执行B。该结构只能执行A或B其中之 一
例如: m和n是整形变量,则: scanf (“%d%d”,m,n );是错误的, 应将“m,n”改为“&m,&n” 。
②如果在“格式控制串”中除了格式标识符、修饰符和格式 说明符以外还有其他字符,则应在输入数据时输入与这些字 符相同的字符。例如: scanf ("%d,%d",&m,&n );
输入时两个整数之间应加入“,”: 234,123↙ 因为,在scanf函数中的“格式控制串”中使用了逗号分 隔,所以必须在234后面加一个逗号。
表3.2 scanf函数常用的格式说明符
格式说明符 d o x c s f
功能说明 表示输入带符号的十进制整数 表示输入无符号八进制整数 表示输入十六进制无符号整数 表示输入单个字符 表示输入多个字符,即一个字符串 表示输入实数,可以用小数形式输入
表3.2 scanf函数常用③从键盘输入的数据类型和个数必须与参数表中的数 据类型和个数相匹配。例如:
scanf (“%d,%d”,&m,&n ); 输入数据时的形式:
234,10.5↙ (错误,因为数据类型不匹配) 234,105,123↙ (错误,因为数据个数不匹配) 234,123↙ (正确) ④可以指定输入数据所占的列数,系统自动按指定列 数截取数据。例如:
程序设计3(3种基本结构)

流程图:
3.2.5 条件运算符(了解即可) 若if语句中,在表达式为“真”和“假”时,且都 只执行一个赋值语句给同一个变量赋值时,可以用 简单的条件运算符来处理。例如,若有以下if语句: if (a>b) max=a; else max=b; 可以用下面的条件运算符来处理: max=(a>b)?a∶b; 其中“(a>b)?a∶b”是一个“条件表达式”。它是 这样执行的:如果(a>b)条件为真,则条件表达式 取值a,否则取值b。
3.3.5 示例:
4பைடு நூலகம்
1
1 3 1 5 1 7
例:多项式如下:π/4 =1 - 1/3 + 1/5 - 1/7 + 1/9 ... 计算的项数n由键盘输入,求π。结果保留2位小数。 #include <iomanip> int main(){ int n, sign=1; double sum=0.0; cin>>n; for(int i=1; i<=n; i+=2) { sum = sum + sign*1.0/i; sign = -sign; } // 设置浮点数的小数个数2位 cout<<fixed<<setprecision(2)<<4*sum<<endl; return 0; }
3.3.3 for
for语句使用最为灵活,不仅可以用于循 环次数已经确定的情况,而且可以用于循环 次数不确定而只给出循环结束条件的情况, 它完全可以代替while语句。一般形式为: for(表达式1;表达式2;表达式3) 语句
它的执行过程如下: (1) 先求解表达式1。 (2) 求解表达式2,若其值为真, 则执行for语句中指定的内嵌语句, 然后执行下面第(3)步。若为假, 则结束循环。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执 行。
汇编-循环与分支程序设计

方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;
第四章 循环结构程序设计

while(i<=100)
{ i++;
程序运行结果: sum=5050
sum=sum+i;
}
6
4.3 do-while语句
do-while语句的结构 do 语句 while(表达式);
例如: do
x-=1; while(x>0);
功能:
1)执行“语句”。 2)计算“表达式”的值。如果值为非0,转1);否则转3)。
}
8
4.3 do-while语句
1)循环体如果包含一个以上的语句,要用复合语句表示。 2)在循环体中应有使循环趋于结束的语句。 3)while语句的特点是先执行循环体,然后判断表达式的值。 4)一般情况下,用while语句和用do-while语句处理同一 个问题时,若二者的循环体部分一样,其结果也一样。但如
18
4.7 goto语句以及用goto语句构成循环结构
goto语句的一般格式:
goto 语句标号;
例如: goto loop;
功能:程序执行到goto语句时,将程序流程转到语句标号指定的 语句去执行。
有标号的语句的格式:
语句标号: 语句
例如: loop: sum=sum+i;
19
4.7 goto语句以及用goto语句构成循环结构
【例4-9】用goto语句实现求1~100累加和。
#include <stdio.h>
main() { int n=1, sum=0; loop: sum += n; n++;
if(n<=100) goto loop;
printf("sum=%d\n",sum); }
第五章 循环与分支程序设计

continue: add loop mov loop ……
2. 分支程序设计
? ? … case 1 case 2 case n case 1 case 2 case n
CASE 结构
(1) 逻辑尺控制 (2) 条件控制
IF-THEN-ELSE 结构
(3) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
13
x(x1,x2,…… x2,……,x10) 例:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), (z1,z2,…… z2,……,z10) 编程计算 z(z1,z2,……,z10) z1 = x1 z2 = x2 z3 = x3 z4 = x4 z5 = x5 z6 = x6 z7 = x7 z8 = x8 z9 = x9 + y1 + y2 - y3 - y4 - y5 + y6 - y7 - y8 + y9
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4je lea L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: …… al, 0
(寄存器间接寻址) 寄存器间接寻址)
continue bx, branch_table ;逻辑右移 al, 1 逻辑右移 ;jnb=jnc add1 ;段内间接转移 word ptr[bx] bx, type branch_table L
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称分支及循环程序设计成绩
指导教师******
专业班级****** 姓名白*** 学号*******
联系电话********
一、任务要求
1.熟练掌握Keil环境下汇编语言程序的调试方法,加深对汇编
语言指令、机器码、寻址方式等基本内容的理解,掌握分支程
序和简单程序的设计及调试方法,了解并行IO口的使用。
2.设有8bits符号数X存于外部RAM单元,按以下方式计算后
的结果Y也存于外部RAM单元,请按要求编写完整程序。
3.利用51系列单片机设计一个24小时制电子时钟,电子时钟
的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩
BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停
止计时。
设计1s延时子程序(延时误差小于10us,晶振频
率12MHz)。
4.1)实现4位十进制加、减1计数,千位、百位由P1口输出;
十位、个位由P2口输出。
利用P3.7状态选择加、减计数方
式。
2)利用P3口低四位状态控制开始和停止计数,控制方式自
定。
二、设计思路
1.先在外部RAM取数,然后判断该符号数是否为负数,若为负
数,则取相反数并存数;若为正数,则接着判断该数是否大于
等于64,若满足,则求平方并存数,先存低位,后存高位;
若小于64,则接着判断该数是否大于10,若满足,则求该数
的一半并存数;若小于等于10,则取相反数并存数。
2.第一步先编可以延时1S的子程序DELAY;接着判断P
3.O
是否满足开始计数条件,若不满足,则重复判断;若满足,则
对时分秒分别赋值,调用延时子程序,判断是否满足计时条件,若不满足,则重复判断直至满足;若满足,则秒钟自加一,循
环,判断秒钟循环满60次后出循环,对分钟自加一,然后继
续循环,最后判断分钟循环满60次后出循环,对时钟自加一,然后判断时钟循环满24则回到初值,时分秒重新赋值并重新
开始循环。
3.判断P3.7,若为1,则进行加一计数,若为0,则跳转至另一
程序进行减一计数;加一计数中,先取低位P1送A,自加一,送P1,判断是否有溢出,若有,则取高位P2送A,自加一,送P2,然后回判断循环;减一计数同理,即先取低位P1送A,自减一,送P1,判断是否有进位,若有,则取高位P2送A,自减一,送P2,然后回判断继续循环。
三、资源分配
1.2000H 片外RAM存数
2001H 存结果低八位
2002H 存结果高八位
B寄存器暂存结果高八位
2.P3.0 存计时判断位
R0、R1、R2 存延时子程序中各重循环的循环次数
R3、R4、R5 存时分秒的循环次数
P0、P1、P2 存时分秒的输出值
3.P1、P2 分别存十进制计数的低两位、高两位
P3.7 存计数方式的控制位
四、流程图
1、8 bit符号数的判断及计算
2、时钟设计
3.十进制加减一计数器
五、源代码(含文件头说明、语句行注释)1.8 bit符号数的判断及计算
ORG 0000H
LJMP START
ORG 1000H
START: MOV DPTR,#2000H;地址指针赋初值MOV A,#22
MOVX @DPTR,A
MOVX A,@DPTR;取数
JB ACC.7,DD
CJNE A,#64,AA;若A≠64,则转AA AA: JC BB;若A<64,则转BB
MOV B,A
MUL AB;求A的平方
INC DPTR
MOVX @DPTR,A;存结果低八位
INC DPTR
MOV A,B
MOVX @DPTR,A;存结果高八位
SJMP $
BB: CJNE A,#10,CC;若A≠10,则转CC CPL A
EE: INC DPTR
MOVX @DPTR,A
SJMP $
CC: JC DD;若A<10,则转DD
RR A;若A>10,则右移一位
SJMP EE
DD: CPL A
INC A
SJMP EE
END
2.时钟设计
ORG 0000H
LJMP START
ORG 1000H
START: JB P3.0,START;若为0,则开始计时RESTA: MOV R3,#24
MOV P0,#00H ;时钟赋初值
LOOP3: MOV R4,#60
MOV P1,#00H ;分钟赋初值
LOOP2: MOV R5,#60
MOV P2,#00H ;秒钟赋初值
LOOP1: ACALL DELAY;调用延时1S子程序LOOP: JB P3.0,LOOP;若为1,则停止计时MOV A,P2
ADD A,#01H
DA A
MOV P2,A
DJNZ R5,LOOP1;判断秒钟是否结束循环
MOV A,P1
ADD A,#01H
DA A
MOV P1,A
DJNZ R4,LOOP2;判断分钟是否结束循环
MOV A,P0
ADD A,#01H
DA A
MOV P0,A
DJNZ R3,LOOP3;判断时钟是否结束循环
LJMP RESTA
DELAY: MOV R0,#12
NOP
DELAY3:MOV R1,#130
DELAY2:MOV R2,#212
NOP
NOP
DELAY1:NOP
DJNZ R2,DELAY1
DJNZ R1,DELAY2
DJNZ R0,DELAY3
RET
END
3.十进制加减计数器
ORG 0000H LJMP START
ORG 1000H START:MOV P1,#12H
MOV P2,#92H LOOP: ACALL DELAY
MOV A,P2
JB P3.7,AA;若为1,则转AA实现记数加1
ADD A,#99H
DA A;实现十进制减1
MOV P2,A
JC BB;判断是否产生借位,若产生,则对高位减1
MOV A,P1
ADD A,#99H
DA A
MOV P1,A
AJMP LOOP
AA: ADD A,#01H
DA A;实现十进制加1
MOV P2,A
JNC BB;判断是否产生进位,若产生,则对高位加1 MOV A,P1
ADD A,#01H
DA A
MOV P1,A
BB: AJMP LOOP
DELAY: MOV R0,#12
NOP
DELAY3:MOV R1,#130 DELAY2:MOV R2,#212
NOP
NOP
DELAY1:NOP
DJNZ R2,DELAY1
DJNZ R1,DELAY2
DJNZ R0,DELAY3
RET
END
六、程序测试方法及结果1.8 bit符号数的判断及计算1)令片外RAM中数据为64
2)令片外RAM中数据为22
3)令片外RAM数据为1
4)令片外RAM数据为-2
2.时钟设计
1)令P3.0=0,程序按十进制正常运行
2)令P3.0=0,暂停计数
3)设置断点观察延时子程序的延时时间,刚好为1s
3.十进制加减1计数器
1)将P3.7置1,计数器实现加一计数
2)将P3.7置0,计数器实现减一计数
七、思考题
1.实现多分支结构程序的主要方法有哪些?举例说明。
a)分支地址表法
b)转移指令表法
c)地址偏移量表法
2.在编程上,十进制加1计数器及十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数?
a)十进制加1计数器满十进1,十六进制加1计数器满16进1,
十进制加法需用DA A指令进行调整
b)用ADD A,#99H
DA A 指令,即可实现减1计数
其它说明:
1.标题:黑体,小四号
2. 正文:宋体,五号,1.5倍行距
3.流程图使用SmartDraw7 或Visio软件绘制
4.不要加封面。