注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

imul 指令学习  

2013-05-07 13:25:27|  分类: 80x86汇编学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
感谢QQ网友 梦里花落(无知年轻) ,因为他提出的一个C函数,计算32位无符号数乘以64位有符号数的运算.

imul ecx,edx  ; ECX=ECX*EDX结果的低32位,高位部分丢弃.


X=32位无符号数
Y=64位有符号数

X*Y=  [ X*Y高32位+ X*Y低32位所得结果的高32位 ] : [  X*Y低32位所得结果的低32位 ]

用冒号隔开高32位与低32位.

movl 16(%ebp),%eax       mov eax,[ebp+16] ;EAX=Y低32
movl 20(%ebp),%edx       mov edx,[ebp+20] ;EDX=Y高32
movl 12(%ebp),%ecx       mov ecx,[ebp+12] ;ECX=X
movl %edx,%esi           mov esi,edx     ;ESI=Y高32
imul %ecx,%esi         imul esi,ecx     ;ESI=Y高32*X
                                          ;高位丢掉
                                         
mull %ecx             mul ecx           ;EDX:EAX=EAX*ECX=Y低32*X

leal (%esi,%edx),%edx   lea edx,[esi+edx] ;EDX=ESI+EDX=乘积的高位部分  LEA指令是取"偏移的" 在这里是取ESI+EDX的值
movl 8(%ebp),%ecx       mov ecx,[ebp+8]   
movl %eax,(%ecx) mov [ecx],eax
movl %edx,4(%ecx)       mov [ecx+4],edx   ;保存值到内存.

imul 指令学习 - sangguowei2002 - 编程学习
 

函数:
imul 指令学习 - sangguowei2002 - 编程学习
 
num_t 可以定义为 long long (64位无符号数)


imul 指令学习 - sangguowei2002 - 编程学习
movl 12(%ebp),%eax       mov eax,[ebp+12]   ;EAX=x
movl 20(%ebp),%ecx       mov ecx,[ebp+20]   ;ECX=Y高32位
imull %eax,%ecx         imul ecx,eax       ;ECX=ECX*EAX=Y高32位*X 丢掉结果的高32位
mul 16(%ebp)             mul [ebp+16]       ;EDX:EAX=EAX*[EBP+16]=x*Y低32位
leal (%ecx,%edx),%edx   lea edx,[ecx+edx] ;EDX=EDX+ECX
movl 8(%ebp),%ecx       mov ecx,[ebp+8]   ;得到指针的值
movl %eax,(%ecx)         mov [ecx],eax
movl %edx,4(%ecx)       mov [edx+4],edx   ;保存结果到内存
  评论这张
 
阅读(58)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017