这让我很困惑,我真的不明白为什么我会遇到这个问题。我将在c语言中创建一个程序,在设置c标志之前输出一个无符号的值,使用assembly在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。这对我来说没有意义,因为我相信我会得到一个更大的数字。任何帮助都将不胜感激。

最佳答案

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

bcs away
mov %l0, %i0

当设置了C标志并执行此分支时,mov仍将执行,并用%i0覆盖%l0中的值(最后一次添加设置C之前的值)和(添加后的值--0)。
如果你在这里插一个nop:
bcs away
nop
mov %l0, %i0

它应该给你想要的价值。

关于c - SPARC程序集,设置C标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15774623/

10-12 22:15