当前位置: 技术问答>linux和unix
linux 下调用BIOS中断10h?(急啊,在线等待!!!)
来源: 互联网 发布时间:2014-12-14
本文导语: 不知道在LINUX下有没有相关BIOS的中断服务程序可以调用, 比如 int86(0x10,&inregs,&outregs)之类的函数或者说 int 10h, 我在/usr/lib/gcc/include下找到了bios.h头文件,但它只是定义了REGS而已。 还有能不能请教一下在C 中嵌入...
不知道在LINUX下有没有相关BIOS的中断服务程序可以调用,
比如 int86(0x10,&inregs,&outregs)之类的函数或者说 int 10h,
我在/usr/lib/gcc/include下找到了bios.h头文件,但它只是定义了REGS而已。
还有能不能请教一下在C 中嵌入行内汇编的问题,程序如下(用GCC编译)
void Set_Video_Mode_Asm(int mode)
{
asm mov ah,o
asm mov al,mode
asm int 10h
asm ret
}
它认不出来第二句。
比如 int86(0x10,&inregs,&outregs)之类的函数或者说 int 10h,
我在/usr/lib/gcc/include下找到了bios.h头文件,但它只是定义了REGS而已。
还有能不能请教一下在C 中嵌入行内汇编的问题,程序如下(用GCC编译)
void Set_Video_Mode_Asm(int mode)
{
asm mov ah,o
asm mov al,mode
asm int 10h
asm ret
}
它认不出来第二句。
|
还有一种办法,就是自己写驱动,不过也不简单。
|
GCC 嵌入式汇编不是这么写的!
gcc inline asm 语法结构:
__asm__(asm statements : outputs : inputs : registers-modified);
看一个 k = i + j 的例子:
int i=0, j=1, k=0;
__asm__ __volatile__("
pushl %%eax\n
movl %1, %%eax\n
addl %2, %%eax\n
movl %%eax, %0\n
popl %%eax"
: "=g" (k)
: "g" (i), "g" (j)
: "eax", "memory"
);
若不懂AT&T语法,可以装个Kylix(3 is best),可使用Intell语法。
Linux 下一般不能直接对BIOS进行INT操作,就像winnt;
必要时可直接使用in/out指令,但要先用ioperm或iopl函数获取操作权。
gcc inline asm 语法结构:
__asm__(asm statements : outputs : inputs : registers-modified);
看一个 k = i + j 的例子:
int i=0, j=1, k=0;
__asm__ __volatile__("
pushl %%eax\n
movl %1, %%eax\n
addl %2, %%eax\n
movl %%eax, %0\n
popl %%eax"
: "=g" (k)
: "g" (i), "g" (j)
: "eax", "memory"
);
若不懂AT&T语法,可以装个Kylix(3 is best),可使用Intell语法。
Linux 下一般不能直接对BIOS进行INT操作,就像winnt;
必要时可直接使用in/out指令,但要先用ioperm或iopl函数获取操作权。