我是c++编程新手,一直想为MS-DOS编写一个系统信息程序。我目前使用最新的DigiMars c++编译器和MASM 6.13为我的项目。项目设置为大内存模型,目标CPU为Intel 8088处理器,以最大限度地与MS-DOS兼容。
我试图写一个例程来检查CPU是否支持晚期486型和早期奔腾CPU上的CPUID指令。我通过Google搜索找到了一些代码,并能够将它们添加到项目中并成功编译,但它们都不能正常工作。问题是,当我试图执行该程序时,我得到一条关于无效指令的消息(在我的Windows NT 3.51测试系统下),并且它完全挂在我的测试MS-DOS系统上。
我使用的代码如下:
public _is_cpuid_supported
cpuid macro
db 0fh, 0a2h
endm
_is_cpuid_supported proc near
.486
push bp
mov bp, sp
sub sp, 40
push eax
push ebx
pushfd ; get extended flags
pop eax
mov ebx, eax ; save current flags
xor eax, 200000h ; toggle bit 21
push eax ; put new flags on stack
popfd ; flags updated now in flags
pushfd ; get extended flags
pop eax
xor eax, ebx ; if bit 21 r/w then eax <> 0
pop ebx
pop eax
je no_cpuid ; can't toggle id bit 21, no cpuid here
mov ax, 1 ; cpuid supported
jmp done_cpuid_sup
no_cpuid:
mov ax, 0 ; cpuid not supported
done_cpuid_sup:
mov sp, bp
pop bp
ret
_is_cpuid_supported endp
我也尝试了OSDev.org的样本:https://wiki.osdev.org/CPUID?msclkid=3c6e16f9c23611ec98be59859d0dd887但它也不起作用。任何建议吗?如果需要进一步澄清,请告诉我。
在large
内存模型的DOS程序中,汇编过程的默认值是far
。从_is_cpuid_supported proc near
行中去掉near
关键字解决了这个问题。感谢@MichaelPetch的提示。