: 运算符在汇编中起什么作用?

发布于 2024-11-30 08:05:55 字数 80 浏览 0 评论 0原文

: 运算符在汇编中起什么作用? 在如下代码中看到:DS:DX 我还没有找到该操作员的任何文档。 (我正在使用 NASM)

what does the : operator do in assembly?
seen in code like: DS:DX
i haven't found any documentation for this operator.
(im using NASM)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

擦肩而过的背影 2024-12-07 08:05:55

这实际上只是一个寄存器分隔符,而不是一个运算符。这意味着使用DX寄存器作为DS段寄存器基址的偏移量。

它实际上为您提供的地址取决于您运行的模式(真实模式或受保护模式)。

例如,在实模式下,段寄存器乘以 16 并添加到偏移寄存器中,得到 20 位物理地址。如果DS0x1234DX0x5678

  12340
+ 05678
  -----
  179B8

在保护模式下,DS为实际上是一个段选择器,用于在表中查找内存的基地址,然后将其添加到偏移寄存器以给出一个值。

该值始终是虚拟地址,在确保相关虚拟内存从外部存储调入后,由内存管理单元 (MMU) 映射到物理地址。

That's actually just a register separator, not an operator. It means use the DX register as an offset from the DS segment register base.

What it actually gives you as an address depends on what mode you're running in (real or protected).

For example in real mode, the segment register is multiplied by sixteen and added to the offset register to give you a 20-bit physical address. If DS is 0x1234 and DX is 0x5678:

  12340
+ 05678
  -----
  179B8

In protected mode, DS is acutally a segment selector which is used to lookup a base address for the memory in a table, then add that to the offset register to give a value.

That value is invariably a virtual address which is mapped to a physical address by the memory management unit (MMU), after ensuring that the relevant virtual memory is paged in from external storage.

ˇ宁静的妩媚 2024-12-07 08:05:55

: 运算符将段寄存器/选择器与通用寄存器区分开来,并表示要访问哪个段中的寄存器值。例如,

DS:DX

意味着在 16 位实模式下访问 16 位寄存器。 DX 寄存器中的位值相对于 DS 段值的偏移量,以 16 字节值递增(即,段值 0x0000 和 0x0001 之间的差异表示16 字节偏移)。例如,如果 DS 中的值为 0xA000,而 DX 中的值为 0xFF,那么您将在 0xA00FF 处寻址该值。

在 32 位保护模式下,段选择器表示 16 位描述符值,其中第 3-15 位用作 CPU 全局描述符表或本地描述符表中的查找偏移量,其中包含有关 32 位段的信息地址范围,以及该段的环级访问权限(即内核级、用户级等)。位 0-1 表示请求权限级别,可防止用户级进程加载更高权限的段值。位 2 是一个标志,清除时表示在 GDT 中查找该段,设置时表示偏移到 LDT 中。例如,DS 值为 0x0010 意味着在 GDT 中查找请求权限级别为 0 的第三个槽(即,您需要处于内核级模式才能设置此值) 。然后,DX 中的值将从 GDT 中为该特定段设置的地址范围的起始位置开始偏移。

The : operator differentiates a segment register/selector from a general-purpose register, and signifies which segment to access the register value in. So for instance,

DS:DX

means in 16-bit real mode to access the 16-bit value in the DX register offset from the DS segment value, which increments in 16-byte values (i.e., the difference between segment values 0x0000 and 0x0001 represent a 16-byte offset). So for instance, if the value in DS was 0xA000, and the value in DX was 0xFF, then you would be addressing the value at 0xA00FF.

In a 32-bit protected mode, the segment selector represents a 16-bit descriptor value where bits 3-15 are used as a look-up offset in the CPU's global descriptor table or local descriptor table which contains information on the 32-bit segment addresses range, as well as the ring-level access permissions for that segment (i.e., kernel-level, user-level, etc.). Bits 0-1 represent the request privledge level, which prevents a user-level process from loading a higher-permission segement value. Bit 2 is a flag, which when cleared means to look up the segment in the GDT, or if set means to offset into the LDT. For instance, a DS value of 0x0010 would mean to look up the third slot in the GDT with a request privledge level of 0 (i.e., you would need to be in kernel level mode to set this value). The value in DX would then be offset from the start of the address range set for that specific segment in the GDT.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文