zoukankan      html  css  js  c++  java
  • 汇编语言中的数据类型

    一、数制及相互转换

    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 码存放在内存中,然后送给显示器(或打印机)即可。在高级语言中,这一转换工作往往由系统完成,而不需要用户处理。但在汇编语言中,这一工作只能由用户编程来完成。为了区别数值数据,程序中的字符都要以单引号或双引号括起来。

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

    (完)

  • 相关阅读:
    圆桌十日冲刺之五
    圆桌十日冲刺之四
    圆桌十日冲刺之三
    圆桌十日冲刺之二
    圆桌十日冲刺之一
    圆桌的项目Alpha冲刺——测试
    圆桌的项目Alpha冲刺(团队)
    团队作业,随堂小测——校友录
    《软件工程实践》第七次作业——项目需求分析(团队)
    软工实践团队汇总
  • 原文地址:https://www.cnblogs.com/vin-c/p/14845865.html
Copyright © 2011-2022 走看看