汇编语言系列教程之基础入门 (一)

http://www.cnblogs.com/flyor/p/7208948.html

机器字长

  机器字长是指CPU一次运算所能处理的数据的位数,一般来说这个数的和CPU的通用寄存器长度、数据总线的宽度等相等,在8086中为16bit。由于历史原因,x86系列的CPU生产较早,所以这一系列的机器字长以8086的机器字长为代表,8086的机器字长为16bit,所以在x86系列中,所谈到的字长为16bit。相比较而言,MIPS系列的CPU则相对较晚才出现,这一系列的CPU一出现就是32位的CPU,所以MIPS系列中所谈的机器字长位32bit。

字节顺序

  数据在内存中的存储顺序有两种,一种为小端(Little Endian)存储,这种 存储最为常见,因为我们生活中见到的x86系列以及MIPS系列的CPU全部是小端存储。与之相反的大端(Big Endian)则较少见到,在PowerPC系列的CPU中是使用这种存储方式,此外socket编程人员可能也容易遇见这种存储,因为在Internet上面数据的传输都是采用大端存储。

无符号数与有符号数

  学过C语言的同学都知道整型数据类型分为无符号类型unsigned和有符号类型signed,其中无符号类型的范围为 [0, 2n-1] (这里的n表示这种类型的bit数,如short为16个bit,32位的CPU中的int位32个bit,下同) ,有符号类型的范围为 [-2n-1,2n-1-1] 。其实这在计算机的存储层面和汇编语言的处理层面是没有这部分的区别的,有符号和无符号都统一处理(无区别对待)。它们到了C语言层面表现的不同是因为上层对它们的解释不同而已。这部分可以自己做一个实验,用C语言输出两个相同的数。1、printf("%d", -1); 2、printf("%u", -1); 这两个数都是-1,但是输出的结果大相径庭(这部分代码我还未测试过,如果相同请通知我。。。让我好一探究竟)。主要原因是上层的解释不同。

  就这部分,推荐大家在C语言中除非特别确定,否则尽量不要使用unsigned,尤其是以为这部分数据不会出现负数而使用unsignd,可能会出现严重的问题。比如下面的代码:

1、认为数组下标不会出现负数:

  for(unsigned i=10; i>=0; --i) arr1[i] = arr2[i];

2、认为一个类型的大小不会出现负数:

  unsigned x=sizeof(int);

  for(int i=0; x-i>=0; ++i) ...;

上面这两个代码都会出现死循环的问题,因为unsigned始终是满足大于等于0。注意第二部分的代码中有一个隐式类型提升。

浮点数存储

  浮点数在内存中的存储如右图所示,其中s表示符号,指明是正数还是负数,exp表示指数,frac是一个介于[1.0, 2.0)之间的一个小数。

  其中exp表示的指数并非简单的指数,而是要减去一个偏置量。这个偏置量在单精度中为127,在双精度中为1023。

  frac可以通过调整exp保证其介于[1.0, 2.0)之间,比如将某数转换为二进制后其二进制表示为 111.0011 那么将exp加2后,这个数便可以写为1.110011。

  

  下图是一个转化实例:

  上面谈到的是规格化的表示,此外浮点数还有非规格化的表示:

  1、+0和-0 :exp和frac全部为0;

  2、+∞和-∞ :exp和frac全部为1;

  3、不是一个数:exp全部为1, frac全部为0。

注:这里s、exp以及frac的顺序位置是精心安排的,因为这样为顺序可以保证浮点数之间的比较可以直接按二进制的大小进行比较,而不用先译码再比较。

关于浮点数的舍取问题,十进制时满足一般的四舍五入规则,但是对于 12.235000000.....(保留小数点后两位)这种参考位为5000000.....类型的,要满足向偶数取舍(round to even),即取舍完以后最低位为偶数。这样一来12.235000000.....和12.245000000.....保留小数点后两位都得到12.24。保证最后一位为偶数(4)。二进制同理,当参考位为10000.....时,也要向偶数取舍。

例如把下面的数舍入到小数点后两位:

1、10.00011  -->  参考位011 < 100...  -->  直接舍掉  -->  10.00

2、10.00110  -->  参考位110 > 100...  -->  直接进位  -->  10.01

3、10.11100  -->  参考位100 = 100...  -->  向偶取舍  -->  11.00

4、10.10100  -->  参考位100 = 100...  -->  向偶取舍  -->  10.10

汇编语言系列教程之基础入门 (一)相关推荐

  1. 2引擎帮助文档_【虚幻4】初学者系列教程-《基础入门》#2-学习虚幻4的15个途径...

    如果你想系统的入门学习虚幻4不妨看看这个系列教程,在教程中我会带大家一步一步详细的了解虚幻引擎的各个功能,制作一些小的场景,小的互动,最终做出一个小的游戏,增加你的成就感! 文字版语言更加简洁,对于一 ...

  2. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. 视频教程-19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程-MySQL

    19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/ja ...

  4. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js

    20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...

  5. python独立网站教程_python从零到独立建设网站系列教程之基础知识篇(二)

    python从零到独立建设网站系列教程之基础知识篇(二)python的安装在Windows上安装python点击Download链接 然后就是按导航走点击确认,需要注意的是要把python加入到系统变 ...

  6. 嗨CE系列教程全套(入门,进阶,高阶)游戏驱动反调试

    嗨CE系列教程全套(入门,进阶,高阶)游戏驱动反调试等 1.入门教程5课 1.如何修改游戏 2.快速找到基址和指针 3.通过一个地址快速找到其他地址 4.制作一个简易修改器 5.一些重要的小技巧和理论 ...

  7. 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)

    系列文章目录 [spring authorization server系列教程](一)入门系列,快速构建一个授权服务器 文章目录 系列文章目录 前言 一.目前已实现的功能 二.入门,一步一步快速开始构 ...

  8. Marvelous Designer布料和角色服装造型完整教程零基础入门到精通实用教学视频教程

    Marvelous Designer布料和角色服装造型完整教程零基础入门到精通实用教学视频教程 marvelous designer是目前世界上最流行的服装打板和模拟软件,能够即时的演算服装的打板,外 ...

  9. 零基础自学python教程-零基础入门学习Python_Python教程

    教程名称:零基础入门学习Python 课程目录: [易源码www.pnp8.com]000愉快的开始 [易源码www.pnp8.com]001我和Python的第一次亲密接触 [易源码www.pnp8 ...

最新文章

  1. awk数组命令经典生产实战应用拓展
  2. pytest+allure框架搭建(MacOS)
  3. NOIP2017大爆炸
  4. 银河计算机网络,Python脚本之socket
  5. Java容器类和包装类
  6. 如何在防火墙或路由器中禁止访问一些公司不相关网站
  7. C# WinForm 自启动/模拟开机自动启动
  8. 现代计算机教室布置图片,高中教室布置设计图
  9. C#LeetCode刷题之#404-左叶子之和​​​​​​​​​​​​​​(Sum of Left Leaves)
  10. 操作系统课程设计-模拟操作系统
  11. ICD3 Target Device ID (00000000)
  12. 某知名网络安全公司的渗透测试工程师面试题实战汇总
  13. C语言函数嵌套调用作业总结
  14. 最新hexo+github搭建个人博客详细教程(二)——关于博客的美化
  15. Linux企业应用——mysql(一)之mysql初始化、mysql与phpadmin、mysql主从复制
  16. 计算机领域十大世界难题,最强思维碰撞:世界十大逻辑难题
  17. CCSP201902纸牌计数——解题报告
  18. oracle 中触发器的作用是什么,oracle创建触发器及作用举例
  19. vue中如何引入jquery详解
  20. 11. Python3 测试代码

热门文章

  1. BAV99 /ESD的干扰或者放电损坏电路/接口保护电路
  2. XML 测试用例分类Variants参数
  3. C# 8.0核心技术指南
  4. 如何制作照片马赛克礼物
  5. element ui DatePicker 日期选择器 限制只能选择今天之前或者之后
  6. VC++实现电脑睡眠/休眠/锁定/关闭屏幕
  7. The Earth Rover
  8. Hadoop 和 spark 读取多个文件通配符规则(正则表达式)joe
  9. 伦敦大学学院的新研究报告揭示主流分布式账本技术网络的能耗水平
  10. Mesh networking----Mesh 网络管理(Mesh network management)