回复:回答出此问题的人算高人了

Ralf Jones

西门子1847工业学习平台

  • 帖子

    406
  • 精华

    3
  • 被关注

    5

论坛等级:侠客

注册时间:2004-03-11

普通 普通 如何晋级?

发布于 2008-10-07 09:43:53

0楼

AR1 := Start address of table



L P##TABLE // ACC1 := Ptr to start of table

LAR1 // AR1 := Ptr to start of table

L W#16#0 // ACC1 := 0

L W [AR1,P#0.0] // Memory reference byte 0..1 ; ACC2 := 0

==I // if(memory reference byte 0..1 = DB#)

JZ IF01 // {

T #BLOCK_NO // ACC1 := DB#

OPN DB [#BLOCK_NO] // Open DB#

IF01: NOP 0 // }

L D [AR1,P#2.0] // ACC1 := Starting address of table

LAR1 // AR1 := Starting address of table



// Check if table is empty



L W#16#0 // ACC1 := 0

L W [AR1,P#2.0] // ACC1 := TABLE[1] // # of entries

==I // if(TABLE[1] = 0)

JZ FAIL // { FAIL }



// Remove "FIRST IN" entry from table



L D [AR1,P#4.0] // ACC1 := TABLE[3]

T #RET_VAL // FIFO := TABLE[3]



// Decrement # of entries by 1. Then, if # of entries = 0 then EXIT



L W [AR1,P#2.0] // TABLE[1] := TABLE[1] - 1

L 1 // .

-I // .

T W [AR1,P#2.0] // .

JZ EXIT // if(TABLE[1] = 0 { EXIT }



// Shift remaining entries down in the table



+AR1 P#4.0 // for(COUNT = # of entries; COUNT <> 0; COUNT -1)

L001: T #CNTR // {

L D [AR1,P#4.0] // .

T D [AR1,P#0.0] // .

+AR1 P#4.0 // AR1 := AR1 + 4 bytes

L #CNTR // .

LOOP L001 // }

EXIT: SET // RL0 := 1

JU SBR // .

FAIL: CLR // RLO := 0

SBR: SAVE // Set BR indicating function success or failure



#RET_VAL 输出应定义为dword类型例如 #output dword

如果希望连续的执行fifo而不受fifo第二个字的长度限制,则可以把程序修改为:
L P##table // ACC1 := Ptr to start of table

LAR1 // AR1 := Ptr to start of table

L W#16#0 // ACC1 := 0

L W [AR1,P#0.0] // Memory reference byte 0..1 ; ACC2 := 0

==I // if(memory reference byte 0..1 = DB#)

JZ IF01 // {

T #BLOCK_NO // ACC1 := DB#

OPN DB [#BLOCK_NO] // Open DB#

IF01: NOP 0 // }

L D [AR1,P#2.0] // ACC1 := Starting address of table

LAR1 // AR1 2:= Starting address of table
LAR2



// Check if table is empty



L W#16#0 // ACC1 := 0

L W [AR1,P#2.0] // ACC1 := TABLE[1] // # of entries

==I // if(TABLE[1] = 0)

JZ FAIL // { FAIL }



// Remove "FIRST IN" entry from table



L D [AR1,P#4.0] // ACC1 := TABLE[3]

T #output // FIFO := TABLE[3]




// Decrement # of entries by 1. Then, if # of entries = 0 then EXIT



L W [AR1,P#2.0] // TABLE[1] := TABLE[1] - 1

T #temp

L 1 // .

-I // .

T W [AR1,P#2.0] // .

JZ EXIT // if(TABLE[1] = 0 { EXIT }



// Shift remaining entries down in the table



+AR1 P#4.0 // for(COUNT = # of entries; COUNT <> 0; COUNT -1)

L001: T #CNTR // {

L D [AR1,P#4.0] // .

T D [AR1,P#0.0] // .

+AR1 P#4.0 // AR1 := AR1 + 4 bytes

L #CNTR // .

LOOP L001 // }
L #temp
T W [AR2,P#2.0]

EXIT: SET // RL0 := 1

JU SBR // .

FAIL: CLR // RLO := 0

SBR: SAVE // Set BR indicating function success or failure




评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54713条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。