76

我记得在过去使用旧的 bo​​rland DOS 编译器时,您可以执行以下操作:

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

现在有半平台独立的方式来做到这一点吗?我需要进行 BIOS 调用,所以如果有办法在没有 asm 代码的情况下做到这一点,那对我同样有用。

4

5 回答 5

81

使用GCC

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

使用VC++

__asm {
  mov eax, edx
  add eax, 2
}
于 2008-09-14T14:05:30.787 回答
18

在 GCC 中,不仅如此。在指令中,你必须告诉编译器发生了什么变化,这样它的优化器就不会搞砸了。我不是专家,但有时它看起来像这样:

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

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

于 2008-09-15T00:10:07.743 回答
7

一个好的开始是阅读这篇关于 C/C++ 中的内联汇编的文章:

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

文章中的示例:

#include <stdio.h>


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 ;
}
于 2008-09-14T13:57:55.780 回答
2

对于 Microsoft 编译器,仅 x86 支持内联汇编。对于其他目标,您必须在单独的汇编源文件中定义整个函数,将其传递给汇编器并链接生成的目标模块。

您极不可能在受保护模式的操作系统下调用 BIOS,并且应该使用该系统上可用的任何工具。即使您处于内核模式,它也可能不安全 - 如果您这样做,BIOS 可能无法正确同步操作系统状态。

于 2008-09-15T14:55:38.240 回答
0

asmor函数的使用__asm__(在编译器中有所不同)

你也可以用fortran函数编写fortran代码

asm("syscall");
fortran("Print *,"J");
于 2021-03-28T15:55:28.110 回答