组合语言之艺术3

VirtualBox安装Windows 98步骤 一、准备工作 1、下载Windows 98 SE光盘镜像,网上下载307.3M的光盘镜像,大部分网站都是这个镜像,如下载地址:http://www.itmop.com/downinfo/14216.html,这个镜像已做成启动盘,还是比较方便。但是这个镜像没有集成KEY,后期输入有点不方便,网上还有个RAR压缩的安装文件,解开是WIN98和WIN98SE两个版本的安装文件,WIN98SE已集成了KEY。用UltraISO打开307.3M的光盘镜像删除win98下的文件,将已集成了KEY的WIN98SE的文件 阅读详情

 第二章    准备工作

 第一节  系统

一、系统之选择

    只因真正了解电脑的人太少,迷信名气的结果,使得 IBM PC/AT占有了市场。为求电脑普及应用,我们唯有因陋就简,针对 IBM PC/AT及其兼容系统,作进一步的分析和说明。
    尽管使用 80486 CPU的微电脑已问世,我个人认为以其造价及功能而言,并不符合效率法则。在从事艺术工作的立场,价值的高低,与所采用的材料没有绝对的关系。更何况我们正要证明,利用组合语言的制作技巧,能够使功能不高的微电脑发挥最大的边际效益。故本书仅以8088 CPU指令为研讨对象,至于程式应用在什么机型,就不在本书的考虑范围内了。

二、目录及磁碟

    假定读者为有经验的程式师,且电脑为 IBM PC/XT/AT。 则在着手制作程式之初,应该先将系统准备妥当。即所谓「工欲善其事,必先利其器」,如果未能注意到下面所提的细节,仅仅制作一、两个程式尚可应付。待工作量一大,程式渐渐增多,不是某些程式找不到,就是找到了也不能一目了然。结果是心烦意躁,马马虎虎,另外再写一个,勉强应付了事。
    硬碟空间较大,应行注意的事相对的也较多。首先应妥善规划好目录及子目录的分类及应用方式,否则每当要找一个档案时,往往有大海捞针之叹。再不然,在修改程式时,如果将不同的版本放在一起,一定会张冠李戴,错误百出。
    每位程式师都应该有自己的目录,而且每个不同的整套档案都应有不同的子目录,这样方能明确的分辨以及应用。而最有效率的方法是,在每一子目录中,档案数不宜太多,且仅存放在同一工作项目下所需要的程式。
    一旦硬碟坏了,所有贮存资料均将付诸流水。为了安全,一定要用软碟备份。最好每天复制一次,虽然每次复制,相当麻烦,但是万一程式被毁坏,那种损失是无从估计的。
    最好的方法,是制作一个专门复制的工具,一般用 .BAT 应用程式,每天工作完毕,只要执行一次即可。

三、应用工具

    程式写作是为了控制电脑运作,应用工具则是将程式师的观念和理解转化为能够连续执行的指令。因此,市面上的应用工具虽多,却不见得对程式的写作有所助益。下面列了几种,只要运用纯熟,绝对够用了。

    程式写作:EDLIN ,PE II,WS等。

    程式编译:MASM.EXE
              早期 (1.25) 版本容许较多的「外界标题」,即External Label,但该版本仅限用于8088指令,较宜大型程式处理。
              4.0 以前的版本,于档案开始时,可用.XCREF以产生标题及缓冲器的位址对照表。但后期的版本会发生错误,不能再用。

    程式联接:LINK.EXE
              早期的版本对 SEGMENT    PUBLIC 'xxxx' 有些规定,但 3.0以后,除了对CODE及 DATA 有效外,其他如 BYTE 及 WORD 等皆无作用。

    程式侦错:DEBUG.EXE 或 SYMDEB.EXE 及 MAPSYM.EXE
              后两者为套件,必须另购。其优点为在侦错过程中,可以使用原程式中的标题名称,且可设「断点」等,侦错方便,功能较强。

    系统处理:PCTOOLS.EXE 是 DOS下很有用的工具,可以作档案管理,也可用来直接修改程式机器码。此外,连机时可以用LL.EXE 或XTALK.EXE等。尤其是系统程式的侦错,经常需要用联机的方式,以另一台微电脑作为监视器。

    这些工具应统一放在 /DOS 子目录中,且须在系统之自动执行程式(AUTOEXEC.BAT)里,先设妥优先通道(PATH)如:

    1:PATH=/DOS;
    是则,不论在哪一个子目录中,前述之工具皆可使用。

四、简化名称

    前述各种工具,在程式侦错过程中使用频繁,为了应用上的方便,如果能少输入一些字符,不仅节省时间,且可避免错误。令用者在惯性反应下,得以集中精神,思考其他细节。
    简化名称是最简单的方法,最好只用一个字母,由于长度相等,其后面的档案名称,就可以利用系统所提供的“F3”「复制上行」功能,不必再行输入。

    是以:EDLIN.COM 改为 E.COM
          MASM.EXE  改为 M.EXE
          LINK.EXE  改为 L.EXE
          DEBUG.EXE 改为 D.EXE
          SYMDEB.EXE 改为 S.EXE
    例如:在完成一个程式后,若要汇编,只要改第一个字母即可。
          C:/>E MYFILE.ASM ( 原来在系统中输入的字符 )
    此时仅输入“M”,再按“F3”键,立即变为:
          C:/>M MYFILE.ASM
    此外,如不需 .LST 等档案,则再加一“;”即可。
          C:/>M MYFILE.ASM;
    “L”及“D”等同样都可依循上面的方法,看来是雕虫小技,但实际上所节省的时间及精力却不同凡响。

五、参考资料

    除专门性的资料外,程式师应该备妥各种有关输出、入,各种周边设备的参考资料或手册等,以便随手查阅。
    最重要的是软件参考手册 MS-DOS Software Reference,其中有各种中断命令的使用规格。唯应注意的,是有一些中断功能与IBM BIOS相同,我建议读者不要使用这些中断,因其调用过程中,要借道BIOS,会使速度减慢。
    其次为 IBM Programmer's Manual 的BIOS中断规格, 是处理所有周边设备必需的工具。
    正因为它涉及周边设备,在设计中文系统时,输出入、显示及列印等功能都有待修改,这本手册更须彻底了解。
    此外还有键盘的输入码表,也是编程必备的资料,本书附录三即为简要的码表介绍。
    如果是编写应用程式,上述的资料已足够应付,但若涉及系统,则尚需了解系统的记忆空间安排,下表为 IBM微电脑的记忆区结构。各种厂牌设计理念虽有差别,但大同小异。
    系统段  位  址              机  能  用  途
                     ┌──────────────┐
    0000  0000H      │中断调用表                  │
                     ├──────────────┤
    0000  0500H      │DOS 及系统操作区            │
                     ├──────────────┤
    0000  4C00H      │周边控制程式                │
                     ├──────────────┤
    0000  5400H      │COMMAND 运用                │
                     ├──────────────┤
    0000 0E0A0H      │使用者操作空间              │
                     ├──────────────┤
    000A  0000H      │萤幕缓冲区(VGA)             │
                     ├──────────────┤
    000B  0000H      │萤幕缓冲区(CGA,EGA)         │
                     ├──────────────┤
    000C  0000H      │EMS 记忆体扩充区            │
                     ├──────────────┤
    000F  0000H      │ROM BIOS  程式区            │
                     └──────────────┘
    上述之系统段,调入段暂存器中时,原来的 000AH应该是0A00H,余同。
    又使用者操作空间的起始点,因各家设计而异。
 第二节  应用工具的制作

一、联接目标档(OBJ Files)

    程式完成以后,相互间的联结,越大越难,有时是结构的改变,有时是档名的变动。不论什么因素,在在都需要加以维护,而且对工作效率关系重大。

    因此,需先建立一个 DO.BAT 的执行档,其内容为:
    1LINK/M @XXXX
    此 XXXX 为一记录档,其中记载所有需联结的目标档名,如果有任何异动,直接更改此档即可。
    在联结时,执行 DO 即可。

    例如:要制作 DRAW.EXE 档,已有 DR1.OBJ .. DRn.OBJ 以及DR-SEG.OBJ 等档,则此 XXXX 档内容应为:
    1: DR-SEG+
    2: DR1+DR2+.. DRn
    3: DRAW,DRAW,
    在执行 DO 后,如果没有错误,所产生的 DRAW.EXE 以及DRAW.SYM 即可供测试。

    也可在第三条后加入:
    4: SYMDEB (或仅用 S)DRAW.EXE DRAW.SYM
    似此,在发展初期,立即可以测试。如果不需再次联结,将第四条另外作一 .BAT 档,随时执行亦可。

    另外有一点需要注意的是,为了要让可执行的程式由指定的起点开始,应在原始档 .ASM 的结束格式标记‘END ’后,加一起点的标题名称。
    此标记不论有多少,联接目标档时,会以第一个找到的标题为唯一的入口。如果程式很多,参与工作的程式师也多,在分开测试时,经常使用自己的入口,一旦联接在一起,就可能发生错误。
    解决的方法是由负责联接的程式师,事先准备好前述XXXX记录档,将带有入口标记的程式放在最前面即可。当然,将其他程式标记后的标题删除亦可,但不如前法效率高。

二、目标档侦错及工具

    在使用 DEBUG时,因为名称简短,用法也简单。若使用「标题侦错」SYMDEB.EXE则不然,因为首先要生成.MAP档,测试时,输入文字也较多。对不断使用的人来说,难免嫌烦。简化的方法,是先制作执行档:S.BAT 及 SM.BAT

    S.BAT 是专供指定程式侦错用,内容为:
    1SYMDEB %1.SYM %1.EXE
    这是指已经有了原档的 .MAP 时,如果程式刚联接完毕,且在联接档中,没有生成 .MAP 的语句,则应制作 SM.BAT 如下:
    1MAPSYM %1.MAP
    使用「标题侦错」工具有很多优点,其功能较 DEBUG强得多。但是使用者必须注意,需要测试的标题,应该在程式中宣告PUBLIC,否则无法直接跳到该处。
    尚有些特殊效果的程式,也应备妥测试的工具,甚至以利用「监视器」的方式,用另外一台电脑来控制。有一些通讯软件,如 XTALK加上SYMDEB.EXE,通过串行埠(Serial Port )可以联机调试,其手续如次:

  1,先在待调程式的主机上输入通讯指令:
    C:/>MODE COM1:9600,N,8,1
    C:/>SYMDEB MYFILE.EXE

  2,再于已与主机经串行埠联接的副机上输入:
    C:/>XTALK
    进入指令输入状态,再输入:
    C:/>SP
    表示设定传输速度,一般多采用9600,但视主机而定。
    C:/>9600
    最后,输入操作指令:
    C:/>GO LO
    表示用区域网络,即串行埠口。
    这时等待联机成功的讯号,见到萤幕上出现“-”,即可    开始侦错。

  3,在主机方面,尚要输入:
    C:/>=COM1 ( 或COM2,端视双方的通讯口而定 )

  4,至于侦错方式,与利用一台电脑时相同,只是此时在主机上出现的是执行后的结果,而由副机控制侦错步骤。
 第三节  分类定义

一、段名(Segment Name)定义

    对段名多于一个的程式,最好先有一个定义段的程式,以DRAW为例,假定程式为两段,一为控制程式段,一为绘图程式段。资料分为三段,一为应用资料,一为参考资料,以及制作资料。此外还有一资料索引段,合计有六个段。
    兹建议,在通用的基础上,简化段名,将段分类如下:
    程式段 (CODE SEGMENT) 定名为 CG
    资料段 (DATA SEGMENT) 定名为 DG
    索引段 (INDEX SEGMENT)定名为 IG
    记忆段 (MEMORY SEGMENT) 名为 MG
    特设段 (EXTRA SEGMENT)定名为 EG
    堆栈段 (STACK SEGMENT)定名为 SG

    当各段超过一组时,则再加数字以区分之。
    如在 DR-SEG.ASM 中,可设为:
    1: TITLE   SEGMENT DEFINITION OF PROGRAM ˉDRAWˇ
    2: CG1     SEGMENT PUBLIC
    3: CG1     ENDS
    4: CG2     SEGMENT PUBLIC
    5: CG2     ENDS
    6: DG1     SEGMENT PUBLIC
    7: DG1     ENDS
    8: DG2     SEGMENT PUBLIC
    9: DG2     ENDS
   10: DG3     SEGMENT PUBLIC
   11: DG3     ENDS
   12: IG      SEGMENT PUBLIC
   13: IG      ENDS
   14:         END
    在 SEGMENT PUBLIC 之后,有多种表示方式:
    SEGMENT PUBLIC XXXX
        XXXX=CODE 表示为程式段,在联接时,属程式的段与段前后衔接。两段程式之间,以 000H 填充至「节」( 每十六个字元为一「节」 )之首位。
        XXXX=DATA 表示资料段,在联接时同上。
        如果程式师为了某种原因,必须严格控制程式之位置及长度时,不宜使用上述两种方式。
        最简单之陈述方式,即在 SEGMENT PUBLIC之后,保持空白。
        XXXX=BYTE 表示程式联接后,各程式之间紧密接合,不留空位。这种方法,有利于程式精简。
        XXXX=WORD 表示程式联接后,各程式之间紧密接合,但在后面的程式必然由双数位起。

    又如在 XXXX 前后加以引号如:
    SEGMENT PUBLIC 'XXXX'
    此一宣告,用以通知汇编程式各段的顺序及定义。因此在编写程式时,只要使用的段名及定义与本档相符,不管将各段安排在程式任一位置,都不致发生错误。
    ‘XXXX’与本段程式的排列顺序有关,在联接时,先将引号中的字串排序妥当,各程式即依此顺序排列之。
    也就是说,凡是使用了引号,则程式联接的顺序,即以在引号中字串,于联接时出现先后为顺序。
    单一程式档的错误不难测知,但若各段之间发生错误,对经验不足的程式师,将有无从下手之虞,不得不慎!
    一般说来,在联接时,最令人头痛的错误讯息为:
    'Fixup overflow at nnnn..'
    不论其错误提示内容如何,此种错误的发生,多半是因为段与段之间的标题、缓冲器或是暂存器的使用发生了混淆,联接程式得不到正确的信息所致。
    解决方法是在第一个错误讯息出现时,立刻以‘Ctrl_C’停止汇编,记下第一个讯息,再在原程式中,找到该位置,(多半为一标题位置)在此标题之前,一定会发现与「段」有关的错误。

二、原始档(Source File)档名定义

    在共同设计大型模组时,程式师间的默契,全赖事先相互约定。否则程式越大,所面临的困难将越多,经常耗时费事,甚至最后功败垂成。
    因此,在设计之初,必须妥善规划,将一应有关的档案、名称、功能等,皆明确地加以定义。参与设计的程式师,更必须严格遵守,方能得心应手。
    原始档名的定义,其目的有三:
  1,代表程式设计者:当制作的程式甚多时,一见档名,就应能分辨出各个程式的设计人。再如某程式师所编程式在一    个以上,则应在其本人代码之后,加一数字编号。这样,遇有任何问题,立即可以找到来处,进行追踪。

  2,代表程式功能:每当联结后发生问题时,应能由档名查知问题所在,故每种功能宜给予适当的名称。

  3,代表联结的关系:除了功能外,有时尚须表示各程式之间的联结关系。如某一程式必须安排在另一程式之前或后,亦应在档名最后,以数字表示顺序。
    若参与的程式师不超过廿人,则以一字元为限,各人事先选定一个字母,作为档案名称的第一字元。第二字元则视该程式师是否编写一个以上的程式而定,是则取一数字代表之,若无则免。
    功能以三到六字元为宜,能统一长度将更为方便,余下一字元留供数序用。
    例:程式师代号为‘C’,本程式之编号为3,功能为‘DRAWS’,此外并无联结关系,则其名应为:
        CDRAWS3.ASM

三、标题定义

    程式在整理或测试时,最大的困扰,是寻找某一个标题的出处或功能。如果在同一档中,尚可利用CREF.EXE,列印出一份对照表来;如果不知道出自哪一个档案,在众多的程式中,就只有望洋兴叹了。
    至于功能,如名称定得太长,不仅输入、修改不便,而且会使得程式看来杂乱无章,令人眼花撩乱。如果定得太简单,或各人任意定名,则难以理解。
    所以,标题定名之重要性,不下于程式之写作。尤其是在参与人数众多时,标题不仅要统一,而且要能代表所有必备的讯息。
    标题所代表的讯息有:
          A x x x x x x x x
          │└┬┘└┬┘└── 分支代号
          │  │    └──── 延伸定义
          │  └─────── 功能名称
          └───────── 程式出处

  1,程式出处:如果很多人同时参加一个计划,而某程式师仅写了一个程式,此定义即为该程式师之代码。否则尚要附    加编号,以便随时可查到。即使只有一个人写作程式,程式可能不断扩大,为了制作的方便,或为了模组的分割,常有必要将程式分到其他档中。因此,一段程式究竟出自于哪一个档案,全赖标题表明,以便能迅速地找到。
        程式出处一般用一个字母即可,如前述第一个字母A代表此段程式来自编号为A的原始档;或属于以A为代号程式师的程式。

  2,功能名称:除若干已知会用到的功能可以事先定义外,其余的多半是在发展过程中,针对需要而产生。对功能定义千万不要掉以轻心,一个程式的再利用价值,常与其功能定义息息相关,明确的定义,可以令人对其功能及应用方式一目了然。
        功能名称长度以三个字母为宜,太长则输入费时,尤其是国人不见得个个英文了得,与其写错,不如藏拙。
        如:DSP 表示萤幕显示功能
            PRN 表示列印功能
            KIN 表示键盘输入功能

  3,延伸定义:若功能相同的程式过多,2,中的定义方式难以分辨,则可再加一延伸定义。
        如:DSPDOT表示显示点阵
            PRNCHI表示列印中文
            KINASC表示输入 ASCII 字符

  4,分支代号:在程式中常有分支,分支代号最理想是由小而大,依序安排。但由于写作时常难以预知后情,故宜先留空号,以便扩充。
        如:DSPDOT10
            PRNCHI06
            KINASC24

四、缓冲器定义

          B x x x x x x x
          ││└┬┘└┬┘
          ││  │    └─── 延伸定义
          ││  └────── 功能名称
          │└──────── 类型
          └───────── 缓冲器保留字

        第一个字母规定用‘B’,为缓冲器保留字。
        第二个字母定义其类型:
        Q=QWORD     如:BQxxxx 缓冲器长度为8字元。
        D=DWORD     如:BDxxxx 长度为4字元。
        W=WORD      如:BWxxxx 长度为2字元。
        B=BYTE      如:BBxxxx 长度为1字元。
        S=STRING    如:BSxxxx 不限长度,但限BYTE型。
        O=ORIGINAL  如:BOxxxx 表不可破坏的原始资料。
        F=FLAG      如:BFxxxx 用作旗号。
        第二字母以后所采用功能或延伸定义,与三、2,3相同。此外,所有缓冲器皆应统一设在缓冲器专用程式中,若系临时使用,或尚未正式联接,亦应设在各程式之首,以便于查阅、修改。

 第四节  统一格式

一、格式统一之优点

    不论采用何种程式语言,凡是共同工作、须相互研讨,或者在同一部门中,分担成败责任者,应该有统一的程式写作方式。这样不仅便于沟通,提高程式的品质,且可避免因某一程式师之离职或出缺所造成的后遗症。
    良好的程式,应如一篇美妙的文学作品,其中有技巧,有意境。其功能不仅表现在执行的效率上,也可以作为同行间学习、欣赏的媒介,这些都必须透过统一的格式达成。
    尤其是把组合程式写作当作一种艺术创作,就必须经常相互观摩,如果没有共通的格式规定,则这样的程式和「天书」可以说没有多大的分别。不论注释写得再好,一般程式师自己都怕看自己的程式,更何况参阅他人的? 但若有统一的格式,养成习惯后,不仅易看易懂,而且寻找、修改方便,写作也轻松省事。

二、规格

  1,统一用大写字母,以利于阅读。
  2,空格处应采用 TAB,齐头等距,一目了然。
  3,标题之后立即改行输入,以便阅读。
  4,每行不得超过70个字母,以免长度不等,画面紊乱。
  5,注记位于指令后,在第五个 TAB的起点,空间不足时,可换行,但位置齐一。
  6,所有缓冲器统一定义在程式之前,不可夹杂在程式中间。
  7,除了需要作超过程式段的FAR CALL使用‘PROC FAR’外,切勿使用‘PROC NEAR ’形式,因这种写法毫无意义。
  8,程式开始时,应有注记说明使用要点。

    以下举例说明统一格式:
    1: PAGE  60,132
    2: TITLE [程式名],[程式师代号],[编号],[功能说明]
    3:
    4: DG       SEGMENT PUBLIC
    5:          EXTRN   BWSCA1:WORD,..
    6: DG       ENDS
    7:
    8: ..
    9: ..
   10: ..
   11:
   12: CG       SEGMENT PUBLIC
   13:          EXTRN   MMMM:NEAR,..
   14:          ..
   15:          PUBLIC  XXXX,YYYY,..
   16:          ASSUME  CS:CG,DS:DG,ES:DG
   17: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   18: ;   REM …………                       ;
   19: ;       ………………….             ;
   20: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   21: START:
   22:          CLD
   23:          MOV     AX,DG
   24:          MOV     DS,AX
   25:          ..
   26:          ..
   27:          ..
   28:
   29:CG        ENDS
   30:      END     START

    第一条的 PAGE 是供列印用的「保留指令」,表示每页所印的行数及列数。其后之 60,132 即为60行, 132个字符。
    第二条的 TITLE  为供查阅之「保留指令」。
    前述REM 注记栏中,应说明该段程式的功能、应用条件,以便其他程式师共同使用。

三、注记

    注记的目的在于日后自己或他人能很容易地做程式修改、维护。因此所做描述当力求详尽。不幸的是,不论多么精彩的文句,总有不足之处。因此,注记时需把握重点,大体说来,程式需加以说明的,不外:

  1,功能:做什么工作,需要何种先决条件。
  2,参数:设些什么数据,以供本段程式处理。
  3,缓冲器:用什么缓冲器,其工作特性如何。
  4,结果:执行后所产生的结果。
  5,子程式调用:在本段程式中,所需调用的子程式名。
  6,重要声明:如暂存器是否被破坏,或其他注意的事项。
    如:
    【功能】:读键盘缓冲区输入码,依性质返回ASCII+扫
              瞄码或中文内码
    把计: AH = 00H
    【返回】: 11AL< 80H,AH = 扫瞄码,AL = ASCII
              12AL≥80H,AL = 四字元中文内码之一
    【破坏暂存器】:AX
    【备注】:以本功能取中文内码,须连取4次,依序得
              到一中文4字元内码。
    当然,如果时间充足,最好能有程式的全部说明,以及制作、修改的细部记录。
    问题在于任何程式发展之初,一定乏善可陈。再加上不断的修改、增补,其间变化复杂无比。程式师又要全神贯注,解决问题,又要考虑如何注记,一心两用,必然谈不到效率。
    那么怎样做才对呢?我建议先让程式师自由发挥,在初期有无注记无关紧要。待程式完成了,大致上没有错误,这时,就应该停下来,从头到尾,将程式彻底整理一番。
    这样不仅加注记容易,而且程式师有机会重新「欣赏」自己的心血结晶,该改的改,该合并的合并,该删的删。最后,程式师经过反思,研究,技术将会大幅度进步,程式更精简,注记也正确无误,工作也达到最高效率。

 

DOS下PCI声卡发声原理:从I/O端口捕获到V86模式虚拟化 在计算机体系结构中,I/O端口是CPU与外部设备通信的关键接口,其访问机制直接影响硬件兼容性。传统ISA总线采用固定端口地址映射,而现代PCI总线则依赖动态资源配置,这导致了实模式DOS系统无法直接访问PCI设备。为解决这一兼容性问题,驱动开发者利用了CPU的V86(Virtual-8086)模式,通过EMM386.EXE建立I/O端口陷阱,将DOS程序对传统端口的访问重定向至PCI硬件。这种硬件虚拟化技术不仅延续了经典DOS游戏的生态,更体现了底层系统软件在架构变迁中的工程智慧。本文以Creative E 阅读详情

相关推荐

PCem:Windows 98 硬件级调试沙盒与底层开发平台

PCem 不是传统意义上的操作系统模拟器,而是一种面向 x86 实模式与 BIOS 层的硬件行为级仿真工具。它严格复现 Intel Pentium MMX 时代芯片组时序、I/O 端口响应、中断链调度及 ROM 执行流程,实现从 CPU 上电第一条指令开始的‘数字孪生’级重建。其技术价值在于提供可控、可暂停、可单步的底层调试环境,支撑 BIOS 逆向、VxD 驱动验证、DOS 实时控制算法测试等硬核工程场景。相比 QEMU 或 VirtualBox 的功能等效抽象,PCem 追求的是电气特性与协议时序的行为

weixin_29181861的博客 217

C# Stream底层原理与高性能实践:从I/O契约到内存优化

Stream是.NET中统一字节流操作的核心抽象,其设计融合了同步/异步I/O契约、状态一致性保障与零成本性能抽象。作为所有文件、网络、内存等字节流的基类,它通过23个虚方法定义可读写、可寻址、可缓冲的行为边界,并直接影响吞吐量、GC压力与线程调度。理解CanSeek、Position语义、ReadAsync生命周期及buffer管理,是避免大文件上传超时、句柄泄漏与内存溢出的关键。本文深入剖析FileStream、MemoryStream、BufferedStream等典型实现的协作机制,结合CopyTo

diaoqi6581的博客 377

windows98 及XP 的开机过程

一、windows98     第一步:当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不稳定,主板控制芯片组会向CPU发出并保持一个RESET(重置)信号,让 CPU初始化。当电源开始稳定供电后(当然从不稳定到稳定的过程也只是短暂的瞬间),芯片组便撤去RESET信号(如果是手动按下计算机面板上的 Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),C

玮。 2266

ThinkPad T430i 愉快安装 Windows11

最近到手几台 ThinkPad T430i, 考虑到 Windows11 刚刚发布,测试一下吧。 首先,驱动下载,联想官网只有 Windows10 的驱动,不过放心 11也能用的: 联想_ThinkPad|ThinkCentre|ThinkStation服务与驱动下载_驱动下载 Windows XP/Vista/Win7 (lenovo.com.cn) 因为手里有配件,于是顺手加内存,换SSD,CPU i3-3120m 升级为 i5-3230m (其实有i7可选,但是考虑到散热跟不上就不折腾了),一波

江哥工作室 5604

MiBeeNvr v0.13.0:实现NVR存储主权与通道级I/O可控

网络视频录像(NVR)系统的核心瓶颈常源于存储层失控——路径不可控、I/O无隔离、容量无预警、路数虚标。本文深入解析现代NVR如何通过Linux挂载管理、C++高性能流I/O、SELinux安全策略协同,构建可配置、可监测、可干预的存储控制平面。重点涵盖NAS/SMB/NFS协议健壮挂载、通道级I/O调度器绑定与缓冲区定制、基于IOPS与延迟的动态路数调控,以及录像元数据结构化设计。面向安防集成商与边缘部署工程师,提供从存储主权落地到I/O瓶颈归因的全栈实践路径。

weixin_34296641的博客 313

ORACLE8i在Penitum4/WINDOWS机器上的安装

ORACLE8i在Penitum4/WINDOWS机器上的安装在Pentium4/WINDOWS机器上安装ORACLE8I时,安装程序不运行,屏幕没反应;有时会显示JREW出错。这是因为ORACLE8I的安装程序使用了JAVA,而旧版JDK/JRE 1.1.x for Windows中的Symantec JIT与Intel Pentium4系统和WINDOWS ME系统不兼容(Solaris

dlcj的专栏 1235

在VMware/VirtualBox里重温经典:手把手教你安装Windows 98 SE中文版(附镜像下载)

本文详细指导如何在VMware/VirtualBox中安装Windows 98 SE中文版,包括系统镜像下载、虚拟机配置、驱动优化及经典软件兼容方案。通过实战技巧和性能调校,帮助用户在现代电脑上完美复刻这一经典操作系统,解决常见问题并提升使用体验。

weixin_30764771的博客 157

端口占用排查:8080被占、EADDRINUSE与Windows保留端口

端口是网络通信的门牌号,程序启动时需向操作系统申请监听,若同一IP与端口已有进程处于LISTEN,bind就会失败并出现“8080端口被占用”或EADDRINUSE。排查价值在于快速定位PID、判断进程归属,避免误杀数据库或同事服务;开发、测试、容器部署和远程转发都会遇到。Linux/macOS可用netstat、lsof、ss,Windows可用netstat与tasklist,还要识别TIME_WAIT、SO_REUSEADDR以及Hyper-V/WSL保留端口等伪占用。Docker的port is a

weixin_33417488的博客 219

怀旧游戏复活指南:用虚拟机与模拟器在现代Windows运行经典游戏

在经典游戏和怀旧软件爱好者圈子里,如何让那些为 Windows 98、DOS 甚至更早系统设计的程序在现代 Windows 10/11 上流畅运行,一直是个既有趣又充满挑战的话题。项目标题中提到的“霹雳酷乐猫2002+原盘镜像”这类经典游戏,往往依赖于特定的硬件环境、声卡驱动和光盘音轨,直接在新系统上运行几乎不可能。这时,虚拟机(VM)和模拟器(Emulator)就成了连接过去与现在的桥梁。 本文将以一个具体的怀旧游戏项目为例,深入探讨如何利用 Dosbox、PCem、86Box、QEMU 和 VMware

weixin_34082789的博客 408

BIO、NIO、AIO实战对比:从线程爆炸到内核代工的I/O演进

I/O模型是高性能网络编程的底层基石,本质是操作系统与用户程序之间数据搬运方式的契约。其核心原理在于阻塞/非阻塞、同步/异步的组合差异:BIO依赖线程一对一等待,资源消耗呈线性增长;NIO通过事件驱动与多路复用(如epoll)实现单线程监控海量连接,大幅提升CPU与内存利用率;AIO则将读写操作完全委托内核异步完成,进一步消除用户态轮询开销。该技术路径直接决定系统在高并发场景下的扩展能力与稳定性,广泛应用于Web服务器(Tomcat/NIO)、通信框架(Netty)、中间件(Redis单线程+epoll)及

didi9310的博客 392

windows系统添加端口转发/映射 && WSL: 无法配置 networkingMode Nat,回退到 networkingMode VirtioProxy

解决端口映射不好用,WSL: 无法配置 networkingMode Nat,回退到 networkingMode VirtioProxy 98%概率解决!!

小梁的旅程 1974

Windows 98界面改造:从API Hook到主题引擎的技术实现

图形用户界面(GUI)是操作系统与用户交互的核心组件,其技术演进反映了计算机视觉呈现能力的发展。从早期的GDI图形设备接口到现代硬件加速渲染,界面实现原理经历了从软件绘制到硬件合成的重大变革。API Hook技术通过拦截系统绘制调用实现界面定制,而主题引擎则通过替换视觉样式文件改变外观,这些技术在界面个性化领域具有重要价值。Windows 98作为经典操作系统,其界面改造实践不仅满足技术怀旧需求,更可应用于遗产系统维护、嵌入式界面定制等场景。本文基于界面改造和系统定制等热词,深入解析通过第三方工具实现Win

weixin_30647423的博客 262

PCem硬件级仿真:深度理解Windows 98底层运行机制

操作系统底层原理是计算机科学的核心基础,涉及实模式与保护模式切换、BIOS中断调用、内存映射及设备驱动协同等关键概念。其技术价值在于揭示现代OS如何抽象硬件复杂性,规避资源争抢与时序冲突等经典问题。典型应用场景包括嵌入式系统调试、驱动开发验证及操作系统教学实践。PCem作为周期精确的硬件级仿真器,能真实复现x86实地址空间、VxD驱动加载链与DOS/Win98混合执行环境,是理解传统PC启动流程、IRQ/DMA配置逻辑及Windows 98即插即用局限性的不可替代工具。

weixin_31423955的博客 236

Nginx启动报错 bind() failed (98 Address already in use) 排查与解决全指南

网络服务的端口绑定是操作系统与应用程序协作的关键环节,bind() 系统调用负责将服务固定在指定地址和端口上。当端口被其他进程占用时,系统返回错误码98(EADDRINUSE),导致进程无法启动。这类端口冲突常见于多Web服务并存、Nginx配置重复监听或Docker端口映射冲突等场景。通过 ss、lsof 等工具可快速定位占用进程,结合配置文件检查和运维规划,能有效解决 Nginx 启动时的 Address already in use 报错。理解端口占用的本质,掌握系统化排查思路,是保障服务稳定运行的核

weixin_32308101的博客 225

告别卡顿!用Qemu 8.2.1在Win10/11上丝滑运行Win98怀旧游戏(附显卡驱动配置)

本文详细介绍了如何使用Qemu 8.2.1在Windows 10/11上流畅运行Windows 98怀旧游戏,包括显卡驱动配置和性能优化技巧。通过对比VMware,Qemu在兼容性、资源占用和画面流畅度方面表现更优,特别适合运行《红色警戒》、《星际争霸》等经典游戏。文章还提供了安装步骤、驱动配置和常见问题解决方案,帮助玩家完美重现怀旧游戏体验。

weixin_30698297的博客 268

LangChain 1.3实战:从Model I/O到Agent,构建稳定大模型应用

大语言模型(LLM)应用开发的核心挑战在于如何将模型能力稳定、可靠地集成到实际业务中。其基本原理是通过工程化框架管理模型输入输出,并赋予模型使用外部工具的能力,从而突破其固有局限。这一技术价值在于显著降低开发门槛与维护成本,使AI应用从原型快速走向生产。在应用场景上,它广泛适用于智能助手、企业工作流自动化、数据分析与摘要等复杂任务处理。本文聚焦于LangChain 1.3版本,深入探讨其如何通过优化Model I/O和Agent这两个核心组件,解决开发中的稳定性与易用性问题。文章结合**环境配置**与**错

weixin_33994429的博客 304

Nginx最新版安装教程(Windows+Linux)

目录一、Nginx安装—Windows1. 下载解压2. 启动3. 测试是否启动成功4. 配置监听端口二、Nginx安装—Linux1. 下载解压2. 上传到服务器3. 配置第一步:`./configure`第二步:`make`第三步:`make install`4. 启动 一、Nginx安装—Windows 1. 下载解压 下载地址:http://nginx.org/en/download.html 这里选择Windows最新稳定版下载,浏览器下载很慢,建议复制下载链接迅雷下载 下载完成后解压,解压后

欢迎来到 Baret-H 的博客 1万+

手动安装Dameware在Win98的客户端

转自互联网,作者不要怪我哟,我只是想自己收藏一份 手动安装Dameware在Win98的客户端本人实践过程:本人操作系统Windows 2000 server , 安装了 DameWare NT Utilities v3.72在安装DameWare NT Utilities(默认为C:/Program Files/DameWare Development/DameWare NT Utiliti

seairhh的专栏 2058
上一篇: 组合语言之艺术2
下一篇: 组合语言之艺术4
dot99
博客等级 码龄26年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值