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

cdq指令有什么用,望赐教

toyix 发布于 2010-12-05 16:23, 6628 次点击
00401053   mov         eax,dword ptr [ebp-4]   
00401056   cdq                    
00401057   mov         ecx,64h            
0040105C   idiv        eax,ecx            
0040105E   mov         dword ptr [i],eax   
大侠讲讲这个cdq有什么用,不写这个,就不能做除法吗
5 回复
#2
toyix2010-12-05 16:25
网上说  是  CDQ 双字扩展. (把EAX中的值与符号扩展为EDX:EAX)   希望解释一下  看不太懂
#3
你们都要疼我哦2010-12-05 16:35
你马上给分我就告诉你

本来EAX中有个值,正或负都可以,CDQ 把这个32位扩展成64位
变成EDX:EAX的形式,其中EDX中的值是EAX中的最高位,也可以说是符号位。
#4
你们都要疼我哦2010-12-05 16:53
你都不速度给分。
很久前  指令集规定除数必须是被除数的一半长,就一直沿用下来
IDIV有符号除法 除数是32位,那么被除数当然需要64位了,
然后就用EDX来扩展EAX的符号位,这样既不改变EAX的值 又扩展成64位咧。
#5
toyix2010-12-05 17:11
恩  基本明白了   也就是说 沿用以前的规定,扩展成64位,
但是感觉没有什么实际作用,是吧  
就像我发的那个反汇编代码   eax除以ecx,商保存在eax,余数放在edx   ,基本上没edx什么事,除了后面保存余数



是不是这样啊,先前把符号位保存到edx里面,等除法做完了  ,符号位又回到eax里面了   


版主可以留个QQ什么的不   方便联系呀  分给了
#6
toyix2010-12-05 17:27
CDQ 是一个让很多初学者感到困惑的指令. 它大多出现在除法运算之前. 它实际的作用只是把EDX的所有位都设成EAX最高位的值. 也就是说,当EAX <80000000, EDX 00000000; 当EAX >= 80000000, EDX 则为FFFFFFFF). 网上找的   留给以后的人看看
1