gpt4 book ai didi

c++ - g++ - 无优化 - 在转到后跳过 asm 代码

转载 作者:IT王子 更新时间:2023-10-29 00:48:18 26 4
gpt4 key购买 nike

有这段代码:

int main(){
int x = 13;
goto f;
asm __volatile__ (".byte 0xff");
f:
return 0;
}

我不明白为什么 g++ 优化它并且不包括操作码(在反汇编中):

# 5 "q.c" 1
.byte 0xff
# 0 "" 2

即使我在没有任何优化的情况下进行编译:g++ -g -O0 -S q.c。我尝试单独使用 g++ -gg++ -O0 因为我读到它在某些情况下可能不兼容。

如果我注释 goto f; 行,它将插入操作码。

        .file   "q.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $13, -4(%rbp)
#APP
# 5 "q.c" 1<<<<<<<<<<
.byte 0xff<<<<<<<<<<
# 0 "" 2<<<<<<<<<<
.L2:
#NO_APP
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits

问题是:

g++不包括一段代码,即使我完全不优化编译也不会被使用吗?

我想知道为什么它不包含那段没有找到其他解决方案的代码。

更新

我在评论中看到:这是糟糕的代码。但是,如果我想拥有它怎么办?如果我想在那里注入(inject)一段本身不执行任何操作的代码怎么办? g++ 会限制我吗?

更新2

因为它的死代码不是解释。我在 Windows VS2012 上编译了这段代码

int main() {
std::cout << "something ";
goto foo;
__asm _emit 0xff
__asm _emit 0xfe;
foo :
std::cout << "other thing";
}

你猜怎么着?当使用调试配置编译时,asm 代码包含在二进制文件中:

.text:00414ECE                 push    offset aSomething ; "something "
.text:00414ED3 mov eax, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:00414ED8 push eax
.text:00414ED9 call loc_41129E
.text:00414EDE add esp, 8
.text:00414EE1 jmp short loc_414EE7
.text:00414EE1 ; ---------------------------------------------------------------------------
.text:00414EE3 db 0EBh ; d
.text:00414EE4 db 2
.text:00414EE5 db 0FFh<<<<<<<<<<<<<<
.text:00414EE6 db 0FEh ; ¦<<<<<<<<<<<<
.text:00414EE7 ; ---------------------------------------------------------------------------
.text:00414EE7
.text:00414EE7 loc_414EE7: ; CODE XREF: main+31j
.text:00414EE7 push offset aOtherThing ; "other thing"
.text:00414EEC mov eax, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::basic_ostream<char,std::char_traits<char>> std::cout
.text:00414EF1 push eax
.text:00414EF2 call loc_41129E
.text:00414EF7 add esp, 8
.text:00414EFA jmp short loc_414EFE

最佳答案

有趣的是,我可以尝试的所有编译器(gcc、llvm-gcc、icc、clang)都优化了代码。

作为解决方法,您可以在 asm 本身中包含 goto:

__asm__ __volatile__ (
"jmp 1f\n\t"
".byte 0xff\n\t"
"1:");

不幸的是,这是特定于体系结构的,而您的原始代码可能不是。对于那种情况,我能想到的最好的办法是:

volatile int false = 0;
if (false) __asm__ __volatile__ (".byte 0xff");

当然,这会导致运行时加载和测试。即使启用了优化,这两种方法也能正常工作。

关于c++ - g++ - 无优化 - 在转到后跳过 asm 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com