没有基址寄存器的 qword ptr [hexvalue] 是什么意思
What does qword ptr [hexvalue] mean without a base register
我在汇编中调试 CLR 代码,到了一行
mov rax, qword ptr [ff4053c0h]
我认为 qword ptr [ff4053c0h]
指的是我感兴趣的字符串,但 ff4053c0h
不是有效的内存位置。读到 qword ptr
它似乎引用了一个基于基址寄存器的地址(例如 qword ptr [rsp+30h]
是堆栈中的 30 个字节),但我找不到没有基址寄存器的含义。
当没有提供基址寄存器时,表示data segment
(http://www.osdata.com/system/physical/memory.htm)。在您的代码中,mov rax, qword ptr [ff4053c0h]
表示 "take 8 bytes from data segment offset FF4053C0h and put them in RAX"。
正如您所指出的那样,rsp
之类的基址寄存器的存在清楚地表明了堆栈段。在你的情况下,没有基址寄存器意味着数据段。
现在,关于大数字 "FF4053C0h",即“4 282 405 824”,完全有可能拥有 4Gb 的可寻址内存 (http://wiki.osdev.org/Protected_Mode), which confirms that your line of code might be valid and it's accessing offset FF4053C0h in a huge data segment (http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html)。
另一个来源 = Assembly: Using the Data Segment Register (DS) .
不要无缘无故地使事情复杂化:
表示从地址0ff4053c0h
读取一个64位的值到寄存器RAX
.
地址必须有效,请再次检查。
QWORD PTR
只是一个大小说明符(这里是多余的,但它提高了可读性),它与拥有基址寄存器无关。
如果您真的对 CPU 的各种寻址模式感兴趣,可以阅读英特尔手册(Google)。
您正在将一个 64 位值从内存移动到 rax 寄存器。该值是从地址 ff4053c0h 读取的。 qword ptr 提示汇编程序使用 64 位常量地址创建移动操作码(机器码)。提供的值是一个 32 位值(8 个十六进制数字 => 8 倍 hex-digit/letter => 8 * 4 位 => 32 位)。
有支持 32 位操作的移动操作码,但(很可能检查 CPU/Mode 的规范)不支持将内存加载到 64 位寄存器中。所以需要qword来保证你真正要表达64位地址的汇编器。
对于您关于指向未定义内存的地址的评论(请参阅已接受答案的评论),了解现在每个进程都分配了一个虚拟内存 table。虚拟内存基本上将逻辑地址映射到实内存中的地址。它可以防止进程查看和更改不属于该进程的内存,从而为 运行 系统提供很大的稳定性。
如果两个进程都共享一部分内存,则每个进程可能会在不同的逻辑地址看到完全相同的物理内存。操作系统决定每个进程的虚拟内存是什么样的。
在每页级别(例如页=4KB)提供映射,处理器在内部进行实际映射。
这个概念对于将文件映射到内存并在不同进程之间共享内存非常正确。通过这种方式,您可以将一个 2GB 的文件映射到内存中,并让 10 个进程同时处理同一个映射文件,而实际只消耗(最多)2GB 内存。这是文件 io 缓存主要在 OS 级别上完成的方式。
我在汇编中调试 CLR 代码,到了一行
mov rax, qword ptr [ff4053c0h]
我认为 qword ptr [ff4053c0h]
指的是我感兴趣的字符串,但 ff4053c0h
不是有效的内存位置。读到 qword ptr
它似乎引用了一个基于基址寄存器的地址(例如 qword ptr [rsp+30h]
是堆栈中的 30 个字节),但我找不到没有基址寄存器的含义。
当没有提供基址寄存器时,表示data segment
(http://www.osdata.com/system/physical/memory.htm)。在您的代码中,mov rax, qword ptr [ff4053c0h]
表示 "take 8 bytes from data segment offset FF4053C0h and put them in RAX"。
正如您所指出的那样,rsp
之类的基址寄存器的存在清楚地表明了堆栈段。在你的情况下,没有基址寄存器意味着数据段。
现在,关于大数字 "FF4053C0h",即“4 282 405 824”,完全有可能拥有 4Gb 的可寻址内存 (http://wiki.osdev.org/Protected_Mode), which confirms that your line of code might be valid and it's accessing offset FF4053C0h in a huge data segment (http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html)。
另一个来源 = Assembly: Using the Data Segment Register (DS) .
不要无缘无故地使事情复杂化:
表示从地址0ff4053c0h
读取一个64位的值到寄存器RAX
.
地址必须有效,请再次检查。
QWORD PTR
只是一个大小说明符(这里是多余的,但它提高了可读性),它与拥有基址寄存器无关。
如果您真的对 CPU 的各种寻址模式感兴趣,可以阅读英特尔手册(Google)。
您正在将一个 64 位值从内存移动到 rax 寄存器。该值是从地址 ff4053c0h 读取的。 qword ptr 提示汇编程序使用 64 位常量地址创建移动操作码(机器码)。提供的值是一个 32 位值(8 个十六进制数字 => 8 倍 hex-digit/letter => 8 * 4 位 => 32 位)。
有支持 32 位操作的移动操作码,但(很可能检查 CPU/Mode 的规范)不支持将内存加载到 64 位寄存器中。所以需要qword来保证你真正要表达64位地址的汇编器。
对于您关于指向未定义内存的地址的评论(请参阅已接受答案的评论),了解现在每个进程都分配了一个虚拟内存 table。虚拟内存基本上将逻辑地址映射到实内存中的地址。它可以防止进程查看和更改不属于该进程的内存,从而为 运行 系统提供很大的稳定性。
如果两个进程都共享一部分内存,则每个进程可能会在不同的逻辑地址看到完全相同的物理内存。操作系统决定每个进程的虚拟内存是什么样的。
在每页级别(例如页=4KB)提供映射,处理器在内部进行实际映射。
这个概念对于将文件映射到内存并在不同进程之间共享内存非常正确。通过这种方式,您可以将一个 2GB 的文件映射到内存中,并让 10 个进程同时处理同一个映射文件,而实际只消耗(最多)2GB 内存。这是文件 io 缓存主要在 OS 级别上完成的方式。