我正在汇编中调试CLR代码,并且到了一行
mov rax, qword ptr [ff4053c0h]
我认为qword ptr [ff4053c0h]
是指我感兴趣的字符串,但ff4053c0h
不是有效的内存位置。阅读qword ptr
它似乎引用了一个基于基址寄存器的地址(例如qword ptr [rsp+30h]
是30个字节进入堆栈),但是我找不到没有基址寄存器的含义。
答案 0 :(得分:8)
如果没有提供基本注册,则表示data segment
(http://www.osdata.com/system/physical/memory.htm)。在您的代码中,mov rax, qword ptr [ff4053c0h]
表示“从数据段偏移FF4053C0h中获取8个字节并将它们放入RAX”。
正如您指出的那样,rsp
等基本寄存器的存在清楚地表明了堆栈段。在您的情况下,没有基址寄存器意味着数据段。
现在,关于大号“FF4053C0h”,即“4 282 405 824”,完全有可能拥有4Gb的可寻址内存(http://wiki.osdev.org/Protected_Mode),这确认了您的代码行可能有效且它在一个巨大的数据段(http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html)中访问偏移FF4053C0h。
答案 1 :(得分:6)
没有任何理由使事情变得复杂:
这意味着从地址0ff4053c0h
将64位值读入寄存器RAX
。
地址必须有效,请再次检查
QWORD PTR
只是一个大小说明符(这里是冗余的,但它提高了可读性),它与具有基址寄存器无关。
如果您真的对CPU具有的各种寻址模式感兴趣,可以阅读英特尔手册(Google)。
答案 2 :(得分:0)
您正在将64位值从内存移动到rax寄存器中。该值从地址ff4053c0h读取。 qword ptr是汇编程序使用64位常量地址创建移动操作码(机器码)的提示。提供的值是32位值(8个十六位数=> 8位十六进制数/字母=> 8 * 4位=> 32位)。
有支持32位操作的移动操作码,但(很可能检查CPU /模式的规格)不是用于将存储器加载到64位寄存器中。所以需要qword来确保你真正想要表达64位地址的汇编程序。
有关指向未定义内存的地址的注释(请参阅有关已验证答案的注释),请了解现在每个进程都分配了一个虚拟内存表。虚拟内存基本上将逻辑地址映射到实际内存中的地址。它可以防止进程查看和更改不属于进程的内存,从而为正在运行的系统提供极大的稳定性。
如果两个进程共享一部分内存,则每个进程可能会在不同的逻辑地址处看到完全相同的物理内存。操作系统决定每个进程的虚拟内存是什么样的。
映射是在每页级别上提供的(例如,页面= 4KB),处理器在内部进行实际映射。
这个概念非常适用于将文件映射到内存并在不同进程之间共享内存。这样,您可以将2GB文件映射到内存中,并使10个进程同时使用相同的映射文件,同时仅消耗(最多)2GB实际内存。文件io-caching主要是在操作系统级别完成的。