int main(int argc, char* argv[])
{
      int i;
      scanf("%d", &i);
      int j = i / 2;
      printf("%d", j);
return 0;
}

编译后:

10:         int j = i / 2;
00401039     mov           eax,dword ptr [ebp-4]
0040103C     cdq
0040103D     sub           eax,edx
0040103F     sar           eax,1
00401041     mov           dword ptr [ebp-8],eax

即:M / 2 为

mov           eax,M
cdq
sub           eax,edx
sar           eax,1

这是为什么呢?思考了一段时间后,我给出这样的回答,不知道够不够严谨

M与-M在计算机中的表示是互为补码的

即 [-M]=[M]补

因此 ,[M]/2分2个情况考虑 
1,M为正数,正数的除法就是算术右移一位
   mov eax , M
   sar eax,1    //右移1位,即除以2

2,M为负数,则[M]/2= [ [-M]/2 ]补   = [-[[M]补/2] ]补

M为负数,所以,上面的计算过程是:
M取反加1,算术右移1位,再取反加1

设M为1字节
M取反加1可以表示成   (FF-M+1)

因此,上面的计算过程转化为
FF - ( (FF-M+1)/2 ) +1 = FF-(FF/2) + (M+1)/2

这里的 /2意思为向右带符号移一位,而FF 算术右移1位还是FF
所以可以简化为

(M+1)/2

注意,这里的M是负数

所以:
mov eax, M
sub eax,-1   //减-1就是+1
sar eax,1   //右移1位,除以2

然后解释一下 CDQ指令就可以了
当EAX >=0 ,CDQ结果   EDX=0
当EAX < 0 ,CDQ结果   EDX=-1

因此,M/2可以写成
mov eax, M
cdq            //扩展符号位,到EDX
sub eax,edx    //EAX>0 ,则EAX - 0 ;EAX<0 ,则EAX - (-1) 
sar eax,1      //右移2位

出处:http://www.cnblogs.com/zhangdongsheng/
作者:张东升 QQ:290387340

VC编译的除法的一段汇编代码解释相关推荐

  1. bcs转10 c语言,小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52...

    已结贴√ 问题点数:20 回复次数:3 小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52 BIT_COUNT     DATA 07FH TIMER0       ...

  2. c语言编译load,用C语言写汇编代码之LoadLibrary

    用C语言写汇编代码之LoadLibrary 2006-6-6 23:29 9868 用C语言写汇编代码之LoadLibrary 2006-6-6 23:29 9868 用C写一个加载msvcrt.dl ...

  3. 几段小代码解释Python命令式编程和函数式编程

    所谓命令式编程,是指How to do,要通过指令告诉计算机如何一步一步地完成预定任务:而所谓函数式编程,可理解为What to do,只需要通过简单的指令告诉计算机要做什么就可以了,代码更加简洁.易 ...

  4. VC++编译zlib

    目录 第1章简介    1 第2章版本1.2.3    2 2.1 编译汇编代码    2 2.1.1 32位汇编    2 2.1.2 64位汇编    5 2.2 Visual C++ 6.0   ...

  5. GCC如何编译内嵌汇编代码

    内核代码绝大部分使用C  语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码.GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计 ...

  6. VS2005混合编译ARM汇编代码

    2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...

  7. 通过一段汇编,加深对寄存器ESP和EBP的理解

    一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指针.还是不能很透彻理解.之后借于一段汇编代码,总算是对两者有个比较清晰的理解. 下面是按调用约定__stdca ...

  8. java汇编代码段,新手求助,跪求各位大神解答,怎么把这段汇编转成java代码

    本人新手,最近在折腾个so文件,通过IDA生成出来的脚本,有一段汇编代码不知道怎么用java去实现,求各位大神指点 loc_2498 LDR     R6, [SP,#0x50-0x40] LDR  ...

  9. 从汇编代码的角度观察switch与if...else,乘除与移位的差别

    Switch与if-else 有以下两个函数,y值根据x值进行加法运算,功能相同,SumSwitch()是switch版本,SumIfElse()是if else版本: public int SumS ...

最新文章

  1. (附链接)CVPR 2022 | 模型难复现不一定是作者的错,最新研究发现模型架构要背锅...
  2. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
  3. linux的 vi编辑器在哪,Linux Vi编辑器的使用
  4. leetcode117. 填充每个节点的下一个右侧节点指针 II(dfs)
  5. onvif学习笔记1:环境准备
  6. sigmoid层的输出_keras如何多输入多输出,以及中间层输出
  7. 免费在线文本分析工具
  8. 《软件体系结构》 第一章 软件体系结构概论
  9. Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
  10. 2018年大数据趋势 :人工智能… 数据分析将包含可视化模型…
  11. oracle的音标,oracle的意思在线翻译,解释oracle中文英文含义,短语词组,音标读音,词源【澳典网ODict.Net】...
  12. Tomcat 启动速度慢,一直转圈的原因
  13. 校企联合学院分析ERP在家具行业中的应用
  14. 《Effective C++》笔记
  15. 我可以抱你吗?linux
  16. matlab特征值归一化,如何用matlab将特征向量归一化呢?
  17. 关于高通QPST平台功能和选项的一些简单说明
  18. 11——去哪儿网(总结)
  19. 谋哥:App开发者的苦逼不值得怜悯!
  20. C~K的难题(费马小定理)

热门文章

  1. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
  2. GraphQL入门之什么是GraphQL?
  3. final、finally与finalize的区别
  4. mysql sql优化书籍_MySQL SQL优化的正确姿势
  5. Cortex-M3-建立向量表
  6. (科普帖)电梯突然断电下坠时、一定要这么做
  7. [置顶] mkdir函数-linux
  8. Active Directory 定义了五种操作主机角色
  9. 【Linux C 多线程编程】互斥锁与条件变量
  10. mozjpeg:JPEG图片压缩5%,获Facebook支持