没有基址寄存器,qword ptr [hexvalue]意味着什么

时间:2015-07-03 17:07:59

标签: assembly .net-assembly

我正在汇编中调试CLR代码,并且到了一行

mov rax, qword ptr [ff4053c0h]

我认为qword ptr [ff4053c0h]是指我感兴趣的字符串,但ff4053c0h不是有效的内存位置。阅读qword ptr它似乎引用了一个基于基址寄存器的地址(例如qword ptr [rsp+30h]是30个字节进入堆栈),但是我找不到没有基址寄存器的含义。

3 个答案:

答案 0 :(得分:8)

如果没有提供基本注册,则表示data segmenthttp://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。

另一个来源= Assembly: Using the Data Segment Register (DS)

答案 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主要是在操作系统级别完成的。