第四节 理解与练习

一、内存数据存取规则

对内存的访问一次可以是一个字节或一个字,甚至可以是一个双字。而因一个字占用两个存储单元,就有两个地址对应,因而规定:一个字须存放在2个相邻存储单元中,字数据的低位字节存储在低地址的存储单元中,高位字节存储在高地址的存储单元中,其字地址是2个存储单元地址中较低的一个。推理可得,一个双字须存放在4个相邻的存储单元中,双字数据从低位字节到高位字节顺序存放在从低地址到高地址的存储单元中,而双字的存储地址是4个存储单元地址中最低的一个。

如图2-13所示,如果把01000H和01001H两个相邻单元组成一个字单元,那么这个字单元的地址是01000H,内容是5678H。如果把01000H单元开始的连续4个存储单元组成一个双字,那么01000H双字单元的内容就是12345678H。现在,把一个字串‘AB’存入01004H字单元的情景是字母‘A’在高字节单元,而‘B’在低字节单元(实际存放的是它们的ASCII编码)。

图2-13 存储器的数据存放

二、计算机中的数据

在计算机中,处理器的基本功能就是获取、加工信息,这些信息包括数值、符号、声音、图像等。然而,在信息被处理之前,必须将其转换成二进制形式,才能被计算机存储和加工处理。一经转换,所有的信息,不管其来源和所代表的内容是什么,都被视为数据。对程序而言,它将代表具体内容的数据交由处理器加工处理,并对处理结果进行解释。而对计算机而言,在对这些数据进行操作时,并不会考虑包含在数据中的信息含义,对于计算机,它们只是二进制位串。

例如,在计算机中有一个16位数据0101 0000 0100 0011,如果程序定义它是无符号二进制数,则它代表的十进制数值是20547;如果程序把它定义为组合十进制数,则它表示的十进制数值是5043;如果程序定义它是ASCII码,则它表示字串‘PC’。

再例如,处理器做两个字节数据的运算,得到结果是1111 1111,这个结果代表的数值是多少,要看参加运算的两个数是无符号数还是带符号数,若为无符号数,这个结果的数值是255,若为带符号数,这个结果为-1。

由此可见,在程序设计时,应该正确地理解所定义的数据类型,了解它在计算机中的表示形式,才能正确解释计算机的处理结果。

三、溢出的概念

两个带符号数进行运算,结果超出了数据的表示范围(8位带符号数的表示范围是-128~+127,16位表示范围是-32768~+32767时,称为溢出。溢出时,标志位OF被置位。

两个无符号数进行运算,当结果超出了数据表示范围时,由于产生正常的进位,因此可以得到正确的结果。而当两个带符号数进行运算,若结果超出数据表示范围,就会产生错误的结果。例如:

上述式子,如果两个加数为无符号数,则为131+132=263,得到的结果正确。如果它们是带符号数则为(-125)+(-124),而得到的结果却是+7,显然是错误的。这是因为带符号数是用补码表示的,最高位为符号位,而运算时,机器并不能区分它们是无符号数还是带符号数,只是按二进制规则进行运算。对带符号数,符号位也被作为数值参与运算,因此产生的进位没有意义。产生溢出是因为(-125)+(-124)=(-249)已经起出了8位带符号数的表示范围。

再看一个例子。

如果两加数是无符号数,结果正确;如果是带符号数,则是两个正数相加,结果为负数,显然发生了溢出。事实上,64+96=160已经超出了8位补码所能表示的范围。这个例子虽然没有进位,照样产生了溢出。由此我们得到,溢出和进位是两个不同的概念。对无符号数来说,可产生有效的进位,没有溢出的概念。对带符号数来说,产生进位没有意义,是否产生溢出,跟有无进位没有关系。

那么如何判断运算结果是否溢出呢?

• 溢出只有在同号数相加或异号数相减两种情况下才可能发生。

• 两个同符号数相加,当结果的符号与参加运算的数的符号不同时,则产生溢出。

• 两个异号数相减,当结果的符号位与被减数的符号位不同时,则产生溢出。

【例2.4】 完成下列各式补码数的运算,判断结果是否溢出。

(1)49H+9DH

(2)41H-0ABH

(3)0A95H+8CA2H

(4)6531H+0BD26H

答案:(1)0E6H,不溢出 (2)96H,溢出 (3)9737H,不溢出 (4)2257H,不溢出

汇编语言基础知识.ppt