在16位字长的机器里,用什么办法来提供20位地址呢?在IBM PC机里采用了存储器地址分段的办法。
程序员在编程序时要把存储器分成段,每段大小可达64K,这样内存地址可用16位表示。IBM PC机对段的起始地址有所限制,段不能起始于任意地址,而必须从任一小段(paragraph)的首地址开始。机器规定:从0地址开始,每16字节为一小段(正如我们平时在16进制编辑器中看到的一样,一行16字节)。下面列出了存储器最低地址区的3个小段的地址区间,每行为一小段:
00000,00001,00002,。。。,0000E,0000F
00010,00011,00012,。。。,0001E,0001F
00020,00021,00022,。。。,0002E,0002F
其中,第一列就是每小段的首地址。其特征是:在16进制表示的地址中,最低为0(即20位地址的低4位为0)。在1M字节的地址空间里,共有64K个小段首地址,可表示如下:
00000H
00010H
00020H
。。。
41230H
41240H
。。。
FFFE0H
FFFF0H
在1M字节的存储器里,每一存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。CPU在访问存储器时,必须先确定要访问的存储单元的物理地址才能取得(或存入)该单元中的内容。20位物理地址由16位段地址和16位偏移地址组成,段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低4位一定是0,这样就可以规定段地址只取段起始地址的高16位值。偏移地址则是指在段内相对于段起始地址的偏移值。这样,物理地址的计算方法可表示如下:
XXXX XXXX XXXX XXXX 0000 (前面是16位,后面4位0是16位左移后补的)
+ XXXX XXXX XXXX XXXX
-----------------
XXXX XXXX XXXX XXXX XXXX (即20位)
也就是说:把段地址左移4位再加上偏移地址值就形成物理地址。或写成:
16 X 段地址 + 偏移地址 = 物理地址
根据上述原理,楼主要表示20001H这个物理地址中的数123h,则可以:
段地址设为2000H,偏移地址设为0001H
当然还可以:
段地址设为1F00H,偏移地址设为1001H
总之,段地址左移4位再加上偏移地址值=物理地址 即可。偏移地址在0000H至FFFFH之间。
不知这样说你是否明白?
mov ax,2000H
mov ds,ax
mov bx,1
mov di,ds:[bx] ; 取出的di即123h
8086的后继版本向下兼容,段寄存器的确够用,但不能向下兼容。
段寄存器:便宜寄存器用于实模式下分段存储方式寻址,
80386及后续机型采用32位结构,在保护模式下,可启用分页存储管理,相应的机制也更复杂
1 JMP BX ; 如果(BX)=1020H,那么(IP)=1020H,因为此种形式为通过寄存器的段内间接转移,执行时将把寄存器的内容直接送IP,所以执行此指令后IP的值为1020H
2 JMP TAB[BX][SI];如果(DS)=2000H,(BX)=1020H,(SI)=0002H,TAB=0010H,(21032H)1234H,那么(IP)=1234H。此种形式为通过存储单元(TAB[BX][SI])段内间接转移,存储单元的内容即为转移的目标地址(偏移量)此存储单元的EA=0010H+1020H+0002H=1032H,其物理地址PA=(DS)10H+EA=20000H+1032H=21032H,而内存单元(21032H)的内容为1234H,所以执行此指令后IP的值为1234H
以上就是关于关于汇编语言读取指令问题全部的内容,包括:关于汇编语言读取指令问题、关于汇编语言:CS:IP,SS:SP的问题、汇编语言编程的问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)