【问题标题】:What does '__asm__(".previous");' mean?'__asm__(".previous");' 是什么意思意思是?
【发布时间】:2010-03-10 12:42:21
【问题描述】:

在尝试使用 mingw 4.4 编译我的项目时,它使用了一些第三方头文件,我遇到了以下错误:

汇编程序消息:
错误:行尾有垃圾,第一个无法识别的字符是 '"'
错误:未知伪操作:'.previous'

我在其中一个标题的末尾找到了这段代码:

__asm__(".section \".plc\"");
__asm__(".previous");

由于我对内嵌汇编指令完全没有任何经验,所以我在谷歌上搜索了它的解释,但找不到我的两个基本问题的答案。 __asm__(".previous"); 到底是做什么的,为什么有人会把它放在头文件的末尾。

这些是整个项目中唯一的__asm__ 指令。我可以安全地删除它们吗?或者有没有办法定义 .previous 以使其成为已知的伪操作?

请赐教!

【问题讨论】:

    标签: gcc assembly inline-assembly


    【解决方案1】:

    .previous 是一个指令,可让您在两个精灵部分之间来回交换。它是一种允许更密集的汇编文件的快捷方式,并允许您在代码流中声明初始化数据,反之亦然。

    例如,假设您有一个包含数据和代码部分的汇编文件。

    如果你想 - 在函数的中间 - 在数据段中声明一个常量,你可以像这样使用 .previous 语句:

      nop            // some code
    
    .previous        // swaps current section (code) with previous section (data)
    
    MyConstant:
      .word 0x0001   // some data
    
    .previous        // swaps curent section (data) with previous section (code)
    
      nop            // more code
    

    更多信息可以在参考手册中找到:

    http://sourceware.org/binutils/docs-2.19/as/Previous.html#Previous

    【讨论】:

    • 因为 "__asm__(".previous");" 后面没有任何指令在我的代码示例中,它只是声明了一个新部分“.plc”并将一些空代码交换到其中。它是否正确?所以删除它不会对编译的应用程序产生任何影响。
    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多