DOS
DOS的FreeBASIC端口基于GNU工具链的
DJGPP端口到32位保护模式DOS。
该端口的当前维护者为
DrV.
To be written: platform-specific information, differences from Win32/Linux, differences from QB?, tutorials, etc.
WANTED TESTERS
FreeBASIC的DOS版本/目标需要更多的测试人员。如果您有兴趣在DOS上使用FreeBASIC,请不要等待将来的版本,现在就尝试一下。欢迎在新旧PC上运行DOS的测试(图形,文件I / O,串行端口,...)。如果有什么不起作用的话,请在论坛或bug跟踪器中填写详细的错误报告。如果一切顺利,你也可以写下你的成功。确保测试FB的最新版本(来自FB的报告大于0.90将被认为是过时和无用的),并检查此文档
之前抱怨任何事情。
限制
DOS目标是相当好的工作和FreeBASIC和最新的支持。然而,与其他平台相比有一些差异。缺少的功能大多是操作系统或DOS扩展程序或C运行时不支持的功能:
- 交叉编译到另一个目标
- 多线程(见FAQ 23)
- 图形在窗口模式或使用OpenGL
- 将ScreenRes设置为不匹配图形卡支持的任何分辨率的大小
- DOS不支持Unicode,WString将与ZString相同,不支持拉丁字母集。(自己做)
- 共享库(DLL)不能被创建/使用(至少不是“容易”),可用于DOS的可用静态外部库的数量有限
FreeBASIC DOS相关问题:
也可以看看
FreeBASIC DOS相关问题
1.FB是一个32位的编译器 - 我需要一个32位的DOS吗?
不,FreeBASIC的DOS版本使用
DOS扩展,允许您在16位DOS内核上执行32位代码。您可以使用FreeDOS(16位),Enhanced-Dr-DOS,旧的关闭Dr-DOS,甚至MS-DOS下载到cca 4版本。您至少需要80386 CPU,另请参见
要求.
2.FreeDOS-32怎么样?是否/会有FB工作,是/会有一个版本?
FreeDOS-32在写入时是实验性的,但它应该执行FreeBASIC和它生成的应用程序,而不会改变。虽然FB DOS支持已经在FreeDOS(16)上工作,但它也应该为FreeDOS-32准备好了。
3.在DOS中运行FreeBASIC时,我会收到“Error:No DPMI”消息!
您需要一个DPMI主机(DPMI内核,DPMI服务器),表示文件“CWSDPMI.EXE”(cca 20 KiB)或HDPMI32.EXE(cca 34 KiB)。有关详细信息,请参阅要求和FAQ 4。
4.是否有可能摆脱这个CWSDPMI.EXE和CWSDPMI.SWP?
是的,有2种可能性。要摆脱CWSDPMI.EXE并创建一个嵌入CWSDPMI的独立DOS可执行文件,您需要使用CWSDPMI软件包和“EXE2COFF.EXE”文件。使用EXE2COFF,删除CWSDPMI.EXE加载程序(文件丢失大小为2 KiB,导致“COFF”文件无扩展名),然后在该COFF之前粘贴文件“CWSDSTUB.EXE”。新的可执行文件是cca 21 KiB比原来的更大,但它是独立的,不需要额外的文件。为了摆脱CWSDPMI.SWP,您可以使用CWSPARAM.EXE编辑您的可执行文件,并禁用交换(偶尔也会错误地称为分页)。但是请注意,这将限制可以赋值给系统中安装的物理内存量的内存。FBC.EXE文件和FBC创建的所有可执行文件都可以完成此工作。该方法也在包中的CWSDPMI文档中描述。或者,您可以使用
WDOSX或
D3X扩展器。它们不互换并创建独立的可执行文件。由于它们在环0中运行您的可执行文件,因此它们的崩溃处理功能不是很好,并且可能会导致冻结或重新引导其他主机通过注册转储退出“民用”方式的错误。另外,使用WDOSX或D3X,产卵可能无法正常工作。最后,您可以使用
HDPMI.下载“HXRT.ZIP”文件(这里:
japheth.de/HX.html),提取“HDPMI32.EXE”(cca 34 KiB)和“HDPMI.TXT”(代码不需要,仅供参考),并将其包含到您的DOS启动(“HDPMI32 -r”)。这将使HDPMI居住并防止所有FreeBASIC(也是FreePASCAL和DJGPP)程序都在哭泣关于缺少DPMI和交换。HDPMI可以
不(容易/尚未)包含在您的可执行文件中。在HDPMI或其他外部主机下运行包含D3X,CWSDPMI或某些DPMI主机的可执行文件,内置主机将被简单地跳过。FreeBASIC绝对需要使用DPMI,因为它不能生成16位实模式代码,在DOS中没有其他好的方式来执行32位代码。
5.我可以使用其他DOS扩展程序,如DOS / 4GW,Causeway,DOS / 32A?
没有任何延长线所谓的WATCOM类扩展器不能被使用,因为内存管理和可执行结构的重要差异。由于WDOSX和D3X是一个多标准的扩展器,所以WDOSX和D3X都不起作用,不仅像WATCOM一样。您也可以使用PMODE / DJ(不是“原始”TOD的PMODE,也不是PMODE / W(!),与CWSDPMI相比,保存cca 5 KiB,可以包含在EXE中,但可能会影响稳定性或性能),或者如上所述, HDPMI。
6.所有的漂亮的蓝色屏幕在哪里.../ IDE在哪里?
FreeBASIC项目专注于编译器,从BAS源生成可执行文件。它看起来不是很明显,但对于您开发的软件的质量来说最重要。该项目不包括IDE。FreeBASIC有几个外部IDE,但现在可能没有一个DOS版本。如果您真的需要一个,可以尝试使用Rhide,但请注意,它是复杂和错误的,所以使用它自己承担风险。另见FAQ 7和8。
7.如何在DOS中查看CHM或PDF格式的文档?
现在没有很好的方法在DOS中查看CHM或PDF文件。但是,您可以查看FreeBASIC文档。FreeBASIC开发人员之一,CoderJeff提供了一个FreeBASIC文档查看器,文档以特殊格式包含,并且还具有DOS版本。它看起来类似于QB的内置帮助查看器,但不包含编辑器或IDE。下载:http://www.execulink.com/~coder/FreeBASIC/docs.html
8.我如何编写/编辑我的源代码?
DOS有很多编辑器,但只有少数是好 - 一些可能性是FreeDOS EDIT(使用0.7d(!!)或0.9,64 KiB限制,次优稳定性(定期保存工作)),SETEDIT INFOPAD(附带CC386编译器,也可编辑大文本,具有C和ASM的语法高亮,但不适用于BASIC)。
9.如何在DOS中播放声音?
有两种方式在DOS中播放声音:(“古”)PC扬声器,如果出现故障,则会以哔声闻名,或声卡。扬声器易于控制,允许多个人可以考虑,即使播放音频文件(WAV,具有解压缩代码也是OGG Vorbis,MP3等),您可以轻松重用现有的大多数QB代码(例如:{989796240 })或ASM代码,但仅提供一个通道和6位,当然比声卡质量更差,而在某些最新(P4)PC上,扬声器质量为
非常不好或没有扬声器在所有对于旧的ISA声卡,有很多示例代码,可以使用(“仿真”SB16兼容)驱动程序(如果可用于您的卡)可访问较新的PCI声卡(假定此类别中为裸DOS)(不幸的是,正在变得越来越成为一个问题,DOS驱动程序差或甚至不存在),或直接访问卡(这是低级编程,硬件相关,汇编程序也需要,您需要有关卡的技术文档)。有一些灵感来源,如DOS音频播放器MPXPLAY(用C与一些ASM一起编写),支持这两种方法(native +“emu”驱动程序),请参阅这里的最新列表:
drdos.org/...wiki...SoundCardChip.在DOS中支持声音是
不商业FB DOS端口,实际上FB在Win32和Linux上也不支持“声音” - 游戏“连接到API”,而不是使用FreeBASIC命令或库。要播放压缩文件(MP3,OGG Vorbis,FLAC,...),您还需要解压缩代码,这些库的现有DJGPP端口应该可用于此。
10.如何在DOS中使用USB?
11.如何在DOS中使用图形?
DOS中的GUI或图形绝对有可能,有几种方法:
- 使用FB图形库。除了标准的VGA模式之外,它还使用VESA(最好是线性的,也支持banked)访问视频卡,并支持卡的VESA VBE驱动程序报告的任何分辨率。
注意:最好使用FB版本0.20或更新版本,FB DOS图形在0.17上效果不佳,而在以前的版本中为根本不工作.
- VGA模式320x200x8bpp:非常简单,最大的可靠性和兼容性,但只有低分辨率和256色,请参见示例。
- VGA“ModeX”320x240x8bpp:与上述类似,不太方便,可靠性和兼容性好,但分辨率低,只有256色,请参见示例。
- VGA“计划”模式640x480x4bpp:难以设置像素,最大可靠性和兼容性,但分辨率低,仅有16种颜色,没有公开示例(?)。
- 一些其他“奇怪”VGA“ModeX”模式(如360x240x8bpp):可能,但仅限于怪胎;-)
- 编写自己的VESA代码:更困难,良好的兼容性,高分辨率和真实的颜色可能存在可能存在可靠性问题,如果不执行仔细。
- 使用外部库(DUGL,Allegro,MGL,WxWidgets):允许创建“昂贵”图形和GUI,膨胀EXE大小,需要尊重库许可证,潜在的可靠性损失。
请注意,一些图形卡通过VESA报告有限的功能,最显着的是更少的内存(例如8 MiB而不是64 MiB)或更少的模式(例如,只有24 bpp模式可见,而32 bpp隐藏,只有较低的分辨率可见(高达cca 1280x1024 ),而较高的隐藏,只有“4:3”模式可见,而“宽”模式隐藏)。这是卡的问题,而不是DOS或FreeBASIC。您将在DOS以外的其他系统中看到附加功能,也可以在DOS中使用硬件检测工具,绕过VESA进入最低级别。
12.FB中缺少DEF SEG!在我的代码中如何解决这个问题?
DEF SEG与16位RM寻址有关,因此被删除。因为FreeBASIC的内存模式(与DJGPP相同)不是基于零的,所以无法直接访问VGA或其他低内存区域。要访问低DOS内存,请使用DOSMEMGET和DOSMEMPUT,请参见“vga13h.bas”示例或“_dos_ds”选择器,用于内联ASM,请参见示例:
'' DOS only example of inline ASM accessing low memory
'' Run in text mode 80x25 only
'' Including dos/go32.bi will define "_dos_ds"
'' "pointing" into GO32 block
#include "dos/go32.bi"
Dim As UInteger DDS
DDS=_dos_ds
? : ? "Hello world !"
? "_dos_ds=$";Hex$(DDS)
? "This is just a tEst - abcd ABCD XYZ xyz @[`{ - press any key ..."
Do
Sleep 1000
If Inkey$<>"" Then Exit Do
Asm
mov eax,[DDS] '' Directly using "_dos_ds" won't work here !!!
push eax
pop gs '' Just to get sure, it is usually set anyway
Xor ebx,ebx
aa3:
mov al,[gs:0xB8000+2*ebx]
cmp al,65 '' "a"
jb aa1
cmp al,122 '' "z"
ja aa1
cmp al,90 '' "Z"
jbe aa2
cmp al,97 '' "a"
jb aa1
aa2:
Xor al,32 '' Swap case
aa1:
mov [gs:0xB8000+2*ebx],al
inc ebx
cmp ebx,2000
jne aa3
End Asm
Loop
? : ? "Bye"
End
13.如何重写QB的CALL INTERRUPT /访问DOS和BIOS中断?
这些中断只能使用FB的DOS版本/目标进行访问。
访问中断比QB慢:对于FB,DPMI主机将不得不做2个上下文切换,进入实模式并返回。所有这些都将在原始DOS和数千个时钟中使用数百个时钟,如果加载了emm386,或者在Windows的DOS框中。减速可能是微不足道的或相关的,这取决于。您应该尽量减少此类调用的数量,并处理每个调用更多的数据 - 至少几个KiB,而不仅仅是一个字节或几个字节。
使用DJGPP的DPMI封装:
#include "dos/dpmi.bi"
Type RegTypeX As __dpmi_regs
#define INTERRUPTX(v,r) __dpmi_int( v, @r )
或者,您可以通过内联ASM调用INT,您必须关心的两件重要事项是FB的内存模型不是基于零的事实(另见FAQ 12,“DEF SEG”问题),另外“直接”传递地址(如DS:[E]DX)到INT将不起作用,除了您有一个DPMI主机与“DOS API翻译”。
14.如何重写QB的XMS / EMS处理?
取决于原代码如何使用它。如果只是绕过低内存限制,只需删除它并使用“普通”FB的数据类型/内存处理功能。如果它用于(声音)DMA,你没有运气,必须完全重新设计代码,关于声音,请参阅FAQ 9。对于DMA,优选使用低内存(应该没有大问题,因为应用程序代码和大多数缓冲区都在DPMI内存中),因此DPMI内存中的DMA是可能的,但更困难。
15.FBC给我一个'找不到lsupcxx'的错误!
这个问题的根源是LIB\DOS\目录中的libsupcxx.a文件,名称中有9个字符。您的错误是要解压缩ZIP文件,通常在Windows中启用长文件名,然后在DOS中使用FB,而不需要LFN支持,导致此文件看起来不可见(989796273)。重命名LIBSUPCX.A(仅一个X)中的文件,或在DOS中再次提取ZIP。注意:FB 0.18的更改,需要重新测试。
16.如何使用串行或并行端口?
DOS INT14在每个调用中发送/读取一个字符并不是非常有用/高效。所以最好使用一个外部的DOS32 comms库。/ *有人知道一个好的吗? * / FB高达0.18.2不支持DOS目标上的OPEN COM,coderJeff有一个实验库/驱动程序可用,自0.18.3以来包含在FB中。
17.如何使用打印机?
DOS内核不会在这里帮助您,所以您必须准备文本(微不足道)或像素数据(对于符合“ESC / P”标准的打印机可以轻松接受),并通过并行端口或USB发送到打印机使用额外的驱动程序(参见FAQ 10)。所谓的“GDI”或“Windows”打印机不能在DOS中以合理的努力工作。
18.如何在DOS中运行FreeBASIC程序的屏幕快照?
理想地将此函数包含在您自己的代码中。基于DOS的基于TSR的屏幕捕获者,如SNARF大多数将使用基于文本的屏幕,但可能没有一个使用FreeBASIC的GFX库。这不是一个或另一方面的错误,这是一个“设计”的问题。
19.图形模式不起作用(冻结/黑屏/垃圾输出)!
在论坛中添加错误报告。为了使其尽可能有用和有成效,请注意以下事项,继续执行步骤并提供所有相关信息:
- 检查GfxLib页面上列出的限制
- 图形可能无法正常工作/在所有旧电脑上。如果您的CPU具有小于cca 500 MHz,请提供有关它的详细信息,如果您不知道,请使用RayeR的CPUID或类似程序进行测试。
- 需要有关您的显卡的确切信息。使用DrV的VBEDIAG(仅报告信息)和RayeR的VESATEST(也尝试设置模式,允许目视检查结果)在DOS上测试。找出支持什么“有用的”模式(640x480,800x600),以及什么bitdepths(8,16,24,32 bpp),以及是否可以设置和查看是否正确。
- 找出并准确描述错误(“模式使用VESATEST而不是FB”,“没有图形但没有错误”,“黑色屏幕和冰柜”,“图形混乱/不完整”,...)。
- 如果一些复杂的程序不起作用,请尝试一个最小的测试,就像在屏幕中间放置一个圆圈。
- 尝试没有鼠标驱动程序(这降低了CPU“成本”)。
- 了解哪些模式受到影响如果某种模式不起作用,请降低分辨率或bitdeph,请确保使用32/24/16/8 bpp,640x480,4 bpp,以及8bpp的320x200测试“最便宜”/最安全的模式640x480。
- 对于一些旧卡,有VESA驱动可用(S3VBE / UVIVBE)。测试有无,并将此信息包含在您的报告中。
- 从DOS启动文件中删除可能有问题的内容(内存管理器,驱动程序)。FB除了DPMI主机外,不需要这样的功能(另见FAQ 4.)。
- 发布有关您的显卡,CPU(如果旧),DOS类型和版本,错误症状和一个简单的示例代码的信息。
20.鼠标麻烦!鼠标在DOS /箭头“跳转”等方面根本不起作用...
要在DOS中使用鼠标,您需要一个兼容的驱动程序,识别您的鼠标,并被FreeBASIC库识别。为获得最佳效果,您需要一个
好驱动程序和
适当鼠标。
鼠标:最佳的选择,现在很好,是一个PS / 2鼠标。旧的类型将是一个串行鼠标,这一个应该工作。最新的是USB鼠标 - 但是不太适合在DOS中使用,因为它需要一个兼容的(INT33)高品质的本机USB鼠标驱动程序(现在没有,只有一些实验),或者依靠BIOS仿真(不总是可用,或“不精确”)。
驱动程序:首选的选择是从FreeDOS项目的CTMOUSE。2008年7月可以使用1.9a1,2.0a4和2.1b4版本。它包含(但不限于)FreeDOS,或从这里下载一个版本:
ibiblio.org/pub/...mouse.没有一个是完美的,但是它们仍然比大多数竞争对手都好一些。1.9xx和2.1xx将与BIOS合作,允许USB仿真,2.0xx绕过BIOS,从而USB仿真将
NOT工作。另外Logitech鼠标驱动通常做得很好,从这里下载:
uwe-sieber.de/util_e.html - 6.50版是一个很好的开始。众所周知的问题是DRMOUSE和一些(旧的)版本的MSMOUSE。
如果鼠标根本不工作,那么很可能是驱动程序没有加载,无法识别鼠标(见驱动程序消息),或与INT33“标准”不兼容。对于USB鼠标,在BIOS设置中激活“USB鼠标仿真”可以帮助您。
如果鼠标控件是“不精确的”,箭头“跳”,那么你有一个坏的驱动程序 - 使用更好的一个,或者BIOS仿真是坏的 - 解决方案是购买一个PS / 2鼠标。
21.64 KiB和640 KiB问题/ FB在DOS中支持多少内存呢?
内存管理是DPMI主机的业务,而不是编译器。FreeBASIC和它生成的可执行文件不遭受此问题,因为它们使用32位DPMI代码而不是实模式。您可以使用PC的几乎所有的内存,但有一些限制,但它们是64或640 KiB以上的远.CWSDPMI r5的验证功能最多只能达到512 MiB,额外的内存不会崩溃(不像一些旧版本),而是被忽略。HDPMI应该支持更多:高达4 GiB(32位寻址的限制),但是在这样巨大的机器上没有太多的测试 - 验证到cca 1.5 GiB。FreeBASIC和它生成的代码(989796306)需要经典的基于DOS的内存管理器(HIMEM / XMS和EMM386 / EMS),但是如果它们存在,则应该与它们共存。所有这一切当然适用于真正的DOS,像“Dos Box”这样的东西将保持对内存管理的控制,并且只提供一小块内存(取决于cca 64 MiB)到你的DOS代码。
22.我的程序崩溃时,我尝试使用超过cca 1 MiB RAM!这是FreeBASIC中的错误吗?
不,它不是FreeBASIC中的错误,它不是真正的DOS特定的,另见
编译器常见问题.对于初学者来说,简单的解决方案是使用
Shared数组。更高级的用户可以考虑使用像
Allocate这样的内存管理功能。这在DOS中更重要,因为它允许应用程序在具有很少内存的(旧的)PC上运行(甚至至少编辑小文本),以及使用所有巨大的RAM(如果可用)(并编辑大量的文本例如)。
23.线程功能在DOS中被禁止?帮帮我!
DOS目标不支持
线程支持功能,很可能不会很快/永远。原因很简单:与Win32或Linux内核不同,DOS内核,DPMI主机/标准以及“GO32”DOS Extender都不支持线程。但是在DOS中没有什么是不可能的:您可以在DPMI的顶部设置线程。有多种可能性,其中两种是:
- 设置ISR,请参见“ISR_TIMER.BAS”示例。这不是一个“完全”的替代品,但在某些情况下是足够的。
- DJGPP有一个并行线程库,可以在一定程度上“模仿”类似Linux的线程。它可以接受[P]7-ZIP DJGPP端口(用C ++编写),但没有FB测试。
- 见论坛t=21274
24.使用FB DOS进行的可执行文件blo肿!
这是真的,但没有简单/快速的方法来解决。FB是一个32位HLL编译器,大部分大小是从DJGPP导入的。!Writeme! (焊接论坛:{989 796 320})
25.FB的编译非常慢!
问题:“FBC需要10秒钟才能编译一个”Hello world“程序!TurboBASIC / QBASIC / VBDOS / PowerBASIC为相同的作业执行<1秒...”
真的,但这是“通过设计”:FB以3个步骤编译您的源,保存中间文件,如CompilerCmdLine所述,而许多较旧的编译器在内存中只进行1次传递。这主要涉及文件I / O性能,请参阅下面的常见问题27有关改进的可能性,另外通过使DPMI主机驻留(HDPMI32 -r或CWSDPMI -p,参见上述FAQ 4)可以在此获得一些小的改进。请注意,延迟大多是“加法”,所以不会因为大型项目而受到太大的伤害。
26.睡眠不起作用如何造成延误?
Sleep正在工作...但是具有cca55ms = 1 / 18s的分辨率,因此“SLEEP 500”是正常的,而例如使用“SLEEP 2”2毫秒将不起作用。!Writeme! /!FIXME!cy
- PIT / BIOS定时器(默认运行在18.2 Hz),查看BIOS定时器或设置自己的,请参见“ISR_TIMER.BAS”示例,提高PIT频率(谨慎使用)
- 调用BIOS定时器+ PIT计数器,从DKRNL32的TIMERHLP.ASM方法,可以提高上述精度,而不会提高PIT频率
- RDTSC指令(奔腾及更新版本)
- RTC时钟
- 延迟循环
27.在DOS中表现非常糟糕!
问题:“与从相同源码编译的Win32 / Linux二进制文件相比,DOS中的性能差?”或者“更糟糕的是,与DOS相比,非常相同的DOS二进制文件在NTVDM中运行得更快!”
两者确实可以发生,然而,DOS是没有办法慢慢的,低效率可以解决。首先,您必须确定代码丢失性能的区域。
文件I / O:默认情况下,DOS为其缓冲区使用非常少的内存,而其他系统使用更多的内容,并且具有文件缓存的“侵略性”。当处理很多小文件时,会导致严重的性能下降。解决方案是安装一个文件缓存,例如
LBACache,或者你可以安装一个RAMDISK(一个好的:
SRDISK),并复制在那里的“违规”文件(例如FreeBASIC安装),然后在那里工作定期将工作备份到更耐用的媒体)。两者都需要一个XMS主机(使用
HIMEMX)。默认情况下,DOS使用BIOS访问硬盘驱动器,而其他系统会尝试寻找和使用DMA。测试用例:IDECHECK by Japheth(下载:
japheth.de/Download/IDECheck.zip) - 运行在“I13”和“DMA”模式并比较结果。如果“DMA”快得多(可以是1 ... 10次,取决于PC机型),那么安装DOS DMA驱动程序(例如
XDMA 3.1是值得尝试的)可以大大提高大文件速度。还要确保以大块读取和写入数据(至少16 KiB),而不仅仅是单个字节。其他操作系统在这里更为宽容,但是在DOS上,每个单个文件I / O调用会导致一个小的“加法”延迟,因此具有良好缓冲的高效代码设计至关重要。
图像:Pentium 2和更新的CPU具有称为“MTRR”的缓存相关功能,以加速对视频RAM的写入。其他操作系统的驱动程序通常会启用它。DOS不(因为它根本不处理图形),FB GFX也没有。使用Japheth的“VESAMTRR”工具(包含在“HXGUI.ZIP”软件包中),它将启用加速,幸存模式切换和大多数“非致命”应用程序崩溃,直到重新启动。可能的加速因素取决于PC型号,高达cca 20倍。此外,鼠标处理在DOS上吃了一些(太多)CPU性能,这是一个已知的弱点(DOS FB GFX的设计不是“非常糟糕”,只是普通的“标准” - 这不是很好)固定在理论上是可能的,但不容易,您只需尝试几个鼠标驱动程序(参见FAQ 20)。
28.可以用FB访问磁盘扇区吗?
您可以 ...但FreeBASIC在这里不会帮助你太多:没有“便携式”解决方案,使用操作系统特定的低级方式。对于DOS 3方法是可能的
请注意,这种实验有点“危险” - 如果出现问题,您可以轻松丢失数据或使PC无法启动。
29.可以在DOS中使用SSE等高级指令吗?
您可以 ...但SSE2及以上版本需要先启用。这通常被认为是DPMI主机的业务,HDPMI32和CWSDPMI 7将这样做,大多数其他主机不会。使用前,请务必正确使用CPUID。除了支持最新的指令外,还提供与旧版CPU(早期奔腾,80386)兼容的代码分支,并避免使用CMOV。
参考