问题描述
下面的命令是什么意思? EA 是什么意思?
&HEAD=0x146BF94C
DATA.SET EA:&HEAD+0x4 %LONG DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF
解决方法
命令 Data.Set
将原始数据写入目标内存的给定地址。
该命令遵循此架构:
Data.Set
哪里
-
的形式为
:
其中“访问类”是几个字母,指定以哪种方式访问哪个内存。 -
8 位为
%Byte
,16 位为%Word
,32 位为%Long
或%Quad
对于 64 位 - 是您实际想要写入的数据。
对于“访问类”,请查看处理器架构手册(菜单 → 帮助 → 处理器架构手册)中的访问类一章。可用访问类的类型因使用的处理器架构而异。 (例如 ARM 和 PowerPC 的不同类)
“访问类”EA: 意味着:
- 在 CPU 运行时访问内存 (E)。
- 通过绕过 MMU 的绝对(物理)内存地址 (A) 访问内存。
最后,您要写入内存的数据 () 可以是固定值(例如 0x42)或通过表达式 (0x40+0x02) 计算得出。这样的表达式也可以使用所谓的“PRACTICE 函数”。您的示例中使用的函数是 Data.Long(<address>)
,它从给定地址读取 32 位。
(注意:表达式不能包含空格。)
然后你有一个包含字符串“0x146BF94C”的宏 &HEAD=
。这意味着出现在任何后续命令中的任何 &HEAD
都会被宏的内容替换。这类似于 C-Preprosor。
因此,您的命令
&HEAD=0x146BF94C
DATA.SET EA:&HEAD+0x4 %LONG DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF
具有相同的含义
Data.Set EA:0x146BF950 %LONG Data.Long(EA:0x146BF950)&0x00FFFFFF
这实际上定义了地址 EA:0x146BF950 处的 32 位值的读-修改-写:该值是从内存中读取的,高 8 位被设置为零,然后结果被写回相同的内存位置。
它具有(几乎)与 C 代码表达式相同的含义
*((volatile uint32_t*) 0x146BF950) &= 0x00FFFFFF;
这只是“几乎相同”,因为 C 代码表达式不会像您的 Data.Set 命令那样绕过 MMU,这要归功于地址的内存访问类中的“A”。