gpt4 book ai didi

linux - 汇编 - 编译器看不到我的内联更改?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:41 24 4
gpt4 key购买 nike

上下文:

Linux 64。

GCC 4.8.2(带 -O3 -march=native)

我左手下的x86_64 abi,​​在第21页打开。

C代码:

int main (int argc, char ** argv) {

int16_t h = atoi(argv[1]) ;
int16_t p;

__asm__ ("mov %2, %0\n\t"
"rol $8,%1\n\t"
: "=r" (p) /* output operands */
: "0"(p),"g"(h)/* input operands */
:"cc"); /* clobbered operands */

printf("%d %d\n", h, p);
return 0;

}

汇编代码(问题所在的行):

    ...
movl $10, %edx
movq 8(%rsi), %rdi
xorl %esi, %esi
call strtol
xorl %edx, %edx
movl $.LC0, %edi
#APP
# 1627 "test2ptr.c" 1
movl %ax, %dx <- set in %dx
rol $8,%dx

# 0 "" 2
#NO_APP
movswl %ax, %esi
movswl %dx, %edx <- Then this line should not appear
xorl %eax, %eax
call printf
xorl %eax, %eax
...

如果我评论它,结果很好。

但我不能依赖于修改源代码(不可维护:每次更改源代码中的某些内容时,都必须回到那个位置以确保它仍在工作......不行)。

问题:

为什么保留行 movswl %dx, %edx

总之要搬长。但它已经由我完成,并花费了我一个多余的时钟。

有什么解决方法吗?

这只是我没有设置的选项吗?

谢谢

最佳答案

由于您指定了 16 位类型,但 printf 需要 32 位整数,因此您的结果需要进行符号扩展,这正是该代码所做的。尽管如此,如果您为 printf 使用了正确的格式,那么两个版本应该会产生相同的输出。

像往常一样,您不需要内联 asm 来进行轮换,而且如果您在内联 asm 中使用 mov 很可能是您做错了。

关于linux - 汇编 - 编译器看不到我的内联更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636763/

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