前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows Interlocked系列函数

Windows Interlocked系列函数

作者头像
战神伽罗
发布2019-08-13 10:56:26
1K0
发布2019-08-13 10:56:26
举报

本文以InterlockedIncrement为例,来说明Windows Interlocked系列函数的实现原理。 一、InterlockedIncrement反汇编代码

如下C++代码:

#include <windows.h>

int main() { LONG l = 1; LONG j = InterlockedIncrement(&l); return 0; }

对应的反汇编代码如下:

LONG l = 1; 002D08A8 mov dword ptr [l],1 LONG j = InterlockedIncrement(&l); 002D08AF mov eax,1 002D08B4 lock xadd dword ptr [l],eax 002D08B9 inc eax 002D08BA mov dword ptr [j],eax

这里写图片描述

从上面代码可以看出,InterlockedIncrement主要是通过lock和xadd这2个汇编指令来实现的。 二、lock与xadd指令 2.1 lock

lock前缀用于锁定指定的内存地址,当这个特定内存地址被锁定后,它就可以阻止其他的系统总线读取或修改这个内存地址,从而实现原子操作。 可以结合lock使用的汇编指令如下:

BT, BTS, BTR, BTC XCHG, XADD ADD, OR, ADC, SBB AND, SUB, XOR NOT, NEG, INC, DEC

2.2 xadd

xadd指令完成交换并相加的功能。如XADD r/m32, r32,即交换r32 与r/m32;并将相加的和存储到 r/m32中。

关于xadd指令可以参考: http://scc.qibebt.cas.cn/docs/optimization/VTune(TM)%20User’s%20Guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/instruct32_hh/vc325.htm

三、InterlockedIncrement过程分析

InterlockedIncrement的处理过程如下: 【1】将eax赋值为1,即mov eax, 1 【2】使用一个xadd命令完成了下面的操作,通过伪代码表示如下:

// [l]和eax交换 temp = [l] [l] = eax eax = temp

// 将相加的和保存到[l]参数中 [l] = eax + [l]

从上面伪代码可以看到,一个xadd指令完成了多步操作,且是针对内存地址的操作,所以这行指令使用了lock前缀修饰。

【3】因为InterlockedIncrement函数返回值也会返回自增的结果,且因win32汇编的函数返回值保存在eax中,所以此时eax还要自增1(即inc eax)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档