0

这让我感到困惑,我真的无法弄清楚为什么我会遇到这个问题。我要在 c 中创建一个程序,该程序在设置 C 标志之前输出一个无符号值,使用程序集通过 addcc 累积一个变量,并将该值发送回 c 中的 main。我相信我的 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。这对我来说很有意义,因为我相信我应该得到一个更大的数字。任何帮助,将不胜感激。

4

1 回答 1

3

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

bcs away
mov %l0, %i0

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

如果你在这里坚持:

bcs away
nop
mov %l0, %i0

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

于 2013-04-02T21:36:36.577 回答