汇编语言中的数据类型

摘要:
当汇编程序汇编源程序时,它可以自动将不同数制的数字转换成二进制数。掌握不同十进制数之间的转换是汇编语言编程的基础。符号由二进制数的最高位表示,数字的有效值由二进制绝对值表示。在原始代码表示中,可以用8位有符号二进制数表示的最大数和最小数是01111111和11111111,即-127和+127。补码符号中的数字范围。

目录

一、数制及相互转换

8086/8088 宏汇编语言源程序中允许使用二进制数、八进制数、十进制数和十六进制数。在书写不同数制的数时,常在一个数的尾部用一个字母来表示该数的数制。二进制数用字母 B(Binary),八进制数用字母 O(Octal),十进制数用字母 D(Decimal),十六进制数用字母 H(Hexadecimal)。其中,十进制数尾部字母 D 可缺省。汇编程序在对源程序进行汇编时,能自动将不同数制的数转换成二进制数。

不同进制数之间的对应关系如表 1 所示。

不同进制数之间的对应关系

表 1 不同进制数之间的对应关系

在编写或阅读程序时,常需要将一种进制数转换为另一种进制数。熟练掌握不同进制数之间的转换,是进行汇编语言程序设计的基础。

1. N 进制数转换为十进制数

转换方法:按权相加。

【例2.1】求 10011.101B 的十进制值。

10011.101B=1×24+1×21+1×20+1×2–1+1×2–3=16+2+1+0.5+0.125=19.625D

八进制、十六进制与十进制之间的转换,除基数不同外,方法一样。

2. 十进制数转换为 N 进制数

转换方法:整数部分,除基(N)取余;小数部分,乘基(N)取整。

【例2.2】求十进制数325.8125的二进制表示。

整数部分:

image

得:325D=101000101B

小数部分:

image

得:0.8125D=0.1101B

于是:325.8125D=101000101.1101B

3. 二进制数转换为八进制数或十六进制数

转换方法:由于八进制数、十六进制数和二进制数的基数成倍数关系,转换较为简单,方法是将二进制数从小数点开始分别向左向右每 3 位分成一组(转换成八进制数时)或每 4 位分成一组(转换成十六进制时),不足 3 位(或 4 位)的补 0,然后写出对应的八进制数或十六进制数即可。

【例2.3】 将 10110.11B 转换成十六进制数

image

4. 八进制数或十六进制数转换为二进制数

转换方法:将每位八进制数写成对应的3位二进制数,每位十六进制数写成对应的4位二进制数即可。

二、计算机中数和字符的表示

(一)计算机中数的表示方法

计算机处理的数据通常是带符号数,即有正数和负数的区别,如 +1101,+0.1101,-1101,-0.1101。在计算机中,正数与负数如何表示呢?为便于计算机识别与处理,通常用数的最高位来表示数的符号,0 表示正数,1 表示负数。日常用“+”或“-”表示符号的数叫真值,而在二进制数的最高位设置符号位,把符号加以数值化,这样的数叫机器数。例如:

image

带符号数的机器数可以用原码、反码、补码3种不同码制来表示,由于补码表示法在加减运算中的优点,现在多数计算机都是采用补码表示法。微机系列机也是采用补码表示法。为此下面将对原码和补码分别进行介绍。

1. 原码表示法

原码是一种比较直观的机器数表示法。用二进制数的最高位表示符号(0 表示正数,1 表示负数),数的有效值用二进制绝对值表示(与真值相同)。例如,原码表示的整数 01101010 和 11101010,分别对应的真值是 +1101010 和 -1101010。

在原码表示法中,8 位带符号二进制数能表示的最大数和最小数是 01111111 和 11111111,即 -127 和 +127。数 0 有两种形式:00000000 和 10000000,它们分别对应于 +0 和 -0。

原码表示法的机器数作加减法运算时不太方便。例如,要进行 (-5)+7 的运算,看起来是作加法,但是两异号数相加实际是进行减法,即作 7-5 的运算。同理,两异号数相减时,实际是进行加法计算。所以对原码表示法的机器数进行加减运算时,不仅需要程序中指令规定的操作种类(加或减),还要根据两数的符号确定实际的加减操作。加减操作后,要按照一定的规则确定运算结果的符号,例如两异号数相加,运算结果的符号应与绝对值较大的数同号,两异号数相减,运算结果的符号应与被减数同号。

2. 补码表示法

由于原码加减运算时不太方便,因此设想让符号位也作为数的一部分参与运算,使其运算操作简化,无须做过多的判断和处理。补码表示法就具有这一特点。

(1)补码的定义。

带符号数 x 的补码表示法 [x] 可定义如下:

[x]=M+x

上述定义中,模数 M 根据机器数的位数而定,如 n=8,M=28。这个 28 正好是机器数(无符号数)产生进位而自动舍去的数。

若X是正数(即 X≥0),按照上述定义,模数 M 和一个正数相加,作为溢出量便自动舍去。因此,正数的补码正好同原码相同。例如,真值 X=+00111011B(即 +59D),其补码表示:

[+59]=28+00111011=100000000+00111011=|1|00111011

其中第 1 位自动舍去。

若 X 为负数(即 X<0),例如真值 X=-00111011B(即 -59D),其补码表示:

[-59]=28+(-00111011)=100000000-00111011=11000101

从上述两个例子可以看出:用补码表示的机器数,符号位仍然表示数的符号(0 为正数,1 为负数);对于正数,补码和原码一样,与真值的有效数等同;但对于负数,补码经过变换后,已是另一编码形式,它与真值的有效数已不能等同视之。

(2)补码表示法中数的范围。

在补码表示法中,当 N=8 时,最大的正数仍是 [127] = 01111111,而数 0 只有一个,即 [0]=00000000,没有 +0 与 -0 的区别。[-127]=10000001,而10000000 却是 [-128],11111111 是 [-1]。所以当 n=8 时,用补码表示数的范围是 -128~+127,如表 2 所示。不难推导出,当 n=16 时,用补码表示数的范围是 -32768~+32767。

补码表示的数(n=8)

表 2 补码表示的数(n=8)

(3)由原码变换为补码。

由于正数的原码和补码的机器数一样,所以这里主要是讨论负数的变换。把一个负数的原码变换为补码的方法是:首先保持符号位不变(因为符号位已表示为负数),然后将有效数各位变反,最低位加1即可。例如:

image

所以,

[-59]=11000101

再看一个例子:

设 X = -25 = -19H = -0011001B

则 X 的 8 位补码表示为:[X]=11100111B = E7H

X 的 16 位补码表示为:[X]=1111111111100111B = FFE7H

从这个例子可以看出 X 的 16 位补码实际上是其 8 位补码的符号扩展。由此得出一个重要结论:一个二进制补码数的符号位(最高位)向左扩展若干位后,仍是该数的补码。

(二)二进制编码

1. 十进制数的二进制编码(BCD 码)

086/8088 指令支持十进制数的运算,那么十进制数在机器内部也必须用二进制表示,即用十进制数的二进制编码表示。常用的是 BCD 码。BCD 码与十进制数的对应关系如表 3 所示。

BCD 码与十进制数的对应关系

表 3 BCD 码与十进制数的对应关系

例如,十进制数 368 写成 BCD 码为:

0011 0110 1000

2. 字符编码

在计算机中,数码、英文字母、标点符号及其他符号统称为字符。字符在计算机中也都是用二进制表示的。现在计算机中通常采用的字符编码是 ASCII 码(American Standard Code for Information Interchange)。标准的 ASCII 码在一个字节中用七位二进制表示字符编码,用一位(最高位)表示奇偶校验位(Parity bit),如图 1 所示。

ASCII 字符编码

图 1 ASCII 字符编码

标准 ASCII 码共有 128 个字符,可分为二类:非打印 ASCII 码和可打印 ASCII 码。

(1)非打印 ASCII 码:这类编码属于控制性代码,共 33 个。例如:BEL(响铃,07H),DEL(删除,7EH),CR(回车,0DH),LF(换行,0AH)等。

(2)可打印 ASCII 码:共有 95 个。例如:数字 0~9 的编码为 30H~39H;大写字母 A~Z 的编码为 41H~5AH;小写字母 a~z 的编码为 61H~7AH;空格(space)的编码为 20H。

三、数据类型

1. 无符号二进制数

字节数据:取值范围为 0~255。

字数据:取值范围为 0~65535。

双字数据:取值范围为 0~4294967295。

2. 有符号二进制数(补码)

字节数据:一位符号,7 位量值,范围为 -128~+127。

字数据:一位符号,15 位量值,范围为 -32768~+32767。

双字数据:一位符号,31 位量值,范围为 -2147483648~+2147483647。

3. 无符号十进制数(BCD)

十进制数(即 BCD 码)有压缩(组合)和非压缩(非组合)两种,如图 2 所示。

无符号十进制数

图 2 无符号十进制数

BCD 的特点是用 4 位二进制数表示 1 位十进制数,每 4 位二进制数之间的进位是十进制数的形式。

4. 浮点数

不同的汇编程序对浮点数约定可能有些不同,但其基本结构是类似的,它们都是由阶码和尾数两个部分组成。

例如,8086/8088 宏汇编程序以用DD伪指令定义的浮点数(单精度实数)约定如图 3 所示。

浮点数表示

图 3 浮点数表示

在存储浮点数时,阶码在高地址一端,尾数以二进制原码形式存放,占三个字节,它的最高位总是有效数字,因此,它被隐藏起来,取而代之的是尾数的符号。浮点数在运算时要把最高位的有效数字恢复才能进行运算。

阶码表示 2 的指数值。它决定了小数点在有效数字(尾数)中的位置。阶码占一个字节,采用过余码形式,即用 80H 表示阶码为 0,大于 80H 表示正阶码,小于 80H 表示负阶码。例如,阶码为 3 时用 83H 表示,阶码为 -3 时用 7DH 表示。

四个字节浮点数的范围是:

正数:2127×(1-2-24)~2-127×2-1

负数:2127×(-(1-2-24))~2-128×(-2)-1

零:阶码和尾数同时为 0。

5. 字符串

字符串是一种顺序邻接的数据单位。由于计算机处理的信息涉及各种字符,这些字符都必须用二进制形式来表示,因此,字符也是数据。在 Intel 处理器中,字符用 ASCII 码表示,每个字符占一个字节,字符数据的使用给人和计算机交互带来了很大方便。

例如,当从键盘上输入字串 123ABC 时,它们立即被转换成与之对应的 ASCII 码 31H,32H,33H,41H,42H,43H。又如,当用户需要在显示器上显示或在打印机上打印程序运行结果 4270 时,只要将它逐一转换成对应的 ASCII 码存放在内存中,然后送给显示器(或打印机)即可。在高级语言中,这一转换工作往往由系统完成,而不需要用户处理。但在汇编语言中,这一工作只能由用户编程来完成。为了区别数值数据,程序中的字符都要以单引号或双引号括起来。

原文:汇编语言中的数据类型

(完)

免责声明:文章转载自《汇编语言中的数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP的反射类ReflectionClass、ReflectionMethod使用实例局域网永恒之蓝病毒发包的解决方案之二下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C语言中 有符号数、无符号数、整数溢出 (转)

[cpp]view plaincopyprint? #include<stdio.h>   void main()   {    int l=-1;    unsigned int c=135;   printf("%u ",l+c);   }   这个的结果134,而不是我之前认为的很大的正数,实际上需要注意的是-1(0xf...

NumPy位操作

NumPy - 位操作 下面是 NumPy 包中可用的位操作函数。 序号 操作及描述 1. bitwise_and对数组元素执行位与操作 2. bitwise_or对数组元素执行位或操作 3. invert计算位非 4. left_shift向左移动二进制表示的位 5. right_shift向右移动二进制表示的位...

gzip压缩算法

gzip,zlib,以及图形格式png,使用的是同一个压缩算法deflate。我们通过对gzip源码的分析来对deflate压缩算法做一个详细的说明: 第一,gzip压缩算法基本原理的说明。 第二,gzip压缩算法实现方法的说明。 第三,gzip实现源码级的说明。 1. Gzip压缩算法的原理          gzip 对于要压缩的文件,首先使用LZ7...

Mysql数据类型

MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 1.数值类型 MySQL支持所有标准SQL数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、...

【高速接口-RapidIO】6、Xilinx RapidIO核仿真与包时序分析

提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一、软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 硬件平台: 评估板:ZYNQ-7 ZC706 Evaluation Board 二、介绍 上篇文章的最后一小节已经对例子工程进行仿真并通过命令 log_wav...

第二章排错的工具:调试器Windbg(上)

感谢博主 http://book.51cto.com/art/200711/59731.htm 《Windows用户态程序高效排错》第二章主要介绍用户态调试相关的知识和工具。本文主要讲了排错的工具:调试器Windbg。   第二章 汇编、异常、内存、同步和调试器——重要的知识点和神兵利器 这一部分主要介绍用户态调试相关的知识和工具。包括:汇编、异常(ex...