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

Trace32 practice script: DATA.SET how to use

下面的命令是什么意思? EA 是什么意思?

&HEAD=0x146BF94C
DATA.SET  EA:&HEAD+0x4  %LONG  DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF

命令 Data.Set 将原始数据写入目标内存中的给定地址。

该命令遵循以下架构:
Data.Set <地址> <访问宽度> <数据>
其中

  • 的格式为 :

    其中“access class”是几个字母,指定以何种方式访问​​哪个内存。
  • 对于 8 位是 %Byte,对于 16 位是 %Word,对于 32 位是 %Long%Quad 64 位
  • 就是你实际要写入的数据。

对于“访问 class”,请查看处理器架构手册中的访问 类 章节(菜单 → 帮助 → 处理器架构手册)。可用访问类型 classes 因使用的处理器架构而异。 (例如,ARM 和 PowerPC 的 classes 不同)

“访问 class”EA: 表示:

  • 在CPU为运行时访问内存(E).
  • 通过绝对(物理)内存地址(A)绕过 MMU 访问内存。

最后要写入内存的数据(<数据>)可以是固定值(例如0x42),也可以是通过表达式计算得到的(0x40+0x02)。这样的表达式也可以使用所谓的“实践函数”。您的示例中使用的函数是 Data.Long(<address>),它从给定地址读取 32 位。 (注意:表达式不能包含空格。)

然后你有一个包含字符串“0x146BF94C”的宏&HEAD=。这意味着出现在任何后续命令中的任何 &HEAD 都会被宏的内容替换。这类似于 C 预处理器。

因此,您的命令

&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,这要归功于内存访问 class 中的“A”地址。