Trace32练习脚本:DATA.SET如何使用

问题描述

下面的命令是什么意思? 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”。