运算符在汇编中做了什么?
在代码中看到:DS:DX
我没有找到该运营商的任何文件。
(我正在使用NASM)
答案 0 :(得分:5)
这实际上只是一个寄存器分隔符,而不是运算符。这意味着使用DX
寄存器作为DS
段寄存器基址的偏移量。
它实际上给你你的地址取决于你正在运行的模式(真实的或受保护的)。
例如,在实模式下,段寄存器乘以16并添加到偏移寄存器,为您提供20位物理地址。如果DS
为0x1234
且DX
为0x5678
:
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中该特定段设置的地址范围的开头。