【发布时间】:2021-01-23 01:43:14
【问题描述】:
以下命令是什么意思? EA 是什么意思?
&HEAD=0x146BF94C
DATA.SET EA:&HEAD+0x4 %LONG DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF
【问题讨论】:
标签: trace32 lauterbach
以下命令是什么意思? EA 是什么意思?
&HEAD=0x146BF94C
DATA.SET EA:&HEAD+0x4 %LONG DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF
【问题讨论】:
标签: trace32 lauterbach
Data.Set 命令将原始数据写入目标内存的给定地址。
命令遵循以下架构:
Data.Set
在哪里
%Byte,16 位为 %Word,32 位为 %Long,64 位为 %Quad
对于“访问类”,请查看处理器架构手册中的访问类一章(菜单 → 帮助 → 处理器架构手册)。可用访问类别的类型因使用的处理器架构而异。 (例如 ARM 和 PowerPC 的不同类)
“访问类”EA:表示:
最后,您要写入内存的数据()可以是固定值(例如 0x42)或通过表达式(0x40+0x02)计算得出。这样的表达也可以使用所谓的“实践功能”。您的示例中使用的函数是 Data.Long(<address>),它从给定地址读取 32 位。
(注意:表达式不能包含空格。)
然后你有一个宏&HEAD=,其中包含字符串“0x146BF94C”。这意味着出现在任何后续命令中的任何 &HEAD 都会被宏的内容替换。这类似于 C-Preprossor。
因此,您的命令
&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”。
【讨论】: