首先看int型

代码如下:

 int nOne = 0, nTwo = 0;nOne = 1 + 1;nOne = nOne + 1;nTwo = nOne + nTwo;

这里先来一次人肉反汇编:

mov [nOne],0
mov [nTow],0mov eax,1
add eax,1
mov [nOne],eaxmov eax,[nOne]
add eax,1
mov [nOne],eaxmov eax,[nOne]
add eax,[nTwo]
mov [nTwo],eax

这里来看下实际的反汇编代码:

这里面可以知道向nOne=1+1的这种,编译器是直接计算为2(估计是优化过的了),然后再进行赋值的。

下面来看short型的反汇编:

 //2字节的长度,无法直接使用32位寄存器,只能使用他的低(高)位short sOne = 0, sTwo = 0;sOne = 1 + 1;sTwo = sTwo + sOne;

这里先使用下人肉反汇编:

mov [sOne],0
mov [sTwo],0    //这两个是错误的,其实short型被翻译为4个汇编语句
//这里并不为他赋0,也是因为他是2字节,需要使用寄存器中的高位或低位进行数据操作并且xor比mov指令执行的周期更短。
//所以人肉下他的反汇编xor eax,eax
mov [sOne],ax
mov [sTwo],axmov eax,2
mov [sOne],axmovsx eax,[sOne]    // 符号扩展的意思是,当计算机存储某一个有符号数时,符号位位于该数的第一位,所以
//当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展MOVZX是一样的,将扩展的高位全赋为0.
movsx ebx,[sTwo]
add eax,ebx
mov [sTwo],ax

这里来看下他的实际反汇编:

根据上面真实的反汇编代码可知:

1.现在的操作系统对处理short数据时,都把他搞成32位(movsx指令),再进行操作。

2.原因可以猜测到的,现在的电脑,整数都默认为int,而浮点数都默认为double,所以,float估计也和这个差不多。

下面来看long long类型

代码如下:

 //64字节long long llOne = 0, llTwo = 0;llOne = 1 + 1;                 //SSE指令 无法在奔三之前的处理器运行的,因为奔三之前并没有sse指令,但是在奔三之前已经有了VC6.0,llOne = llOne + 1;llTwo = llOne + llTwo;

这里直接来看反汇编:

这里有几个重点:

1.xorpd和xor差不多,只是他可以操作的是xmm寄存器(这个寄存器是64位的(8字节))

2.qword为4个字,4个字为8字节.

3.adc:ADC指令的引入主要是为了实现多字节的运算个。当进行32位以上运算时,要求低位字节相加,而高位字节再相加时就要考虑低位相加的进位,即CF,这时就要用到ADC指令。

本人使用的vs2013,这里可以看到,的确有脱了裤子打屁的感觉,逻辑上就是把long long搞成低8位,高8位,进行操作。

下面是float类型:

 float fOne = 0, fTwo = 0;fOne = 1 + 1;fOne = fOne + 1;fTwo = fOne + fTwo;

其中对应的反汇编代码如下:

1.movss是将一个单精度数传输到xmm寄存器的低32位

也就是把0给了xmm0

而double类型如下:

代码如下:

 //double类型double dOne = 0, dTwo = 0;dOne = 1 + 1;dOne = dOne + 1;dTwo = fOne + fOne;

对应的反汇编如下:

反汇编基础-加法的求值过程(各种类型)相关推荐

  1. Deep Learning基础--Softmax求导过程

    一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...

  2. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  3. python中关系运算符惰性求值,lazy.js 惰性求值实现分析

    背景:惰性求值? 来看一个 lazy.js 主页提供的示例: var people = getBigArrayOfPeople(); var results = _.chain(people) .pl ...

  4. 表达式求值问题数据结构课程设计

    完整代码在最后~~ 1 需求分析 1.1 问题描述 表达式求值是程序设计语言编译中的一个最基本问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的 ...

  5. 表达式求值(中缀转后缀及后缀表达式求值)

    .中缀表达式转后缀表达式: 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素 ...

  6. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  7. Emacs之魂(三):列表,引用和求值策略

    Emacs之魂(一):开篇 Emacs之魂(二):一分钟学会人界用法 Emacs之魂(三):列表,引用和求值策略 Emacs之魂(四):标识符,符号和变量 Emacs之魂(五):变量的"指针 ...

  8. 一道PHP题引出的“短路求值”

    今天群里有个人问了一个问题,代码如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) {     ++$a; } echo $a; 说代码段的执行的结果为1,问大家$a的 ...

  9. leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...

最新文章

  1. cf-Sasha and Array
  2. QTP测试之With秒用
  3. esp32原理图设计_第十一章 ESP32的PWM全彩LED灯显示
  4. Packet Tracer 5.0 建构 CCNA 实验攻略——配置单区域 OSPF
  5. Spark源码分析之SchedulerBackend分析
  6. (92)低速接口UART、IIC、SPI介绍,面试必问(十六)(第19天)
  7. 全国Python科研应用专题实操培训班
  8. 系统分析师资料_软考 系统分析师考试通过总结
  9. 机器学习系列-AdaBoost
  10. 在高并发环境下Reids做缓存踩坑记录
  11. 计算机一级报名照片是几寸的,一级建造师报名照片要几寸的
  12. 想用html5改写妄撮
  13. 04-fliqlo时钟屏保安装
  14. 【导航算法】无人机路径跟踪L1导航算法
  15. NQueen问题(N皇后问题Java)
  16. 磁盘 IO 真的比网络 IO 快吗?
  17. 区块链技术应用场景有哪些?
  18. 频域串联滞后校正matlab,控制工程基础(基于Matlab的线性系统串联校正)
  19. 淘宝商品详情接口抓取
  20. 使用okHttp下载文件到本地

热门文章

  1. 学编程的日子里,很多人因迷茫放弃了编程,那我们应该怎么做呢?
  2. 关于BEA-000402和BEA-000438(没有进程来读取写入管道的数据)
  3. 飞书×帆软数知鸟 | 飞书上的一站式需求管理
  4. *和**在Python中意味着什么?它与指针和地址有关吗?
  5. 继续完善掼蛋游戏 其次说说朋友的情况
  6. 飞秋爱好者(WZ132)
  7. 飞鸽传书2011绿色版简单性
  8. 程序员自我提高情绪10招
  9. 2005免费书记下载-[NEW]
  10. 创业公司技术总监,去大公司面试,结果凉了