为旧MS-DOS系统信息程序在c++项目中集成x86汇编



我是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的提示。

相关内容

  • 没有找到相关文章

最新更新