`ldstr` 指令使用哪种类型的常量?

Posted

技术标签:

【中文标题】`ldstr` 指令使用哪种类型的常量?【英文标题】:which type of the constant does the `ldstr` instruction use? 【发布时间】:2018-09-24 18:49:37 【问题描述】:

我正在阅读.NET IL Assembler 一书。书中有一段话:

`ldstr` "Enter a number" 是创建字符串对象的指令 从指定的字符串常量并加载对此的引用 对象到堆栈上。 本例中的字符串常量存储在 元数据。您可以参考诸如通用语言运行时之类的字符串 字符串常量元数据字符串常量。您可以存储和 以另一种方式处理字符串常量,如一些 时刻,ldstr 专门处理公共语言运行时 字符串常量,始终以 Unicode (UTF-16) 格式存储。

我看到作者写道,可以将string 称为通用语言运行时字符串常量元数据字符串常量。虽然我不明白这些选项之间的区别,但我的问题是关于其他的......

另外,作者写了两次关于ldstr指令对字符串的使用,每次都是其他的(我用粗体选择了它)。

那么团队使用哪种类型的常量?它是公共语言运行时字符串常量吗?还是元数据字符串常量?

【问题讨论】:

很难猜出他想说什么,我们没有得到“在几分钟内解释清楚”的好处。每当您使用 IL 进行任何操作时,请始终将 Ecma-335 放在手边。它仅将“字符串文字元数据标记”记录为 ldstr 的有效操作数。据推测,他使用 const 等同于文字。不是,编译器在最终的 IL 中消除了 const。 在我看来,作者为 same 概念提供了两个不同的名称。因此,两者之间没有没有的区别,因为它们不是不同的选项。 @Damien_The_Unbeliever:我只能假设他们使用术语“元数据字符串常量”来引用#Strings 流中的字符串(UTF-8,用于存储类/成员名称等标识符) 和“通用语言运行时字符串”来引用#US 流中的字符串(UTF-16,用于存储ldstr 加载的字符串)。 @BrianReichle - 我只是想理解片段“这样的字符串”。这显然是一个反向引用。但是引用中任何先前的“字符串”引用似乎都是一个单一的概念。然后“此类字符串”句子的后半部分引入了两个名称。要么需要更多的上下文,而不是包含在问题的引用中,要么正如我所建议的,它是同一个概念的两个名称。您对“这样的字符串”的理解是什么,这意味着我们现在需要两个单独的名称? 【参考方案1】:

过去几天我对此进行了一些研究,并想出了一个可能的答案。

.NET 2.0 IL Assembler 书似乎使用了与您的书相同的示例。 他们谈论那个指令

ldstr "输入一个数字"

将常量“输入数字”加载到元数据中。 与您的示例相同,它声明它可以称为 通用语言运行时字符串常量元数据字符串常量,在这种情况下似乎没有区别。至于我的理解,它只是简单地说字符串常量是用 UTF-16 格式化的。如果您想使用 ANSI 格式的字符串,则必须使用占位符。 (我无法解释,因为我也是这个话题的新手)。

所以我对这个问题的结论是,它只是归结为元数据的 UTF-16 编码。

【讨论】:

以上是关于`ldstr` 指令使用哪种类型的常量?的主要内容,如果未能解决你的问题,请参考以下文章

javap指令

栈和局部变量操作指令

jvm指令

4多用类型常量,少用#define预处理指令

JVM指令手册

JVM指令手册