当前位置: 首页 > news >正文

哪个浏览器任何网站都可以访问有什么推广的平台

哪个浏览器任何网站都可以访问,有什么推广的平台,威海做网站,网站seo课设乘法指令是一种在CPU中实现的基本算术操作#xff0c;用于计算两个数的乘积。在汇编语言中#xff0c;乘法指令通常是通过mul#xff08;无符号乘法#xff09;和imul#xff08;有符号乘法#xff09;这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多#…乘法指令是一种在CPU中实现的基本算术操作用于计算两个数的乘积。在汇编语言中乘法指令通常是通过mul无符号乘法和imul有符号乘法这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多所以编译器在优化代码时通常会尝试将乘法操作转换为更高效的加法、和移位操作。 对于较小的数编译器可能会选择将乘法操作直接转换为加法操作。例如将表达式a * b转换为a a ... ab次相加的形式。这种方式可以通过循环展开、代码向量化等技术来优化。 对于较大的数编译器可能会使用位移和移位操作来代替乘法。例如将表达式a * b转换为a n a m的形式其中n和m为符合条件的位数。这种方式可以通过位移指令的高效性来加速运算。 当以上方式均无法进行优化时编译器才会使用mul/imul指令来执行乘法操作。这两条指令可以对无符号数和有符号数进行乘法运算即便这两条指令会使用更多的时钟周期但乘法指令的计算效率相对于其他指令DIV来说仍然较低因此在编写高效代码时应尽可能地避免使用乘法操作并结合使用上面提到的技巧进行优化。 7.1 使用IMUL指令完成乘法 要计算乘法在不考虑执行效率的情况下编译器通常会直接使用imul指令完成计算imul指令在一些情况下可以比其他乘法指令如mul指令更快地执行乘法运算但性能较低的原因主要是由于imul指令通常用于有符号数的乘法运算并且在执行时需要处理符号位的扩展和溢出问题这转换成了额外的指令和时钟周期的消耗。如果对于无符号整数或需要使用寄存器的低位或者高位结果的情况使用imul指令可以提供一定的优势。 计算乘法时应遵循: 如果乘数与被乘数都是8位 则把AL做乘数,结果放在AX中如果乘数与被乘数都是16位 将把AX做乘数,结果放在EAX中如果乘数与被乘数都是32位 将把EAX做乘数,结果放在EDX:EAX中 乘法指令计算很简单只需要累加乘数即可如下所示则是一个简单的计算三个数相乘的汇编实现 .datax DWORD ?y DWORD ?z DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROCmov dword ptr ds:[x],10mov dword ptr ds:[y],24mov dword ptr ds:[z],18; 计算 x * y * zmov eax,dword ptr ds:[x]imul eax,dword ptr ds:[y]imul eax,dword ptr ds:[z]invoke crt_printf,addr szFmt,eaxmain ENDP END main7.2 使用LEA指令替换乘法 在实际编程中我们可以使用LEA指令来替代乘法操作从而提高代码的执行效率。但读者需要注意在使用LEA计算乘法时必须要保证乘数是2的次幂并且乘数的范围必须是2/4/8这三个区间才可使用该指令我们使用汇编来实现计算eax*82其汇编指令如下。 假设 eax5 计算 eax * 8 2 的结果,拆分过程如下:1.计算 lea ebx,dword ptr ds:[eax * 8 2] 这就相当于计算 ebx (eax * 8) 2直接可得到结果。 第一个案例比较简单可直接使用一条lea指令即可完成计算过程只要保证被乘数是2的次幂即可。 .datax DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROC; 针对乘法的lea指令优化mov dword ptr ds:[x],5mov eax,dword ptr ds:[x] ; eax xxor ebx,ebx ; ebx 0lea ebx,dword ptr ds:[eax * 8 2] ; ebx eax * 8 2invoke crt_printf,addr szFmt,ebxinvoke ExitProcess,0main ENDP END main7.3 使用LEA指令拆分计算 如果我们计算的乘法超出了2/4/8次幂范围则需要对乘法进行拆分拆分时也应遵循2的次幂原则拆分后在分开来计算。 假设 eax3 计算 15 * eax 的结果,拆分过程如下:1.计算 lea edx,[eax * 4 eax] 这就相当于计算 edx (4 * eax) eax 5eax 其中的每个edx就相当于5个eax2.计算 lea edx,[edx * 2 edx] 这就相当于计算 edx (5 * eax) * 2 (5 * eax)3.计算 (5eax * 2) 10eax 接着计算 (5 * eax) 5eax 最后得出 10eax 5eax4.经过该过程可得出 eax * 15 45 最终计算3*1545得到最终结果. 这个计算过程看似复杂但如果将其转化为汇编指令那么只需要两条即可实现快速乘法运算。 .datax DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROC; 针对乘法的lea指令优化mov dword ptr ds:[x],3; 如果使用lea计算乘法,则乘数必须是2/4/8mov eax,dword ptr ds:[x] ; eax 3lea edx,dword ptr ds:[eax * 4 eax] ; edx 4eax eax 得出 5eax,也就是说每一个edx就代表5个eaxlea edx,dword ptr ds:[edx * 2 edx] ; edx (5eax * 2) 5eax 最终得出 15eaxinvoke crt_printf,addr szFmt,edx ; edx eax * 15 计算后得出 45invoke ExitProcess,0main ENDP END main7.4 使用LEA指令递减计算 如果计算乘法时乘数非2的次幂这种情况下需要减去特定的值例如当我们计算eax * 7时由于7非二的次幂我们无法通过lea指令进行计算但我们可以计算eax * 8计算出的结果减去一个eax同样可以得到正确的值。 假设 eax3 计算 eax * 7 10 的结果,拆分过程如下:1.计算 lea edx,dword ptr ds:[eax * 8] 这就相当于计算 edx (8 * eax)2.计算 sub edx,eax 这就相当于计算 edx (8 * eax) - eax3.计算 add edx,10 这就相当于计算 edx ( (8 * eax) - eax ) 104.经过如上计算,我们就可以计算出eax * 7 10的最终结果 这个计算过程看似复杂但其实在汇编层面并不难构建如下分别实现计算两个表达式求值过程。 .datax DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROC; 针对乘法的lea指令优化mov dword ptr ds:[x],3; 如果计算乘法时乘数非2的次幂,则此时需要减; 计算 edx eax * 7 10mov eax,dword ptr ds:[x] ; eax 3 计算 eax * 7 10lea edx,dword ptr ds:[eax * 8] ; edx eax * 8sub edx,eax ; edx edx - eaxadd edx,10 ; edx edx 10invoke crt_printf,addr szFmt,edx ; edx eax * 7 10; 计算 edx eax * 3 - 7mov eax,dword ptr ds:[x] ; eax 3 计算 eax * 3 - 7lea edx,dword ptr ds:[eax * 2] ; edx eax * 2add edx,eax ; edx edx eaxsub edx,7 ; edx edx - 7invoke crt_printf,addr szFmt,edx ; edx eax * 3 - 7invoke ExitProcess,0main ENDP END main7.5 使用SHL计算无符号乘法 通过使用逻辑左移同样可以实现2的次幂的高速乘法运算但逻辑左移只能用于计算无符号乘法且只能计算被乘数是2的次方的算式。 计算时我们需要参考次方表,这里我列举出几个常用的次方数值: 次方表: 12 24 38 416 532 664 7128 次方表: 8256 9512 101024 112048 124096 138192 1416384 假设 eax3 计算 eax * 8 10 的结果,拆分过程如下: 1.计算 shl eax,3 这就相当于计算 eax eax * 2 ^(次方) 3 其公式相当于计算 eax eax * 8 2.计算 add eax,10 这就相当于计算 eax (eax * 8) 10 3.最终即可得到计算结果也就是3*810得到34 通过使用逻辑左移我们可以实现快速无符号乘法运算如下代码是效率最高的一种。 .datax DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROCmov dword ptr ds:[x],3; 计算 eax eax * 2 ^ 1 相当于计算 eax * 2mov eax,dword ptr ds:[x]shl eax,1invoke crt_printf,addr szFmt,eax; 计算 eax eax * 2 ^ 2 相当于计算 eax * 4mov eax,dword ptr ds:[x]shl eax,2invoke crt_printf,addr szFmt,eax; 计算 eax eax * 2 ^ 3 相当于计算 eax * 8mov eax,dword ptr ds:[x]shl eax,3add eax,10invoke crt_printf,addr szFmt,eaxinvoke ExitProcess,0main ENDP END main7.6 使用SAL计算有符号乘法 通过使用算数左移同样可以实现2的次幂的高速乘法运算与逻辑左移不同算术左移只能计算有符号乘法且只能计算被乘数是2的次方的算式。 计算时我们需要参考次方表,这里我列举出几个常用的次方数值: 次方表: 12 24 38 416 532 664 7128 次方表: 8256 9512 101024 112048 124096 138192 1416384 假设 eax-5,ebx3 计算 (eax * 8) (ebx * 4) 的结果,拆分过程如下: 1.计算 sal eax,3 这就相当于计算 eax (eax * 2 ^ 3 ) 其公式相当于计算 eax eax * 8 结果是一个有符号数 2.计算 shl ebx,2 这就相当于计算 ebx (ebx * 2 ^2) 其公式相当于计算 ebx ebx * 4 结果是一个无符号数 3.最终将有符号与无符号数通过 add eax,ebx 相加,即可得到(eax * 8) (ebx * 4)的最终结果-28 如下是通过算数左移实现2的次幂的高速乘法运算我们可以将算数运算与逻辑运算相加通过此方式提高运算效率。 .datax DWORD ?y DWORD ?szFmt BYTE 计算结果: %d,0dh,0ah,0 .codemain PROCmov dword ptr ds:[x],-5mov dword ptr ds:[y],3; 计算 eax eax * 2 ^ 1 相当于计算 eax * 2mov eax,dword ptr ds:[x]sal eax,1invoke crt_printf,addr szFmt,eax; 计算 eax eax * 2 ^ 2 相当于计算 eax * 4mov eax,dword ptr ds:[x]sal eax,2invoke crt_printf,addr szFmt,eax; 计算 eax (eax * 2 ^ 3 ) (ebx * 2 ^2) 相当于计算 (eax * 8) (ebx * 4)mov eax,dword ptr ds:[x]mov ebx,dword ptr ds:[y]sal eax,3 ; eax * 8 (有符号乘法)shl ebx,2 ; ebx * 4 (无符号乘法)add eax,ebx ; eax ebxinvoke crt_printf,addr szFmt,eaxinvoke ExitProcess,0main ENDP END main乘法优化的知识点基本就这些除了两个未知变量的相乘无法优化外其他形式的乘法运算均可以进行优化如果表达式中存在一个常量值那编译器则会匹配各种优化策略最后对不符合优化策略的运算进行调整如果真的无法优化则会使用原始乘法指令计算。 本文作者 王瑞 本文链接 https://www.lyshark.com/post/ade8241c.html 版权声明 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处
http://www.hkea.cn/news/14420153/

相关文章:

  • 网站展示英文都用什么字体不属于营销型网站的特点
  • 学院网站建设时间控制变更申请表将page转换为wordpress
  • 河南省建设厅门户网站装修网站建设优缺点
  • 安平县外贸网站建设仿腾讯网站源码
  • 双鸭山住房和城乡建设局网站十大外贸电商平台有哪些
  • 学习网站建设好找工作吗网页视频怎么下载到本地视频手机
  • 商城网站建设需求一个网页大概多少钱
  • 进入网站空间拼车网站的建设雨实现
  • 太原制作网站国家房管局官网查询系统
  • 镇江网站推广排名永济做网站单价
  • 网站快速备案公司制作二维码免费软件
  • 给企业做网站的公司有哪些wordpress显示未开启stmp服务
  • 禁忌网站安徽省建设干校网站
  • 网站免费建站 图标一个网站完整的html代码
  • 网站不备案会有什么影响丝瓜app官网下载安装io
  • 免费单页网站建设高端网站建设公司哪里济南兴田德润实惠吗
  • 辽宁建设工程信息网场内业绩什么意思网站没有收录从哪开始做优化
  • 微信小程序是什么模式长沙seo网站排名优化
  • 简述网站建设评估的指标有哪些南通学校网站建设
  • 专业营销型网站定制wordpress 笑话站
  • 免费源码网站天建设工程类公司网站
  • 建设银行黑龙江省分行官方网站网站图片被盗连怎么办
  • 尧都区建设厅官方网站免费的云服务器哪家好
  • 利用vs做网站阳江招聘网的拼音
  • 广州网站建设 推广公司佛山优化网站排名收费
  • 滨州淘宝网站建设公司网站优化怎么做
  • 北京网站开发哪家好沈阳百度seo关键词排名优化软件
  • 中山火炬开发区建设局网站网站建设网站需要什么软件有哪些
  • 商务局网站群建设方案宝塔linux wordpress
  • 微信服务号绑定网站程序开发 网站开发