Assembly 16位实模式下的物理地址公式?

Assembly 16位实模式下的物理地址公式?,assembly,Assembly,物理地址=16*选择器+偏移量 但我不知道为什么用选择器乘以16?64?当然读例如。乘以64就像向左移动6位维基百科说它应该是4,即*16,也就是说选择器代表22位地址中最重要的16位维基百科报告20。这是维基百科中描述的真实模式,比我能做的还要好 64?当然读例如。乘以64就像向左移动6位维基百科说它应该是4,即*16,也就是说选择器代表22位地址中最重要的16位维基百科报告20。这是维基百科中描述的真实模式,比我能做的还要好 为了使程序员与Z80兼容,同时仍能使用超过64KB的内存,早期的英

物理地址=16*选择器+偏移量
但我不知道为什么用选择器乘以16?

64?当然读例如。乘以64就像向左移动6位维基百科说它应该是4,即*16,也就是说选择器代表22位地址中最重要的16位维基百科报告20。这是维基百科中描述的真实模式,比我能做的还要好

64?当然读例如。乘以64就像向左移动6位维基百科说它应该是4,即*16,也就是说选择器代表22位地址中最重要的16位维基百科报告20。这是维基百科中描述的真实模式,比我能做的还要好

为了使程序员与Z80兼容,同时仍能使用超过64KB的内存,早期的英特尔处理器引入了内存分段。16位段将左移4位,意思是乘以16,而不是像您的问题所说的那样在添加到16位偏移量之前乘以64,从而产生一个20位地址


对于习惯于Z80的程序员来说,所需要的只是使用操作系统提供的段,他们可以随心所欲地使用给定的64KB偏移量。新程序员可以对这些段进行更复杂的操作,允许他们访问1兆字节的地址空间。IBM PC将地址空间缩减到640千字节,但这是出于他们自己的原因。

为了使程序员与Z80兼容,但仍能使用超过64千字节的内存,早期的英特尔处理器引入了内存分段。16位段将左移4位,意思是乘以16,而不是像您的问题所说的那样在添加到16位偏移量之前乘以64,从而产生一个20位地址

对于习惯于Z80的程序员来说,所需要的只是使用操作系统提供的段,他们可以随心所欲地使用给定的64KB偏移量。新程序员可以对这些段进行更复杂的操作,允许他们访问1个MiB的地址空间。IBM PC将地址空间缩减到640 kiB,但这是出于他们自己的原因

我不知道为什么用选择器乘以64

16位指针可以轻松寻址64 KB

CPU设计者希望能够寻址1MB

因此,他们没有使用单个16位指针,而是指定一个指针由两个寄存器实现,即段加偏移,其中“段”是一个16位寄存器,其值乘以16以寻址1MB

值16来自将所需地址范围1 MB除以16位寄存器大小64 KB的自然寻址能力。。。i、 e.16来自1MB/64KB

我不知道为什么用选择器乘以64

16位指针可以轻松寻址64 KB

CPU设计者希望能够寻址1MB

因此,他们没有使用单个16位指针,而是指定一个指针由两个寄存器实现,即段加偏移,其中“段”是一个16位寄存器,其值乘以16以寻址1MB


值16来自将所需地址范围1 MB除以16位寄存器大小64 KB的自然寻址能力。。。i、 e.16来自1MB/64KB。

8088/8086的目标是提供一种方法,使16位处理器可以拥有1MB的寻址空间,而程序员不必将地址空间划分为64K块,并担心地址是否跨越它们之间的边界。尽管它受到了很多诽谤,但它实际上比我见过的处理超过寄存器大小的地址的任何其他方法都要好。当数据被自然地细分为64K或更少的项,并且可以将项填充到16字节的边界上时,它通常可以相对轻松地工作。乘以16而不是某个较大或较小的数字可能是任意的,但在用十六进制表示法列出事物时,它可以方便地计算出来,这是一个很好的折衷方案,即使用两个较小的数字,将地址空间限制在半兆或更小或太大的数字,需要更多的代码来处理分配块的任意偏移量,或者将更多的内存填充块浪费到更大的倍数

实际上,8088细分设计中唯一的主要缺陷是:

两个通用分段寄存器是不够的。常见的模式是将数据从一个对象复制到另一个对象,使用第三个对象进行转换;只有当其中一个对象位于代码段或堆栈中时,该模式才能有效实现。不幸的是,直到80386年,这个问题才得到解决,当时的普遍做法是忽略段。 在段寄存器上没有任何好的算法。添加或删除的说明 来自DS或ES或FS或GS的ubtract 0x1000,无论是设置进位还是无条件地设置,总共八个或十六个操作码都将极大地促进段处理。 应该有mov seg,立即指示。
尽管程序员经常抱怨一天中的8088/8086个,但它比我看到的任何其他16位处理器都好得多,或者从NB开始:我认为68000个32位处理器。

< P> 8088/8086的目标是提供一个16位处理器可以拥有1兆字节寻址空间的方法,程序员无需将地址空间划分为64K块,并担心地址是否跨越它们之间的边界。尽管它受到了很多诽谤,但它实际上比我见过的处理超过寄存器大小的地址的任何其他方法都要好。当数据被自然地细分为64K或更少的项,并且可以将项填充到16字节的边界上时,它通常可以相对轻松地工作。乘以16而不是某个较大或较小的数字可能是任意的,但在用十六进制表示法列出事物时,它可以方便地计算出来,这是一个很好的折衷方案,即使用两个较小的数字,将地址空间限制在半兆或更小或太大的数字,需要更多的代码来处理分配块的任意偏移量,或者将更多的内存填充块浪费到更大的倍数

实际上,8088细分设计中唯一的主要缺陷是:

两个通用分段寄存器是不够的。常见的模式是将数据从一个对象复制到另一个对象,使用第三个对象进行转换;只有当其中一个对象位于代码段或堆栈中时,该模式才能有效实现。不幸的是,直到80386年,这个问题才得到解决,当时的普遍做法是忽略段。 在段寄存器上没有任何好的算法。如果设置进位或无条件地总共八个或十六个操作码,则从DS或ES或FS或GS中添加或减去0x1000的指令将极大地促进段处理。 应该有mov seg,立即指示。
尽管程序员经常抱怨8088/8086天内的情况,但它比我看到的任何其他16位处理器都好得多,或者从NB开始:我认为68000是一个32位处理器。至少,你用的是什么CPU架构和汇编程序?当然我不用16位,我只是在一本书上看到的,我只是好奇而已!那么它是所有16位实模式的通用公式还是什么?不,如果您参考x86,并且假设公式是正确的,那么这不是通用公式。您需要提供更多信息。至少,你用的是什么CPU架构和汇编程序?当然我不用16位,我只是在一本书上看到的,我只是好奇而已!那么这是所有16位实模式的通用公式还是什么?不,如果你提到x86,并且假设公式是正确的,这不可能是通用的。不知何故,我认为他们并不关心Z80兼容,因为Z80是他们的直接竞争对手。这些指令甚至与8080不兼容,尽管翻译相对容易。@Mark:他们当然在乎。如果他们是适度Z80兼容的,那么这将是他们可以添加的另一个要点。一个可以吸引Z80开发人员的工具。@Ignacio:Z80是8080上的一批奇怪的扩展,我不记得大多数扩展都进入了8086和8088。没有什么比Z80更能向上兼容的了。@David:内存寻址方案。多亏了操作系统,x86程序员现在不必担心处于保护模式的描述符表。将x86替换为Z80,将描述符表替换为内存段,将保护模式替换为8086,历史会自动重复。@Ignacio:Z80寻址内存与8080非常相似。不同之处在于一对索引寄存器IX和IY,它们是笨拙而缓慢的索引尝试。我发现它们大多是无用的,这似乎是我读到的普遍共识。Z80没有内存段。简而言之,从几十年前的大量Z80经验来看,我不知道你在说什么。不知何故,我认为他们并不关心Z80的兼容性,因为Z80是他们的直接竞争对手。这些指令甚至与8080不兼容,尽管翻译相对容易。@Mark:他们当然在乎。如果他们是适度Z80兼容的,那么这将是他们可以添加的另一个要点。一个可以吸引Z80开发人员的工具。@Ignacio:Z80是8080上的一批奇怪的扩展,我不记得大多数扩展都进入了8086和8088。没有什么东西是特别受欢迎的
Z80@David:内存寻址方案。多亏了操作系统,x86程序员现在不必担心处于保护模式的描述符表。将x86替换为Z80,将描述符表替换为内存段,将保护模式替换为8086,历史会自动重复。@Ignacio:Z80寻址内存与8080非常相似。不同之处在于一对索引寄存器IX和IY,它们是笨拙而缓慢的索引尝试。我发现它们大多是无用的,这似乎是我读到的普遍共识。Z80没有内存段。简而言之,从几十年前大量的Z80经验来看,我不知道你在说什么。