我正在使用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上应该如何工作,但是语法是什么?如何获得任何按下的键盘键代码?
该服务int 16h
是BIOS服务。它仅在实模式下工作,通常在引导加载程序或DOS程序中使用。不能从Windows(任何版本,除非执行DOS程序,在这种情况下要模拟服务)或Linux(任何版本)或任何其他保护模式的操作系统来访问它。
据Freenode上#winapi上的人说,可能可以int 16h
从Windows 98上的Win32程序中调用,但是该调用随后可能会在BIOS中挂起。无论如何,这对实现你的目标没有用。
要解决你的问题,请使用DOS工具链(例如ia16-gcc,Open Watcom或旧版本的MSVC)编写DOS程序,或者使用你要为其编程的操作系统支持的保护模式服务。