它太糟糕了,你正在为一个凌乱的架构的微处理器学习汇编程序.你会得到令人困惑的概念,比如LES指令.
传统的微处理器具有足够大的寄存器以包含完整的存储器地址.您只需将内存位置的地址加载到寄存器中,然后通过寄存器访问该位置(通常是附近的索引).
有些机器(特别是Intel 286似乎就是你编程的)只有16位寄存器但可以处理1mB的内存.在这种情况下,寄存器没有足够的位:您需要20位,但寄存器只有16位.
解决方案是使用包含缺失位的第二个寄存器.一个简单的方案是需要2个寄存器,其中一个寄存器具有低16位,其中一个具有高16位,以产生32位地址.然后引用两个寄存器的指令是有意义的:您需要两者来获得完整的内存地址.
英特尔选择了一个更简洁的方案:索引寄存器(在你的情况下为bx)包含低16位,另一个寄存器(称为ES)包含16位左移4位,并添加到索引寄存器,以获得结果地址.ES被称为"段"寄存器,但除非您阅读大约1968年的Multics操作系统,否则这没有任何意义.
[完全实现Multics方式时,段和段寄存器确实是一个有趣的想法.如果您不知道这是什么,并且您对计算机和/或信息架构有任何兴趣,请查找关于Multics的Elliot Organick书籍并阅读它的封面.你会对我们在60年代后期所拥有的东西感到沮丧,并且似乎已经失去了50年的"进步".
这个想法在x86中留下的内容几乎是一个笑话,至少它在"现代"操作系统中使用的方式.你真的不在乎; 当一些硬件设计师为您提供一台机器时,您必须按原样使用它.
对于Intel 286,您只需加载段寄存器和索引寄存器即可获得完整地址.每个机器本身必须引用一个索引寄存器和一个段寄存器以形成完整地址.对于Intel 286,有4个这样的段重组器:DS,SS,ES和CS.每个指令类型都明确指定一个索引寄存器,并隐式选择4个段寄存器中的一个,除非您提供一个显式覆盖,说明要使用哪一个.除非另有说明,否则JMP指令使用CS.除非另有说明,否则MOV说明使用DS.PUSH指令使用SS,除非你另有说明(在这种情况下你最好不要).ES是"额外"部分; 您只能通过在指令中明确引用它来使用它(块移动[MOVB}指令除外,它同时使用DS和ES).
希望有所帮助.
最好使用更现代的微处理器,其中段寄存器愚蠢不是问题.
8086个寄存器cs,ds,es,和ss是原始机制,通过该16位寄存器可以寻址超过64K的存储器.在8086/8088中,有20位地址(1024 K)要生成.x86处理器的后续版本增加了新方案以进行更多处理,但是从一对16位值生成20+位地址是基本原因.
在所谓的"实模式"(原生于8086/8088/80186/80286)中,通过将段寄存器的内容乘以16(或等效地,向左移位4位)并添加偏移来计算地址.
在保护模式下(80386及更高版本可用),段寄存器选择包含基本物理地址的"描述符".es:[bx]例如,操作数会添加bx到该物理地址以生成操作数地址.