SPARC Assembly,设置C标志

时间:2013-04-02 21:21:02

标签: c assembly 32-bit sparc

让我感到困惑,我真的无法弄清楚为什么我会遇到这个问题。我将在c中创建一个程序,在C标志设置之前输出一个无符号值,使用assembly用addcc累加变量,然后将值发送回main中的c。我相信我对c的代码是正确的:

unsigned int func();

int main(void){
    printf("The max value before the C flag is set is: %u\n", func());
}

现在装配问题就出现了......

.global func
func: save %sp, -128, %sp
addcc %g0, 1, %g0
clr %l0

loop:
bcs away
mov %l0, %i0
addcc %i0, 1, %l0
ba loop
nop

away:
ret
restore

这应该做的是累积%l0,当设置C标志时,将值传递回%i0并返回它。当我运行这个时,我得到0.这对我有意义,因为我相信我应该得到更多的数字。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

问题是Sparc上的分支被延迟了 - 分支之后的下一条指令将在分支实际执行之前执行。所以当你有:

bcs away
mov %l0, %i0

当设置了C标志并且执行了此分支时,mov仍将执行,覆盖%i0中的值(设置C的最后一次添加之前的值){{1} (add - 0之后的值)。

如果你在这里贴一个小鸟:

%l0

它应该给你你想要的价值。