关于汇编语言读取指令问题

关于汇编语言读取指令问题,第1张

在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的问题、汇编语言编程的问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9272073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存