C++ 如何强制GCC以线性方式转换易失性内联汇编语句?

C++ 如何强制GCC以线性方式转换易失性内联汇编语句?,c++,gcc,assembly,binary,x86,C++,Gcc,Assembly,Binary,X86,如何强制GCC以线性方式转换易失性内联汇编语句 我知道,使内联汇编语句同时具有易失性和内存依赖性将防止GCC对它们进行重新排序 但是,没有说明GCC是否会将这些汇编语句线性地放置在输出文件中 假设我有以下内联汇编语句(在伪代码中): 然后我保证GCC将保留他们的订单。但我如何确定GCC不会输出: [...] jmp label_1 label_2: [...] asm_statement_n [...] label_1: asm_statement_1 asm_statement_2 [...]

如何强制GCC以线性方式转换易失性内联汇编语句

我知道,使内联汇编语句同时具有易失性和内存依赖性将防止GCC对它们进行重新排序

但是,没有说明GCC是否会将这些汇编语句线性地放置在输出文件中

假设我有以下内联汇编语句(在伪代码中):

然后我保证GCC将保留他们的订单。但我如何确定GCC不会输出:

[...]
jmp label_1
label_2:
[...]
asm_statement_n
[...]
label_1:
asm_statement_1
asm_statement_2
[...]
jmp label_2
我知道我的示例有点模糊,但我在运行时防篡改的应用依赖于一个内联汇编语句块被翻译成一个保留顺序的相应汇编语句块

换句话说,我希望输出如下:

[...]
asm_statement_1
asm_statement_2
[...]
asm_statement_n
[...]

有什么想法吗?

不幸的是,这是不可能的

从:

不要期望asm语句序列保持完美 编译后连续,即使使用volatile 合格者如果某些指令需要在中保持连续 输出,将它们放在单个多指令asm语句中


最简单的方法是将它们组合成一个内联asm语句。或者,只需在.S文件中编写汇编代码,并将其包含在项目中——然后您就可以使用预处理器宏了。您必须按照Chris Dodd的建议编写整个代码块,这些代码块必须在汇编中按特定顺序排列。GCC可以做各种事情来重新排序代码。像部分内联和将函数分为冷分区和热分区这样的事情甚至可以在其他函数之间移动代码。@ChrisDodd-您能提供一个小例子作为答案吗?例如,显示宏以及如何包含.s文件?谢谢这似乎很有帮助。
[...]
asm_statement_1
asm_statement_2
[...]
asm_statement_n
[...]