组装键盘IO口

2023-12-31

我看过以下内容topic https://stackoverflow.com/questions/219120/x86-assembly-protected-mode-keyboard-access.

我有兴趣通过 IN / OUT 指令联系键盘并设置各种模式,例如打开大写锁定 LED。到目前为止,我在这样做时遇到了问题。 下列link http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH20/CH20-2.html可能有帮助。

我尝试过各种组合,例如

mov al,0EDh           ;ED command - Send LED bits. The next byte written to port 60h updates the LEDs on the keyboard.
out 60h,al            ;out on port 60h
mov al,00000111b      ;led status - all leds on. bits 3-7 = reserved(zero)
out 60h,al            ;out on port 60h

我将不胜感激任何帮助。 谢谢。

编辑: 正如我所说,使用端口 60h 不起作用 我在网上搜索了 0040:0017 的用法。 其中一篇网站指出,第 5、6、7 位包含有关 LED 状态的数据

我尝试使用这段代码:

mov al,es:[0017h]
or al,11100000b
mov es:[0017h],al

它也不起作用。

我可能做错了,所以有人可以帮助我或给我发送一个打开所有 3 个 LED 的工作代码吗?

EDIT2:我在安装在虚拟机上的 MS-DOS 上运行了我的应用程序,并且代码运行良好。

我的问题是:如何让它在 MS-DOS 之外工作?


要从在 VM86 模式或保护模式下运行的任务访问 I/O 端口,您需要特殊权限。此特权可以通过以下方式获得:

  • IOPL(仅适用于保护模式任务):如果任务的当前权限级别
  • I/O 权限位图(对于 VM86 任务和 CPL 不足的保护模式任务):TSS 可能包含用于允许/拒绝 I/O 端口访问的位图。

当访问被拒绝时,会生成 GPF。

Linux 具有 iopl() 和 ioperm() 系统调用,允许具有 CAP_SYS_RAWIO 的进程获取这些权限。因此,在 Linux 上访问键盘 LED 可以这样完成:

#include <stdio.h>
#include <sys/io.h>

int main()
{
    int ret;

    ret = ioperm(0x60, 0xf, 1);
    if (ret < 0) {
            perror("ioperm");
            return 1;
    }
    while (inb(0x64) & 0x2);
    outb(0xed, 0x60);
    while (inb(0x64) & 0x2);
    outb(0x07, 0x60);
    ioperm(0x60, 0xf, 0);

    return 0;
}

Windows NTVDM和Linuxosemu使用VM86模式来运行实模式DOS程序。当尝试进行不允许的 I/O 端口访问时,会生成 GPF,并且这些系统可以模拟(或不模拟)I/O 端口访问。 osemu 有一个 -k 开关,可以绕过通常的 tty 层并直接访问键盘。使用这个开关你的第一个例子就可以工作了。

现在,要在 Windows 上执行相同的操作,可能需要从在环 0 上运行的驱动程序执行此操作。替代方案可能是使用允许环 3 进程访问 I/O 端口的驱动程序(非常不安全):请参见示例cygwin 的 ioperm http://openwince.sourceforge.net/ioperm/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组装键盘IO口 的相关文章

随机推荐

  • Visual Studio 2012 中的 Lua? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在考虑开始学习 Lua 想知道是
  • Unicorn 重启 Capistrano 问题

    我们正在使用 cap 进行部署 并使用一个脚本将 USR2 发送到 unicorn 进程进行重新加载 它通常可以工作 但偶尔会失败 当这种情况发生时 查看 unicorn 日志会发现它正在不再存在的旧版本目录中寻找 Gemfile 例外 u
  • 如何使用 Ping.SendAsync 与 datagridview 配合使用?

    我有一个应用程序 它会 ping datagridview 中的每个 IP 以便编译响应 IP RoundtripTime 的列表 完成该步骤后 我会将 RoundtripTime 推回 datagridview foreach DataG
  • 在数组映射中转换某些属性名称的优雅方法

    认为 let A x x y y x x y y 我知道我可以将这个数组转换为一个新数组 并重命名y像这样的财产 A map o gt v o y v y v y 我可以使用扩展来获取所有现有属性以及一个新的 经过转换的属性 如下所示 A
  • Yii Booster 日期选择器无法正常工作

    我有一个与 Yii booster datepicker 相关的问题 设想 p class help block Fields with span class required span are required p
  • 如何避免 C++ 中两个库的变量/函数冲突

    我有类似的情况 如下所述 我有一个头文件first h它有一个功能 char getName 以及相关的cpp文件first cpp有函数定义 char getName return first 和第二个头文件 secondary h 它具
  • Xcode 持续集成:未找到配置的目标

    我已将本地存储库克隆到 Xcode 服务器 并创建了一个机器人来在每次提交时运行测试 但在集成时 它给出了构建服务问题 不再支持或找不到配置的目标 我也无法从日志中找到任何错误 Oct 19 12 32 08 1397
  • 如何查找字符串中的循环/重复?

    我需要检测字符串中的循环 序列并返回第一次出现的位置 我应该怎样去做呢 例子 2 0 5 3 1 5 3 1 5 3 1 第一个发生的序列是5 3 1 没有规则 例如 序列可以是字符串长度的一半 5 3123 1231 231 31 231
  • 从 R 中的嵌套列表中提取内容

    我将客户数据存储在 R 中的嵌套列表中 其方式与此相同 myinventedlist lt list LOLETE list Name LOLETE location Huelva Employees 22 SM eJeK1 Groups
  • Keras 不使用 Theano

    1 我创建一个虚拟环境 mkvirtualenv kerasTH 2 我使用安装keraspip install keras 3 这就是输出pip list Package Version h5py 2 10 0 joblib 0 16 0
  • 如何在 Andengine Base 游戏活动中使用比率分辨率策略时覆盖 onSetContentView

    我正在开发 学习构建 一款游戏andengine GLES2 我在用基础游戏活动 并且我覆盖了setContent查看放置我的 admob 广告的视图 除了解决政策之外 一切都正常 比率决议政策是我正在使用的那个CAMERA WIDTH 8
  • gdb:退出程序而不退出gdb

    我正在使用 gdb 调试程序 首先 我load我的可执行文件 然后我continue运行程序 我有时想中断程序的执行 所以我这样做Ctrl C 我的问题是这关闭了both我的程序和gdb 如何在不退出 gdb 的情况下退出程序 您是否尝试过
  • rufus 调度程序未在生产中运行

    我有一个在 nginx 和乘客下运行的 Rails 服务器 我的sheduler rb看起来像这样 require rufus scheduler my awesome job Rufus Scheduler new my awesome
  • 有没有办法在结果查询中显示“是”或“否”而不是 0 或 1? [复制]

    这个问题在这里已经有答案了 我正在尝试创建一个查询 当我选择一行且一列为 0 时 它显示 否 如果为 1 则显示 是 这是一个示例表 SELECT FROM NUMBERS RESULT PRODUCT HAS APPLES 0 GRAPE
  • 当2的幂时如何将除法变成按位移位?

    我有以下需要经常做的划分 int index pos 64 在 CPU 级别 除法可能会很昂贵 我希望有一种方法可以通过按位移位来做到这一点 我还想了解如何从除法到移位 换句话说 我不想只记住按位表达式 int index pos gt g
  • 重命名后项目崩溃

    如果我在 XCode 中的导航器视图中更改 iOS 项目的名称 Xcode 4 中的 Project gt Rename 相当于什么 https stackoverflow com questions 6077876 what is the
  • 如何使用 jQuery animate() 方法使 div 左右移动?

    请看一下这个 http jsfiddle net tmPfV http jsfiddle net tmPfV 如果您单击右侧 则该框将向右移动 如果您单击左侧 则该框将向左移动 但是 如果您再次单击右键 则什么也没有 我怎样才能让它左右移动
  • 尝试解码数据(将 Abs 导出到 MySQL)

    我有数据库表 DROP TABLE translation en lt CREATE TABLE translation en lt id INTEGER lt translation WIDEMEMO BLOBBlockSize 1024
  • 如何使用 Log4j 和 Storm Framework 将日志写入文件?

    我在 Storm 中使用 log4j 记录到文件时遇到了一些问题 在提交我的拓扑之前 即在我的主要方法中 我编写了一些日志语句并使用以下方法配置了记录器 PropertyConfigurator configure myLog4jPrope
  • 组装键盘IO口

    我看过以下内容topic https stackoverflow com questions 219120 x86 assembly protected mode keyboard access 我有兴趣通过 IN OUT 指令联系键盘并设