我记得当初使用旧的borland DOS编译器时,您可以执行以下操作:
1 2 3 4
| asm {
mov ax,ex
etc etc...
} |
现在是否有一种半平台独立的方式来执行此操作?我需要进行BIOS调用,因此,如果有一种方法可以在没有asm代码的情况下进行此操作,那对我同样有用。
使用GCC
1 2 3 4
| __asm__("movl %edx, %eax\
\\t"
"addl $2, %eax\
\\t"); |
使用VC
1 2 3 4
| __asm {
mov eax, edx
add eax, 2
} |
在海湾合作委员会,还有更多的东西。在指令中,您必须告诉编译器进行了哪些更改,以便其优化程序不会出错。我不是专家,但有时看起来像这样:
1
| asm ("lock; xaddl %0,%2" :"=r" (result) :"0" (1),"m" (*atom) :"memory"); |
最好用C编写一些示例代码,然后要求GCC生成程序集列表,然后修改该代码。
阅读本文有关在C / C中进行内联汇编的一个很好的开始:
http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx
文章示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #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 ;
} |
对于Microsoft编译器,仅x86支持内联汇编。对于其他目标,您必须在单独的汇编源文件中定义整个函数,然后将其传递给汇编器并链接生成的对象模块。
您极不可能在保护模式操作系统下调用BIOS,并且应使用该系统上可用的任何功能。即使您处于内核模式,也可能不安全-如果这样做,BIOS可能无法正确地相对于操作系统状态进行同步。