首页
社区
课程
招聘
[旧帖] 求一条汇编指令:能判断一处内存的数据如果为假,就置成真。 0.00雪花
发表于: 2012-12-12 15:41 8441

[旧帖] 求一条汇编指令:能判断一处内存的数据如果为假,就置成真。 0.00雪花

2012-12-12 15:41
8441
我想这样来实现线程的同步,我一直以为可以用个全局变量来作标志,然后赋值来解决的,后来发现不能同步。现在要一条指令实现就可以。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 2993
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
只能是一条指令?
2012-12-15 18:37
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
InterlockedBitTestAndSet
2012-12-15 20:29
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
进来学习下啊
2012-12-17 11:19
0
雪    币: 214
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
InterlockedCompareExchange()
对应的汇编指令是lock cmpxchg r/m, r
2012-12-17 12:42
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用 InterlockedCompareExchange 就能满足楼主的线程同步要求。
2012-12-17 13:16
0
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
如果只是简单的为假就置真可以用not,xor,or等指令吧?
2012-12-17 19:13
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
同感,如果只是一条指令的话,用xor把数值与“假”值作异或运算应该就可以了吧。
2012-12-21 14:43
0
雪    币: 20
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
or dword prt [mem],1
2013-2-24 12:54
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
10
假设标志存储在bool Flag中
or Flag,1

or mem,imm可以加上lock前缀锁总线以保证实现“原子操作”
lock or Flag,1

不过我在Ring0的代码中有锁总线的行为时有时会导致BSOD,原因不明。
====================分割线=====================
另外还是推荐LZ利用Windows提供的各种机制实现同步。内联汇编会带来无数麻烦……
2013-2-24 19:34
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我求这指令是因为我想把判断资源是否被占用的操作原子化,只要把这些操作放到关中断和开中断中间就ok了,我想windows的函数也许是这样实现原子化的吧。这么简单的问题居然没想到。。。。。。。。。。。。。。。。。
2013-7-3 15:29
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
汇编单条指令并不代表是原子化的
2013-7-3 16:52
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
话又不说完,怎么不原子化了?难不成一条汇编指令的执行过程会被中断?
2013-7-3 20:21
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
请问所有种类的cpu中那种是关中断的指令在执行过程中都要被打断的?哪位天才发明的啊。
2013-7-3 20:26
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你关中断然后执行一段指令,不被打断,再开中断,那只是单核的同步问题。如果是多核处理器,只能用原子操作来同步。你说为何是原子操作,难道一条指令中间还会被打断吗?一条指令确实不会被中断,但是在多核情况下,对内存的操作可能就不同步了。举个简单例子。
inc 某个内存,而不是inc 寄存器。
这个inc ,先把内存读进来,再加1 ,再写入内存。是这3个步骤,中断是不可能的。单核不会出错,如果内存原来是1,执行以后就是2 。
现在看多核的情况,核1,读内存为1,加1,等于2,还没有写入内存,慢点,核2也开始读内存了,内存还是1,也加1,核2也准备写入内存了,不管核1还是核2先后写入,内存最后结果是2,而这就是2个核没有同步,我们都知道同步的结果应该是3 ,核1加1,核2再加1吗,等于3,很简单。
所以要用lock操作,锁住内存总线,核1读出内存为1,加1,再写入内存之前,lock总线,核2是不可能读内存的,只有等核1写入结果2,核2再读内存,读出2,加1,写入3到内存。这样就同步执行了,结果正确。
2013-7-3 22:31
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
16
多个核心,需加kock前缀锁总线,才安全。
2013-7-4 08:36
0
雪    币: 19
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
如果只是为了实现自进程现成同步,你得到当前过程地址,然后动态调用不是就可以!

另外也可以建立一个消息钩子来实现!

汇编的话可以

在 Thread 1  {
      xor Tr,0


Thread 2 {
    cmp Tr,0
    Jne @aa:

@aa:
}

楼上几位的方法也不错!
2013-7-4 10:12
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
[QUOTE=小色;1145484]or dword prt [mem],1[/QUOTE]

小色大大正解,,我是QQ 952203029
2013-7-5 15:52
0
游客
登录 | 注册 方可回帖
返回
//