老古开发网首页
导航:老古开发网首页文章索引索引第2388页文章分类单片机第36页→[A51 3.5.4 程序地址]
| -文章搜索 - 最新文章 - |

第2366篇:A51 3.5.4 程序地址

发布时间:2006年7月20日 点击次数:884
来源:   作者:
 
 程序地址是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    
 

欢迎进入老古论坛进行讨论
[单片机] 相关文章:
[转载]基于AVR单片机的高精度频率调节器
简介:
摘要 : 精确的频率控制是现代化工业生产与高精度测试的必备手段。基于AD9850可以发生优于1Hz频率精确度的信号,这对于频率测试来说至关重要。本文介绍的这种频率调节器由Atmel公司的AVR单片机Atmega16L作为控制核心,采用4×4键盘作为频率值输入设备。AVR单片机扫描键盘并且读入用户设定的频率值。随后,AVR单片机计算出AD9850的控制字,并且对AD9850发出指令。本文介绍的频率控制器可以通过“+1Hz”键和“–1Hz”键微调频率值。本文对频率控制器扩展了液晶显示模......

SPI总线在51系列单片机系统中的实现
<转载>C编程中使用全局变量应注意的事项
单键开关机的实现
[转载]声效芯片CS4235在DSP的嵌入式系统中的应用
 
下一个:[单片机]A51 3.6 表达式和运算符
简介:
一个表达式可以是一个数值常量,一个符号化的名称,一个字符串或者一个表达式。 在我们的程序中,运算符被用来结合或比较操作数。运算符既不是汇编语言指令,也不会产生x51汇编码。它们代表一种在汇编时计算的运算。所以,运算符只能处理当程序被汇编时已知数值的计算。 表达式是数值、字符串、符号和运算符的组合,它被计算为一个32位的二进制数(对于A51:16位二进制数)。表达式在汇编时被计算,所......

上一个:[单片机]keilc51用户上电初始化程序解读(转)

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:47毫秒