大家觉得贴吧上那些找吸引家挽回男友靠谱吗的的帖子靠谱吗

|  
|  
|  
|  
|  
只需一步,快速开始
查看: 3958|回复: 28
主人公一开始被抓之前是干什么的?
主题帖子积分
高级玩家, 积分 538, 距离下一级还需 62 积分
高级玩家, 积分 538, 距离下一级还需 62 积分
也是冒险者?为什么要穿越边境呢
主题帖子积分
卫兵& && && && && && && &
主题帖子积分
本帖最后由 lgmt 于
10:51 编辑
未来的某猪脚为拯救5代天际,将自己的灵魂穿越至5代的天际,也就是奥杜因从古代来到天际之时,并恰好在战场附身于路人甲,之后昏迷,被抓,在押运车上醒来
主题帖子积分
腹黑思密达
超级玩家, 积分 693, 距离下一级还需 307 积分
超级玩家, 积分 693, 距离下一级还需 307 积分
骚年,,这就是滚滚特有的rpg风格,,自己就是个透明人。。
主题帖子积分
中级玩家, 积分 123, 距离下一级还需 127 积分
中级玩家, 积分 123, 距离下一级还需 127 积分
就是玩家自己啊
主题帖子积分
游戏达人, 积分 2027, 距离下一级还需 1473 积分
游戏达人, 积分 2027, 距离下一级还需 1473 积分
之前的主角......就是常打機玩的
主题帖子积分
超级玩家, 积分 873, 距离下一级还需 127 积分
超级玩家, 积分 873, 距离下一级还需 127 积分
是一名住在兽人部落的兽人
用了人生如梦的路过。。。& &很有意思
主题帖子积分
中级玩家, 积分 163, 距离下一级还需 87 积分
中级玩家, 积分 163, 距离下一级还需 87 积分
那身麻袋片是监狱犯人穿的,可能是某个监狱逃出来的罪犯,打算跑到天际这个边远山区躲避一时。
主题帖子积分
游戏达人, 积分 2648, 距离下一级还需 852 积分
游戏达人, 积分 2648, 距离下一级还需 852 积分
老滚里我记得我有份遗嘱
是一个朋友给我的
他就是个工匠
我估计我也是劳动人民
主题帖子积分
高级玩家, 积分 488, 距离下一级还需 112 积分
高级玩家, 积分 488, 距离下一级还需 112 积分
哈达瓦的小白脸
主题帖子积分
高级玩家, 积分 444, 距离下一级还需 156 积分
高级玩家, 积分 444, 距离下一级还需 156 积分
某中二少年,穿越到老滚世界
主题帖子积分
中级玩家, 积分 232, 距离下一级还需 18 积分
中级玩家, 积分 232, 距离下一级还需 18 积分
主题帖子积分
高级玩家, 积分 307, 距离下一级还需 293 积分
高级玩家, 积分 307, 距离下一级还需 293 积分
之前一直在家宅着等老滚5了,这不。。。游戏一出,他就坐着马车赶来拉,没想到作者开篇的情节是砍头,估计他心头也一冷。。。自首来啦。。。
主题帖子积分
游戏狂人, 积分 1214, 距离下一级还需 786 积分
游戏狂人, 积分 1214, 距离下一级还需 786 积分
是一个玩老滚死在电脑前的人,灵魂穿越占据了一个刚死去的乞丐的肉体
主题帖子积分
他是 打酱油 路过哟id
主题帖子积分
Dragonborn
游戏狂人, 积分 1282, 距离下一级还需 718 积分
游戏狂人, 积分 1282, 距离下一级还需 718 积分
主角从赛洛迪尔来到天际是碰巧进入了帝国埋伏圈同风暴斗篷被抓(有一个MOD是不被抓,龙语墙变遗迹,没有龙,海尔根没被毁,没龙裔,不过我找不到了)
主题帖子积分
初级玩家, 积分 38, 距离下一级还需 62 积分
初级玩家, 积分 38, 距离下一级还需 62 积分
& & 奥杜因从古时穿越到现在,加大了奴役人类的进程,人类和帕图纳克斯起来反抗,却因部分人类猜疑帕图纳克斯而抗击不成,世界面临着毁灭.
& && &但人类意外的发现了一名婴儿(后来的龙裔),幸存的人类将他抚养成年人,龙的血液使他长大后成了第一勇士,他们找到了上古卷轴(能幸存的人当然是各方面的精英),希望能回到奥杜因出现之时.然而他们能力毕竟有限,只能传送一人,第一勇士接受了这个任务.没人经历过传送,不知道是否会成功.
& && &传送慢慢开始,却发生了意外,衣服被上古卷轴的能量撕碎,他也失去了记忆,赤身裸体的跌在了地上,跌在了帝国埋伏圈,被帝国人发现,并无辜被抓.
& && &本以为会死的奥杜因经过传送,来到了天际,刚刚安身,就感受到了上古卷轴的能量(他经历过上古卷轴的传送,能感应到上古卷轴的能量),连忙赶向了这里.离得越近,他越心惊,因为他感受到了自己的能量,在传送发生地探查了一番后,就赶向了自己的能量散发处.
& && &然后就是开篇了.
& && &编的不好,请各位见谅.
主题帖子积分
高级玩家, 积分 383, 距离下一级还需 217 积分
高级玩家, 积分 383, 距离下一级还需 217 积分
这个有好几代的主角都是这种犯人&&而且具体生平都不明&&可能B社想制造神秘感
主题帖子积分
超级玩家, 积分 632, 距离下一级还需 368 积分
超级玩家, 积分 632, 距离下一级还需 368 积分
不好说 老滚的风格就是不说过去&&不过新维加斯最后用一个dlc说明了主角的过去 是不是可以期待下老滚也这么来& &主角其实是皇帝的私生子? 毕竟龙裔这玩意到这个时代大部分还是靠血统流传嘛&&囧&&虽说不只有皇帝一条龙裔血脉
主题帖子积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
shijiayinew 发表于
不好说 老滚的风格就是不说过去&&不过新维加斯最后用一个dlc说明了主角的过去 是不是可以期待下老滚也这么 ...
维加斯主角过去是干啥的?
主题帖子积分
超级玩家, 积分 632, 距离下一级还需 368 积分
超级玩家, 积分 632, 距离下一级还需 368 积分
qqliuyanmeng 发表于
维加斯主角过去是干啥的?
他过去就是个邮差 不过他老家叫做分水岭 是一个核弹头遍布的地方&&邮差被子弹打了头 失去了记忆,死钱里的光头女在以前就见过他,他老家环境很恶劣,邮差是唯一出入那里的人,后来因为邮差那里毁灭了,具体我也不知道- -&&现在邮差重新回到了分水岭,和另一位邮差对决 那个dlc翻译的不完全&&大致剧情就是这样,开始后找到了眼球机器人,一路过去最后是一个人要发射核弹,你可以选择牺牲眼球机器人阻止发射,炸新加州共和国 或者炸凯撒军团&&还有可以两边都来一颗,分水岭是以前的一条秘密高速公路&&貌似是13号还是几号来着,是通往维加斯最重要的补给线,凯撒和新加州在这打的不可开交 还都是最精锐的部队,后来这炸了个核弹,两边都成僵尸了,这些成僵尸的新加州和凯撒就组成了一个僵尸军团占领了这里- -&&不和人沟通,并且吃人肉。。。 分水岭水很深的,新加州不知道在这找什么,派出了一堆敢死队,本身这里还有一种变异怪物,是核战前驻扎在这的将军把当地平民骗到了一个山洞里,做了生化试验变成的,这玩意打死亡爪都很轻松,通体黑色,住在地下,挖洞挖的很好- - 潜伏在分水岭的隧道和建筑里,当地居民在战前和驻军因为污染问题有矛盾,貌似后来得罪了将军 然后就悲剧了
主题帖子积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
shijiayinew 发表于
他过去就是个邮差 不过他老家叫做分水岭 是一个核弹头遍布的地方&&邮差被子弹打了头 失去了记忆,死钱里的 ...
这邮差太逆天了,玩这么长时间,虽然也知道主角是邮差但没怎么玩DLC,谢谢你喽
主题帖子积分
超级玩家, 积分 632, 距离下一级还需 368 积分
超级玩家, 积分 632, 距离下一级还需 368 积分
qqliuyanmeng 发表于
这邮差太逆天了,玩这么长时间,虽然也知道主角是邮差但没怎么玩DLC,谢谢你喽 ...
岂止是逆天啊- - 简直就是成神了。。要知道&&一个人穿越分水岭的只有邮差了,不过貌似dlc里的那个人也算是个邮差,其他人都过不来,抽空看看如果分水岭那部dlc汉化好了还是玩玩的好,那确实感觉比维加斯残破多了,好多路都是隐藏在废弃倾倒的大楼里,而且死亡爪很多,还有变种加强版的,里边会爬的小黑人轻易虐杀死亡爪- -& &
主题帖子积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
shijiayinew 发表于
岂止是逆天啊- - 简直就是成神了。。要知道&&一个人穿越分水岭的只有邮差了,不过貌似dlc里的那个人也算 ...
一直没玩懂剧情的说,一开始我基本没做任何任务就直接宰了班尼
主题帖子积分
超级玩家, 积分 632, 距离下一级还需 368 积分
超级玩家, 积分 632, 距离下一级还需 368 积分
本帖最后由 shijiayinew 于
06:42 编辑
qqliuyanmeng 发表于
一直没玩懂剧情的说,一开始我基本没做任何任务就直接宰了班尼
维加斯的剧情有点像天际的内战--&&不过是两大势力明面上争夺一片区域,另外两个势力在幕后夺取维加斯,明面的就是凯撒,新加州,暗地里就是豪斯和班尼,不过班尼就是个代理,实际上另一势力是班尼和一个天启者改造的机器人- -&&都是为了夺得新维加斯,主角深陷其中,一开始主角就是为豪斯运送白金筹码,一个强大的处理芯片,没有芯片豪斯就不能升级自己的机器人军团,豪斯其实雇了6个邮差,只有主角运送的是真的,ps分水岭里的那个对手邮差其实比主角早接到这个任务,不过感觉水深就放弃了,这就是开端,班尼干的主角半死,得到了白金筹码不过不知道怎么用,所以就一直拿着- - 直到主角bang了他,班尼改造的机器人叫yesman,设定的人格是你问他啥他都告诉你,你让他干啥他都干,而且不分人,只要是命令就执行,你可以选择这4个势力最后得到维加斯,反正维加斯不是你的,你就是一个帮凶把- -好多人选择yesman以为自己最后能成老大的,结果都囧了。&&吐槽下 维加斯地图真挺小的,不过洞穴挺多。
4个势力代表4种趋势, 豪斯是集中资源发展科技,把梦想寄托在了宇宙和未来,不过他做事不在意过程,是那种为了多数人可以果断牺牲少数人的那种,许多人不喜欢就是了。 yesman代表的是维加斯在机器人管理下的独立,算是比较好的一个结局,不过机器以后是否会失控谁都不好说,感觉隐患很大。&&新加州致力恢复战前的资本主义社会,腐败滋生,不过有现代文明的感觉,表面上的旗号就是自由人权这些,但是特权者也依然存在。 凯撒则是罗马式帝国国家,没有人可以闲下来,这保证了人类基因的优异性,也提高了社会产能,虽然牺牲了人权,不过确实是废土末日里最能保证人类延续的方式0 0&&说实话维加斯其实挺深奥的,感觉比天际的内战意义要深很多,4种选择都很纠结,都很不好选
主题帖子积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
游戏狂人, 积分 1567, 距离下一级还需 433 积分
shijiayinew 发表于
维加斯的剧情有点像天际的内战--&&不过是两大势力明面上争夺一片区域,另外两个势力在幕后夺取维加斯,明 ...
我选的豪斯,至于牺牲很多人 这个很能理解,没有牺牲哪来的历史呢
主题帖子积分
游戏达人, 积分 2827, 距离下一级还需 673 积分
游戏达人, 积分 2827, 距离下一级还需 673 积分
酱油妹路过-.-
主题帖子积分
高级玩家, 积分 301, 距离下一级还需 299 积分
高级玩家, 积分 301, 距离下一级还需 299 积分
主题帖子积分
超级玩家, 积分 915, 距离下一级还需 85 积分
超级玩家, 积分 915, 距离下一级还需 85 积分
主角不是打酱油的吗?
潜行的混沌
Powered by在main()之前,IAR都做了啥_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
在main()之前,IAR都做了啥
上传于||文档简介
&&对于了解系统的编译运行过程有帮助
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢在main之前,IAR都做了啥-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
在main之前,IAR都做了啥
来源:互联网 发表时间: 6:24:40 责任编辑:王亮字体:
为了帮助网友解决“在main之前,IAR都做了啥”相关的问题,学网通过互联网对“在main之前,IAR都做了啥”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:在main之前,IAR都做了啥,具体解决方案如下:解决方案1:并设置为MSP的值。接下来IAP程序获取0x0800&#39,是CM3要求放置中断向量表的地方。         首先系统复位时;25FF:   0   0   E1D   0      这个程序是由IAP程序来启动的,为了写好启动代码;0'4000处的MSP值(0x00处获取栈顶地址,花了一些时间了解了IAR在main()以前做了些什么事,即主堆栈最大范围是0x2000&#39,打算使用IAR,IAP程序获取0x4获取第一个指令的跳转地址,用来初始化MSP寄存器的值:   __vector_table。   这里是一个程序的启动区的反汇编。这些地址。   接下来从代码区偏移0x4处的Reset_Handler的地址(0x0800&#39最近要在Cortex-M3上写一个简单的操作系统,Cortex-M3从代码区偏移0xE1D),并跳转到Reset_Handler()执行
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号最近要在Cortex-M3上写一个简单的操作系统,打算使用IAR,为了写好启动代码,花了一些时间了解了IAR在main()以前做了些什么事。
首先系统复位时,Cortex-M3从代码区偏移0x处获取栈顶地址,用来初始化MSP寄存器的值。
接下来从代码区偏移0x获取第一个指令的跳转地址。这些地址,是CM3要求放置中断向量表的地方。
这里是一个程序的启动区的反汇编:
__vector_table:& & 2600&&&&&&
& & 2000&&&&&&
& & 7E1D&&&&&&
& & 0800&&&&&
这个程序是由IAP程序来启动的,IAP程序获取0x处的MSP值(0x),并设置为MSP的值,即主堆栈最大范围是0xx2000'25FF。接下来IAP程序获取0x处的Reset_Handler的地址(0xD),并跳转到Reset_Handler()执行。
IAP在这里完全是模仿了Cortex-M3的复位序列,也就是说,在没有IAP的系统上,CM3只能从0x获取MSP,从0x获取第一条指令所处地址。而IAP就存在在0x这个地址上,IAP的启动,已经消耗掉了这个复位序列,所以IAP要启动UserApp程序的时候,也是完全模仿Cortex-M3的复位序列的。
接下来我们看看复位后第一句指令&&Reset_Handler()函数里有什么。
若我们使用的是ST公司标准外设库,那么已经有了现成的Reset_Handler,不过他是弱定义&&PUBWEAK,可以被我们重写的同名函数覆盖。一般来说,我们使用的都是ST提供的Reset_Handler,在V3.4版本的库中,可以在startup_stm32f10x_xx.s中找到这个函数:
&&&&&&& PUBWEAK Reset_Handler&&&&&&& SECTION .text:CODE:REORDER(2)Reset_Handler&&&&&&& LDR&&&& R0, =SystemInit&&&&&&& BLX&&&& R0&&&&&&& LDR&&&& R0, =__iar_program_start&&&&&&& BX&&&&& R0
看来ST没有做太多的事,他只调用了自家库提供的SystemInit函数进行系统时钟、Flash读取的初始化,并把大权交给了__iar_program_start这个IAR提供的&内部函数&了,我们就跟紧这个__iar_program_start跳转,看看IAR做了什么,上面一段代码的反汇编如下:
&&&&&&&Reset_Handler:__iar_section$$root:& 08007E1C& 4801&&&&& LDR&&&&&&&&& R0, [PC, #0x4]; LDR&&&& R0, =SystemInit&&08007E1E& 4780&&&&& BLX&&&&&&&&& R0;BLX&&&& R0&&01&&&&& LDR&&&&&&&&& R0, [PC, #0x4];LDR&&&& R0, =__iar_program_start&&00&&&&& BX&&&&&&&&&& R0;BX&&&&& R0& C69&&&&&&
& 00&&&&&&
& D8D&&&&&&
& 08007E2A& 0800&&&&&
细心的观众会发现地址是0xC,比我们查到的0xD差了1,这是ARM家族的遗留问题,因为ARM处理器的指令至少是半字对齐的(16位THUMB指令集 or 32位ARM指令集),所以PC指针的LSB是常为0的,为了充分利用寄存器,ARM公司给PC的LSB了一个重要的使命,那就是在执行分支跳转时,PC的LSB=1,表示使用THUMB模式,LSB=0,表示使用ARM模式,但在最新的Cortex-M3内核上,只使用了THUMB-2指令集挑大梁,所以这一位要常保持1,所以我们查到的地址是0xD(C=1100,D=1101),放心,我们的CM3内核会忽略掉LSB(除非为0,那么会引起一个fault),从而正确跳转到0xC。
从0x处的加载指令,我们可以算出__iar_program_start所处的位置,就是当前PC指针(0x),再加上4,即0x处的所指向的地址&&0xD(0xC),我们跟紧着跳转,__iar_program_start果然在这里:
__iar_program_start:& 08007D8C& F000F88C& BL&&&&&&&&&& __low_level_init& 00&&&&& CMP&&&&&&&&& R0, #0x0& 08007D92& D001&&&&& BEQ&&&&&&&&& __iar_init$$done& 08007D94& F7FFFFDE& BL&&&&&&&&&& __iar_data_init2
& 00&&&&& MOVS&&&&&&&& R0, #0x0& 08007D9A& F7FDFC49& BL&&&&&&&&&& main
我们看到IAR提供了__low_level_init这个函数进行了&底层&的初始化,进一步跟踪,我们可以查到__low_level_init这个函数做了些什么,不是不是我们想象中的不可告人。
__low_level_init:& 001&&&&& MOVS&&&&&&&& R0, #0x1& 08007EAA& 4770&&&&& BX&&&&&&&&&& LR
__low_level_init出乎想象的简单,只是往R0寄存器写入了1,就立即执行"BX LR"回到调用处了,接下来,__iar_program_start检查了R0是否为0,为0,则执行__iar_init$$done,若不是0,就执行__iar_data_init2。__iar_init$$done这个函数很简单,只有2句话,第一句是把R0清零,第二句就直接"BL main",跳转到main()函数了。不过既然__low_level_init已经往R0写入了1,那么我们还是得走下远路&&看看__iar_data_init2做了些什么,虽然距离main只有一步之遥,不过这中间隐藏了编译器的思想,我们得耐心看下去。
__iar_data_init2:& 08007D54& B510&&&&& PUSH&&&&&&&& {R4,LR}& 04&&&&& LDR&&&&&&&&& R0, [PC, #0x10]& C04&&&&& LDR&&&&&&&&& R4, [PC, #0x10]& 08007D5A& E002&&&&& B&&&&&&&&&&& 0x8007D62& 08007D5C& F8501B04& LDR&&&&&&&&& R1, [R0], #0x4& 88&&&&& BLX&&&&&&&&& R1& A0&&&&& CMP&&&&&&&&& R0, R4& 08007D64& D1FA&&&&& BNE&&&&&&&&& 0x8007D5C& 08007D66& BD10&&&&& POP&&&&&&&&& {R4,PC}& C78&&&&&&
& 08007D6A& 0800&&&&&&
& 08007D6C& 7C9C&&&&&
& 08007D6E& 0800&&&&&
看来IAR迟迟不执行main()函数,就是为了执行__iar_data_init2,我们来分析分析IAR都干了些什么坏事~
首先压R4,LR入栈,然后加载0x至R0,0xC至R4,马上跳转到0x执行R0,R4的比较,结果若是相等,则弹出R4,PC,然后立即进入main()。不过IAR请君入瓮是自不会那么快放我们出来的&&结果不相等,跳转到0xC执行,在这里,把R0指向的地址&&0x中的值&&0x加载到R1,并且R0中的值自加4,更新为0xC,并跳转到R1指向的地址处执行,这里是另一个IAR函数:__iar_zero_init2:
__iar_zero_init2:& 00&&&&& MOVS&&&&&&&& R3, #0x0& 08007D72& E005&&&&& B&&&&&&&&&&& 0x8007D80& 08007D74& F8501B04& LDR&&&&&&&&& R1, [R0], #0x4& 08007D78& F8413B04& STR&&&&&&&&& R3, [R1], #0x4& 08007D7C& 1F12&&&&& SUBS&&&&&&&& R2, R2, #0x4& 08007D7E& D1FB&&&&& BNE&&&&&&&&& 0x8007D78& 08007D80& F8502B04& LDR&&&&&&&&& R2, [R0], #0x4& A00&&&&& CMP&&&&&&&&& R2, #0x0& 08007D86& D1F5&&&&& BNE&&&&&&&&& 0x8007D74& 70&&&&& BX&&&&&&&&&& LR& 08007D8A& 0000&&&&& MOVS&&&&&&&& R0, R0
__iar_data_init2还没执行完毕,就跳转到了这个__iar_zero_inti2,且看我们慢慢分析这个帮凶&&__iar_zero_inti2做了什么。
__iar_zero_inti2将R3寄存器清零,立即跳转到0x执行'LDR&&&&&&&&& R2, [R0], #0x4',这句指令与刚才在__iar_data_init2见到的'LDR&&&&&&&&& R1, [R0], #0x4'很类似,都为&后索引&。这回,将R0指向的地址&&0xC中的值&&0x加载到R2寄存器,然后R0中的值自加4,更新为0x。接下来的指令检查了R2是否为0,显然这个函数没那么简单想放我我们,R2的值为2F4,我们又被带到了0x处,随后4条指令做了如下的事情:
1、将R0指向的地址&&0x中的值&&0x加载到R1寄存器,然后R0中的值自加4,更新为0x。
2、将R1指向的地址&&0x中的值&&改写为R3寄存器的值&&0,然后R1中的值自加4,更新为0x。
3、R2自减4
4、检查R2是否为0,不为0,跳转到第二条执行。不为,则执行下一条。
这简直就是一个循环!&&C语言的循环for(r2=0x2F4;r2-=4;r!=0){...},我们看看循环中做了什么。
第一条指令把一个地址加载到了R1&&0x 是一个RAM地址,以这个为起点,在循环中,对长度为2F4的RAM空间进行了清零的操作。那为什么IAR要做这个事情呢?消除什么记录么?用Jlink查看这片内存区域,可以发现这片区域是我们定义的全局变量的所在地。也就是说,IAR在每次系统复位后,都会自动将我们定义的全局变量清零0。
清零完毕后,接下来的指令"LDR&&&&&&&&& R2, [R0], #0x4"将R0指向的地址&&0x中的值&&0加载到R2寄存器,然后R0中的值自加4,更新为0x。随后检查R2是否为0,这里R2为0,执行'BX LR'返回到__iar_data_init2函数,若是不为0,我们可以发现又会跳转至&4指令&处进行一个循环清零的操作。
读到这里,我们应该可以猜到IAR的意图了:__iar_data_init2一开始加载了0x至R0,0xC至R4,[R0,R4]就是一段启动代码区,在这个区域内保存了要&处理&的所有地址与信息&&执行的函数地址或者参数,实际上,这片区域也有一个名字,叫做:Region$$Table$$Base。在这个区域内,程序以R0为索引,R4为上限,当R0=R4,__iar_data_init2执行完毕,跳转至main()函数。
好了,保持我们这个猜想,继续跟踪我们的PC指针&&我们回到了__iar_data_init2函数中,第一件事就是比较R0,R4的值,可惜的是,仍然不相等,我们又被带到了0xC,至此,我们应该能看出这是一个__iar_data_init2的&主循环&,这也验证了我们对IAR意图的猜想~
& __iar_data_init2中的&主循环&:
& 08007D5C& F8501B04& LDR&&&&&&&&& R1, [R0], #0x4& 88&&&&& BLX&&&&&&&&& R1& A0&&&&& CMP&&&&&&&&& R0, R4
我们可以等价写为:for(r0=0x,r4=0xC;r0!=r4;r0+=4){...}
此时,我们的R0为0x,经过&指令1&,R0变为0xC,R1为0x。我们来看看,7C55处,IAR又要执行何种操作。
__iar_copy_init2:& 08007C54& B418&&&&& PUSH&&&&&&&& {R3,R4}& 08007C56& E009&&&&& B&&&&&&&&&&& 0x8007C6C& 08007C58& F8501B04& LDR&&&&&&&&& R1, [R0], #0x4& 08007C5C& F8502B04& LDR&&&&&&&&& R2, [R0], #0x4& 08007C60& F8514B04& LDR&&&&&&&&& R4, [R1], #0x4& 08007C64& F8424B04& STR&&&&&&&&& R4, [R2], #0x4& F1B&&&&& SUBS&&&&&&&& R3, R3, #0x4& 08007C6A& D1F9&&&&& BNE&&&&&&&&& 0x8007C60& 08007C6C& F8503B04& LDR&&&&&&&&& R3, [R0], #0x4& B00&&&&& CMP&&&&&&&&& R3, #0x0& 08007C72& D1F1&&&&& BNE&&&&&&&&& 0x8007C58& 08007C74& BC12&&&&& POP&&&&&&&&& {R1,R4}& 70&&&&& BX&&&&&&&&&& LR
这是一个名为__iar_copy_init2的函数,他执行了什么"copy"操作呢?
首先压R3,R4入栈,然后跳转到0xC,从R0&&Region$$Table$$Base中取出参数0x238放入R3,接下来的指令大家应该都熟悉了,0x238不为0,所以我们被带至7C58处,再次从Region$$Table$$Base中取出参数0x放入R1,从Region$$Table$$Base取出参数0x放入R2处。细心的观众应该能察觉这和__iar_zero_init2中取参数的几乎一样:先取出大小,随后取出了地址&&只不过这里多出了1个地址,没错这就是"copy",随后的指令
& 08007C60& F8514B04& LDR&&&&&&&&& R4, [R1], #0x4& 08007C64& F8424B04& STR&&&&&&&&& R4, [R2], #0x4& F1B&&&&& SUBS&&&&&&&& R3, R3, #0x4& 08007C6A& D1F9&&&&& BNE&&&&&&&&& 0x8007C60则是另一个&4指令&,指令1将R1指向地址的数据读到R4,指令2将R2指向地址的数据改写为R4的数据,指令3、4是完成一个循环。
说到这里大家都应该明白了&&这就是一个"copy"的操作,从Flash地址0x起,将长度0x238的数据拷贝到RAM地址0x中。
通过Jlink,我们可以看到这片区域是我们定义的并且已初始化的全局变量。也就是说,每次复位后,IAR在此处进行全局变量的初始化。
在这&4指令&执行完毕后,再次从Region$$Table$$Base中取出参数,为0,比较之后条件符合,函数返回__iar_data_init2。
此时的R0已经为0xC与R4相等,__iar_data_init2终于完成它的使命。
& 00&&&&& MOVS&&&&&&&& R0, #0x0& 08007D9A& F7FDFC49& BL&&&&&&&&&& main
将R0清零以后,IAR放弃主动权,把PC指针交给了用户程序的入口&&main()。
但请注意,这里使用的是BL指令进行main跳转,也就是说,main函数只是IAR手中的一个子程序,若是main函数执行到了结尾,接下来则会执行exit等IAR提供的&退出&函数。这些函数,等待下回分解~
总之,IAR在启动main()函数以前,执行了Reset_Handler,调用SystemInit()(ST库提供)进行时钟,Flash读取初始化,并转入__iar_program_start中执行__low_level_init与__iar_data_init2,并在__iar_data_init2中,先后调用__iar_zero_init2与__iar_copy_init2对全局变量、全局已初始化变量进行相应的初始化操作。最后,调用main()函数执行。
这就是IAR在启动main()函数之前做的事情,它并没有那么神秘,只要花些时间,就可以跟跟踪分析出这个过程。
若是有帮助,留个言支持下,我会继续写一些个人的经验与大家分享~欢迎留言交流问题与经验~若是有错误,还请指正!
阅读(...) 评论()

我要回帖

更多关于 女朋友觉得我不靠谱 的文章

 

随机推荐