TDxxxV1.0
四、程序流程控制
程序流程控制是程序的精华所在,正确的程序流程才能实现正确的程序功能。安排精巧的程序流程控制才可能使程序具有高效率。程序流程控制不管是在C还是在汇编中都是程序设计者最值得思考的地方。
4.1顺序结构
顺序结构是程序最基本的流程,其语句顺序执行,PC指针依次下移,是CPU内部处理指令的初始方法。这也是编程思维的最初级方式,也是程序的最基本方式和流程。
顺序结构流程:
A操作 B操作
图4-1 顺序结构流程
其实,其描述的是一个向量方式发展的问题,是所有问题发展和描述的基本方法,具有明确的方向性和时间性,如图中的A操作的发展方向只有一个,即接下来就是B操作,中间既没有反复也没有曲折变化,B一定发生在A的后面。
我们平时可以看到的C语言的实现:(微波炉开机初始化)
key_bibi_f = 1; menu_disp_h = 0xf0U; menu_disp_l = 0;
21
//上电响一声 //上电显示0:00
TDxxxV1.0
disp5 = 0xffU;
上述简短的几条语句分别完成一定目的的初始化,虽然在这里没有强制要求什么样的顺序,但是执行过程中是严格按语句的先后来开关目标的。
SN8ASM的实现:
b0bset key_bibi_f ;上电响一声
mov mov mov mov mov mov
a,#0f0h menu_disp_h,a a,#00h menu_disp_l,a a,#11111111b disp5,a
;上电显示0:00
这是一段功能完全与上面这段C相同的汇编实现,我们可以看见在顺序结构的汇编语句当中没有任何的跳转和判断,都是按原功能的顺序来描述。
从对比当中我们完全可以找到它们的逻辑上的一一对应关系。
4.2选择结构
事实上,完全顺序结构的流程的程序很少,因为很多事情并不是一帆风顺,顺流而下。很多情况下,事件的发生都需要具备一定的条件,只有一定条件下才有可能实现。这就得使用选择结构来描述。
选择结构流程图:
P为真? A操作 B操作
22
TDxxxV1.0
图4-2 选择结构流程图
简单选择结构只判断一个条件的真假来决定下面的需要执行的操作,这是一个最简单的判断。
C语言实现:(BCD码调整)
if(result_buf > 0x0a) {
result_buf = input + 6;
} else { result_buf = input; }
我们看见在C语言当中,我们用判断语句来实现这样一个判断逻辑,不管是什么样的条件,我们只计算其真假,做出判断。If??else??是一个非常好的判断组合,很容易用它来完成下列我们用汇编来实现的功能。
SN8 汇编实现:
cmprs nop b0bts0
a,#0ah fc
jmp $+3
b0mov a,y ret
b0mov a,y add a,#6h
;调整后的数放在a
事实上,在汇编程序中,我们会遇到几种情况的条件选择:
一是当条件是一个位变量时,我们可以直接用b0bts指令来进行判断。
一是当条件是是否满足一个预定的值,我们可以用CMPRS指令来进行判断,当然也可以将其转化为标志位来判断。也可以用减法的方法将其转化成为标志位进行判断,就看需要来安排了
更深入。。。。。。
A、串行多分支结构流程: 事实上大多数时候,单个的条件无法分析判断复杂的问题,有时候一个结果的出现需要很多个条件同时成立,而每一个条件成立,又都有不同的结果产生,这样就会有一系列的有层次的判断!
23
TDxxxV1.0
N P1为真? Y N P2为真? N Pn为真? Y Y C1 C2 C3 C4
图4-3 串行多分支结构流程图
C用if,else if嵌套来实现:
if(key_bibi_f) { buzzer_time = d_buzzer_time1; buzzer_not = d_buzzer_not3; }
else if(end_bibi_f) //buzzer10 { buzzer_time = d_buzzer_time2; //响声长短,500ms buzzer_not = d_buzzer_not1; //要响几次,#10 }
else if(segment_bibi_f) {
//buzzer20
//响声长短,500ms
//响声长短,200ms //要响几次,#1
buzzer_time = d_buzzer_time2; buzzer_not = d_buzzer_not1;
//要响几次,#4
} 说明: key_bibi_f end_bibi_f
;按键响声请求标志
;烹调结束响声请求标志
;段切换响声请求标志
sgment_bibi_f 按键响声:200ms/1次 结束响声:500ms/5次 段切换响声:500ms/2次
问:SN8 ASM怎么实现?
24
TDxxxV1.0
SN8 ASM的实现:
Buzzer00: b0bts1 key_bibi_f jmp buzzer10
mov a,@buzzer_time1 ;200ms mov buzzer_time,a ;响声长短 mov a,@buzzer_not3 mov buzzer_not,a
;#1 ;要响几次
jmp buzzer40 buzzer10:
b0bts1 end_bibi_f jmp buzzer20
mov a,@buzzer_time2 ;500ms mov buzzer_time,a ;响声长短 mov a,@buzzer_not1 mov buzzer_not,a jmp buzzer40
;#10
;要取反的次数
buzzer20: b0bts1 segment_bibi_f
jmp buzzer30
mov a,@buzzer_time2 ;500ms mov buzzer_time,a ;响声长短 mov a,@buzzer_not2 mov buzzer_not,a
;#4
;要取反的次数
jmp buzzer40
B、并行多分支结构流程:
P=? P = 1 P = 2 P = 3 P = n A1 A2 A3 An
25
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新初中教育松翰C语言编程指导C+Program+Guide (6)全文阅读和word下载服务。
相关推荐: