assembly - : mean in x86? 是什么意思

标签 assembly x86

在此汇编指令中

mov ax, es:[bx]

: 的作用是什么?

最佳答案

what specifically does the : do?

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

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

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

大多数时候,在 32 位程序中,大多数段寄存器都指向指定整个 32 位地址空间的结构。主要的异常(exception)是“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>]

其中 addr == (es << 4) + [bx]

关于assembly - : mean in x86? 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19739303/

相关文章:

gcc - 对于具有单独管道的 ARM,为 "-mfpu=neon-vfpv3"指定 "-mfpu=neon"比 0x104567910 有优势吗?

linux - NASM scanf 未定义引用 (LINUX)

assembly - LLVM 中的 getOpcode 是什么?

assembly - 是否可以在VM中使用VMX CPU指令?

assembly - 在汇编中清除寄存器中的位

c++ - 使用rdtsc计算系统时间

c - 我们如何在Linux 2.6 中从保护模式切换到实模式?

ubuntu - 如何使用 Ubuntu 14.04 x86 架构创建 Docker 镜像?

linux - 汇编函数整型局部变量

c++ - 访问冲突 _mm_store_si128 SSE Intrinsics