搜索
bottom↓
回复: 17

WinAvr中嵌入汇编如何使用跳转命令至指定地址?

[复制链接]

出0入0汤圆

发表于 2005-1-17 16:51:57 | 显示全部楼层 |阅读模式
例如定义一个函数A() 定位于 0x1000

文件中如此使用

#define rcall_A() __asm__ __volatile__ ("rcall 0x1000
")

假设A()在rcall指令的4K范围内.编译后却得不到正确得结果.....

使用icall好像一样有问题.有谁研究过得?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2005-1-17 17:08:57 | 显示全部楼层
用c语言的setjump不行么?

出0入0汤圆

发表于 2005-1-17 17:41:02 | 显示全部楼层
用嵌入汇编方式也可以asm("rjmp 0X####");

出0入0汤圆

发表于 2005-1-17 18:56:49 | 显示全部楼层
声明函数指针

void (*callfuc)(void) = 0x1000;



过程调用

callfuc();

出0入0汤圆

发表于 2005-1-17 19:35:37 | 显示全部楼层
为什么要这样做,这样太危险了!建议不要这样做

出0入0汤圆

发表于 2005-1-17 19:41:22 | 显示全部楼层
???????????????????????????????????????

出0入0汤圆

 楼主| 发表于 2005-1-18 08:20:05 | 显示全部楼层
多谢hotpower,函数指针应该是个好办法.怎么没有想到

to zhonghua_li :如何说"太"危险了?详细解释下?

to kingco: 嵌入汇编我试过了,或许是我书写方法不对.没有成功,我再试试.

to lanmp: setjmp.h至今没用过,还不敢肯定.. 我去看看.

出0入0汤圆

发表于 2005-1-18 12:30:21 | 显示全部楼层
哈哈...如果连这点都不具备,岂敢在MCU中"行走江湖"???



那样,非让别人搞成"糨糊"不可...



"非典"少碰点,但不能不沾...

出0入0汤圆

发表于 2005-1-18 12:40:27 | 显示全部楼层
hotpower 确实不错啊!高手中的高手.

出0入0汤圆

发表于 2005-1-18 13:02:07 | 显示全部楼层
我是菜鸟我怕谁???

出0入0汤圆

 楼主| 发表于 2005-1-19 10:29:10 | 显示全部楼层
测试过后<除了setjmp> 都不行.附上测试程序.看看有问题不?我编译后sendChar位于0x5c

#include <avr/io.h>



void sendChar(void)

{

        while(!(UCSRA & (1<<UDRE)));

        UDR = 0xDD;

}



void (*sendChar2)(void) = sendChar;

// void (*sendChar2)(void) = (void*)0x005c;



void main(void)

{

        UCSRB = 0x00;

        UBRRH = (7372800/115200/16 - 1)/256;

        UBRRL = (7372800/115200/16 - 1)%256;

        UCSRA = 0x00;

        UCSRB = (1<<TXEN);

       

        while(!(UCSRA & (1<<UDRE)));

        UDR = 0xAA;       

       

//        sendChar();

//       asm volatile ("rcall 0x5c
");

//        asm volatile ("ldi r30,0x5c
" "clr r31
" "icall
");

        sendChar2();

       

        while(!(UCSRA & (1<<UDRE)));

        UDR = 0xBB;

       

        while(1);

}

出0入0汤圆

发表于 2005-1-19 10:41:44 | 显示全部楼层
(*sendChar2)();试试

我一般都是定义一个函数指针类型 typedef void (*void_fp) (void);

然后 void_fp sendchar2;

调用的时候 sendchar2();就行了
-----此内容被lanmp于2005-01-19,10:49:45编辑过

出0入0汤圆

 楼主| 发表于 2005-1-19 10:51:53 | 显示全部楼层
直接输出sendChar的地址,是0x2E :( 晕.调用0x2E是正确的.... 0x5C只是字节地址,需要的应该是字地址...

出0入0汤圆

 楼主| 发表于 2005-1-19 10:54:22 | 显示全部楼层
多谢大家了,我的疏忽浪费大家时间了.

出0入0汤圆

 楼主| 发表于 2005-1-19 11:32:26 | 显示全部楼层
问了许多.自己小结下:

1.flash中寻址是以字进行的,而我们常用的pgm_read_char之类的函数参数却是字节地址!

2.需要如此做法的是为了在bootloader程序和app程序中进行代码的共用.m8空间太小了:(

3.直接操作,猜测还可以一个函数多用,如在switch(status)状态转换中.例行的已知的状态跳转不就方便了?!

出0入0汤圆

发表于 2011-10-12 22:30:54 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-9-26 15:47:37 | 显示全部楼层
hotpower 发表于 2005-1-18 13:02
我是菜鸟我怕谁???

您真是高手,我一直在思考直接跳转的方法。
(*((void (*)(void)) 0xf300)) ();,
或者#define test 0xf300
然后(*((void (*)(void)) test)) ();

这样可以直接跳转,但是我想让它带参数跳呢?该怎么办。

您的方法是void (*test)(void) = 0xf300;

然后直接test()就可以转到test函数了
如果定义void (*test2)(char t) = 0xf300;
就可以test(t)

如果定义void (*test3)(char a,char b) = 0xf300;
就可以test(a,b)

感谢您。

出0入0汤圆

发表于 2012-9-26 15:50:22 | 显示全部楼层
hotpower 发表于 2005-1-18 13:02
我是菜鸟我怕谁???

我也在我的帖子里对您表示了感谢,谢谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 11:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表