Assembly 用于在C中除以2的内联x86 asm

Assembly 用于在C中除以2的内联x86 asm,assembly,inline-assembly,Assembly,Inline Assembly,我想用C语言转换一些东西 int div div = div/2; 使用右移(SAR)插入内联ATT x86程序集 但我无法让它工作。 如果使用=r,您将告诉编译器div中的现有值已被asm覆盖,则会非常感谢您的任何见解。要告诉它您正在读取和写入asm中的div值,请使用+r(请参阅): 通过使用=r,您告诉编译器div中的现有值被asm覆盖。要告诉它您正在读取和写入asm中的div值,请使用+r(请参阅): 通过使用=r,您告诉编译器div中的现有值被asm覆盖。要告诉它您正在读取和写入as

我想用C语言转换一些东西

int div
div = div/2;
使用右移(SAR)插入内联ATT x86程序集

但我无法让它工作。
如果使用
=r
,您将告诉编译器div中的现有值已被asm覆盖,则会非常感谢您的任何见解。要告诉它您正在读取和写入asm中的div值,请使用
+r
(请参阅):


通过使用
=r
,您告诉编译器div中的现有值被asm覆盖。要告诉它您正在读取和写入asm中的div值,请使用
+r
(请参阅):


通过使用
=r
,您告诉编译器div中的现有值被asm覆盖。要告诉它您正在读取和写入asm中的div值,请使用
+r
(请参阅):


通过使用
=r
,您告诉编译器div中的现有值被asm覆盖。要告诉它您正在读取和写入asm中的div值,请使用
+r
(请参阅):



这难道不是任何一个体面的编译器都知道该怎么做的吗?@Thilo是的,但是为了学习,我还是很想知道写这样东西的正确方法。任何一个体面的编译器都知道/2是>>1,任何一个体面的程序员都知道>>1是/2。但是请坚持!有符号除2不是有符号右移1。尝试一个负数,看看它是如何工作的。@harold>>1仍然是负数的/2,除了从0取整。这不是任何一个优秀的编译器都知道的事情吗?@Thilo是的,但是为了学习,我仍然非常想知道写这样东西的正确方法。任何一个好的编译器都知道/2是>>1,任何一个好的程序员都知道>>1是/2。但是,等等!有符号除2不是有符号右移1。尝试一个负数,看看它是如何工作的。@harold>>1仍然是负数的/2,除了从0取整。这不是任何一个优秀的编译器都知道的事情吗?@Thilo是的,但是为了学习,我仍然非常想知道写这样东西的正确方法。任何一个好的编译器都知道/2是>>1,任何一个好的程序员都知道>>1是/2。但是,等等!有符号除2不是有符号右移1。尝试一个负数,看看它是如何工作的。@harold>>1仍然是负数的/2,除了从0取整。这不是任何一个优秀的编译器都知道的事情吗?@Thilo是的,但是为了学习,我仍然非常想知道写这样东西的正确方法。任何一个好的编译器都知道/2是>>1,任何一个好的程序员都知道>>1是/2。但是,等等!有符号除2不是有符号右移1。尝试一个负数,看看结果如何。@harold>>1仍然是负数的/2,除了从0取整。让我的+1成为一个内联气体黑魔术师。太棒了!!谢谢你的回答和链接。我现在就要读了。让我的+1成为一名内联气体黑魔术师。太棒了!!谢谢你的回答和链接。我现在就要读了。让我的+1成为一名内联气体黑魔术师。太棒了!!谢谢你的回答和链接。我现在就要读了。让我的+1成为一名内联气体黑魔术师。太棒了!!谢谢你的回答和链接。我现在就读。
asm("sar %0" : "=r"(div));
asm("sar %0" : "+r"(div));