组装键盘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口 的相关文章

  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • 二元炸弹 - 第 6 阶段

    这是拆解phase 6 08048dbf
  • 如果没有按下任何键,则检查按键而不阻塞

    我正在创建一个应用程序来查看当前时间 并创建了一个循环来每秒更新时间 循环看起来像这样 UPDATE The code to be re executed JMP UPDATE 但我无法结束它 当我使用 MOV AH 00H INT 21H
  • 如何在 MOS 6502 的 asm 中创建延迟

    我是 ASM 新手 我正在尝试研究如何为以下代码创建延迟 org 1000 loop inc d021 jmp loop 我想评论已经足够清楚了 每帧更改颜色的代码示例 1 50 秒 sei enable interrupts loop1
  • 该程序如何知道该字符串存储的确切位置?

    我用 Radare2 反汇编了一个 C 程序 在这个程序中有很多调用scanf像下面这样 0x000011fe 488d4594 lea rax var 6ch 0x00001202 4889c6 mov rsi rax 0x0000120
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC

    MSVC 和 ICC 都支持内在函数 addcarry u64 and addcarryx u64 根据英特尔的内在指南 https software intel com sites landingpage IntrinsicsGuide
  • 使用 GNU C 内联汇编在 VGA 内存中绘制字符

    我正在学习使用 C 和内联汇编在 DOS 中进行一些低级 VGA 编程 现在我正在尝试创建一个在屏幕上打印出字符的函数 这是我的代码 This is the characters BITMAPS uint8 t characters 464
  • 显示不带字母的数字键盘

    iOS 默认数字键盘中是否有隐藏数字下方字母的选项 对于某些电话语言 键盘显示时不带字母 抱歉 你所要求的是不可能的 这取决于键盘语言 只有用户可以更改键盘语言 我希望这能帮到您
  • 如何为键盘上的 xml 中的功能键设置不同的背景?

    我正在开发 Android 键盘应用程序 我尝试为普通键和功能键设置不同的背景 但它不起作用
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • 将 1 字节立即值添加到 2 字节内存位置

    The add说明文档来 自这一页 http x86 renejeschke de html file module x86 id 5 html说如下 请注意我突出显示的两条说明 我在 NASM 中尝试了以下代码 符合第一个突出显示的指令
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • MFENCE/SFENCE/etc“序列化内存但不序列化指令执行”?

    英特尔系统编程指南第 8 3 节中有关 MFENCE SFENCE LFENCE 的说明 以下指令是内存排序指令 而不是序列化指令 这些指令会耗尽数据内存子系统 它们不序列化指令执行流 我试图弄清楚为什么这很重要 在多线程代码中 对内存的写
  • 函数地址不是实际代码地址

    在 Visual Studio 2008 C 中调试一些代码时 我注意到函数指针变量中的地址不是函数本身的实际地址 这是一个外部 C 函数 int main void printaddr const char print debug sho
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com

随机推荐

  • 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 指令联系键盘并设