电气知识|分支程序设计

   更新日期:2017-03-26     来源:建材之家    作者:安防之家    浏览:57    评论:0    
核心提示:分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。 分支程序有两种基本结构,如图所示。 它们分别相当于高级语言中的IF_THEN_ELSE语句和CASE语句,适用于要求根据不同条件作不同处理的情况。IF_THEN_ELSE语句可以引出两个分支,CASE语句则可以引出多个分支,不论哪一种形式,它们的共同特点是:运行

安防知识|防护网分类与介绍

推荐简介:安防之家讯:防护网,是一种安装于窗户、阳台等处,为居家生活提供防护、防盗、防坠物等安全保障的新型建筑安防产品,它集安全、美观、实用等诸多优点于一身,代表着21世纪家居安防的最新理念。防护网分类防护网分为:山坡防护网(边坡防护网,主动防护网,柔性防护网,被动防护网)(公路、铁路)防护网,园林防护网、体育场防护网、居民区防护网等......
安防之家讯:分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。 分支程序有两种基本结构,如图所示。



它们分别相当于高级语言中的IF_THEN_ELSE语句和CASE语句,适用于要求根据不同条件作不同处理的情况。IF_THEN_ELSE语句可以引出两个分支,CASE语句则可以引出多个分支,不论哪一种形式,它们的共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。



例1试编写程序段,实现符号函数。

分析:变量X的符号函数可表示为:

程序可通过对符号标志的判别来确定执行哪一分支。

START: MOV AX,BUFFER;(BUFFER)=X

ORAX,AX

JEZERO ;X=0,则转ZERO

JNSPLUS;X为正数,则转PLUS

MOV BX,0FFFFH ;X为负数,则-1送BX

JMPCONT1

ZERO:MOV BX,0

JMPCONT1

PLUS:MOV BX,1

CONT1: ……

例2利用表实现分支。根据AL中各位被置位情况,控制转移到8个子程序P1~P8之一中去。转移表的结构如表1所示。

分析:对于这种程序关键要找出每种情况的转移地址,从图中可见表地址=表基地址+偏移量, 而偏移量可由AL各位所在位置*2求得。

表1 子程序R1—R8的入口地址表

P1

子程序R1的入口偏移地址

P2

子程序R2的入口偏移地址

P3

子程序R3的入口偏移地址

……

……

…….

……

P7

子程序R7的入口偏移地址

P8

子程序R8的入口偏移地址

DATASEGMENT

baseDWSR0,SR1,SR2,SR3, 

SR4,SR5,SR6,SR7

DATAENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

BEGIN:PUSH DS

XOR AX,AX

PUSHAX

MOV AX,DATA 

MOV DS,AX

LEA BX,base ;表头送BX

INAL,PORT 

GETBIT: RCR AL,1;右移一位

JCGETAD;移出位是1?

INCBX

INC BX ;修改指针

JMPGETBI

GETAD: JMPWORD PTR[BX] ;实现散转

CODEENDS

ENDBEGIN

例3将内存中某一区域的原数据块传送到另一区域中。

分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。程序如下:

DATASEGMENT

STR DB 1000DUP(?)

STR1EQU STR+7

STR2EQU STR+25

STRCOUNT EQU 50

DATAENDS

STACKSEGMENT PARASTACK‘STACK’

STAPNDB100DUP(?)

STACKENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

GOO PROC

PUSH DS

SUBAX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

MOV CX,STRCOUNT

MOV SI,STR1

MOV DI,STR2

CLD

PUSH SI

ADD SI,STRCOUNT-1

CMP SI,DI

POPSI

JLOK

STD

ADD SI,STRCOUNT-1

ADD DI,STRCOUNT-1

OK:REPMOVSB

RET

GOOENDP

CODEENDS

END GOO





csegsegment

main procnear

assume cs:cseg, ds:data

start:

movax,dseg

movds,ax





exit:movax,4c00h

int21h

mainendp

csegends

endstart

例4 试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支中去。

branch_addressessegment; 定义数据段

branch_table dw routine_1

dw routine_2

dw routine_3

dw routine_4

dw routine_5

dw routine_6

dw routine_7

dw routine_8

branch_addressesends

procedure_selectsegment; 定义代码段

main procfar; 定义主程序main

assume cs:procedure_select,ds:branch_addresses

start: 

pushds 

sub bx,bx 

pushbx 

mov bx,branch_addresses

mov ds,bx

; 程序的主要部分(寄存器相对寻址)

cmp al,0 ; (al)=0?

je continue ; (al)为0则转到continue_main_line

mov si,0

l:shr al,1; 把al逻辑右移1位

jnc not_yet ; CF=0转到not_yet

jmp branch_table[si] ; CF=1转到相应程序分支

not_yet: add si,type branch_table; 修改地址add si,2

jmp l; 无条件跳到l 

continue:; 其它程序段

… 

routine_1: 

… ; 程序段1

routine_2: 

… ; 程序段2 

ret 

mainendp ; 主程序main结束

procedure_select ends 

end start

用寄存器间接寻址方式实现跳跃表法的程序如下(仅给出修改后的程序的主要部分):

……

cmpal,0 

je continue 

leabx,branch_table ; branch_table的偏移地址送bx l: shral,1 

jncnot_yet ; CF=0转到not_yet

jmpword ptr[bx] ; CF=1转到相应程序分支

not_yet: addbx,type branch_table ; 修改地址

jmpl; 无条件跳到l

continue: 

…… 

用基址变址寻址方式实现跳跃表法的程序如下(仅给出修改后的程序的主要部分),与前两种寻址方式的主要区别是这里使用了逻辑左移指令,即从al的高位向低位判断,而前两段程序是从al的低位向高位判断。

……

cmpal,0 

je continue

leabx,branch_table 

movsi,7*type branch_table ; 14送si

movcx,8; 循环次数8送cx

l: shlal,1; 把al逻辑左移1位

jnbnot_yet ; CF=0转到not_yet

jmpword ptr[bx][si]; CF=1转到相应程序分支

not_yet: subsi,type branch_table; 修改地址

loop l; 循环

continue: 

……

以上多个例子都是既有分支结构又有循环结构,实际上,多数程序都是各种程序结构的组合。而且,循环结构可以看作分支结构的一种特例,它只是多次走一个分支,只在满足循环结束条件时,走另一个分支罢了。

算法和循环控制条件的选择对程序的工作效率有很大的影响,而循环控制条件的选择又是很灵活的,应该根据具体情况来确定。考虑算法时必须把可能出现的边界情况考虑在内。

设置逻辑尺是循环控制中很常用的一种方法。除了静态地预置外,还可以在程序中动态地修改标志位的值,以达到控制的目的。

循环可以有多层结构。多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。另外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。

起泡排序算法是多重循环程序设计中的一种常用方法。

分支程序结构可以有两种形式。分别相当于高级语言中的IF_THEN_ELSE语句和CASE语句,适用于要求根据不同条件作不同处理的情况。

IF_THEN_ELSE语句可以引出两个分支,CASE语句则可以引出多个分支,不论哪一种形式,它们的共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。

数组排序算法中可以采用折半查找法来提高查找效率。

CASE结构可以使用跳跃表法实现,使程序能根据不同的条件转移到多个程序分支中去。跳跃表法;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;是一种很有用的分支程序设计方法。

安防之家专注于各种家居的安防,监控,防盗,安防监控,安防器材,安防设备的新闻资讯和O2O电商导购服务,敬请登陆安防之家:http://anfang.jc68.com/
小程序码
 
打赏
 
更多>文章标签:安防器材
更多>同类安防监控资讯
0相关评论

推荐图文更多...
点击排行更多...
安防监控商机更多...
安防监控圈更多...
最新视频更多...
推荐产品更多...
水泥之家 | 橱柜之家 | 机械之家 | 水电之家 | 五金之家 | 家电之家 | 墙布头条 | 饰品头条 | 模具头条 | 家纺头条 | 建材群站 | 建材资讯 | 建材产品 | 俱乐部 | 装修之家 | 建材商机 | 装修问答 | 知名品牌 | 家装展会 | 装修效果图 | 商企动态 | 瓷砖之家 | 安防之家 | 灯具之家 | 门窗头条 | 地板头条 | 环保头条 | 暖气之家 | 玻璃幕墙 | 吊顶之家 | 隔断屏风 | 楼梯铁艺 | 家具之家 | 卫浴头条 | 石材园林 | 板材钢板 | 油漆头条 | 家纺头条 | 水泥之家 | 橱柜之家 | 家电之家 | 水电之家 | 五金之家 | 老姚之家 | 灯饰之家 | 电气之家 | 全景头条 | 照明之家 | 防水之家 | 防盗之家 | 区快洞察 | 漳州建材 | 泉州建材 | 三明建材 | 莆田建材 | 合肥建材 | 宣城建材 | 池州建材 | 亳州建材 | 六安建材 | 巢湖建材 | 宿州建材 | 阜阳建材 | 滁州建材 | 黄山建材 | 安庆建材 | 铜陵建材 | 淮北建材 | 马鞍山建材 |
建材 | 双碳之家 | 企业之家 | 移动社区 | 关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图 | 排名推广 | 广告服务 | 积分换礼 | RSS订阅 | sitemap | 粤ICP备14017808号
(c)2015-2017 Bybc.cn SYSTEM All Rights Reserved
Powered by 安防之家