所谓“寻址”,通俗的讲,就是要得到想要得到的数据。大脑首先把“寻址”这个词忘掉,然后再想。要想得到想要的数据,可以有两种方法:
(1)直接给。如mov ax,10h; 10就是你想要的数据,结果是把它放在了ax中。
(2)给出数据所在内存中的地址,让程序自己从地址处去找。然而给出地址的方式和“直接给数据”的方式形式上必定要有区分,否则他们就成了一种方式。区分的方法很简单,就是加入[]。从中括号里面得出的数就是想要得到的数据在内存中的地址。[]里可以放立即数,如[5]表示存放在内存单元位置为ds:5数据。因为地址空间是由段地址和偏移地址组成,而此时默认的段地址就是ds中的数据。[]中也可以放寄存器如[bx],假如bx中的内容为1a2f,则表示在内存单元位置为ds:1a2f处的数据。[]中也可以二者都引入,如[bx+5],如果bx中存储的数据为1a2f,则表示在内存单元位置为ds:1a2f+5处的数据。当然[]内还可以有多种形式,但是意思都是一样的。
再来看第二个问题:
首先,溢出是对有符号数而言的。在8086系列计算机中,有符号数是以补码的形式进行表示的。补码表示法中,正数采用符号加绝对值进行表示。即数的最高有效为0表示符号为正,数的其余部分则表示数的绝对值。如+127的补码表示为01111111,而负数表示则可由其绝对值的补码转换而来,具体规则就是对其绝对值的补码取反后加一,得到的即为负数的补码形式。负数补码最高位为1,表示负数。如-3的补码求解过程如下:00000011(+3)取反后为11111100,然后加1,得11111101(-3)。如果想知道以补码表示的负数的具体值,也可通过此法则得到。即对负数的补码取反后加一,得到的数的绝对值即为此补码表示的负数的绝对值。如补码形式-3的绝对值求解过程如下:11111101(-3的补码表示)取反后为00000010,然后加1,得00000011(3)。在补码表示法中,零只有一种表示,即00000000,对于10000000这个数,补码表示法中被定义为-128。这样8位补码所能表示的数的范围为-128~127。
了解了补码的相关知识后,我们再来看具体问题。“当两个异号的数相减,结果如果与减数符号相同则溢出,其余均不溢出”,所谓的溢出,是指得出的结果超出了所能表示的范围。这句话的前提是减法运算。-5-5即可以看作加法运算(-5)+(-5)也可以看作减法运算(-5)-5,如果看作减法运算,那么被减数为-5,减数则为5,它的符号为正,而不是楼主所说的-5。那么结果为-10,它的符号与减数符号相反,所以不会产生溢出。假如由如下代码:
mov al,11000000B ;-64的补码表示
mov bl,01000110B ;70的补码表示
sub al,bl
三句代码计算的是(-64)-(70),这是一个减法运算,结果放在al中。通过口算可以知道结果为-134,而一个八位补码所能表示的数的范围为-128~127,-134不在此范围之内,因此必定产生溢出。11000000B - 01000110B = 01111010B,得到的结果为01111010B最高位为0,表示正数,与减数01000110B(70)符号相同,因此必定产生溢出。正好验证了命题的正确。另外需要注意,命题中所说的结果计算机经过运算后得到的结果,而不是指此处的
-134。
不知楼主明白了没? |