kingman 发表于 2009-4-18 18:22:58

GOTO和CALL指令的不同使用

在PIC的汇编程序中,CALL与GOT0指令使用的场台不同。CALL是用来调用子程序的,在调用完子程序后返回到调用前的程序;而GOTO是无条件转移,即由此状态进入另外一个状态而不需要返回。  为了使程序更加具有可读性,使流程更加清晰、合理,通常程序都采用模块化程序设计,即将程序按照功能分成不同的子程序,而主程序则相当简洁,只须采用CALL指令对子程序进行调用。  由于PIC单片机的堆栈有限,在程序中不能无止境地使用GOTO指令,否则会使堆栈溢出,程序无法正常运行。但是在有些时候,例如当程序出现分支时,则不得不使用GOTO指令。对于PICl6F7x系列单片机,程序出现分支时只能通过STATUS寄存器的Z位或C位进行判断。这时在两种情况的前一种情况下,必须使用GOTO指令进行转移;否则在执行完第一种情况后,紧接着又执行第二种情况。程序如下:  BTFSS STATUS,Z  GOTO A  GOTO B  在跳转到A时,必须使用GOTO指令;否则执行完这条语句以后,紧接着执行GOTO B。这样无论Z为何值,程序都将跳转到B。而对于GOT0 B,则可以不必使用GOTO指令。  在上面这种情况下,由于GOTO只在子程序内部进行跳转,小程序内部循环占用堆栈的级数不多,因此使用GOTO指令是可行的。但是在大的程序中使用GOTO指令,将有可能无法返回到调用前的下一条指令。  因此,笔者建议,在使用汇编语言进行程序设计时,应该将程序分解成一级级的子程序;然后在程序之间进行调用,尽量将GOTO指令跳转的范围缩小。
页: [1]
查看完整版本: GOTO和CALL指令的不同使用