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