使用 IN 指令使 x86 程序崩溃

问题描述

我正在尝试使用端口 61H (PB4) 编写一个延迟计时器,并使用 function filterTable() { const filterBy = document.getElementById('filter'); // filter option select const savedData = JSON.parse(localStorage.getItem('data')); let filteredArray; if (filterBy.value === 'Node.JS') { filteredArray = savedData.filter(function (e) { return e.veranstaltung === 'Node.JS'; }) } else if (filterBy.value === 'ReactJS') { filteredArray = savedData.filter(function (e) { return e.veranstaltung === 'ReactJS'; }) } else if (filterBy.value === 'AngularJS') { filteredArray = savedData.filter(function (e) { return e.veranstaltung === 'AngularJS'; }) } for (let i = 0; i < filteredArray.length; i++) { createTable(filteredArray[i]); } } 在虚拟机上的 Windows XP 上运行它。但是,当代码运行 MASM 指令时,无论调用哪个端口,都会使程序崩溃。

IN

我不明白为什么计算机无法从端口 61h 获取数据。

解决方法

计算机可以从 I/O 端口获取数据,但前提是它以实模式或 ring 0 运行,后者为内核和设备驱动程序保留。 在原生 DOS 中,您可以读取任何您喜欢的 I/O 端口,并且即使在模拟器(NTVDM,DosBox)中运行实模式程序时,也可以读取/写入一些知名端口。

但是由于您选择了 Windows 保护模式可执行文件,这将不起作用。
改为调用 WinAPI 函数 Sleep(dwMilliseconds)