使用 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)。
我正在尝试使用端口 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)。