楼主: chandge

[其他] 求汇编实现程序跳转

[复制链接]

该用户从未签到

12

主题

66

帖子

0

新手上路

Rank: 1

积分
156
最后登录
1970-1-1
 楼主| 发表于 2012-5-9 10:28:53 | 显示全部楼层

回复:求汇编实现程序跳转

回复第 10 楼 于2012-05-09 10:11:30发表:
回复第 7 楼 于2012-05-09 09:21:29发表:
回复第 6 楼 于2012-05-09 04:55:27发表:
回复第 5 楼 于2012-05-08 16:46:18发表:
 jmp的方式我也试过...还是不行,调试跟踪发现PC指针在jmp后,的确指向了bootloader的地址,但之后就运行不下去了...怀疑:数据寄存器D0~D7和地址寄存器A0~A7中之前的数据是否影响了内核在bootloader段的正常运行。
 

不知你的bootloader是不是当作一个完整的程序编译,如果是你应该跳到他的启动向量,由启动向量跳到系统的启动代码(_startup),启动代码作完初始化后才跳到你写的代码。你如果直接跳到你的代码,你自己应确认是否作完了该做的系统初始化。
如果把bootloader当作你应用程序的一部分编译,应确认你的bootloader不使用被编程区域的子程序,中断向量......
 
 
我的bootloader和application都是作为独立的程序编译的,当然都有自己的启动、初始化的部分。而jmp过去后的flash地址我设定为0x0000 0500,也是从s19文件中分析得到的bootloader启动的地址,这个地址后面的代码肯定是要运行startup代码的。我把我bootloader的s19文件贴上来,你们看一下吧。
 

 

你的500地址存的是什么?是启动向量吗?
 
额..coldfire的引导向量应该是在0x0000 0000 - 0x0000 0400之间,0x500貌似不是启动flash引导向量段的吧....
你可以分析一下这个s19文件,我是在CW10.2下编写的裸板程序。
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-5-9 11:00:36 | 显示全部楼层

回复:求汇编实现程序跳转

回复第 11 楼 于2012-05-09 10:28:53发表:
回复第 10 楼 于2012-05-09 10:11:30发表:
回复第 7 楼 于2012-05-09 09:21:29发表:
回复第 6 楼 于2012-05-09 04:55:27发表:
回复第 5 楼 于2012-05-08 16:46:18发表:
 jmp的方式我也试过...还是不行,调试跟踪发现PC指针在jmp后,的确指向了bootloader的地址,但之后就运行不下去了...怀疑:数据寄存器D0~D7和地址寄存器A0~A7中之前的数据是否影响了内核在bootloader段的正常运行。
 

不知你的bootloader是不是当作一个完整的程序编译,如果是你应该跳到他的启动向量,由启动向量跳到系统的启动代码(_startup),启动代码作完初始化后才跳到你写的代码。你如果直接跳到你的代码,你自己应确认是否作完了该做的系统初始化。
如果把bootloader当作你应用程序的一部分编译,应确认你的bootloader不使用被编程区域的子程序,中断向量......
 
 
我的bootloader和application都是作为独立的程序编译的,当然都有自己的启动、初始化的部分。而jmp过去后的flash地址我设定为0x0000 0500,也是从s19文件中分析得到的bootloader启动的地址,这个地址后面的代码肯定是要运行startup代码的。我把我bootloader的s19文件贴上来,你们看一下吧。
 

 

你的500地址存的是什么?是启动向量吗?
 
额..coldfire的引导向量应该是在0x0000 0000 - 0x0000 0400之间,0x500貌似不是启动flash引导向量段的吧....
你可以分析一下这个s19文件,我是在CW10.2下编写的裸板程序。
 
 

 

你的连接文件怎么写的?你自己检查一下。别人读你的s19文件相当于别人要破解你的二进制程序,工作量相当大。
如果0x500不是启动引导向量,你直接跳过去能运行吗?如果你非要跳到500,即使500是你的代码开始地址,你特意把你的main()定位到500,而且重写了系统初始化代码了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

66

帖子

0

新手上路

Rank: 1

积分
156
最后登录
1970-1-1
 楼主| 发表于 2012-5-9 11:25:12 | 显示全部楼层

回复:求汇编实现程序跳转

回复第 12 楼 于2012-05-09 11:00:36发表:
回复第 11 楼 于2012-05-09 10:28:53发表:
回复第 10 楼 于2012-05-09 10:11:30发表:
回复第 7 楼 于2012-05-09 09:21:29发表:
回复第 6 楼 于2012-05-09 04:55:27发表:
回复第 5 楼 于2012-05-08 16:46:18发表:
 jmp的方式我也试过...还是不行,调试跟踪发现PC指针在jmp后,的确指向了bootloader的地址,但之后就运行不下去了...怀疑:数据寄存器D0~D7和地址寄存器A0~A7中之前的数据是否影响了内核在bootloader段的正常运行。
 

不知你的bootloader是不是当作一个完整的程序编译,如果是你应该跳到他的启动向量,由启动向量跳到系统的启动代码(_startup),启动代码作完初始化后才跳到你写的代码。你如果直接跳到你的代码,你自己应确认是否作完了该做的系统初始化。
如果把bootloader当作你应用程序的一部分编译,应确认你的bootloader不使用被编程区域的子程序,中断向量......
 
 
我的bootloader和application都是作为独立的程序编译的,当然都有自己的启动、初始化的部分。而jmp过去后的flash地址我设定为0x0000 0500,也是从s19文件中分析得到的bootloader启动的地址,这个地址后面的代码肯定是要运行startup代码的。我把我bootloader的s19文件贴上来,你们看一下吧。
 

 

你的500地址存的是什么?是启动向量吗?
 
额..coldfire的引导向量应该是在0x0000 0000 - 0x0000 0400之间,0x500貌似不是启动flash引导向量段的吧....
你可以分析一下这个s19文件,我是在CW10.2下编写的裸板程序。
 
 

 

你的连接文件怎么写的?你自己检查一下。别人读你的s19文件相当于别人要破解你的二进制程序,工作量相当大。
如果0x500不是启动引导向量,你直接跳过去能运行吗?如果你非要跳到500,即使500是你的代码开始地址,你特意把你的main()定位到500,而且重写了系统初始化代码了吗?
 
 
我不知道你所说的引导向量是什么意思。FLASH起始段有一段程序引导段,可以引导PC指针从任意固定的FLASH段
开始执行程序,你所说的引导向量如果指的是这个的话,那我的app程序跳转之后是避过这一段,直接进入bootloader代码区,然后开始执行bootloader的startup,之前有师兄在HCS12内核中这样做过,的确也没问题。所用的汇编就是我一楼贴出来的那一段,与jmp的区别在于RTC指令过后,PC指针执行通用地址寄存器出栈后的地址(也就是boot段地址)。
我感觉你对FLASH中代码铺写理解还有些模糊,要么就是您没有表达清楚啊。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-5-9 11:51:15 | 显示全部楼层

    RE:求汇编实现程序跳转

    比如:S3090000400400004A1850
    这个是用来存放启动向量的,那么你可以获得:
    真正的启动向量是:0004A18。
    你把你的文件生产.S19发上来,我给你分析一下,你发的哪个文件的格式太乱。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12

    主题

    66

    帖子

    0

    新手上路

    Rank: 1

    积分
    156
    最后登录
    1970-1-1
     楼主| 发表于 2012-5-9 12:29:42 | 显示全部楼层

    回复:求汇编实现程序跳转

    回复第 14 楼 于2012-05-09 11:51:15发表:
    比如:S3090000400400004A1850
    这个是用来存放启动向量的,那么你可以获得:
    真正的启动向量是:0004A18。
    你把你的文件生产.S19发上来,我给你分析一下,你发的哪个文件的格式太乱。 

    这个是我的application的s19,有一点先说明一下,bootloader和application是独立编译的,之间没有任何联系。现在bootloader可以顺利升级到application,也就是0x0000 0000 - 0x0000 0400的引导向量段固定为从0x0000 4000段的application代码启动。现在需要实现的是:前提,1引导向量段固定 2bootloader段固定 3application段固定。  结果:bootloader程序 和 application程序之间可以实现互相跳转。
    (bootloader的s19已经在前面贴出来了)

    Switch_Application_3.3.14.elf.rar

    36.5 KB, 下载次数: 7

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12

    主题

    66

    帖子

    0

    新手上路

    Rank: 1

    积分
    156
    最后登录
    1970-1-1
     楼主| 发表于 2012-5-9 12:34:05 | 显示全部楼层

    RE:求汇编实现程序跳转

    我编写的bootloader和 安 提供的52259demo的bootloader不同,我只参考了其中s19文件在Flash中铺写的那一部分。其他部分都是按自己需要设计的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    99

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    322
    最后登录
    1970-1-1
    发表于 2012-5-9 12:34:46 | 显示全部楼层

    回复:求汇编实现程序跳转

    回复第 13 楼 于2012-05-09 11:25:12发表:
    回复第 12 楼 于2012-05-09 11:00:36发表:
    回复第 11 楼 于2012-05-09 10:28:53发表:
    回复第 10 楼 于2012-05-09 10:11:30发表:
    回复第 7 楼 于2012-05-09 09:21:29发表:
    回复第 6 楼 于2012-05-09 04:55:27发表:
    回复第 5 楼 于2012-05-08 16:46:18发表:
     jmp的方式我也试过...还是不行,调试跟踪发现PC指针在jmp后,的确指向了bootloader的地址,但之后就运行不下去了...怀疑:数据寄存器D0~D7和地址寄存器A0~A7中之前的数据是否影响了内核在bootloader段的正常运行。
     

    不知你的bootloader是不是当作一个完整的程序编译,如果是你应该跳到他的启动向量,由启动向量跳到系统的启动代码(_startup),启动代码作完初始化后才跳到你写的代码。你如果直接跳到你的代码,你自己应确认是否作完了该做的系统初始化。
    如果把bootloader当作你应用程序的一部分编译,应确认你的bootloader不使用被编程区域的子程序,中断向量......
     
     
    我的bootloader和application都是作为独立的程序编译的,当然都有自己的启动、初始化的部分。而jmp过去后的flash地址我设定为0x0000 0500,也是从s19文件中分析得到的bootloader启动的地址,这个地址后面的代码肯定是要运行startup代码的。我把我bootloader的s19文件贴上来,你们看一下吧。
     

     

    你的500地址存的是什么?是启动向量吗?
     
    额..coldfire的引导向量应该是在0x0000 0000 - 0x0000 0400之间,0x500貌似不是启动flash引导向量段的吧....
    你可以分析一下这个s19文件,我是在CW10.2下编写的裸板程序。
     
     

     

    你的连接文件怎么写的?你自己检查一下。别人读你的s19文件相当于别人要破解你的二进制程序,工作量相当大。
    如果0x500不是启动引导向量,你直接跳过去能运行吗?如果你非要跳到500,即使500是你的代码开始地址,你特意把你的main()定位到500,而且重写了系统初始化代码了吗?
     
     
    我不知道你所说的引导向量是什么意思。FLASH起始段有一段程序引导段,可以引导PC指针从任意固定的FLASH段
    开始执行程序,你所说的引导向量如果指的是这个的话,那我的app程序跳转之后是避过这一段,直接进入bootloader代码区,然后开始执行bootloader的startup,之前有师兄在HCS12内核中这样做过,的确也没问题。所用的汇编就是我一楼贴出来的那一段,与jmp的区别在于RTC指令过后,PC指针执行通用地址寄存器出栈后的地址(也就是boot段地址)。
    我感觉你对FLASH中代码铺写理解还有些模糊,要么就是您没有表达清楚啊。

     

    我把我从Freescale学的Coldfire V2 的启动过程描述一下,你看我什么地方理解错了:
    按Freescale的规矩,程序执行的第一条指令是跳转到_startup的指令。这条指令是就是“引导向量”--- Freesccale 本部的工程师就这么叫,不是我起的名字。
    如果你用CW默认的方式建立一个工程,CW应该自动给你生成这个_startup代码。_startup执行硬件初始化后,最后跳到你写的代码的Main(),这才开始执行你的程序。就这么简单。
    上边安版主也说的很清楚了。Freescale之所以搞出这么个“引导向量”是因为根据你连接文件的设置,_startup和你的Main()可能会定位在任何非500的地方。这也是我问你在500地址存了东西的原因。
    你跳转到你的Bootloader模块时,如果不想用所谓的“引导向量”,应该跳到_startup,由_startup自动(找你的main在什么地址,然后)跳到你的main()。如果你不想用Freescale现成的结构,你可能要吃透freescale写的_startup里的汇编。
    另外你Bootloader用到的中断向量在500地址前设好了没有?和你的app分开了么?
     
    安版主提到的跳转指令没有问题,这也是Freescale用的。我的Bootloader严格按Freescale的规矩写的,就用上边几条,现在几百台系统出去了,很多系统都是一天运行20+小时,运行好几年了还没有出过问题。
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12

    主题

    66

    帖子

    0

    新手上路

    Rank: 1

    积分
    156
    最后登录
    1970-1-1
     楼主| 发表于 2012-5-9 12:59:51 | 显示全部楼层

    回复:求汇编实现程序跳转

    回复第 17 楼 于2012-05-09 12:34:46发表:
    回复第 13 楼 于2012-05-09 11:25:12发表:
    回复第 12 楼 于2012-05-09 11:00:36发表:
    回复第 11 楼 于2012-05-09 10:28:53发表:
    回复第 10 楼 于2012-05-09 10:11:30发表:
    回复第 7 楼 于2012-05-09 09:21:29发表:
    回复第 6 楼 于2012-05-09 04:55:27发表:
    回复第 5 楼 于2012-05-08 16:46:18发表:
     jmp的方式我也试过...还是不行,调试跟踪发现PC指针在jmp后,的确指向了bootloader的地址,但之后就运行不下去了...怀疑:数据寄存器D0~D7和地址寄存器A0~A7中之前的数据是否影响了内核在bootloader段的正常运行。
     

    不知你的bootloader是不是当作一个完整的程序编译,如果是你应该跳到他的启动向量,由启动向量跳到系统的启动代码(_startup),启动代码作完初始化后才跳到你写的代码。你如果直接跳到你的代码,你自己应确认是否作完了该做的系统初始化。
    如果把bootloader当作你应用程序的一部分编译,应确认你的bootloader不使用被编程区域的子程序,中断向量......
     
     
    我的bootloader和application都是作为独立的程序编译的,当然都有自己的启动、初始化的部分。而jmp过去后的flash地址我设定为0x0000 0500,也是从s19文件中分析得到的bootloader启动的地址,这个地址后面的代码肯定是要运行startup代码的。我把我bootloader的s19文件贴上来,你们看一下吧。
     

     

    你的500地址存的是什么?是启动向量吗?
     
    额..coldfire的引导向量应该是在0x0000 0000 - 0x0000 0400之间,0x500貌似不是启动flash引导向量段的吧....
    你可以分析一下这个s19文件,我是在CW10.2下编写的裸板程序。
     
     

     

    你的连接文件怎么写的?你自己检查一下。别人读你的s19文件相当于别人要破解你的二进制程序,工作量相当大。
    如果0x500不是启动引导向量,你直接跳过去能运行吗?如果你非要跳到500,即使500是你的代码开始地址,你特意把你的main()定位到500,而且重写了系统初始化代码了吗?
     
     
    我不知道你所说的引导向量是什么意思。FLASH起始段有一段程序引导段,可以引导PC指针从任意固定的FLASH段
    开始执行程序,你所说的引导向量如果指的是这个的话,那我的app程序跳转之后是避过这一段,直接进入bootloader代码区,然后开始执行bootloader的startup,之前有师兄在HCS12内核中这样做过,的确也没问题。所用的汇编就是我一楼贴出来的那一段,与jmp的区别在于RTC指令过后,PC指针执行通用地址寄存器出栈后的地址(也就是boot段地址)。
    我感觉你对FLASH中代码铺写理解还有些模糊,要么就是您没有表达清楚啊。

     

    我把我从Freescale学的Coldfire V2 的启动过程描述一下,你看我什么地方理解错了:
    按Freescale的规矩,程序执行的第一条指令是跳转到_startup的指令。这条指令是就是“引导向量”--- Freesccale 本部的工程师就这么叫,不是我起的名字。
    如果你用CW默认的方式建立一个工程,CW应该自动给你生成这个_startup代码。_startup执行硬件初始化后,最后跳到你写的代码的Main(),这才开始执行你的程序。就这么简单。
    上边安版主也说的很清楚了。Freescale之所以搞出这么个“引导向量”是因为根据你连接文件的设置,_startup和你的Main()可能会定位在任何非500的地方。这也是我问你在500地址存了东西的原因。
    你跳转到你的Bootloader模块时,如果不想用所谓的“引导向量”,应该跳到_startup,由_startup自动(找你的main在什么地址,然后)跳到你的main()。如果你不想用Freescale现成的结构,你可能要吃透freescale写的_startup里的汇编。
    另外你Bootloader用到的中断向量在500地址前设好了没有?和你的app分开了么?
     
    安版主提到的跳转指令没有问题,这也是Freescale用的。我的Bootloader严格按Freescale的规矩写的,就用上边几条,现在几百台系统出去了,很多系统都是一天运行20+小时,运行好几年了还没有出过问题。
     
     

    额,原来是BOSS啊,小弟冒犯了.....不过我提到的“引导向量”我和您理解的还是有所不同。
    我说一下我的理解,通过编译一些不同的工程,我发现s19文件中,对FLASH 0x0000 0000 - 0x0000 0400这一区域的格式是相同的,我提到的“引导向量”也是指的这一区域,它的作用是指定了内核之后将会从FLASH内的哪个地址运行程序。
    之于startup,的确是一个初始化硬件,引导程序的代码段,不过我 反汇编 后观察,发现startup的部分代码(比如说 startup(void) 这段汇编)是在我编译后程序代码段之内的。比如说,我将程序规定在0x0000 4000之后的128K空间内,那在debug时,通过反汇编,发现startup(void) 运行的地址是在0x0000 4000之后。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12

    主题

    66

    帖子

    0

    新手上路

    Rank: 1

    积分
    156
    最后登录
    1970-1-1
     楼主| 发表于 2012-5-9 12:59:54 | 显示全部楼层

    回复:求汇编实现程序跳转

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    99

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    322
    最后登录
    1970-1-1
    发表于 2012-5-9 13:46:44 | 显示全部楼层

    RE:求汇编实现程序跳转

    想跟你确认一下:你的boodloader是定位在Flash的前16K,应用程序在后边?如果这样你应该以很好的理解了启动过程,要不然你的Bootloader不可能成功的跳到应用程序。

    如果你用Freescale默认的工程结构,从app跳bootloader应该跳到bootloader的启动向量(我记得是0x0000 0000),该向量说白了就是一条跳转到_startup的指令。由_startup去找你的Main()在什么地方,你不要自己去找。

    因为开发Bootloader是4-5年前的事了,具体的地址记不清了,但原理肯定没错。
    你可以简单试一下,不要跳到0x0000 0500, 跳到0x0000 0000,   
    asm (JMP 0x0000 0000); 看是否能解决你的问题,如果再不行我再给你翻翻我的笔记  
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 11:48 , Processed in 0.108136 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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