我目前正在我的大学学习一门课程,在这个阶段,我们了解某些 C/C++ 结构背后的汇编代码。
工作流程通常是这样的:实验室助理简短地谈论一个主题,我们找出其中的怪癖,然后使用内联汇编解决一些完全随机的问题。
(例如:他简要介绍了struct
(成员)是如何存储在内存中的,我们找出了模式,然后我们使用内联汇编编写了解决方案,其中我们使用了一个简单的问题struct
。)
实验室助理(以及小组的其他成员)正在使用Visual C++
编译器和调试器(用于反汇编)进行演示,但是由于道德原因我不能使用它,因此我选择了g++
和gdb
.
与 Visual C++ 相比,我对 g++ 的内联汇编感到尴尬的是:
如果我想编写内联汇编的“块”,我有两个选择: 有一个单一的
asm("..")
结构,其中每条指令前面都有一个\n\t
(导致很多混乱)。或者将每条指令放在自己的asm("..")
块中(导致大量输入)。如果我想在内联程序集中引用局部变量,我必须使用扩展语法或通过使用
esp
/的偏移量来引用它ebp
。
关于上面的两个问题,我更喜欢 Visual C++ 的内联汇编风格,在这种风格中,为了编写一个 asm 块,我所要做的就是__asm { .. }
将每条指令写在一个新行上,为了引用一个变量,我只需要写它的名字。
在我的搜索过程中,我发现 Appleg++
支持与带有开关 (-fasm-blocks) 的 Visual C++ 相同的语法,但 GNU 似乎并非如此g++
。
希望我可能错过了一些我在这里问的东西,是否可以Visual C++
在 GNU 下编译像内联汇编块一样g++
。