【问题标题】:Size of the 8086 Code Segment8086 代码段的大小
【发布时间】:2015-07-31 14:37:50
【问题描述】:

我得到了 CS、DS、SS、ES、SP、BP、SI、DI、AX、BX、CX、DX 的寄存器值。我将如何查找代码段的十六进制字节大小?

【问题讨论】:

  • 我碰巧不同意重复问题中的答案。我在这里非常支持 Serge 的回答,只是说所有片段都是 64kb。即使一个 Segment 等于 0xFFFF,它仍然是 64kb 并且环绕到内存的底部。

标签: assembly intel x86-16


【解决方案1】:

你不能。

8086 现在已经过时了,但有些恐龙还记得它。它是一个 16 位处理器,但地址为 20 位:4 个段寄存器(CS、DS、ES 和 SS)的值移位了 4 位,并添加了偏移量。总可寻址内存为 1 MB。

任何段的最大大小为 65536 字节 (0x10000)。但是处理器不知道代码段的实际大小。没有内存保护,允许在代码段中间写入数据(根据程序员是否知道原因,可能是对还是错:-()。

曾经有不同的常用内存模型(参考:8086 Memory Model):

  1. Tiny:CS = DS = SS = ES:整个程序使用了 1 个单段并且限制为 64k 字节
  2. 小:一个代码段和一个数据段。数据和代码都使用接近寻址(16 位)。
  3. 紧凑:一个单段代码,对数据没有限制:代码使用近寻址(16 位),数据使用远寻址(32 位:段 + 偏移)
  4. 中:数据一个段,代码无限制
  5. 大:代码和数据没有限制

所以:

  • 段的最大代码为64kbytes,但使用的大小可以更小
  • 代码可以根据需要使用尽可能多的段(对于中型和大型模型),每个段的大小小于 64k

【讨论】:

  • 我在很大程度上同意你的看法,但我想说任何段的大小总是 64kb(8086 上的段大小无法更改 AFAIK),你说 任何段的最大大小为 65536 字节 (0x10000),我建议段的大小始终等于 64kb,正如您指出的那样,您无法计算其中的多少甚至在8086. 这个问题与另一个问题重复出现,建议可以计算代码段,我完全不同意。
  • @MichaelPetch:您所说的段是可从一个基址寄存器寻址的内存,这在 8086 上确实是 64k!我(以及 ref'd 的问题 - 对您来说不错)所谓的段是链接器声明为段的内容,而这个是 limited 到 64k。现在假设程序使用小内存模型,并且假设CS 我们可以猜测代码段从CS延伸到DS和数据段从 DS 延伸到 SS。但这一切都可能是完全错误的,因为程序使用了中型或大型内存模型,而不是自定义内存管理。
  • 我了解您来自哪里,但是从问题的措辞方式来看,另一个问题没有提及上下文(链接器)等。由于缺乏适当的上下文,我回退到如何处理器会看到它。微小的内存模型将使所有段都相同,但我怀疑有人会争辩说代码段是 0 字节;-)。我认为这些问题不够清晰,也许这里的问题不是它们实际上是如何提供给原始海报的。
  • 作为脚注,我会考虑链接器的上下文如果问题说他们正在谈论文本和数据段或文本和数据部分(术语因汇编程序而异)。
  • @MichaelPetch 我真的不记得我的(法语)手册是否提到了段或节 :-) 但我喜欢 0 字节大小的段!
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
相关资源
最近更新 更多