谁能帮我解释一下以下汇编指令

发布网友 发布时间:2022-04-23 12:53

我来回答

1个回答

热心网友 时间:2023-10-14 07:31

第一条cmpxchg8b[esi]比较并交换8个字节, 这个指令在386机及后续有效 inline static bool cas(void* pdst, u comp, u xchgn)
{
__asm
{
lea esi, comp; //将comp的地址放入esi
mov eax, [esi]; //将esi(comp)的内容放入eax ,即4个字符的长度
mov edx, 4[esi];//第esi的第四个到第七个字符放入esi即字符串comp的comp[4]~comp[7]lea esi, xchgn; //将xchgn的地址放入esi
mov ebx, [esi]; //同第二条指令,只不过现在是把数入ebx
mov ecx, 4[esi];//同第三条指令,数放入ecxmov esi, pdst; //取pdst的地址,注意,pdst是一个8个字节长字符串
lock cmpxchg8b [esi]; //如果(pdst!=edx eax),则pdst的内容存入edx eax,否则,则把ecx ebx 的内容放入edx,eax
setz al;
}
} lock cmpxchg [edx], ecx; 比较并换指令(跟上面不同,上面是比较并且交换8个字节,这个没规定交换多少字节) inline static bool cas32(void* pdst, u32 comp, u32 xchgn)
{
__asm
{
mov eax, comp; //comp的内容放入eax,这里不是地址,即改变eax的值不会影响comp
mov ecx, xchgn; //将xchgn的内容放入ecx,道理同上
mov edx, pdst; //将pdst的内容放入edx

lock cmpxchg [edx], ecx; //相当于xchgn与pdst的比较,如果相当,edx=ecx否则eax=edx
setz al;
}
}

热心网友 时间:2023-10-14 07:31

第一条cmpxchg8b[esi]比较并交换8个字节, 这个指令在386机及后续有效 inline static bool cas(void* pdst, u comp, u xchgn)
{
__asm
{
lea esi, comp; //将comp的地址放入esi
mov eax, [esi]; //将esi(comp)的内容放入eax ,即4个字符的长度
mov edx, 4[esi];//第esi的第四个到第七个字符放入esi即字符串comp的comp[4]~comp[7]lea esi, xchgn; //将xchgn的地址放入esi
mov ebx, [esi]; //同第二条指令,只不过现在是把数入ebx
mov ecx, 4[esi];//同第三条指令,数放入ecxmov esi, pdst; //取pdst的地址,注意,pdst是一个8个字节长字符串
lock cmpxchg8b [esi]; //如果(pdst!=edx eax),则pdst的内容存入edx eax,否则,则把ecx ebx 的内容放入edx,eax
setz al;
}
} lock cmpxchg [edx], ecx; 比较并换指令(跟上面不同,上面是比较并且交换8个字节,这个没规定交换多少字节) inline static bool cas32(void* pdst, u32 comp, u32 xchgn)
{
__asm
{
mov eax, comp; //comp的内容放入eax,这里不是地址,即改变eax的值不会影响comp
mov ecx, xchgn; //将xchgn的内容放入ecx,道理同上
mov edx, pdst; //将pdst的内容放入edx

lock cmpxchg [edx], ecx; //相当于xchgn与pdst的比较,如果相当,edx=ecx否则eax=edx
setz al;
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com