内嵌汇编程序调用顺序不同导致结果不同是怎么回事?
问题类别:ARM软件工具 > Keil MDK | 浏览次数:5711 |
发布日期: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却不行。