【发布时间】:2015-04-22 14:11:39
【问题描述】:
上下文:
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 行?
它应该在一个单词中移动很长。但它已经由我完成,并且花费了我一个多余的时钟。
有什么解决方法吗?
这只是我没有设置的选项吗?
谢谢
【问题讨论】:
标签: linux assembly x86-64 cpu-registers att