使用 Visual C++ 环境和“Asm”关键字作为 Assembler IDE 的替代方案?

Posted

技术标签:

【中文标题】使用 Visual C++ 环境和“Asm”关键字作为 Assembler IDE 的替代方案?【英文标题】:Use Visual C++ Environment and "Asm" keyword as alternative for Assembler IDE? 【发布时间】:2012-04-16 00:51:08 【问题描述】:

只需阅读一本 C++ 书籍,您就可以通过使用 asm 关键字将汇编程序直接放入 C++。

这是否意味着,如果想使用 Visual Studio 编写汇编程序,我可以简单地创建一个 C++ 主方法,然后将汇编程序放入其中并将其作为 C++ 程序执行?编译器会简单地运行嵌入汇编程序的 C++,就好像它只是一个汇编程序一样?

我的问题源于缺乏合适的汇编程序 IDE。

【问题讨论】:

msdn.microsoft.com/en-us/library/45yd4tzz%28v=VS.80%29.aspx 好的,把我的问题中的“asm”换成“__asm”。 【参考方案1】:

当您使用 C++ 编译器时,它会在您的程序中添加不在int main() 中的额外代码。如果你曾经反编译过一个简单的 hello world 程序,你会注意到它在int main() 之前就开始执行,调用了一些函数,例如_set_app_type_getmainargs,然后最终调用了你的int main()。对您来说最有趣的事情可能是对_getmainargs 的调用,因为它会为您的程序获取命令行参数。如果您要使用 NASM、FASM 甚至 GAS 等汇编程序编译您的程序集,它不会调用 _getmainargs 和其他人,因此您作为程序员必须实现自己的方式来获取命令行参数,这些参数可以是对于初学者来说很棘手。

只要您使用volatile 关键字指定您的__asm,编译器就不会修改您的汇编代码,它会像运行“ 汇编程序”。

如果您正在寻找用于组装的 IDE,我可以告诉您,我已经走上了同样的道路。我使用的是 FASM,它是一个很棒的小 IDE,但也有适用于 Eclipse 甚至 Visual Studio 的插件,尽管我不能说我对它们有很好的体验。

编辑:我想补充一点,如果您正在学习汇编,那么最好使用汇编程序来学习它。当 C++ 或更高级别的语言不能使用时,会使用汇编的常见用途,因此,如果您依赖 C++ 编译器和内联汇编语法,则在尝试编写原始汇编时可能会导致混淆。

【讨论】:

@Misha 如果您使用 volatile 关键字,则不应该这样做。关键字的意思是“别管它”。在某些编译器上,您可能必须指定一个编译器标志,如 -force-volatile 或其他东西,因此您可能需要检查您的编译器。 有人能解释一下FASM、NASM和MASM之间的区别吗?是一个英特尔,另一个 AMD……等等? @user1107474 - 这听起来像是堆栈溢出的好问题。 也许是这样的问题? Where to start learning assembly - IDE, examples

以上是关于使用 Visual C++ 环境和“Asm”关键字作为 Assembler IDE 的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 Visual C++ 中的 _asm 命令

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

如何使用 Visual C++ 的内联汇编器插入重复的 NOP 语句?

Visual C++ 2005 中的新关键字和新指针类型。啥是托管 C++?

运行时 Visual C++ 10 中的奇怪异常

C++ 'true' 和 'false' 关键字在 Visual C++ 6.0 中突然不是真或假