lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.top-me.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    汇编里 import 和export

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    汇编里 import 和export

    帖子 由 Admin 于 2013-08-13, 9:43 am

    B   .   和 jmp $  相同,自己在死循环
    IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的
    EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。
    以上两个在汇编和C语言混合编程的时候用到
    刚看到一篇不错的BLOG,解说C和汇编混编的,虽然貌似是翻译ADS文档的,不过写的挺不错,通俗容易懂,可以看看
    其实汇编调用C貌似很简单
    B Main 就完了,直接跳过去,那传递参数怎么办?根据《嵌入式系统 Boot Loader 技术内幕》里面说的用弹簧床什么的来结局,不过暂时理解不了。
    用ADS的一个项目中同时放汇编的S文件和C语言文件的话,那么整个连接出来,程序默认从C语言的main函数那里作为入口,刚才试了一下,发现解决办法。方法是,先将汇编的入口标签EXPORT出来,
          AREA adrlabel, CODE, READONL
          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字节空间之前,那就解决问题了。自己试试就是了,很简单的~~~
    avatar
    枫林霜叶
    论坛版主
    论坛版主

    帖子数 : 20
    威望 : 0
    注册日期 : 13-09-19

    回复: 汇编里 import 和export

    帖子 由 枫林霜叶 于 2013-12-01, 8:49 pm

    最近在学51的汇编指令,有些怎么看都不太明白.就是那个访问外部程序储存器的指令MOVX,一直不太懂.例如:
    MOV     DPTR     #0FBFFh
    MOV     A,#6Eh
    MOVX   @DPTR,A
    我的理解是P0,P2分别先输出FFh,FBH作为地址。然后P0口在输出6EH作为数据呢?这对不对呢?
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    回复: 汇编里 import 和export

    帖子 由 Admin 于 2013-12-01, 10:09 pm

    枫林霜叶 写道::最近在学51的汇编指令,有些怎么看都不太明白.就是那个访问外部程序储存器的指令MOVX,一直不太懂.例如:
    MOV     DPTR     #0FBFFh
    MOV     A,#6Eh
    MOVX   @DPTR,A
    我的理解是P0,P2分别先输出FFh,FBH作为地址。然后P0口在输出6EH作为数据呢?这对不对呢?
    具体是怎么完成的是单片机自己的时序了,不是还有专门的读写引脚吗,好像还有个啥ALE的

      目前的日期/时间是2018-04-25, 6:40 am