让我感到困惑,我真的无法弄清楚为什么我会遇到这个问题。我将在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.这对我有意义,因为我相信我应该得到更多的数字。任何帮助将不胜感激。
答案 0 :(得分:3)
问题是Sparc上的分支被延迟了 - 分支之后的下一条指令将在分支实际执行之前执行。所以当你有:
bcs away
mov %l0, %i0
当设置了C标志并且执行了此分支时,mov
仍将执行,覆盖%i0
中的值(设置C的最后一次添加之前的值){{1} (add - 0之后的值)。
如果你在这里贴一个小鸟:
%l0
它应该给你你想要的价值。