了解 ARM 程序集说明和 C/C++ 指针

Understanding ARM assembly instructions and C/C++ pointers

本文关键字:C++ 指针 ARM 程序集 说明 了解      更新时间:2023-10-16

我正在尝试解码在地址上运行的汇编指令,16位ARM拇指指令。所以,我认为我不应该关心数据类型。因为我只对那里的 16 位存储感兴趣。我有单独的解释器来理解这些位,无论如何我都不想将其用作数据。

如果我有一个指针p并且我想读取 4 个字节(即从pp+3地址的数据)。将p转换为int *和取消引用是否会为我提供数据?

你有一个指向某个类型的指针。指针算术和取消引用支持数据类型。

请注意,您只能通过具有兼容类型或字符指针的左值表达式访问任何变量(对象)的存储值。盲目地强制指针强制转换为其他不兼容的类型并尝试取消引用,这将违反严格的别名规则,您将面临未定义的行为。

引用C11,第§6.5章

对象的存储值只能由具有以下 以下类型:88)

— 与对象的有效类型兼容的类型,

— 与对象的有效类型兼容的类型的限定版本,

— 一种类型,它是与 的有效类型对应的有符号或无符号类型 对象

— 一种类型,它是与 的限定版本相对应的有符号或无符号类型 对象的有效类型,

— 包含上述类型之一的聚合或联合类型 成员(递归地包括子聚合或包含的联合的成员),或

— 字符类型。

但是,您始终可以使用char *指向任何类型并取消引用和递增(并重复)以获取字节的各个值,但您需要自己注意字节序。

相关,引用C11,章节§6.3.2.3

[....]当指向对象的指针转换为指向字符类型的指针时, 结果指向对象的最低寻址字节。的连续增量 结果(不超过对象的大小)生成指向对象剩余字节的指针。