当前位置:  开发笔记 > 前端 > 正文

有没有办法将汇编代码插入C?

如何解决《有没有办法将汇编代码插入C?》经验,为你挑选了3个好方法。

我记得当天用旧的borland DOS编译器你可以做这样的事情:

asm {
 mov ax,ex
 etc etc...
}

现在是否有半平台独立的方式来做到这一点?我需要进行BIOS调用,所以如果有一种方法可以在没有asm代码的情况下执行此操作,那对我来说同样有用.



1> Niall..:

使用GCC

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

使用VC++

__asm {
  mov eax, edx
  add eax, 2
}


@JayD:VS编译器支持内联汇编,具体取决于目标.例如,支持32位x86; 64位x86-64不是.
是的,这是合法的gcc语法,但存在错误,除非您将其放入带有__attribute __((naked))的函数中,该函数只包含内联汇编。**如果修改寄存器,则*必须*使用GNU C扩展Asm约束/ Clobbers告知编译器****;踩到编译器的寄存器可能会导致非常奇怪的结果。(禁用优化测试一个案例也不能证明它是安全的)。参见https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html / /sf/ask/17360801/ / http://ibiblio.org /gferg/ldp/GCC-Inline-Assembly-HOWTO.html

2> Martin Del V..:

在海湾合作委员会中,还有更多内容.在指令中,你必须告诉编译器改变了什么,以便它的优化器不会搞砸.我不是专家,但有时它看起来像这样:

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

在C中编写一些示例代码是个好主意,然后让GCC生成一个汇编列表,然后修改该代码.



3> Espo..:

一个好的开始是阅读本文,讨论C/C++中的内联汇编:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

文章的例子:

#include 


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有