user-0 提问: 帮忙看下这段汇编代码

回复:
user: user-0
content: 引用 4 楼 user-2 的回复:看cmpw指令应该是PowerPc的指令集，对这个不太了解。 Warning: using `%dx' instead of `%edx' due to `w' suffix 这个貌似应该是30行开始的。 cmpw 指令 比较的应该是32bit的数据，看这个警告，应该是两个操作数有问题。   :"=m" (plock->pid)  :"q" (pid)  第一个冒号是输出操作数，第二个冒号是输入操作数。在这段内联汇编里应该都是做输入才对。 30行和40行两段 中间又没C代码，合并一起会比较好。  参考链接： 内联汇编：http://blog.csdn.net/liuqiaoyu080512/article/details/8457528 GCC：https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Machine-Constraints.html#Machine-Constraints PPC汇编入门：http://blog.csdn.net/skywind/article/details/6347684  仅供参考。 谢谢,看了一下参考的链接,虽然更多的还是不懂.但是至少现在语法上面没有太多的误区了.

user: user-0
content: 引用 5 楼 a198997 的回复:spinlock.c:43: Error: operand size mismatch for `xadd'  spinlock.c:72: Error: operand size mismatch for `add'  spinlock.c:87: Error: operand size mismatch for `xadd' 这几个是使用xadd，add指令与后面的操作符的运算位数不对应。 很久没用了，忘了具体指令。xaddw 是16位计算，其他的忘了，你对应一下。   spinlock.c:90: Error: no such instruction: `mv %eax,$-1'  spinlock.c:91: Error: no such instruction: `mv -24(%ebp),%eax'  spinlock.c:125: Error: no such instruction: `mvw %eax,%eax'  spinlock.c:126: Error: no such instruction: `mvw (%edx),%eax' 这几个应该是指令使用错误，看看指令有没有写错的。  PS： __asm__ __volatile__(             "cmpw %1, %0\n"             "jne 1f\n"             "call abort\n"             "1:"             :"=m" (plock->pid)             :"q" (pid)              :"memory", "cc"             );       __asm__ __volatile__(             "1:\n"             "cmpw %1, %0\n"             "jne 1b\n"             "lock xaddw %1, %2\n"             :"=q" (unlock), "=m" (plock->lock)             :"q" (lock)             :"memory", "cc"             );   这两个完全可以放一起写。。。 谢谢,你说的的确.今天又看了一下,操作符后面可以接b,w,l分别表示bit(8), word(16), long(32).至于add报的错误,是因为add必须有一个参数是m类型的才可以.所以     __asm__ __volatile__(             "1:\n"             "cmpw %1, %0\n"             "jne 1b\n"             "lock xaddw %2, %1\n"             :"=q" (unlock), "=m" (plock->lock)             :"q" (lock), "m" (plock->lock)             :"memory", "cc"             ); 这样写就是可以的.

user: user-1
content: spinlock.c:43: Error: operand size mismatch for `xadd'  spinlock.c:72: Error: operand size mismatch for `add'  spinlock.c:87: Error: operand size mismatch for `xadd' 这几个是使用xadd，add指令与后面的操作符的运算位数不对应。 很久没用了，忘了具体指令。xaddw 是16位计算，其他的忘了，你对应一下。   spinlock.c:90: Error: no such instruction: `mv %eax,$-1'  spinlock.c:91: Error: no such instruction: `mv -24(%ebp),%eax'  spinlock.c:125: Error: no such instruction: `mvw %eax,%eax'  spinlock.c:126: Error: no such instruction: `mvw (%edx),%eax' 这几个应该是指令使用错误，看看指令有没有写错的。  PS： __asm__ __volatile__(             "cmpw %1, %0\n"             "jne 1f\n"             "call abort\n"             "1:"             :"=m" (plock->pid)             :"q" (pid)              :"memory", "cc"             );       __asm__ __volatile__(             "1:\n"             "cmpw %1, %0\n"             "jne 1b\n"             "lock xaddw %1, %2\n"             :"=q" (unlock), "=m" (plock->lock)             :"q" (lock)             :"memory", "cc"             );   这两个完全可以放一起写。。。

user: user-2
content: 看cmpw指令应该是PowerPc的指令集，对这个不太了解。 Warning: using `%dx' instead of `%edx' due to `w' suffix 这个貌似应该是30行开始的。 cmpw 指令 比较的应该是32bit的数据，看这个警告，应该是两个操作数有问题。   :"=m" (plock->pid)  :"q" (pid)  第一个冒号是输出操作数，第二个冒号是输入操作数。在这段内联汇编里应该都是做输入才对。 30行和40行两段 中间又没C代码，合并一起会比较好。  参考链接： 内联汇编：http://blog.csdn.net/liuqiaoyu080512/article/details/8457528 GCC：https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Machine-Constraints.html#Machine-Constraints PPC汇编入门：http://blog.csdn.net/skywind/article/details/6347684  仅供参考。

user: user-0

user: user-0
content: 第一次发帖啊.没有人回答吗?

user: user-0
content: 就是按着自己的思路实现的一个简单的自旋锁.因为对于汇编实在是一窍不通.坑爹队友还一直催,所以就想走个捷径,希望能够得到大牛们的指点.