@(组成原理)
本次总结这个知识点的起因是一道相对寻址题中把这个知识点作为基本条件,然而其他的问题我都明白,却卡在了低字节为字地址的存放方式中。因此有必要再次进行细致的回顾总结。
先看这道题。
设相对寻址的转移指令占用三个字节。第一个字节为操作码,第二,三个字节为相对位移量(补码表示),而且数据在存储器中采用以低字节为字地址的存放方式。每当CPU从存储器中取出一个字节时,即自动完成(PC) + 1 ->PC。若PC当前值是240(十进制),要去转移到290(十进制),则转移指令的第二、三字节的机器代码是(2FH,00H);若PC当前值为240(十进制),要求转移到200(十进制),则转移指令的第二、三字节的机器代码是(D5H,FFH)。
通过对这道题目的深入解析以便分析牵涉到的知识点。
关于转移指令的PC自增问题:
http://blog.csdn.net/u011240016/article/details/52723779
进行过一次总结。
所以这里重点关注的是数的表示问题。
因为转移指令占用3个字节,所以取出指令后PC已经变成(PC)+3了。
不妨设相对偏移的值为A,那么下一条执行的指令地址为: (PC)+3+A
这样根据题中的数据就可以算出A是多少了。
第一个:240–>290:
240+3+A=290==>A=47
第二个:240–>200
240+3+A=200⇒A=−43
上面的数字都是在十进制下。
OK,问题全部转移到数字的补码表示与具体的存储位置上。
先看补码表示:
47D=[0010,1111]补=2FH,D表示十进制Decimal,H表示十六进制Hexadecimal
−43D=[1101,0101]补=D5H
额外说一句,一个十六进制数占用四位,两个比如,2F, D5占用一个字节。我总是会误以为2F占用两个字节。这是错的认识。
OK,问题只剩下怎么存储了。
这也是本篇文章的核心。
我们在小端序,大端序中说过:
小端序:先存储低位字节,后存储高位字节
大端序:先存储高位字节,后存储地位字节
大端字节序,数据高字节存于内存低地址,数据低字节存于内存高地址;小端字节序反之。
这里的先后是根据地址的增长顺序说的。
将一个字视为一个对象,包含多个字节。
几乎所有的机器都是多字节对象(字)的地址是所使用的字节中最小的地址。
有两种字节次序:
比如给定一个16进制数,0x12345678, 0x12是数据的高字节,0x78是数据的低字节。如果说以低字节为低地址,则就是说按照地址递增的顺序,先存储数据的低位字节。
因此我们说大端序有“大自然”的外号。
即:大端序存储数据与我们的正常感觉相符合。从左往右存,左边是存储地址的低地址,但存储的是数据的高字节。比如0x123456H,12是数据的高字节,存在地址的最左边。
小端序根据低字节为低地址,低字节在右,则字的低地址也在右。从左往右看地址是递减的顺序。
这是两种端序的说法。
我们需要仅仅抓住的是:
那么回到问题中来,2FH如何存储?
如果给两个字节表示2FH,我们正常情况下写成:00H,2FH这个样子。00H是高位字节,2FH是低位字节。
这里的第一,第二,第三字节表示的地址递增的意思。
第二字节相对于第三字节是地址较小的字节,存储的是数据的相对低位。
即:第二字节存储的是2FH,第三字节存储的是00H.
即第二、第三字节代码是:2FH,00H.
同理D5H是一个负数。写成数据是FFD5H,补码表示,高位扩充是填1.则高位字节是FFH,存储在第三字节上。
低位字节是D5H,存储在第二字节上。
即:第二、第三字节代码是:D5H, FFH.
值得注意的是如果假定从左到右数第一第二第三字节,认为地址从左到右增长,与假定从右往左数第一第二第三字节,即认为地址从右往左增长效果相同。
—感谢 xujiawei4848 关于字地址相关的指正。