图4.13 字符存储和字节地址

  这表明字节地址中偶数地址对应字存储单元的高位字节,奇数地址对应字存储单元的低位字节。请注意,字节地址和字地址有如下关系:

  一个字的高位字节的字节地址为该内存单元的字地址的2倍;一个内存字中的两个字节的字节地址的关系是:低位字节的字节地址为高位字节的字节地址值加1。

  有了上述说明,也就找到了在硬件按字寻址的存储器中,用软件实现的按字节寻址来完成字节读写的办法,有关思路说明如下:

  字地址用15位表示时,字节地址就要使用16位。若使用16位的字节地址值不断加1,则可以使其指向内存的每个字节单元。每加两次,则会从一个字指向另一个字。 如果用16位的字节地址完成增1计数,用16位的字节地址的高15位进行内存读写,用字节地址的最低1位的值为0还是为1区分读写的字节应是高位字节 ( 0 ) 还是低位字节,全部问题就都解决了。

  具体处理办法,可以采用通过寄存器与C进位触发器的循环移位指令来处理。若Ri中存的是一个字地址(假定该地址最高一位的值为零且C的值也为零),在与C循环左移一位后,即得到该字中的头一个字节(高位) 单元的字节地址,加1后则为后一个字节(低位) 单元的字节地址。 再加1则指向了下一个字的高位字节,如此等等。

  有了字节地址,要实现读字节操作,首先应将保存有该字节地址的寄存器与C循环右移,则标记高低位字节的字节地址的最低1位移入C触发器,而寄存器中则是包含了被读字节的内存字单元的字地址,用其首先实现按字读,再用保存在触发器C中的值从读出的一个字中选择相应一个字节就可以了。

  写一个字节内容到内存中稍微复杂些。首先应把准备写入内存的一个字节保存在一个通用寄存器的相应字节中,并将该寄存器的另一个字节的值清为0;再用相应的字地址读出有关内存字的内容,并清0其中要替换为新内容的那个字节,把另一个字节的值通过OR操作与被写字节拼装成一个字,然后写回相应内存的字单元即可。 请注意,切不可用一个字节的内容直接进行内存字的写操作,因为这有可能会破坏原内存字单元中另一个字节的原有内容。