Assembly 教育目的?

Assembly 教育目的?,assembly,x86,masm,Assembly,X86,Masm,汇编中的les指令的目的是什么 为什么我们需要加载es段和寄存器?这本书举了以下例子: les bx, p ; Load p into ES:BX mov es:[bx], al ; Store away AL 在这种情况下,我们为什么需要加载es和bx 还有,为什么我们要使用es:[bx]?如果p指向内存中的100h,那么es和bx100h=200h(bx+es)不都是吗?p指向带有段和偏移部分的32位远指针(与近指针相反,近指针只是偏移部分)。 LE

汇编中的
les
指令的目的是什么

为什么我们需要加载
es
寄存器?这本书举了以下例子:

les    bx, p           ; Load p into ES:BX
mov    es:[bx], al     ; Store away AL
在这种情况下,我们为什么需要加载es和bx


还有,为什么我们要使用
es:[bx]
?如果
p
指向内存中的100h,那么
es
bx
100h=200h(
bx+es
)不都是吗?

p指向带有段和偏移部分的32位远指针(与近指针相反,近指针只是偏移部分)。 LES将段:偏移加载到
ES:BX

否则,您必须使用三个说明。
一个用于加载
BX
,两个用于加载
ES
(段寄存器不能直接从内存加载,但必须先加载到通用寄存器,然后再加载到段寄存器)

哦,是的,wallyk提到保护模式很有道理(尽管这与你的问题无关)。 在这里,
ES
将被解释为选择器,而不是实际的段

此上下文中的段(地址)是物理地址的一部分:
将该段向左移动4位(即乘以2^4=16),并添加偏移量,以从段:偏移量中获取物理地址

相反,选择器是指向所谓的描述符表中的项的指针(即,选择器指向描述符),并在保护模式下使用。
描述符表(例如)可能包含关于内存块的信息条目,包括关于物理内存地址、内存块大小、访问权限等的信息(还有一些轻微的其他用途)。

对于一个结构混乱的微处理器来说,学习汇编程序太糟糕了。你会得到令人困惑的概念,比如LES指令

传统的微处理器有足够大的寄存器来容纳一个完整的内存地址。您只需将内存位置的地址加载到寄存器中,然后通过寄存器访问该位置(通常是索引位置附近的位置)

有些机器(特别是Intel 286的实模式,这似乎就是您正在编程的),只有16位寄存器,但可以寻址1MB内存。在这种情况下,寄存器没有足够的位:需要20位,但寄存器只有16位

解决方案是使用第二个寄存器来包含丢失的位。一个简单的方案是需要2个寄存器,其中一个具有较低的16位,另一个具有较高的16位,以生成32位地址。然后,引用两个寄存器的指令就有意义了:两个寄存器都需要获得完整的内存地址

英特尔选择了messier
段:偏移量
方案:普通寄存器(在您的例子中是bx)包含较低的16位(偏移量),特殊寄存器(称为ES)包含16位,左移4位,并添加到偏移量中,以获得结果的线性地址。ES被称为“段”寄存器,但除非你读到大约1968年的情况,否则这毫无意义

(x86允许对地址的“有效地址”或“偏移量”部分使用其他寻址模式,如
es:[bx+si+1234]
,但对于内存地址,始终只有一个段寄存器。)

[当完全采用Multics方式时,段和段寄存器确实是一个有趣的想法。如果你不知道这是什么,并且你对计算机和/或信息架构感兴趣,请找到Elliot Organik关于Multics的书,从头到尾阅读。你会对我们在60年代末所做的感到失望,并且似乎有50年“进步”中的ost。如果您想对此进行更长时间的讨论,请参阅]

x86中剩下的想法几乎是一个笑话,至少它在“现代”操作系统中的使用方式是如此。你真的不在乎;当某个硬件设计师向你展示一台机器时,你必须接受它的现状

对于Intel 286,您只需加载一个段寄存器和一个索引寄存器即可获得完整地址。每个机器指令必须引用一个索引寄存器和一个段寄存器才能形成完整地址。对于Intel 286,有4个这样的段寄存器:DS、SS、ES和CS。每种指令类型都显式指定tes一个索引寄存器并隐式选择4个段寄存器中的一个,除非您提供了一个明确的覆盖说明要使用哪一个。JMP指令使用CS,除非您另有说明。MOV指令使用DS,除非您另有说明。PUSH指令使用SS,除非您另有说明(在本例中,最好不要)。ES是“额外的”段;只能通过在指令中显式引用它来使用它(块移动[MOVB}指令除外,它隐式使用DS和ES)

希望有帮助


最好使用更现代的微处理器,其中段寄存器愚蠢不是问题。(例如,32位模式x86,主流操作系统使用所有段基均为0的平面内存模型。因此,您可以忽略段,使用单个寄存器作为指针,只关心地址的“偏移”部分。)8086段寄存器
cs
ds
es
ss
是16位寄存器寻址64K以上内存的原始机制。在8086/8088中,有20位地址(1024K)后续版本的x86处理器添加了新的方案来处理更多的地址,但从一对16位值生成20+位地址是基本原因

在所谓的“实模式”(8086/8088/80186本机)中,通过将段寄存器的内容乘以16(或等效地左移四位)并添加偏移量来计算地址

在保护模式(80286及更高版本提供)下,段重新