汇编代码求解释

boywang 2006-08-08 02:02:22
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天汇编,但是从来没看到过有这么写法的,求高人指点一二.


还有哪里可以找到相关的资料啊.
...全文
194 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cody2k3 2006-08-09
  • 打赏
  • 举报
回复
简单说一下吧, 这个东西还是比较麻烦的,不过看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是反的。


大熊猫侯佩 2006-08-08
  • 打赏
  • 举报
回复
应该是锁定变量的增长吧,在 SMP 中非常重要的一个应用。
boywang 2006-08-08
  • 打赏
  • 举报
回复
to Cody2k3

能解释一下代码的意思吗?
我啃 2006-08-08
  • 打赏
  • 举报
回复
内联汇编__asm表示开始使用汇编代码
至于里面的东西,由于不同编译器要求不同所以建议看相关的文档
Cody2k3 2006-08-08
  • 打赏
  • 举报
回复
这是gcc的内联汇编的语法,请参看gcc的manual

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧