低字节+高字节+字地址+大端序+小端序全辨析

低字节+高字节+字地址+大端序+小端序全辨析

@(组成原理)web

本次总结这个知识点的原由是一道相对寻址题中把这个知识点做为基本条件,然而其余的问题我都明白,却卡在了低字节为字地址的存放方式中。所以有必要再次进行细致的回顾总结。svg

先看这道题。atom

设相对寻址的转移指令占用三个字节。第一个字节为操做码,第二,三个字节为相对位移量(补码表示),并且数据在存储器中采用以低字节为字地址的存放方式。每当CPU从存储器中取出一个字节时,即自动完成(PC) + 1 ->PC。若PC当前值是240(十进制),要去转移到290(十进制),则转移指令的第2、三字节的机器代码是(2FH,00H);若PC当前值为240(十进制),要求转移到200(十进制),则转移指令的第2、三字节的机器代码是(D5H,FFH)。spa

经过对这道题目的深刻解析以便分析牵涉到的知识点。.net

关于转移指令的PC自增问题:code

http://blog.csdn.net/u011240016/article/details/52723779orm

进行过一次总结。xml

因此这里重点关注的是数的表示问题。
由于转移指令占用3个字节,因此取出指令后PC已经变成(PC)+3了。
不妨设相对偏移的值为A,那么下一条执行的指令地址为: (PC)+3+A 对象

这样根据题中的数据就能够算出A是多少了。blog

第一个:240–>290:
240+3+A=290==>A=47

第二个:240–>200
240+3+A=200A=43

上面的数字都是在十进制下。

OK,问题所有转移到数字的补码表示与具体的存储位置上。

先看补码表示:
47D=[0010,1111]=2FH,DDecimal,HHexadecimal
43D=[1101,0101]=D5H
额外说一句,一个十六进制数占用四位,两个好比,2F, D5占用一个字节。我老是会误觉得2F占用两个字节。这是错的认识。

OK,问题只剩下怎么存储了。
这也是本篇文章的核心。

咱们在小端序,大端序中说过:

小端序:先存储低位字节,后存储高位字节
大端序:先存储高位字节,后存储地位字节

大端字节序,数据高字节存于内存低地址,数据低字节存于内存高地址;小端字节序反之。

这里的前后是根据地址的增加顺序说的。

更正:

将一个字视为一个对象,包含多个字节。

几乎全部的机器都是多字节对象(字)的地址是所使用的字节中最小的地址。

有两种字节次序:

  • 数据的低字节为低地址 – 对应小端序
  • 数据的高字节为低地址 – 对应大端序

好比给定一个16进制数,0x12345678, 0x12是数据的高字节,0x78是数据的低字节。若是说以低字节为低地址,则就是说按照地址递增的顺序,先存储数据的低位字节。

所以咱们说大端序有“大天然”的外号。

即:大端序存储数据与咱们的正常感受相符合。从左往右存,左边是存储地址的低地址,但存储的是数据的高字节。好比0x123456H,12是数据的高字节,存在地址的最左边。

小端序根据低字节为低地址,低字节在右,则字的低地址也在右。从左往右看地址是递减的顺序。

这是两种端序的说法。

咱们须要仅仅抓住的是:

  • 字的地址是多字节对象中的最小的字节地址
  • 给定的数字左边字节是高字节,右边字节是低字节

那么回到问题中来,2FH如何存储?
若是给两个字节表示2FH,咱们正常状况下写成:00H,2FH这个样子。00H是高位字节,2FH是低位字节。
这里的第一,第二,第三字节表示的地址递增的意思。
第二字节相对于第三字节是地址较小的字节,存储的是数据的相对低位。
即:第二字节存储的是2FH,第三字节存储的是00H.

即第2、第三字节代码是:2FH,00H.

同理D5H是一个负数。写成数据是FFD5H,补码表示,高位扩充是填1.则高位字节是FFH,存储在第三字节上。
低位字节是D5H,存储在第二字节上。

即:第2、第三字节代码是:D5H, FFH.

值得注意的是若是假定从左到右数第一第二第三字节,认为地址从左到右增加,与假定从右往左数第一第二第三字节,即认为地址从右往左增加效果相同。

—感谢 xujiawei4848 关于字地址相关的指正。