米尔科技提醒您:您的浏览器版本过低或者使用了兼容模式,为了获得更好的浏览体验,建议使用IE10以上的浏览器或使用极速模式。 请升级浏览器以获得更好的体验!

内嵌汇编程序调用顺序不同导致结果不同是怎么回事?

问题类别: > 浏览次数:2733
发布日期:2012/4/23 17:05:16 文章来源:米尔科技
回复日期:2020/12/20 9:59:18

环境说明

RealView MDK3.05以上

分析描述

在MDK中有如下内嵌汇编函数 __asm long Division32(long Dividend, long Divisor) { SDIV R0,R1 } __asm long long MAC64(long long L00, long L0, long L1) { SMLAL R0,R1,R2,R3 } 在主程序中分别调用他们 L00=MAC64(100000000,1000,20000); L0=Division32(10000000,3000); 当两个函数的调用位置交换之后,为什么L00和L0结果会不同?

问题解答

      主要的问题是内嵌汇编函数的最后没有BX LR,按照上面内嵌汇编函数的定义顺序:
      如果先调用MAC64,则在执行完MAC64后它会自动执行接在它后面的程序而不会返回到调用它的地方。这样L00可以得到正确的结果,但是L0得不到,因为Division32根本就没有被调用。
      如果先调用Division32,则在执行完Division32后它会自动执行它后面的程序,也就是MAC64。不过这个时候MAC64并没有被调用,MAC64里面R0,R1的值是执行完Division32后的值。这样L0可以得到正确的结果但是L00却不行。