访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
A51 3.5.4 程序地址
内容导读:
 程序地址是CODE或ECODE存储器类型的绝对或者可以重定位的表达式。典型的程序地址被用于跳转和调用指令中。对于间接跳转或调用,我们需要装载一个寄存器或跳转表中的程序地址。下面的跳转和调用指令都是可能的:

SJMP
JZ
JNZ …

相对跳转,包括条件跳转(CJNE,DJNZ,JB,JBC,JC,……)和非条件SJMP指令。可寻址的偏移量为离开紧跟在相对跳转指令后面的指令的首字节-128到+127字节。当我们在代码中使用相对跳转指令时,我们必须用一个表达式来估计跳转目标的代码地址。汇编器完成所有的偏移运算。如果目标地址超出范围,汇编器会产生一条出错信息。
   
ACALL
AJMP


块内跳转和调用只能访问程序空间的2K字节块内的地址。当跳转或调用指令被执行时,程序计数器的低11位被替换。对于Dallas 390连续型模式,块的大小为512KB或19位。如果ACALL或AJMP是块中的最后一条指令,程序计数器的高端位改变,跳转将被限制在ACALL或AJMP指令后面的程序块内。

LCALL
LJMP
长跳转和调用允许访问程序空间的64K字节段中任意地址。当跳转或调用指令被执行时,程序计数器的低16位被替换。对于Dallas 390连续型模式,块的大小为16MB或24位。对于菲利浦80C51MX和英特尔/爱特梅尔WM 251:如果LCALL或LJMP是64K字节段中的最后一条指令,程序计数器的高端位改变,跳转指令将被限制在LCALL或LJMP指令后面的程序段内。
   
ECALL
EJMP
扩展的跳转和调用允许在英特尔/爱特梅尔WM 251或菲利浦80C51MX扩展的程序空间内访问。
   
CALL
JMP
通用跳转和调用是两条不代表具体操作码的指令助记符。JMP可以被汇编为SJMP,AJMP,LJMP,EJMP。CALL可以被汇编为ACALL,LCALL或ECALL。通用助记符通常被估计为一条指令,没有必要是最短的指令,只要达到指定的程序地址操作数就可以。

适用于所有8051版本的例子

EXTRN    CODE    (my_function)
  CSEG AT 3  
  JMP ext_int ; 一个中断向量
       
?PR?myintr SEGMENT CODE ; 为程序代码定义一个段
  RSEG ?PR?myintr  
ext_int: JB FLAG, flag_OK  
  INC my_var  
flag_OK: CPL FLAG  
  RETI    
      ; http://gonghighloam.21ic.org 罗亩的笔记
?PR?myprog SEGMENT CODE INBLOCK ; 2K块内的一个段
  RSEG ?PR?myprog  
func1: CALL sub_func ; 将产生ACALL
loop: CALL my_function ; 外部函数 -> LCALL
  MOV A,my_var  
  JNZ loop  
  RET    
      http://gonghighloam.21ic.org   罗亩的笔记
sub_func: CLR FLAG  
  MOV R0, #20  
loop1: CALL my_function  
  DJNZ R0, loop1  
  RET    

在菲利浦80C51MX和英特尔/爱特梅尔WM 251中使用EJMP,ECALL的例子

EXTRN ECODE:FAR (my_farfunc)  
Reset EQU ECODE 0FF0000H ; 251上的复位地址
       
?PR?my_seg SEGMENT ECODE ; 定义一个EDATA类型的段
  RSEG ?PR?my_seg  
      ; http://gonghighloam.21ic.org罗亩的笔记
func1 PROC FAR ; 使用ECALL调用的FAR函数
  CALL func2 ; 产生LCALL
  JNB Flag, mylab ; 产生ECALL
  EJMP Reset  
mylab: ERET    
  ENDP    
      http://gonghighloam.21ic.org   罗亩的笔记
func2 PROC NEAR  
  CALL my_farfunc ; 产生ECALL
  RET    
  ENDP    
 
标签:
来源: 作者: 时间:2006/9/25 16:50:53
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐