Warm tip: This article is reproduced from serverfault.com, please click

c++-在Linux中使用GCC Assembly破坏BIOS?

(c++ - BIOS interruption with GCC Assembly in Linux?)

发布于 2020-12-23 01:27:30

我正在使用QTCreator 3.5.1和一个虚拟操作系统,它是Linux Mint 18.3 Cinnamon 32位GCC编译器。

我必须编写一个使用中断的代码,并使用汇编命令获取键盘上按下的键。

应该在Windows上运行的代码是这样的:

#include <iostream>
unsigned char x;
int main()
{
 do {
 __asm {
 mov ah, 00h
 int 16h
 mov x, ah
 };
 std::cout <<"The pressed key code is "<< x << std::endl;
 } while (true);
}

尽管它在Windows 98(在Windows 7x32上使用Visual Studio 2003编译)和任何其他Windows系统上均不起作用,但给我带来了运行时错误或关闭了系统(在Windows 98上)。

因此,我切换到Linux,并且http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html(第7部分)中的以下汇编示例代码运行良好:

#include <iostream>
using std::cout;
int main(void)
{
        int foo = 10, bar = 15;
        __asm__ __volatile__("addl  %%ebx,%%eax"
                             :"=a"(foo)
                             :"a"(foo), "b"(bar)
                             );
        printf("foo+bar=%d\n", foo);
        return 0;
}

(要使其正常工作,我还必须在QT Creator工具->选项的“桌面工具包”上指定编译器版本(usr / bin中的GCC x86 32bit),以及有效的QT版本4.8.7,最后一个版本5.5 .1给我一个“安装不正确,请运行make install”错误)

尽管我很难理解中断的概念,并且“ int 16h”中断在具有GCC内联汇编的linux上应该如何工作,但是语法是什么?如何获得任何按下的键盘键代码?

Questioner
Ivan Silkin
Viewed
0
fuz 2020-12-27 19:59:51

该服务int 16h是BIOS服务。它仅在实模式下工作,通常在引导加载程序或DOS程序中使用。不能从Windows(任何版本,除非执行DOS程序,在这种情况下要模拟服务)或Linux(任何版本)或任何其他保护模式的操作系统来访问它。

据Freenode上#winapi上的人说,可能可以int 16h从Windows 98上的Win32程序中调用,但是该调用随后可能会在BIOS中挂起。无论如何,这对实现你的目标没有用。

要解决你的问题,请使用DOS工具链(例如ia16-gcc,Open Watcom或旧版本的MSVC)编写DOS程序,或者使用你要为其编程的操作系统支持的保护模式服务。