什么:运算符在汇编中做什么?

时间:2011-08-19 13:49:25

标签: assembly x86 operators nasm

运算符在汇编中做了什么? 在代码中看到:DS:DX 我没有找到该运营商的任何文件。 (我正在使用NASM)

2 个答案:

答案 0 :(得分:5)

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

它实际上给你你的地址取决于你正在运行的模式(真实的或受保护的)。

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

  12340
+ 05678
  -----
  179B8

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

该值总是一个虚拟地址,在确保从外部存储器中分页相关虚拟内存后,由存储器管理单元(MMU)映射到物理地址。

答案 1 :(得分:2)

:运算符区分段寄存器/选择器与通用寄存器,并表示访问寄存器值的段。例如,

DS:DX

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

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