:操作员在装配中做了什么? 看到类似的代码:DS:DX
我还没有找到该运营商的任何文档。 (使用NASM IM):操作员在装配中做什么?
1
A
回答
4
这实际上只是一个注册分隔符,而不是操作符。这意味着使用DX
寄存器作为与DS
段寄存器基址的偏移量。
它究竟是什么给出你作为一个地址取决于你在什么模式下运行(真实或受保护)。
例如,在实模式下,段寄存器乘以16并添加到偏移量寄存器,为您提供20位物理地址。如果DS
是0x1234
和DX
是0x5678
:
12340
+ 05678
-----
179B8
在保护模式下,DS
是实际上可以分段选择其被用于查找的基地址用于在表存储器中,然后添加到偏移寄存器给一个价值。
该值始终是一个虚拟地址,它在确保从外部存储器中对相关虚拟内存进行分页之后,由内存管理单元(MMU)映射到物理地址。
2
的:
操作者区分从一个通用寄存器段寄存器/选择器,并表示该段中访问该寄存器的值。因此,例如,
DS:DX
指16位实模式来访问DX
寄存器偏移量为DS
段值的16位值,该值以16字节值递增(即段值0x0000和0x0001之间的差值表示16字节偏移量)。举例来说,如果DS
中的值为0xA000,并且DX
中的值为0xFF,则您将寻址0xA00FF处的值。
在32位保护模式下,段选择器表示一个16位描述符值,其中位3-15用作CPU全局描述符表或局部描述符表中的查找偏移量,其中包含32位段地址范围以及该段的环级访问权限(即内核级别,用户级别等)。位0-1表示请求专用级别,它阻止用户级别的进程加载更高权限的分段值。位2是一个标志,当清除意味着在GDT中查找段时,或者如果设置意味着偏移到LDT中。例如,DS
的值为0x0010意味着在请求权限级别为0的情况下查找GDT中的第三个插槽(即,您需要处于内核级别模式才能设置此值)。然后,DX
中的值将从GDT中为该特定段设置的地址范围的开始处开始偏移。
相关问题
- 1. 这些操作员在做什么C
- 2. @在装配中做什么?
- 3. 在哪里查看装配操作员?
- 4. 简单操作在Matlab中做什么?
- 5. '+ ='操作符在Javascript中做了什么?
- 6. '|| ='操作符在ruby中做了什么?
- 7. &和|是什么?操作员在批处理文件中做什么?
- 8. 如何定义操作员做什么在Java类
- 9. 这些操作员在做什么? String key = offset == -1? keyStroke:keyStroke.substring(offset + 1);
- 10. ls -LA做什么操作?
- 11. 什么是++操作符在Python中做什么?
- 12. 双管齐下和管道操作员做什么?
- 13. 这在装配中有什么作用
- 14. 装配编程中的伪操作是什么?
- 15. 我在这里做错了什么?在我的编译中有几个“不匹配操作员”的错误
- 16. 装配中的位操作
- 17. 为什么操作员不能在C++ - CLI中工作?
- 18. 新操作员返回什么?
- 19. RxJS - 操作员的要点是什么?
- 20. 我的操作员有什么问题?
- 21. 内存操作 - 我做错了什么?
- 22. 这个位操作函数做什么?
- 23. 我在做下面的数组操作时做错了什么?
- 24. 在bash中,-a操作符在做什么?
- 25. 不确定组合操作员在功能中执行什么操作
- 26. 共享操作员在RxJava中做什么?我应该什么时候使用它?
- 27. _malloc在装配中究竟做了些什么?
- 28. >>操作符/操作数/修饰符是做什么的?
- 29. 测试人员做什么?
- 30. 操作员超载错误“与操作员错误不匹配”
谢谢(哇,那很快:D) – TheBreadCat