Assembly 在x86中:是什么意思?

Assembly 在x86中:是什么意思?,assembly,x86,Assembly,X86,在本装配说明书中 mov ax, es:[bx] :的作用是什么?:是表示地址段部分的惯例ES因此是一个段(因此SI例如在此位置将无效),并且[BX]该段内的偏移量;用作偏移量的段寄存器同样无效并产生错误 具体做什么:做什么 “:”不“做”任何事情,就像“.”在大多数高级编程语言中不“做”任何事情一样。“:”与:形式的指令一起使用。默认情况下,所有x86指令都有一个“默认段选择器”,用于确定指令“内存操作数”指示的地址。这通常是“ds”或“ss”,具体取决于指令。然而,指令可以通过在指令二进制

在本装配说明书中

mov ax, es:[bx]

的作用是什么?

是表示地址段部分的惯例
ES
因此是一个段(因此
SI
例如在此位置将无效),并且
[BX]
该段内的偏移量;用作偏移量的段寄存器同样无效并产生错误

具体做什么:做什么

“:”不“做”任何事情,就像“.”在大多数高级编程语言中不“做”任何事情一样。“:”与
形式的指令一起使用。默认情况下,所有x86指令都有一个“默认段选择器”,用于确定指令“内存操作数”指示的地址。这通常是“ds”或“ss”,具体取决于指令。然而,指令可以通过在指令二进制编码中指定适当的“指令前缀字节”来指定CS、DS、ES、SS、FS和GS段寄存器中的任何一个

在16位“实模式”程序中,段寄存器中的值用于确定内存地址的“高阶位”。它与指令中指定的内存地址相结合,以生成指令引用的实际地址。这允许在16位硬件上运行的程序访问大于16位的内存空间,前提是它们可以将内存分组为4k块,这些块可以相对于“段选择器”寄存器进行访问

在32位程序中,段选择器实际上是描述动态映射(包括偏移量和大小)的结构的索引。地址是通过将索引结构中的信息与指令中的内存操作数相结合来计算的

大多数情况下,在32位程序中,大多数段寄存器指向指定整个32位地址空间的结构。主要的例外是“fs”寄存器,它指定映射到操作系统定义的特殊数据结构的偏移量和大小。它被用作内核空间和用户空间之间通信的机制之一。它通常包含对当前“进程或线程”的内核表示的所有“用户空间可见”属性的访问

64位程序完全避开段寄存器。除FS和GS之外的所有段寄存器都定义为无效,其行为就好像它们映射了整个用户空间一样。FS寄存器通常用于提供对执行程序当前“32位上下文”的访问。“GS”寄存器通常用于提供对当前“64位上下文”的访问。这允许32位程序在64位系统上运行,但也允许64位内核(以及32位进程和64位进程之间的映射层)访问其工作所需的64位上下文

因此,要回答您最初的问题:

很可能(在不了解处理器或操作系统模式的情况下),指令:

mov ax, es:[bx]
实际上相当于:

mov ax, [bx]
然而,它使用16位寄存器的事实表明它可能是实模式程序,在这种情况下,它可能意味着:

mov ax, [<addr>]
mov-ax,[]

其中addr==(es当您访问进程内存中的某些数据时,始终会涉及一个段寄存器,它定义了一个内存窗口,主寄存器为偏移量。这些寄存器是
cs
ds
es
ss
fs
gs
。其中一些段寄存器具有特殊的pu像
cs
ss
这样的用途。 当您使用类似于示例中的寄存器访问数据时,汇编程序会选择一个默认段。该段寄存器在指令中进行编码。 在某些情况下,您希望覆盖默认选择,并使用不同的段寄存器,然后使用默认寄存器,您可以通过使用段覆盖来实现这一点,这就是您的示例所做的

执行时

mov   eax, [ebx]
默认情况下,将使用
ds

但是带段覆盖的指令

mov   eax, es:[ebx]

指定应改用
es
段。在Windows中,默认情况下,
ds
es
指向同一段,因此不需要此重写,因为它将访问相同的物理地址。

ds:OFFSET,其中ds是段地址,OFFSET是相对于段的偏移量

意思是这样计算地址:DS*size\u of_段+偏移量

通常,对于x86,段的大小是16字节

例如:

      DS:  07C0H   0000 0111 1100 0000 
+ OFFSET:   0000H       0000 0000 0000 0000
=          07C00H  0000 0111 1100 0000 0000

谢谢。更有意义的是这两个指令
mov-ax,es:[bx]
mov-ax[bx]
不是等价的,除非以前使用过
假定
命令。在这种情况下,默认寄存器是
ds
而不是
es
,因此需要段o override,这就是
es:
所做的。大多数情况下,在32位程序中,es具有偏移量0并引用整个地址空间。这就是为什么I援助“从概率上讲”它们是等价的。这并不意味着它更好,因为答案取决于
ds
es
具有相同的值。因此在Windows程序中,指令的效果是相同的,因为
es
ds
指向相同的段,但这并不意味着指令本身是等价的,只有效果是相同的它在Windows系统中的ct(可能也在Linux中?因为OP显然不知道这一点,他可能会被误导。你应该将
概率
部分替换为
假设es和ds相等
。本文实际上讨论了32位程序中分段的含义(请阅读).然后我提到,大多数情况下,除了FS和GS,32位程序中不使用这些段,这意味着