注册 登录
编程论坛 汇编论坛

汇编指令CMPXCHG的用法疑惑

遮天云 发布于 2010-09-21 15:19, 2881 次点击
有题如下:
CMPXCHG CX,DX
如果指令执行前 (AX)=2300H,(CX)=2300H.(DX)=2400H
则指令执行后 因(CX)=(AX),故(CX)=2400H,ZF=1
如果指令执行前(AX)=2500H,(CX)=2300H,(DX)=2400H
则指令执行后因(CX)!=(AX),故(AX)=2300H,ZF=0
这是书上的例题
我不明白的是CMPXCHG指令不是比较交换吗?怎么还要考虑AX呢?我刚开始自己做得时候以为两者执行后的结果是一样的呢!可是结果却收到AX的限制!不知为何!还有就是标志位ZF不是零标志位吗?运算结果为0时ZF位置为1否则为0那为什么这题中一个为1一个为零呢??本人刚学汇编不到两星期!感觉还是没入门请教各位前辈帮忙解惑!谢谢
5 回复
#2
东海一鱼2010-09-21 15:33
这条指令将al\ax\eax\rax中的值与首操作数比较,如果相等,第2操作数的直装载到首操作数,zf置1。(相当于相减为0,所以0标志位置位)
如果不等, 首操作数的值装载到al\ax\eax\rax,并将zf清0(原因同上)。

BTW:
两个星期想入门??早哪!慢慢来吧。
#3
zklhp2010-09-22 01:50
我学了4、5年汇编罢 也只是刚懂皮毛罢了 呵呵
#4
遮天云2010-09-24 09:23
谢谢两位指教!灭了我心中急躁的情绪!接下来就是安心学习了
#5
你们都要疼我哦2010-09-29 18:41
CMPXCHG CX,DX
首先进行CMP操作,这个操作就是进行减运算,但不保存结果,只是影响标志位ZF的。
AX CX相减为0,ZF置位为1。
CMPXCHG隐含使用EAX寄存器,根据首操作数的位数确定EAX的位数,就是根据CX来确定
是AX,如果是cl,则就是al,根据CMP结果进行XCHG,相等则第2操作数送到第1操作数,不等则第1操作数送EAX或AX或AL。

象这种隐含使用其他寄存器的指令还有不少。对于哪种操作影响标志位也需要慢慢熟悉。

其实在很久前,CMPXCHG指令是很标准的,它规定第2个操作数必须是EAX/AX/AL,
这样就简单了,先比较2个操作数,如果相等,ZF置1,第2操作数送第1操作数,
如果不等,ZF清0,第1操作数送第2操作数。很标准的“比较交换”。
只不过后来对第2操作数就不做限制必须是EAX/AX/AL了,变成隐含使用,指令功能强大了,但对于刚接触指令的人也带来理解和使用上的困惑。

对于汇编的学习,俺一直觉得重点要放在对代码段功能的理解上,至于指令实现的操作,查手册或者碰到再查就可以了,碰到个3次5次,不用查也知道了。

偶断网半个月后的第1个回帖就贡献在这里了。
#6
遮天云2010-09-30 10:16
回复 5楼 你们都要疼我哦
呃!这样啊!太谢谢您了
1