汇编代码求解释

时间:2020-12-20 04:47:49
00026 {
LONG NTAPI InterlockedDecrement  (  LPLONG  lpAddend   )   

{        LONG ret;
      __asm__
       (
                 "\tlock\n"  /* for SMP systems */
                 "\txaddl %0, (%1)\n"
                "\tdecl %0\n"
               :"=r" (ret)
                :"r" (lpAddend), "0" (-1)
                : "memory"
        );
         return ret;
}

学过2天汇编,但是从来没看到过有这么写法的,求高人指点一二.


还有哪里可以找到相关的资料啊.

5 个解决方案

#1


这是gcc的内联汇编的语法,请参看gcc的manual

#2


内联汇编__asm表示开始使用汇编代码
至于里面的东西,由于不同编译器要求不同所以建议看相关的文档

#3


to Cody2k3

能解释一下代码的意思吗?

#4


应该是锁定变量的增长吧,在 SMP 中非常重要的一个应用。

#5


简单说一下吧, 这个东西还是比较麻烦的,不过看linux kernel又不得不看这些东西,楼主还是抽空仔细读读manual的好
__asm__
       (
                 "\tlock\n"  /* for SMP systems */
                 "\txaddl %0, (%1)\n"
                "\tdecl %0\n"
               :"=r" (ret)
                :"r" (lpAddend), "0" (-1)
                : "memory"
        );

第一个:后面代表输出变量, 第二个:后面代表输入变量,第三个:后面代表发生变化的量
从第一个:开始数,分别是%0,%1, %2, 所以%0就是引用ret所在的寄存器,%1就是引用lpAddend所在的寄存器,“=r"代表分配任意一个寄存器给ret和lpAddend,"0"(-1)代表分配给ret的寄存器的初值是-1,\t, \n这种格式府可以先不管,那么上面的指令实际相当于
movl -1, reg1
movl lpAddend, reg2
------------
lock
addl reg1, (reg2)
decl reg1
------------
movl reg1, ret
前两句和最后一句都是gcc自动帮你完成的,reg1和reg2是编译器自动帮你挑选的两个通用寄存器,所以这个函数的作用就是把一个共享的变量减一。
:memory说明在此操作中有内存发生变化,所以有些缓存的量要求重新再从内存读取。

另外注意以上的代码是AT&T的语法,dst和src是反的。


#1


这是gcc的内联汇编的语法,请参看gcc的manual

#2


内联汇编__asm表示开始使用汇编代码
至于里面的东西,由于不同编译器要求不同所以建议看相关的文档

#3


to Cody2k3

能解释一下代码的意思吗?

#4


应该是锁定变量的增长吧,在 SMP 中非常重要的一个应用。

#5


简单说一下吧, 这个东西还是比较麻烦的,不过看linux kernel又不得不看这些东西,楼主还是抽空仔细读读manual的好
__asm__
       (
                 "\tlock\n"  /* for SMP systems */
                 "\txaddl %0, (%1)\n"
                "\tdecl %0\n"
               :"=r" (ret)
                :"r" (lpAddend), "0" (-1)
                : "memory"
        );

第一个:后面代表输出变量, 第二个:后面代表输入变量,第三个:后面代表发生变化的量
从第一个:开始数,分别是%0,%1, %2, 所以%0就是引用ret所在的寄存器,%1就是引用lpAddend所在的寄存器,“=r"代表分配任意一个寄存器给ret和lpAddend,"0"(-1)代表分配给ret的寄存器的初值是-1,\t, \n这种格式府可以先不管,那么上面的指令实际相当于
movl -1, reg1
movl lpAddend, reg2
------------
lock
addl reg1, (reg2)
decl reg1
------------
movl reg1, ret
前两句和最后一句都是gcc自动帮你完成的,reg1和reg2是编译器自动帮你挑选的两个通用寄存器,所以这个函数的作用就是把一个共享的变量减一。
:memory说明在此操作中有内存发生变化,所以有些缓存的量要求重新再从内存读取。

另外注意以上的代码是AT&T的语法,dst和src是反的。