gpt4 book ai didi

gcc - 两个数相加

转载 作者:行者123 更新时间:2023-12-04 02:15:56 25 4
gpt4 key购买 nike

我正在尝试使用 GCC 的内联汇编器熟悉 x86 汇编。我正在尝试添加两个数字( ab )并将结果存储在 c 中.我有四种略有不同的尝试,其中三种有效;最后不会产生预期的结果。

前两个示例使用一个中间寄存器,它们都可以正常工作。第三个和第四个示例尝试在没有中间寄存器的情况下直接将两个值相加,但结果因优化级别和我添加输入值的顺序而异。我怎么了?

环境是:

i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)

首先,变量声明如下:
int a = 4;
int b = 7;
int c;

示例 1:
asm("   movl    %1,%%eax;"
" addl %2,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11

示例 2:
asm("   movl    %2,%%eax;"
" addl %1,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11

示例 3:
asm("   movl    %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14

示例 4:
// this one appears to calculate a+a instead of a+b
asm(" movl %1,%0;"
" addl %2,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=8
// output with -O3: a=4, b=7, c=11

解决了。 Matthew Slattery's answer是正确的。之前,它试图重用 eax两者都适用 bc :
movl    -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %eax
addl %eax, %eax

马修建议的修复到位后,它现在使用 ecx持有 c分别地。
movl    -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %ecx
addl %eax, %ecx

最佳答案

默认情况下,gcc将假设内联 asm块将在更新输出操作数之前完成使用输入操作数。这意味着输入和输出都可以分配给同一个寄存器。

但是,在您的示例 3 和 4 中不一定是这种情况。

例如在示例 3 中:

asm("   movl    %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);

...您已更新 c ( %0 ) 阅读前 a ( %1 )。如 gcc碰巧将相同的寄存器分配给两个 %0%1 ,那么它会计算 c = b; c += c ,因此将完全按照您观察的方式失败:
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14

您可以通过告诉 gcc 来修复它通过向操作数添加“ & ”修饰符,可以在使用输入之前使用输出操作数,如下所示:
asm("   movl    %2,%0;"
" addl %1,%0;"
: "=&r" (c)
: "r" (a), "r" (b)
);

(参见 gcc 文档中的 "Constraint Modifier Characters"。)

关于gcc - 两个数相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com