just so so
来源:互联网 发布:涂子沛 大数据mobi 编辑:程序博客网 时间:2024/05/08 18:32
看了一下ARM的指令,摆弄了一下 ADS ,弄懂了几个小东西 B . 和 jmp $ 相同,自己在死循环 IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。以上两个在汇编和C语言混合编程的时候用到刚看到一篇不错的BLOG,解说C和汇编混编的,虽然貌似是翻译ADS文档的,不过写的挺不错,通俗容易懂,可以看看 其实汇编调用C貌似很简单 B Main 就完了,直接跳过去,那传递参数怎么办?根据《嵌入式系统 Boot Loader 技术内幕》里面说的用弹簧床什么的来结局,不过暂时理解不了。用ADS的一个项目中同时放汇编的S文件和C语言文件的话,那么整个连接出来,程序默认从C语言的main函数那里作为入口,刚才试了一下,发现解决办法。方法是,先将汇编的入口标签EXPORT出来, AREA adrlabel, CODE, READONLY IMPORT Main EXPORT Start ENTRY Start MOV R0,#10 ; 没有用,纯粹为了方便看 B Main B . END 这样声明了一个Start的标签提供给外面引用,然后IMPORT声明需要引用一个C语言的Main函数,好了,在修改一下连接属性,Image Entry Point 那里填 “Start” 将镜像的开始点指向Start,那么运行的时候,就先执行Start那里的汇编程序,而不是先执行C里面的Main函数了 :) ADR 装载地址,不过地址范围不能大,4KB 空间编译器会根据需要汇编成 ADD SUB 指令的。如果装载的地址比较大,则需要用 ADRL 指令。好了,貌似今天终于搞懂那个文字池(literal pool)是什么东西了。根据现在的理解,大概是这样的:首先,因为ARM一条指令只有32位,所以只能通过mov指令装载一个单字节,8位的理解数,最大是 255 。遇到需要装载32位立即数的时候,编译器采取了一个叫文字池的办法,将立即数放在那里,然后通过PC指针的偏移来取立即数。这个文字池是编译器自己取搞的,一般放在代码的后面,条件是代码长度不能超过4KB,否则编译出错,这个时候可以用一条LTORG 指令强制将文字池定位在4K范围内,那就OK了~~~不过咱们的目标是写bootloader,估计应该不用很担心这个问题,放心的用就是了。其实ADS目录下面有个例子就是说明这个问题的,下面的小例子摘取自ADS目录下面的 Examples/asm/adrlabel.s FUNC2 LDR R2,=0X55555555 MOV PC,LR ; LTORG DAT SPACE 4200 END 因为DAT空出了 4200 字节的空间,已经大于4K了,如果不加 LTORG 指令的话,那么文字池会分配在4200字节空间之后,超过4K,所以那个 LDR R2,=0X55555555 指令会出错的,然而我们如果用 LTORG 指令将文字池强制分配在那4200字节空间之前,那就解决问题了。自己试试就是了,很简单的~~~
- just so so
- just so so
- JUST SO SO
- CSDN博客,JUST SO SO
- JUST SO SO 之redis
- JUST SO SO之JVM
- JUST SO SO之多线程
- JUST SO SO 之spring
- JUST SO SO之 MySQL
- JUST SO SO之spring事务
- JUST SO SO之mybatis 缓存机制
- so
- so...
- so
- So.
- so
- so
- JUST SO SO之centOs 下 nginx安装
- 美国南德公司对中国的评价报告 (转载)
- jbpm4.3--mail
- VB 查找游戏窗口句柄的方法
- web工程的相对路径和绝对路径
- STL::set用法
- just so so
- SendMessage 用法详解及消息详解
- LINUX安装网卡驱动时提示找不到.autoconf.h
- [转】netbeans的快捷代码
- STL::map,multimap用法
- 让VB菜鸟最快写出自己的外挂.通杀所有游戏.呵呵.
- 找的不是工作,是寂寞。
- [转帖]支持PS2和USB的键盘过滤驱动(xfocus)
- jsp提交表单的乱码问题