我无法进入Nuvoton NCT6793D
的扩展功能模式。数据表中说两次将87h
写到注册人2Eh
中,但是在尝试这样做时,Visual Studio抛出了一个异常,即第三行是“特权指令”。
在网上查找时,据我了解,该指令只能在内核模式下执行,但是我找不到任何在内核模式下运行汇编代码的方法。
.386
.stack 4096
.
.
.
main PROC
mov DX,2EH
mov AL,87H
out DX,AL <----
out DX,AL
.
.
.
写内核模式驱动程序是我唯一的选择吗?
预先感谢您的亲切答复。
答案 0 :(得分:2)
是的,out
是特权指令。它必须在Ring 0(内核模式)下执行。
解决此问题的唯一方法是制作驱动程序,Windows使用Windows Driver Kit来开发驱动程序(它具有所有工具和许多示例)。
有一条指令可以跳转到特权模式(实际上不止一个),但是您当然可以跳转到内核中的入口点。
从根本上讲,所有这些指令都是对特定例程的调用,您无法提升代码,否则操作系统将被完全破坏。
我假设Windows某种程度上涉及到,因为您使用的是Visual Studio和x86代码,尽管标题是指嵌入式计算机。
Windows并没有向用户模式应用程序公开读写IO端口的功能(出于充分的理由)。
我发现了一个old driver I wrote for reading IO ports,它暴露了可以像往常一样打开,读取和写入的“文件” \Device\iomem_io
(CreateFile
,ReadFile
,{{ 1}})。
读取和写入偏移量 WriteFile
(请参阅X
)将对端口SetFilePointer
进行读/写操作,操作的大小必须为1、2或4个字节。
RWEverything附带with a driver,可用来读取/写入端口(以及更多)。它是需要硬件访问权限的恶意软件常用的一种,没有文档记录,它是带有IOCTLs (DeviceIoControl
)代码的控制器,必须从逆向工程中收集这些代码。
注意:如果您切换到Linux,则可以使用X
允许用户模式程序访问IO端口。这对于调试非常有用。