使用 IN 指令会使 x86 程序崩溃

using IN instruction crashes the x86 program

我正在尝试使用端口 61H (PB4) 编写延迟计时器,并在虚拟机的 Windows XP 上使用 MASM 运行 它。但是,当代码 运行 执行 IN 指令时,无论调用哪个端口,它都会使程序崩溃。

.386
.model flat,stdcall


include C:\masm32\include\windows.inc
include C:\masm32\include\masm32.inc
include C:\masm32\include\msvcrt.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\masm32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\kernel32.lib

.data
msg1 db "text 1  ", 0
msg2 db "text 2", 0
msg3 db "text 2", 0

.code
start proc

invoke crt_printf, offset msg1
push cx

call waitf
pop cx

invoke crt_printf, offset msg2

invoke crt_scanf, offset msg3
invoke ExitProcess,0

start endp


waitf proc near
    mov cx, 33144
    push ax
    waitf1:
        in al, 61h
        and al, 10h
        cmp al, ah  
        je waitf1   
        mov ah, al
        loop waitf1
        pop ax  
        ret
waitf endp

end start

无法理解为什么电脑无法从61h端口获取数据

计算机可以从I/O端口获取数据,但前提是它运行在实模式或ring 0,这是为内核和设备驱动程序保留的. 在本机 DOS 中,您可以读取任何您喜欢的 I/O 端口,并且一些众所周知的端口可以是 read/written 即使实模式程序在模拟器(NTVDM,DosBox)中运行。

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