;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
铏氭嫙8086妯″紡 - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> 姹囩紪璇█ >> 姹囩紪鏂囨。 >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

铏氭嫙8086妯″紡

鍙戝竷: 2008-6-26 22:49 |  浣滆: admin |   鏌ョ湅: 2娆

铏氭嫙8086妯″紡锛 缁ф帹鍑80386涔嬪悗锛孖ntel鍙堟帹鍑轰簡80386銆丳entium鍜孭entium PRO銆傝繖浜涘鐞嗗櫒閮藉叿鏈夊疄妯″紡鍜屼繚鎶ゆā寮忎袱绉嶅伐浣滄柟寮忋傚墠闈㈠凡浠嬬粛杩囷紝瀹炴ā寮忎笌8086鍏煎锛屽彲浠ヨ繍琛孌OS鍙婁互鍏朵负骞冲彴鐨勫嚑涔庢墍鏈夎蒋浠讹紱浣嗗湪瀹炴ā寮忎笅锛屽鐞嗗櫒涓嶈兘鍙戞尌鑷韩鐨勪紭瓒婃ц兘锛屼笉鑳芥敮鎸佸鐢ㄦ埛銆佸浠诲姟鎿嶄綔绯荤粺鐨勮繍琛屻備负浜嗗厖鍒嗗彂鎸ュ鐞嗗櫒鐨勫姛鑳斤紝鍚屾椂浣緿OS鍙婁互鍏朵负骞冲彴鐨勮蒋浠剁户缁湁鏁堝湴杩愯锛屼粠80386寮濮嬪鍔犱簡铏氭嫙8086妯″紡銆傛湰鏂囧皢浠嬬粛铏氭嫙8086妯″紡銆 <涓>V86妯″紡1.V86妯″紡 铏氭嫙8086妯″紡鏄繚鎶ゆā寮忎笅鐨勪竴绉嶅伐浣滄柟寮忥紝涔熺О涓篤8086妯″紡锛屾垨鑰呯畝绉颁负V86妯″紡銆傚湪铏氭嫙8086妯″紡涓嬶紝澶勭悊鍣ㄧ被浼间簬8086銆傚鍧鐨勫湴鍧绌洪棿鏄1M瀛楄妭锛涙瀵勫瓨鍣ㄧ殑鍐呭浣滀负娈靛艰В閲婏紱20浣嶅瓨鍌ㄥ崟鍏冨湴鍧鐢辨鍊间箻浠16鍔犲亸绉绘瀯鎴愩傚湪V86妯″紡涓嬶紝浠g爜娈垫绘槸鍙啓鐨勶紝杩欎笌瀹炴ā寮忕浉鍚岋紝鍚岀悊锛屾暟鎹涔熸槸鍙墽琛岀殑锛屽彧涓嶈繃鍙兘浼氬彂鐢熷紓甯搞傛墍浠ワ紝鍦ㄨ櫄鎷8086妯″紡涓嬶紝鍙互杩愯DOS鍙婁互鍏朵负骞冲彴鐨勮蒋浠躲備絾V86妯″紡姣曠珶鏄櫄鎷8086鐨勪竴绉嶆柟寮忥紝鎵浠ヤ笉瀹屽叏绛夊悓浜8086銆 褰撴爣蹇楀瘎瀛樺櫒涓殑VM浣嶄负1鏃讹紝澶勭悊鍣ㄥ氨澶勪簬V86妯″紡銆傛鏃讹紝鍏跺綋鍓嶇壒鏉冪骇鐢卞鐞嗗櫒鑷姩璁剧疆涓3銆2.V86浠诲姟 8086绋嬪簭鍙互鐩存帴鍦╒86妯″紡涓嬭繍琛岋紝鑰孷86妯″紡鍙楀埌绉颁负V86鐩戞帶绋嬪簭鐨勬帶鍒躲俈86鐩戞帶绋嬪簭鍜屽湪V86妯″紡涓嬬殑8086绋嬪簭鏋勬垚鐨勪换鍔$О涓鸿櫄鎷8086浠诲姟锛屾垨鑰呯畝绉颁负V86浠诲姟銆俈86浠诲姟褰㈡垚涓涓敱澶勭悊鍣ㄧ‖浠跺拰灞炰簬绯荤粺杞欢鐨勭洃鎺х▼搴忕粍鎴愮殑鈥滆櫄鎷8086鏈衡濄俈86鐩戞帶绋嬪簭鎺у埗V86澶栭儴鐣岄潰銆佷腑鏂拰I/O銆傜‖浠舵彁渚涜浠诲姟鏈浣庣1M瀛楄妭绾挎у湴鍧绌洪棿鐨勮櫄鎷熷瓨鍌ㄧ┖闂达紝鍖呭惈铏氭嫙瀵勫瓨鍣ㄧ殑TSS锛屽苟鎵ц澶勭悊杩欎簺瀵勫瓨鍣ㄥ拰鍦板潃绌洪棿鐨勬寚浠ゃ 80386鎶奦86浠诲姟浣滀负涓庡叾瀹冧换鍔″叿鏈夊悓绛夊湴浣嶇殑涓涓换鍔°傚畠鍙互鏀寔澶氫釜V86浠诲姟锛屾瘡涓猇86浠诲姟鏄浉瀵圭嫭绔嬬殑銆傛墍浠ワ紝閫氳繃V86妯″紡杩欑褰㈠紡锛岃繍琛8086绋嬪簭鍙厖鍒嗗彂鎸ュ鐞嗗櫒鐨勮兘鍔涘拰鍏呭垎鍒╃敤绯荤粺璧勬簮銆<浜>杩涘叆鍜岀寮V86妯″紡 淇濇姢妯″紡鍜孷86妯″紡涔嬮棿鐨勫垏鎹㈡儏褰㈠涓嬪浘鎵绀恒傚浘涓乏闈㈤儴鍒嗕负V86浠诲姟銆備粠鍥句腑鍙锛孷86妯″紡涓庝繚鎶ゆā寮忕殑鍒囨崲鍙彂鐢熷湪V86浠诲姟涔嬪唴锛岃繖绉嶅垏鎹㈡槸V86妯″紡涓嬬殑8086绋嬪簭涓庝繚鎶ゆā寮忎笅鐨勭洃鎺х▼搴忎箣闂寸殑杞崲锛沄86妯″紡涓庝繚鎶ゆā寮忕殑鍒囨崲鍙彂鐢熷湪浠诲姟涔嬮棿锛岃繖绉嶅垏鎹㈡槸V86浠诲姟涓庡叾瀹冧换鍔$殑鍒囨崲銆傛澶栵紝V86鐩戞帶绋嬪簭涓庡叾瀹冧换鍔′箣闂寸殑鍒囨崲鏄櫘閫氱殑浠诲姟鍒囨崲銆 鐢变簬80386娌℃湁鎻愪緵鐩存帴鏀瑰彉VM鏍囧織鐨勬寚浠わ紝骞朵笖鍙湁褰撳墠鐗规潈绾PL=0鏃讹紝瀵筕M鐨勬敼鍙樻墠鏈夋晥锛屾墍浠86妯″紡涓庝繚鎶ゆā寮忕殑鍒囨崲涓嶈兘绠鍗曞湴閫氳繃鏀瑰彉VM浣嶈岃繘琛屻備笅闈粙缁峍86妯″紡涓庝繚鎶ゆā寮忎箣闂寸殑鍒囨崲锛屼篃灏辨槸濡備綍杩涘叆鍜岀寮V86妯″紡銆備负浜嗘柟渚匡紝鍏堜粙缁嶅浣曠寮V86妯″紡銆1.绂诲紑V86妯″紡 鍦╒86妯″紡涓嬶紝濡傛灉澶勭悊鍣ㄥ搷搴斾腑鏂/寮傚父锛岄偅涔堝氨浼氶鍑哄綋鍓峍86浠诲姟鐨刅86妯″紡銆 鍦╒86妯″紡涓嬶紝澶勭悊鍣ㄥ涓柇/寮傚父鐨勫搷搴斿鐞嗕笉鍚屼簬鐪熸鐨8086锛岃屼粛鐒堕噰鐢ㄤ繚鎶ゆā寮忎笅瀵逛腑鏂/寮傚父鍝嶅簲澶勭悊鐨勬柟娉曘傛墍浠ワ紝鍦╒86妯″紡涓嬶紝涓嶆槸鏍规嵁浣嶄簬绾挎у湴鍧绌洪棿鏈浣庣鐨勪腑鏂悜閲忚〃鍐呯殑瀵瑰簲涓柇鍚戦噺杞叆澶勭悊绋嬪簭锛岃屾槸鏍规嵁涓柇鎻忚堪绗﹁〃IDT鍐呯殑瀵瑰簲闂ㄦ弿杩扮鐨勬寚绀鸿浆鍏ュ鐞嗙▼搴忋(1)鍦╒86浠诲姟鍐呯寮V86妯″紡 濡傛灉瀵瑰簲鐨勯棬鎻忚堪绗︽槸386涓柇闂ㄦ垨386闄烽槺闂紝閭d箞灏卞彂鐢熷湪褰撳墠V86浠诲姟鍐呬粠V86妯″紡鍒颁繚鎶ゆā寮忕殑杞崲銆80386瑕佹眰鎵ц杩欑涓柇/寮傚父澶勭悊绋嬪簭鏃剁殑CPL蹇呴』绛変簬0銆 鐢变簬V86妯″紡涓嬬殑CPL=3锛岃岃浆鎹㈠埌淇濇姢妯″紡鍚庣殑CPL=0锛屾墍浠ヨ繖绉嶈浆鎹㈠寘鍚簡鐗规潈绾х殑鍙樻崲銆傚湪杞叆澶勭悊绋嬪簭涔嬪墠锛屽鐞嗗櫒鍏堝皢V86妯″紡涓嬬殑娈靛瘎瀛樺櫒GS銆丗S銆丏S鍙奅S鍘嬪叆0绾у爢鏍堬紝骞跺湪杩涘叆淇濇姢妯″紡涓嬬殑澶勭悊绋嬪簭涔嬪墠瑁呭叆绌洪夋嫨瀛愩備负淇濇寔浣垮爢鏍堝榻愶紝鎶婃瀵勫瓨鍣ㄥ帇鍏ュ爢鏍堟椂涓寰嬫寜32浣嶅煎帇鍏ワ紝浣16浣嶆槸娈靛瘎瀛樺櫒鐨勫硷紝楂16浣嶄负绌恒備簬鏄紝杞崲鍚庣殑0绾у爢鏍堝涓嬪浘鎵绀恒傚叾涓紝娈靛瘎瀛樺櫒SS鍜孋S鐨勫间篃鏄疺86妯″紡涓嬬殑娈靛笺傚浘(a)鏄病鏈夊嚭閿欑爜鐨勬儏褰紱鍥(b)鏄湁鍑洪敊鐮佺殑鎯呭舰銆 鍦ㄨ繖绉峍86浠诲姟鍐呬粠V86妯″紡杞崲鍒颁繚鎶ゆā寮忕殑杩囩▼涓紝涓轰簡淇濊瘉涓柇/寮傚父澶勭悊绋嬪簭宸ヤ綔浜庣壒鏉冪骇0锛屽鐩爣浠g爜娈垫弿杩扮鐗规潈绾ц繘琛屾鏌ワ紝濡傛灉鐢辩洰鏍囦唬鐮佹鎻忚堪绗︾壒鏉冪骇鍐冲畾鐨凜PL涓嶇瓑浜0锛屽皢寮曡捣閫氱敤淇濇姢寮傚父銆傛澶栵紝鏍囧織瀵勫瓨鍣‥FLAGS涓殑VM浣嶈娓0锛屼粠鑰屼娇寰椾腑鏂/寮傚父澶勭悊鍦ㄤ繚鎶ゆā寮忎笅杩涜锛屼篃鍗崇寮V86妯″紡銆 杩欑鎯呭喌涓嬶紝鐩稿簲鐨勪腑鏂/寮傚父澶勭悊鍦ㄥ綋鍓峍86浠诲姟涔嬪唴杩涜銆備腑鏂紓甯稿鐞嗙▼搴忓彲浠ユ鏌ヤ繚瀛樺湪鍫嗘爤涓殑EFLAGS鏄犺薄锛屾牴鎹甐M浣嶇殑鍊兼潵纭畾琚腑鏂▼搴忕殑宸ヤ綔妯″紡銆傚鏋淰M=1锛岄偅涔堣涓柇鐨勭▼搴忓伐浣滀簬V86妯″紡锛屾槸8086绋嬪簭锛涘惁鍒欙紝琚腑鏂殑绋嬪簭宸ヤ綔浜庝繚鎶ゆā寮忥紝鏄疺86鐩戞帶绋嬪簭銆(2)浠诲姟鍒囨崲绂诲紑V86妯″紡 濡傛灉瀵瑰簲鐨勯棬鎻忚堪绗︽槸浠诲姟闂紝閭d箞灏卞彂鐢熶粠褰撳墠V86浠诲姟鍒板叾瀹冧换鍔$殑鍒囨崲锛屼篃灏辩寮浜嗗綋鍓峍86浠诲姟鐨刅86鏂瑰紡銆傝薄鏅氫换鍔″垏鎹竴鏍凤紝V86妯″紡鐨勫悇閫氱敤瀵勫瓨鍣ㄣ佹瀵勫瓨鍣ㄣ佹寚浠ゆ寚閽堝拰鏍囧織瀵勫瓨鍣‥FLAGS绛変繚瀛樺埌鍘烿86浠诲姟鐨386TSS涓傝淇濆瓨鐨勬瀵勫瓨鍣ㄧ殑鍐呭鏄疺86妯″紡涓嬬殑娈靛笺傝淇濆瓨鐨凟FLAGS鍐呯殑VM=1銆 杩欑鎯呭喌涓嬶紝鐩稿簲鐨勪腑鏂紓甯稿鐞嗗湪鍙︿竴涓换鍔″唴杩涜銆傜洰鏍囦换鍔″彲浠ユ槸鏅氫换鍔★紝涔熷彲浠ユ槸鍙︿竴涓猇86浠诲姟銆傚鏋滅洰鏍囦换鍔SS鍐呯殑EFLAGS瀛楁鍐呯殑VM=1锛岄偅涔堝氨杞叆鍙︿竴涓猇86浠诲姟鐨刅86妯″紡銆2.杩涘叆V86妯″紡 涓庣寮V86妯″紡鐨勪袱鏉¢斿緞鐩稿搴旓紝鏈変袱鏉¤繘鍏86妯″紡鐨勯斿緞銆(1)閫氳繃IRET鎸囦护杩涘叆V86妯″紡 閫氳繃鍦ㄤ腑鏂/寮傚父澶勭悊缁撴潫鏃朵娇鐢↖RET鎸囦护杩斿洖琚腑鏂殑绋嬪簭缁х画鎵ц銆傛寚浠RET鐨勬墽琛屾楠ゅ涓嬫墍绀猴細 (1)鑻T=1锛屽垯杩涜浠诲姟鍒囨崲锛岀劧鍚庤浆姝ラ6锛 (2)鍚﹀垯浠庡爢鏍堜腑寮瑰嚭EIP銆丆S鍜孍FLAGS锛 (3)鑻M=1涓擟PL=0锛屽垯鎭㈠澶栧眰鍫嗘爤鍙婂叾瀹冩瀵勫瓨鍣紝鐒跺悗杞楠6锛 (4)鑻ユ棤鐗规潈绾у彉鎹㈠垯杞楠6锛 (5)鍚﹀垯鎭㈠澶栧眰鍫嗘爤锛 (6)缁撴潫 灏界涓婅堪姝ラ涓嶅缁嗚嚧鍜屾病鍖呮嫭寮傚父鎯呭喌锛屼絾杩樻槸浣撶幇浜嗘寚浠RET鎵ц鏃舵墍澶勭悊鐨勪笁绉嶆儏褰€傜涓绉嶆儏褰㈡槸褰撳墠EFLAGS涓殑NT=1锛屼篃鍗冲祵濂椾换鍔¤繑鍥烇紝閭d箞灏辫繘琛屼换鍔″垏鎹紝鎸囧悜鐩爣浠诲姟TSS鐨勯夋嫨瀛愬湪褰撳墠浠诲姟TSS鐨勮繛鎺ュ瓧娈点侼T=0琛ㄧず褰撳墠涓柇/寮傚父澶勭悊绋嬪簭涓庤涓柇绋嬪簭灞炰簬鍚屼竴浠诲姟锛屼簬鏄氨浠庡爢鏍堝脊鍑篍IP銆丆S鍜孍FLAGS銆傜浜屽拰绗笁涓儏褰㈡槸NT=0鐨勬潯浠朵笅浜х敓鐨勩傜浜岀鎯呭舰鏄脊鍑虹殑EFLAGS涓璙M=0锛岃〃绀鸿涓柇鐨勭▼搴忔槸鏅氫繚鎶ゆā寮忕▼搴忥紝閭d箞灏辫冭檻鐗规潈绾у彉鎹紝濡傛灉鍚戝灞傝繑鍥烇紝閭d箞灏辨仮澶嶅灞傚爢鏍堟寚閽堛備笉鍏佽鍚戝唴灞傝繑鍥烇紝鍚﹀垯灏嗕細寮曡捣閫氱敤淇濇姢寮傚父銆傚墠鏂囦腑浠嬬粛鐨処RET鎸囦护鐨勫姩浣滃彧鑰冭檻浜嗘儏褰竴鍜屾儏褰簩锛屽苟涓嶆槸IRET鎸囦护鐨勫畬鏁村姩浣溿 绗笁绉嶆儏褰㈡槸寮瑰嚭鐨凟FLAGS涓璙M=1涓斿綋鍓嶆杩愯绋嬪簭鐨凜PL=0锛岃〃绀鸿涓柇鐨勭▼搴忔槸V86妯″紡涓嬬殑8086绋嬪簭锛屽綋鍓嶆槸浠庡悓涓V86浠诲姟涓嬬殑涓柇/寮傚父澶勭悊绋嬪簭杩斿洖銆傜敱浜嶸86妯″紡鐨勭壒鏉冪骇鏄3锛屾墍浠ヨ杩涜鍫嗘爤鍒囨崲锛屼篃鍗充粠鍫嗘爤涓脊鍑3绾у爢鏍堢殑鎸囬拡(ESP鍜孲S)銆傛澶栵紝杩樹粠鍫嗘爤涓脊鍑烘瀵勫瓨鍣‥S銆丏S銆丗S鍜孏S銆傚湪杩欑鎯呭舰涓嬶紝寮瑰埌鍚勬瀵勫瓨鍣(鍖呮嫭CS鍜孲S)鐨勫唴瀹归兘浣滀负娈靛硷紝鑰岄潪閫夋嫨瀛愩傝繖绉嶅鐞嗗姩浣滃搴斾簬涓婅堪绗竴绉嶇寮V86妯″紡鐨勬儏褰紝鏈夊叧鍫嗘爤鎿嶄綔涓庝笂鍥炬墍绀虹殑鍫嗘爤鍐呭鐩哥銆傚綋鐒讹紝濡傛灉浜х敓寮傚父鏃舵彁渚涘嚭閿欑爜锛岄偅涔堝紓甯稿鐞嗙▼搴忓湪鍒╃敤IRET鎸囦护杩斿洖鏃讹紝蹇呴』纭繚鍫嗘爤鎸囬拡鎸囧悜濡備笂鍥炬墍绀轰繚瀛楨IP鐨勫崟鍏冦傜畝鍗曠殑瀹炵幇鏂规硶鏄紝寮傚父澶勭悊绋嬪簭鍦ㄦ墽琛孖RET鍓嶏紝鍏堜粠鍫嗘爤涓脊鍑哄嚭閿欑爜銆 鍒╃敤鎸囦护IRET澶勭悊鐨勮繖绗笁绉嶆儏褰紝鍙互鏂逛究鍦颁粠V86浠诲姟涓嬬殑涓柇/寮傚父澶勭悊绋嬪簭杩斿洖鍒癡86妯″紡涓嬬殑8086绋嬪簭銆傚埄鐢ㄨ繖鏉¢斿緞杩樺彲浠ョ洿鎺ヨ繘鍏86妯″紡銆備负姝わ紝鍏堝湪0绾у爢鏍堜腑褰㈡垚濡備笂鍥(a)鎵绀虹殑鏍堥《銆傚搴擡IP鍊兼槸V86妯″紡涓嬭鎵ц鐨8086绋嬪簭鍏ュ彛鐐圭殑16浣嶅亸绉伙紱瀵瑰簲CS鍊兼槸V86妯″紡涓嬭鎵ц鐨8086绋嬪簭鍏ュ彛鐐圭殑娈靛硷紱瀵瑰簲EFLAGS鍊间腑鐨刅M浣嶅繀椤绘槸1锛涘搴擲S鍜孍SP鐨勫兼槸瑕佹墽琛岀殑8086绋嬪簭鐨勫爢鏍堟寚閽堬紱瀵瑰簲ES銆丏S銆丗S鍜孏S鐨勫兼槸鐩稿簲鐨勬鍊笺傜劧鍚庯紝鍦–PL=0鍜孨T=0鐨勬儏鍐典笅锛屾墽琛孖RET鎸囦护銆傚疄闄呬笂锛岃繖绉嶈繘鍏86妯″紡鐨勯斿緞鏄紝鍏堝缓绔嬩竴涓猇86妯″紡涓嬫墽琛岀殑8086绋嬪簭琚腑鏂岀寮V86妯″紡鐨勭幆澧冿紝鐒跺悗鍐嶈繑鍥炪傞渶瑕佹敞鎰忕殑鏄紝鑻ュ綋鍓嶆鎵ц绋嬪簭鐨凜PL涓嶄负0锛屽垯鍐嶆墽琛孖RET鎸囦护鏃朵笉浼氳繘鍏86妯″紡锛屼絾涔熶笉浜х敓寮傚父锛孍FLAGS涓殑VM浣嶈澶勭悊鍣ㄨ嚜鍔ㄦ竻0銆 涓嶈兘閫氳繃RET鎸囦护杩涘叆V86妯″紡锛屽洜涓哄畠涓嶆敼鍙楨FLAGS鐨勫唴瀹广備换浣曚笉鑳戒慨鏀笶FLAGS涓璙M浣嶇殑鎸囦护鍧囦笉鑳藉垏鎹㈠埌V86妯″紡銆(2)閫氳繃浠诲姟鍒囨崲杩涘叆V86妯″紡 閫氳繃浠诲姟鍒囨崲鐨勯斿緞锛屽彲浠ヤ粠鍏跺畠浠诲姟杩涘叆V86浠诲姟鍐呯殑V86妯″紡銆 鍒╃敤鍦ㄥ墠鏂囦粙缁嶇殑浠诲姟鍒囨崲鐨勬柟娉曞彲浠ヨ繘琛屼换鍔″垏鎹€傚鏋滅洰鏍囦换鍔$敱386TSS鎻忚堪锛屽苟涓斿叾涓璄FLAGS瀛楁鍐呯殑VM浣嶄负1锛岄偅涔堝湪鍒囨崲鍒扮洰鏍囦换鍔℃椂锛屼篃灏辫繘鍏ヤ簡V86妯″紡銆傚湪鍒囨崲鍒癡86妯″紡鏃讹紝CPL琚瀹氫负3銆傜洰鏍囦换鍔SS涓殑鍚勬瀵勫瓨鍣ㄥ瓧娈佃瑙i噴涓8086鍙互鎺ュ彈鐨勬鍊硷紝鑰屼笉鏄夋嫨瀛愩備换鍔″垏鎹㈡椂涔熷皢瑁呰浇LDTR鍜孋R3銆 绋嬪簭鍦╒86妯″紡涓嬫墽琛屾椂锛孍FLAGS瀵勫瓨鍣ㄤ腑鐨凬T浣嶈蹇界暐锛屾墍浠ワ紝涓嶈兘鍦╒86妯″紡涓嬬敤IRET鎸囦护瀹屾垚涓涓换鍔″垏鎹紝骞朵娇鍏跺伐浣滀簬V86浠ュ鐨勫伐浣滄ā寮忋傚湪V86妯″紡涓嬫墽琛孖RET鎸囦护鏃讹紝灏嗗脊鍑篒P銆丆S鍙奆LAGS瀵勫瓨鍣紝浠ユ仮澶嶈涓柇鐨勭▼搴忥紝鑰屼笉鑰冭檻NT浣嶇殑鍊笺傚鏋滃埄鐢ㄨ繖鏉¢斿緞寤虹珛V86浠诲姟骞惰繘鍏86妯″紡锛岄偅涔堜富瑕佹槸鎶婂搴386TSS涓璄FLAGS瀛楁鍐呯殑VM浣嶇疆1锛屾妸8086绋嬪簭鐨勬湁鍏虫鍊煎~鍏ュ搴386TSS涓殑鐩稿簲娈靛瘎瀛樺櫒瀛楁銆傛澶栵紝濡傛灉V86鐩戞帶绋嬪簭闇瑕佺敤鍒癓DT锛岄偅涔堣繕瑕佸~鍐橪DTR瀛楁锛涘鏋滈渶瑕侀噰鐢ㄥ垎椤垫満鍒讹紝閭d箞杩樿濉啓CR3瀛楁(褰撴柊浠诲姟涓篤86妯″紡鐨勪换鍔℃椂锛屽彧瑁呭叆娈靛瘎瀛樺櫒锛岃屾病鏈夎鍏ユ弿杩扮鎶曞奖瀵勫瓨鍣ㄧ殑鍔ㄤ綔)銆<涓>婕旂ず杩涘叆鍜岀寮V86妯″紡鐨勫疄渚(瀹炰緥鍗佷竴) 涓嬮潰缁欏嚭涓涓敤浜庢紨绀鸿繘鍏ュ拰绂诲紑V86妯″紡鐨勫疄渚嬨傝瀹炰緥鐨勯昏緫鍔熻兘鏄紝浠ラ┗鐣欐柟寮忕粨鏉熺▼搴忥紝閫鍑烘椂宸插浜嶸86妯″紡銆傝瀹炰緥婕旂ず鍐呭鍖呮嫭锛氫袱绉嶆柟寮忚繘鍏86妯″紡鍜屼袱绉嶆柟寮忕寮V86妯″紡锛沄86妯″紡涓嬬殑8086绋嬪簭濡備綍璋冪敤瀹炴ā寮忎笅鐨勮蒋涓柇澶勭悊绋嬪簭銆1.婕旂ず姝ラ鍜屾簮绋嬪簭娓呭崟 涓轰簡渚夸簬婕旂ず锛屾湰瀹炰緥鍚湁涓変釜浠诲姟锛氫复鏃朵换鍔★紝V86浠诲姟鍜孖NTFF浠诲姟銆傚湪瀹炴ā寮忎笅鍋氬繀瑕佺殑鍒濆鍖栧伐浣滃悗鍒囨崲鍒颁繚鎶ゆā寮忥紝涔熷嵆杩涘叆涓存椂浠诲姟锛屽紑濮嬫紨绀恒傛紨绀哄垎涓や釜闃舵锛氱涓闃舵杩涘叆V86浠诲姟鐨刅86妯″紡锛屽苟椹荤暀閫鍑猴紱绗簩闃舵杩涘叆INTFF浠诲姟锛屽垏鎹㈠埌涓存椂浠诲姟锛屽苟杩斿洖瀹炴ā寮忋 绗竴闃舵鐨勬紨绀烘楠ゅ涓嬶細 (1)寮濮嬩复鏃朵换鍔″悗锛屼綔鍒囨崲鍒癡86浠诲姟鐨勫噯澶囷紱 (2)鍒囨崲鍒癡86浠诲姟锛岀敱浜嶸86浠诲姟TSS涓殑EFLAGS瀛楁鍐呯殑VM=1锛屾墍浠ヤ即闅忕潃浠诲姟鍒囨崲灏辫繘鍏ヤ簡V86妯″紡銆 (3)杩涘叆V86浠诲姟鐨刅86妯″紡鍚庯紝鏄剧ず鎻愮ず淇℃伅锛岄┗鐣欑粨鏉燂紝鍑虹幇DOS鎻愮ず绗︼紝绗竴闃舵鑷虫缁撴潫銆 鍦╒86妯″紡涓嬶紝鍙繘琛屽悇绉嶆搷浣滐紝杩愯鍏跺畠8086绋嬪簭銆傚鏋8086绋嬪簭寮曡捣閫氱敤淇濇姢寮傚父锛岄偅涔堝湪灞忓箷涓婃樉绀烘彁绀轰俊鎭紝骞朵腑姝㈣8086绋嬪簭銆傚鏋滃湪8086绋嬪簭涓墽琛屸淚NT 0FFH鈥濇寚浠わ紝寮濮嬬浜岄樁娈点傜浜岄樁娈电殑婕旂ず姝ラ濡備笅锛 (1)杩涘叆INTFF浠诲姟鍚庯紝鏄剧ず鎻愮ず淇℃伅锛屽垏鎹㈠埌涓存椂浠诲姟锛 (2)鍦ㄤ复鏃朵换鍔″唴鍒囨崲鍒板疄妯″紡锛 (3)鍦ㄥ疄妯″紡涓嬩腑姝㈠彂鍑衡淚NT 0FFH鈥濈殑绋嬪簭 婧愮▼搴忕敱濡備笅鍑犻儴鍒嗙粍鎴愶細 (1)鍏ㄥ眬鎻忚堪绗﹁〃GDT锛 (2)涓柇鎻忚堪绗﹁〃IDT(鍙傜敤浜嶸86浠诲姟)锛 (3)INTFF浠诲姟鐨凾SS娈点丩DT娈点0绾у爢鏍堟鍜屼唬鐮佹锛 (4)V86浠诲姟鐨凾SS娈点丩DT娈点0绾у爢鏍堟銆3绾у爢鏍堟鍙婃暟鎹锛岄氱敤淇濇姢寮傚父澶勭悊绋嬪簭娈靛拰鍏跺畠涓柇/寮傚父澶勭悊绋嬪簭娈碉紝V86妯″紡涓嬬殑8086绋嬪簭娈碉紱 (5)涓存椂浠诲姟鐨凾SS娈靛拰浠g爜娈碉紱 (6)瀹炴ā寮忎笅鐨勫垵濮嬪寲浠g爜娈靛強鏈夊叧杩囩▼銆傛簮绋嬪簭娓呭崟濡備笅锛;鍚嶇О:ASM11.ASM;鍔熻兘:婕旂ず杩涘叆鍜岀寮V86鏂瑰紡;缂栬瘧:TASM ASM11.ASM;杩炴帴:TLINK ASM11.OBJ;============================================================================INCLUDE 386SCD.INC;============================================================================GDTSeg SEGMENT PARA USE16 ;鍏ㄥ眬鎻忚堪绗﹁〃鏁版嵁娈(16浣);---------------------------------------------------------------------------- ;鍏ㄥ眬鎻忚堪绗﹁〃GDT LABEL BYTE ;绌烘弿杩扮DUMMY Desc <> ;瑙勮寖娈垫弿杩扮鍙婇夋嫨瀛怤ormal Desc <0ffffh,,,ATDW,,>Normal_Sel = Normal-GDT ;鏄剧ず缂撳啿鍖烘暟鎹鎻忚堪绗﹀強閫夋嫨瀛怴ideo Desc <07fffh,8000h,0bh,ATDW,,>Video_Sel = Video-GDT;----------------------------------------------------------------------------EFFGDT LABEL BYTE ;V86浠诲姟TSS娈垫弿杩扮鍙婇夋嫨瀛怴86TSS Desc V86TSS_Sel = V86TSS-GDT ;V86浠诲姟灞閮ㄦ弿杩扮琛ㄧ殑鎻忚堪绗﹀強閫夋嫨瀛怴86LDT Desc V86LDT_Sel = V86LDT-GDT ;IntFF浠诲姟TSS娈垫弿杩扮鍙婇夋嫨瀛怚ntFFTSS Desc IntFFTSS_Sel = IntFFTSS-GDT ;IntFF浠诲姟灞閮ㄦ弿杩扮琛ㄧ殑鎻忚堪绗﹀強閫夋嫨瀛怚ntFFLDT Desc IntFFLDT_Sel = IntFFLDT-GDT ;涓存椂浠诲姟鐨勪换鍔$姸鎬佹鎻忚堪绗﹀強閫夋嫨瀛怲empTSS Desc TempTSS_Sel = TempTSS-GDT ;涓存椂浠诲姟浠g爜娈垫弿杩扮鍙婇夋嫨瀛怲empCode Desc <0ffffh,TempCodeSeg,,ATCE,,>TempCode_Sel = TempCode-GDT;----------------------------------------------------------------------------GDNum = ($-EFFGDT)/(SIZE Desc) ;闇鐗规畩澶勭悊鐨勬弿杩扮鏁癎DTLen = $-GDT ;鍏ㄥ眬鎻忚堪绗﹁〃闀垮害GDTSeg ENDS ;鍏ㄥ眬鎻忚堪绗﹁〃娈靛畾涔夌粨鏉;============================================================================IDTSeg SEGMENT PARA USE16 ;V86浠诲姟浣跨敤鐨勪腑鏂弿杩扮琛↖DT LABEL BYTE ;瀵瑰簲0--12鍙蜂腑鏂/寮傚父鐨勪腑鏂棬鎻忚堪绗 REPT 13 Gate <,TPCode_Sel,,AT386IGate+DPL3,> ENDM ;閫氱敤淇濇姢鏁呴殰澶勭悊绋嬪簭闂ㄦ弿杩扮 Gate ;瀵瑰簲14--254鍙蜂腑鏂/寮傚父鐨勪腑鏂棬鎻忚堪绗 REPT 241 Gate <,TPCode_Sel,,AT386IGate+DPL3,> ENDM ;瀵瑰簲255鍙蜂腑鏂殑浠诲姟闂ㄦ弿杩扮 Gate <,IntFFTSS_Sel,,ATTaskGate+DPL3,>;----------------------------------------------------------------------------IDTLen = $-IDTIDTSeg ENDS ;涓柇鎻忚堪绗﹁〃娈靛畾涔夌粨鏉;============================================================================;IntFF浠诲姟鐨凾SS娈礗ntFFTSSSeg SEGMENT PARA USE16 DD 0 ;閾炬帴瀛 DD 0 ;0绾у爢鏍堟寚閽(瀹炰緥涓嶄娇鐢) DW 0,0 ;0绾у爢鏍堥夋嫨瀛(瀹炰緥涓嶄娇鐢) DD 0 ;1绾у爢鏍堟寚閽(瀹炰緥涓嶄娇鐢) DW 0,0 ;1绾у爢鏍堥夋嫨瀛(瀹炰緥涓嶄娇鐢) DD 0 ;2绾у爢鏍堟寚閽(瀹炰緥涓嶄娇鐢) DW 0,0 ;2绾у爢鏍堥夋嫨瀛(瀹炰緥涓嶄娇鐢) DD 0 ;CR3 DW IntFFBegin,0 ;EIP DD 0 ;EFLAGS DD 0 ;EAX DD 0 ;ECX DD 0 ;EDX DD 0 ;EBX DD IntFFStackLen ;ESP DD 0 ;EBP DD 0 ;ESI DD 0 ;EDI DW Normal_Sel,0 ;ES DW IntFFCode_Sel,0 ;CS DW IntFFStack_Sel,0 ;SS DW Normal_Sel,0 ;DS DW Normal_Sel,0 ;FS DW Normal_Sel,0 ;GS DW IntFFLDT_Sel,0 ;LDTR DW 0 ;璋冭瘯闄烽槺鏍囧織 DW $+2 ;鎸囧悜I/O璁稿彲浣嶅浘 DB 0ffh ;I/O璁稿彲浣嶅浘缁撴潫鏍囧織;----------------------------------------------------------------------------IntFFTSSLen = $IntFFTSSSeg ENDS;============================================================================;IntFF浠诲姟鐨凩DT娈礗ntFFLDTSeg SEGMENT PARA USE16FLDT LABEL BYTE ;0绾у爢鏍堟鎻忚堪绗﹀強閫夋嫨瀛怚ntFFStack Desc IntFFStack_Sel = IntFFStack-FLDT+TIL ;浠g爜娈垫弿杩扮鍙婇夋嫨瀛怚ntFFCode Desc IntFFCode_Sel = IntFFCode-FLDT+TIL;----------------------------------------------------------------------------IntFFLDNum = ($-FLDT)/(SIZE Desc)IntFFLDTLen = $IntFFLDTSeg ENDS;============================================================================;IntFF浠诲姟鐨勫爢鏍圛ntFFStackSeg SEGMENT PARA USE16IntFFStackLen = 512 DB IntFFStackLen DUP(0)IntFFStackSeg ENDS;============================================================================;IntFF浠诲姟鐨勪唬鐮佹IntFFCodeSeg SEGMENT PARA USE16 ASSUME CS:IntFFCodeSeg;----------------------------------------------------------------------------IntFFMess DB 'Return to real mode.'IntFFMessLen = $-IntFFMess;----------------------------------------------------------------------------IntFFBegin PROC FAR mov si,OFFSET IntFFMess mov ax,Video_Sel mov es,ax mov di,0 mov ah,17h mov cx,IntFFMessLen cldINext: mov al,BYTE PTR cs:[si] inc si stosw loop INext JUMP16 TempTSS_Sel,0IntFFBegin ENDP;----------------------------------------------------------------------------IntFFCodeLen = $IntFFCodeSeg ENDS;============================================================================;V86浠诲姟鐨凾SS娈礦86TSSSeg SEGMENT PARA USE16 DD 0 ;閾炬帴瀛 DD V86Stack0Len ;0绾у爢鏍堟寚閽 DW V86Stack0_Sel,0 ;0绾у爢鏍堥夋嫨瀛 DD 0 ;1绾у爢鏍堟寚閽(瀹炰緥涓嶄娇鐢) DW 0,0 ;1绾у爢鏍堥夋嫨瀛(瀹炰緥涓嶄娇鐢) DD 0 ;2绾у爢鏍堟寚閽(瀹炰緥涓嶄娇鐢) DW 0,0 ;2绾у爢鏍堥夋嫨瀛(瀹炰緥涓嶄娇鐢) DD 0 ;CR3 DW V86Begin,0 ;EIP DD IOPL3 OR VMFL ;EFLAGS(IO鐗规潈绾т负3,VM=1) DD 0 ;EAX DD 0 ;ECX DD 0 ;EDX DD 0 ;EBX DD V86Stack3Len ;ESP DD 0 ;EBP DD 0 ;ESI DD 0 ;EDI DW V86CodeSeg,0 ;ES DW V86CodeSeg,0 ;CS DW V86Stack3Seg,0 ;SS DW V86CodeSeg,0 ;DS DW V86CodeSeg,0 ;FS DW V86CodeSeg,0 ;GS DW V86LDT_Sel,0 ;LDTR DW 0 ;璋冭瘯闄烽槺鏍囧織 DW $+2 ;鎸囧悜I/O璁稿彲浣嶅浘 DB 4000h/8 DUP(0) ;I/O璁稿彲浣嶅浘 DB 0ffh ;I/O璁稿彲浣嶅浘缁撴潫鏍囧織;----------------------------------------------------------------------------V86TSSLen = $V86TSSSeg ENDS;============================================================================;V86浠诲姟鐨凩DT娈礦86LDTSeg SEGMENT PARA USE16VLDT LABEL BYTE;---------------------------------------------------------------------------- ;V86浠诲姟绾挎у湴鍧绌洪棿涓渶浣庣1M瀛楄妭娈电殑鎻忚堪绗﹀強鎻忚堪绗AllMem Desc <0ffffh,,,ATDWA,0fh,>VAllMem_Sel = VAllMem-VLDT+TIL ;V86浠诲姟0绾у爢鏍堟鎻忚堪绗﹀強閫夋嫨瀛怴86Stack0 Desc V86Stack0_Sel = V86Stack0-VLDT+TIL ;V86浠诲姟鏁版嵁娈垫弿杩扮鍙婇夋嫨瀛怴86Data Desc V86Data_Sel = V86Data-VLDT+TIL ;V86浠诲姟涓柇/寮傚父澶勭悊绋嬪簭浠g爜娈垫弿杩扮鍙婇夋嫨瀛怲PCode Desc TPCode_Sel = TPCode-VLDT+TIL ;V86浠诲姟閫氱敤淇濇姢寮傚父澶勭悊绋嬪簭浠g爜娈垫弿杩扮鍙婇夋嫨瀛怗PCode Desc GPCode_Sel = GPCode-VLDT+TIL;----------------------------------------------------------------------------V86LDNum = ($-VLDT)/(SIZE Desc)V86LDTLen = $V86LDTSeg ENDS;============================================================================;V86浠诲姟鐨0绾у爢鏍圴86Stack0Seg SEGMENT PARA USE16V86Stack0Len = 512 DB V86Stack0Len DUP(0)V86Stack0Seg ENDS;============================================================================;V86浠诲姟鐨3绾у爢鏍圴86Stack3Seg SEGMENT PARA USE16V86Stack3Len = 1024 DB V86Stack3Len DUP(0)V86Stack3Seg ENDS;============================================================================;V86浠诲姟鏁版嵁娈礦86DataSeg SEGMENT PARA USE16GPErrMess DB '......General Protection Error......'GPErrMessLen = $-GPErrMessV86DataLen = $V86DataSeg ENDS;============================================================================;瀹氫箟閮ㄥ垎浠h〃鍫嗘爤鍗曞厓鐨勭鍙稰err EQU Pip EQU Pcs EQU Pflag EQU Psp EQU Pss EQU Pes EQU Pds EQU Pfs EQU Pgs EQU ;============================================================================;V86浠诲姟涓嬬殑涓柇/寮傚父澶勭悊绋嬪簭浠g爜娈礣PCodeSeg SEGMENT PARA USE16 ASSUME CS:TPCodeSeg;----------------------------------------------------------------------------TPBegin PROC FARCount = 0 REPT 256 ;瀵瑰簲256涓叆鍙 IF Count EQ 21hEnt21H LABEL BYTE ;鍦ㄧ21H椤瑰瀹氫箟鏍囧彿Ent21H ENDIF push bp mov bp,Count ;缃腑鏂悜閲忓彿鍒癇P jmp Process ;閮借浆缁熶竴鐨勫鐞嗙▼搴廋ount = Count+1 ENDMProcess: push bp ;淇濆瓨BP mov bp,sp ;鍫嗘爤鎸囬拡閫丅P push eax push ebx ;淇濆瓨EAX銆丒BX ;鍦╒86鍫嗘爤椤跺舰鎴愯繑鍥炵偣鐨勭幇鍦 mov ax,VAllMem_Sel ;杞浇鎻忚堪鏈浣1M瀛楄妭绾挎у湴鍧 mov ds,ax ; 绌洪棿鐨勬弿杩扮閫夋嫨瀛 xor eax,eax mov ax,Psp ;淇敼鍦╒86浠诲姟0绾у爢鏍堜腑淇濆瓨 sub ax,3*2 ; 鐨3绾у爢鏍堢殑鎸囬拡锛屽噺3涓瓧 mov Psp,ax ; 鍗冲湪鏍堥《绌哄嚭3涓瓧 xor ebx,ebx mov bx,Pss ;浣縀BX鎸囧悜V86鍫嗘爤椤 shl ebx,4 add ebx,eax mov ax,Pip ;鎶婁繚瀛樺湪0绾у爢鏍堜腑鐨勮繑鍥炲湴鍧 mov WORD PTR [ebx],ax ;鐨勫亸绉婚儴鍒嗛乂86鍫嗘爤 mov ax,Pcs mov WORD PTR [ebx+2],ax ;娈靛奸儴鍒嗛乂86鍫嗘爤 mov ax,Pflag mov WORD PTR [ebx+4],ax ;鏍囧織鍊奸乂86鍫嗘爤 ;鐢ㄥ搴旂殑涓柇鍚戦噺鍊间唬鏇胯繑鍥炲湴鍧 mov bx,[bp] ;鍙栦腑鏂悜閲忓彿 shl bx,2 ;涔4 mov ax,[bx] ;鍙栧疄妯″紡涓嬪搴斾腑鏂悜閲忕殑鍋忕Щ mov Pip,ax ;浠f浛0绾у爢鏍堜腑鐨凟IP mov ax,[bx+2] ;鍙栧疄妯″紡涓嬪搴斾腑鏂悜閲忕殑娈靛 mov Pcs,ax ;浠f浛0绾у爢鏍堜腑鐨凜S pop ebx ;鎭㈠鐜板満 pop eax pop bp pop bp ;浠庝繚鎶ゆ柟寮忚繑鍥濾86鏂瑰紡 ;鍏堣浆鍏ュ搴旂殑涓柇澶勭悊绋嬪簭,鍐嶈繑鍥炰腑鏂彂鐢熷 iretdTPBegin ENDP;----------------------------------------------------------------------------TPCodeLen = $TPCodeSeg ENDS;============================================================================;V86浠诲姟涓嬬殑閫氱敤淇濇姢鏁呴殰澶勭悊绋嬪簭浠g爜娈;----------------------------------------------------------------------------GPCodeSeg SEGMENT PARA USE32 ASSUME CS:GPCodeSeg;----------------------------------------------------------------------------GPBegin PROC FAR mov ax,V86Data_Sel mov ds,ax mov si,OFFSET GPErrMess mov ax,Video_Sel mov es,ax mov di,0 mov ah,17h mov cx,GPErrMessLen cldGNext: lodsb stosw loop GNext add esp,4 mov ax,4c01h JUMP16 TPCode_Sel,Ent21HGPBegin ENDP;----------------------------------------------------------------------------GPCodeLen = $GPCodeSeg ENDS;============================================================================;V86鏂瑰紡鎵ц鐨8086绋嬪簭娈礦86CodeSeg SEGMENT PARA USE16 ASSUME CS:V86CodeSeg,DS:V86CodeSegMessage DB 'V86 is OK!',0dh,0ah,24hV86Begin PROC FAR mov ah,9 mov dx,OFFSET Message int 21h mov ax,RCodeSeg sub ax,GDTSeg mov dx,OFFSET TSRLine+15 shr dx,4 add dx,ax add dx,10h mov ax,3100h int 21hV86Begin ENDPV86CodeSeg ENDS;============================================================================TempTSSSeg SEGMENT PARA USE16 ;涓存椂浠诲姟鐨凾SS娈 TSS <> DB 0ffh ;I/O璁稿彲浣嶅浘缁撴潫鏍囧織TempTSSLen = $TempTSSSeg ENDS;============================================================================TempCodeSeg SEGMENT PARA USE16 ;涓存椂浠诲姟鐨勪唬鐮佹 ASSUME CS:TempCodeSeg;----------------------------------------------------------------------------Virtual PROC FAR mov ax,Normal_Sel mov ds,ax mov es,ax mov fs,ax mov gs,ax mov ss,ax mov ax,TempTSS_Sel ;瑁呰浇TR ltr ax JUMP16 V86TSS_Sel,0 ;鐩存帴鍒囨崲鍒版紨绀轰换鍔oDos: clts mov eax,cr0 ;鍑嗗杩斿洖瀹炴ā寮 and al,11111110b mov cr0,eax JUMP16 ,Virtual ENDP;----------------------------------------------------------------------------TempCodeSeg ENDS;============================================================================RDataSeg SEGMENT PARA USE16 ;瀹炴柟寮忔暟鎹RDataSeg ENDS;============================================================================RCodeSeg SEGMENT PARA USE16 ASSUME CS:RCodeSeg,DS:RCodeSeg;----------------------------------------------------------------------------VGDTR PDesc ;GDT浼弿杩扮VIDTR PDesc ;IDT浼弿杩扮NORVIDTR PDesc <> ;鐢ㄤ簬淇濆瓨鍘烮DTR鍊糞PVar DW ? ;鐢ㄤ簬淇濆瓨瀹炴柟寮忎笅鐨凷PSSVar DW ? ;鐢ㄤ簬淇濆瓨瀹炴柟寮忎笅鐨凷S;----------------------------------------------------------------------------Start PROC mov ax,RCodeSeg mov ds,ax cld call InitGDT ;鍒濆鍖栧叏灞鎻忚堪绗﹁〃GDT call InitIDT ;鍒濆鍖栦腑鏂弿杩扮琛↖DT mov ax,V86LDTSeg mov fs,ax mov cx,V86LDNum mov si,OFFSET VLDT call InitLDT mov ax,IntFFLDTSeg mov fs,ax mov cx,IntFFLDNum mov si,OFFSET FLDT call InitLDT mov SSVar,ss mov SPVar,sp lgdt QWORD PTR VGDTR ;瑁呰浇GDTR骞跺垏鎹㈠埌淇濇姢鏂瑰紡 sidt QWORD PTR NORVIDTR ;淇濆瓨IDTR cli ;鍏充腑鏂 lidt QWORD PTR VIDTR ;瑁呰浇IDTR mov eax,cr0 or al,1 mov cr0,eax JUMP16 ,Real: mov ax,cs mov ds,ax lss sp,DWORD PTR SPVar ;鍙堝洖鍒板疄鏂瑰紡 lidt QWORD PTR NORVIDTR sti mov ax,4c00h int 21hStart ENDP;----------------------------------------------------------------------------TSRLine LABEL BYTE;----------------------------------------------------------------------------InitGDT PROC push ds mov ax,GDTSeg mov ds,ax mov cx,GDNum mov si,OFFSET EFFGDTInitG: mov ax,[si].BaseL movzx eax,ax shl eax,4 shld edx,eax,16 mov WORD PTR [si].BaseL,ax mov BYTE PTR [si].BaseM,dl mov BYTE PTR [si].BaseH,dh add si,SIZE Desc loop InitG pop ds mov bx,16 mov ax,GDTSeg mul bx mov WORD PTR VGDTR.Base,ax mov WORD PTR VGDTR.Base+2,dx retInitGDT ENDP;----------------------------------------------------------------------------;鍏ュ彛鍙傛暟:FS:SI=绗竴涓鍒濆鍖栫殑鎻忚堪绗,CX=瑕佸垵濮嬪寲鐨勬弿杩扮鏁;----------------------------------------------------------------------------InitLDT PROC mov ax,WORD PTR FS:[si].BaseL movzx eax,ax shl eax,4 shld edx,eax,16 mov WORD PTR fs:[si].BaseL,ax mov BYTE PTR fs:[si].BaseM,dl mov BYTE PTR fs:[si].BaseH,dh add si,SIZE Desc loop InitLDT retInitLDT ENDP;----------------------------------------------------------------------------InitIDT PROC push ds mov ax,IDTSeg mov ds,ax mov cx,256-1 mov si,OFFSET IDT mov ax,OFFSET TPBeginIIDT1: cmp cx,256-1-13 jz IIDT2 mov [si],axIIDT2: add si,8 add ax,7 loop IIDT1 pop ds mov bx,16 mov ax,IDTSeg mul bx mov WORD PTR VIDTR.Base,ax mov WORD PTR VIDTR.Base+2,dx retInitIDT ENDP;----------------------------------------------------------------------------RCodeSeg ENDS END Start鐢ㄤ簬婕旂ずINTFF浠诲姟鐨勬簮绋嬪簭濡備笅锛;鍔熻兘锛氱敤浜庢紨绀篤86妯″紡涓嬬殑INTFF浠诲姟;缂栬瘧锛歍ASM INTFF.ASM;杩炴帴锛歍LINK INTFF.OBJ;====================================================================Text SEGMENT ASSUME cs:Text,ds:Text;---------------------------------------Start PROC int 0ffh mov ax,4c00h int 21hStart ENDP;---------------------------------------Text ENDS END Start2.璇存槑(1)瀵笽DT琛ㄧ殑鍒濆鍖 涓轰簡鏂逛究鍦颁功鍐橧DT琛紝閲囩敤浜嗛噸澶嶆眹缂栥備粠閲囩敤閲嶅姹囩紪鏂瑰紡瀹氫箟鐨処DT琛ㄥ彲瑙侊紝闄ゅ搴旈氱敤淇濇姢寮傚父鐨13鍙烽櫡闃遍棬鎻忚堪绗﹀拰255鍙蜂换鍔¢棬鎻忚堪绗﹀锛屽叾瀹冧腑鏂棬鎻忚堪绗﹀唴鐨勫亸绉诲潎鏈瀹氥備负姝わ紝鍦ㄥ疄妯″紡涓嬪垵濮嬪寲鏃讹紝鎶婄浉搴旂殑鍏ュ彛鍋忕Щ濉叆杩欎簺闂ㄦ弿杩扮銆備粠婧愮▼搴忓彲瑙侊紝杩欎簺澶勭悊绋嬪簭鐨勫叆鍙e亸绉讳篃鐢ㄩ噸澶嶆眹缂栦功鍐欙紝骞朵笖瀛楄妭鏁扮浉鍚岋紝鎵浠ラ棿闅旂瓑闀裤(2)浠诲姟鍒囨崲鏂瑰紡杩涘叆V86妯″紡 瀹炰緥浠庝复鏃朵换鍔″垏鎹㈠埌V86浠诲姟鏃惰繘鍏86妯″紡銆傚湪V86浠诲姟鐨凾SS涓紝EFLAGS瀛楁鍐呯殑VM=1锛屾墍浠ヤ即闅忕潃浠诲姟鍒囨崲锛屽氨杩涘叆浜哣86妯″紡銆備负姝わ紝TSS涓搴斿悇娈靛瘎瀛樺櫒瀛楁鍐呯殑鍒濆鍊奸兘鏄疺86妯″紡涓嬭鎵ц鐨8086绋嬪簭鍚勬鐨勬鍊硷紝鑰岄潪閫夋嫨瀛愩傜敱浜庡湪鍙戠敓涓柇/寮傚父鏃惰杩涘叆V86浠诲姟鐨勭壒鏉冪骇0锛屾墍浠ュ垵濮嬪寲浜0绾у爢鏍堟寚閽堛俈86浠诲姟浣跨敤灞閮ㄦ弿杩扮琛↙DT锛屾墍浠SS涓搴斿瓧娈靛~鏈夌浉搴旂殑閫夋嫨瀛愩(3)V86妯″紡涓嬪涓柇鐨勫鐞 瀹炰緥瀵筕86妯″紡涓嬪搷搴斾腑鏂拰鎵ц杞腑鏂寚浠も淚NT n鈥濈殑澶勭悊鏂规硶鏄紝杞疄妯″紡涓嬬殑瀵瑰簲涓柇澶勭悊绋嬪簭銆傚叿浣撴楠ゅ涓嬶細 1)鍦╒86妯″紡鍫嗘爤(V86浠诲姟鐨3绾у爢鏍)椤跺舰鎴愯繑鍥炵偣鐨勭幇鍦猴紱 2)鐢ㄥ疄妯″紡涓嬪搴旂殑涓柇鍚戦噺鍊间唬鏇胯繑鍥炲湴鍧锛 3)浠庝繚鎶ゆā寮忚繑鍥濾86妯″紡銆傜敱浜庡爢鏍堜腑淇濆瓨鐨凟FLAGS鍐呯殑VM=1锛屾墍浠ュ湪淇濇姢妯″紡涓嬫墽琛孖RET鎸囦护鏃讹紝杩斿洖V86妯″紡锛涚敱浜庡湪0绾у爢鏍堜腑淇濆瓨鐨勮繑鍥炲湴鍧(娈靛煎拰鍋忕Щ)宸茶淇敼鎴愬疄妯″紡涓嬬殑涓柇鍚戦噺锛屾墍浠ヨ繖鏃剁殑杩斿洖涔熷氨鏄浆鍏ュ疄妯″紡涓嬬殑瀵瑰簲涓柇澶勭悊绋嬪簭锛涚敱浜庡湪V86鍫嗘爤椤跺凡瀹夋帓浜嗚繑鍥炲湴鍧锛屾墍浠ュ湪鎵ц瀹炴ā寮忎笅瀵瑰簲涓柇澶勭悊绋嬪簭鏃讹紝閬囧埌IRET鎸囦护灏辫繑鍥炲埌V86浠诲姟鐨勮涓柇澶勩傝繖绉嶅鐞嗘柟娉曚技涔庣粫浜嗕釜寮備絾灏辨槸鍒╃敤杩欎釜鏂规硶鏈夋晥鍦拌皟鐢ㄤ簡DOS鍔熻兘锛屾柟渚垮湴鏄剧ず浜嗘彁绀轰俊鎭淰86 is OK.鈥濓紝椤哄埄鍦板疄鐜颁簡椹荤暀閫鍑恒 杩欑澶勭悊鏂规硶娌℃湁鍏呭垎鑰冭檻寮傚父锛屾洿娌℃湁鑰冭檻寮傚父鏃剁殑鍑洪敊鐮併(4)V86浠诲姟鐨勯氱敤淇濇姢寮傚父澶勭悊 鍦ㄦ紨绀虹殑绗竴闃舵鍜岀浜岄樁娈碉紝涓嶄細鍙戠敓浠讳綍寮傚父銆備絾鍦ㄨ繖涓や釜闃舵涔嬮棿锛岀敱浜庡厑璁告墽琛屽叾瀹冪▼搴忥紝鍙兘寮曡捣寮傚父銆備负浜嗙畝鍗曪紝瀹炰緥鍙冭檻浜嗛氱敤淇濇姢寮傚父锛岃屾湭鑰冭檻鍏跺畠寮傚父銆傝鍙兘鍙戠敓寮傚父鐨勯樁娈垫槸鍦╒86妯″紡涓嬨傚鏋滃彂鐢熼氱敤淇濇姢寮傚父锛岄偅涔堝氨杞叆V86浠诲姟鐨勯氱敤淇濇姢寮傚父澶勭悊绋嬪簭銆傞氱敤淇濇姢寮傚父澶勭悊绋嬪簭鍦ㄤ繚鎶ゆā寮忎笅鏄剧ず鎻愮ず淇℃伅鈥......General Protection Error......鈥濓紝鐒跺悗鍐嶈浆21H鍙蜂腑鏂鐞嗙▼搴忥紝閫氳繃璁剧疆鍏ュ彛鍙傛暟AX=4C01H锛屼腑姝㈠紩璧烽氱敤淇濇姢寮傚父鐨勭▼搴忋(5)INTFF浠诲姟 涓轰簡婕旂ず浠ヤ换鍔″垏鎹㈡柟寮忕寮V86妯″紡锛屽湪瀹炰緥涓畨鎺掍簡杩欎竴浠诲姟锛屽苟绉颁箣涓篒NTFF浠诲姟銆傜敱浜庝腑鏂弿杩扮琛↖DT涓殑255(0FFH)鍙锋弿杩扮鏄换鍔¢棬鎻忚堪绗︼紝鎵浠ュ綋鍦╒86妯″紡涓嬫墽琛岃蒋涓柇鎸囦护鈥淚NT 0FFH鈥濇椂渚夸粠V86妯″紡鍒囨崲鍒癐NTFF浠诲姟銆侷NTFF浠诲姟鐨凾SS鏄垵濮嬪寲濂界殑锛屽湪INTFF浠诲姟涓嬩笉鍙戠敓鐗规潈绾у彉鎹紝涓嶄娇鐢ㄥ眬閮ㄦ弿杩扮琛↙DT銆侷NTFF浠诲姟鍏堟樉绀烘彁绀轰俊鎭淩eturn to real mode.鈥濓紝鐒跺悗鍐嶅垏鎹㈠埌涓存椂浠诲姟銆<鍥>V86妯″紡涓嬬殑鏁忔劅鎸囦护 鍦╒86妯″紡涓嬶紝CPL=3锛屾墽琛岀壒鏉冩寚浠ゆ椂锛屾垨鑰呰寮曡捣鍑洪敊鐮佷负0鐨勯氱敤淇濇姢鏁呴殰锛屾垨鑰呰寮曡捣闈炴硶鎿嶄綔鐮佹晠闅溿 鍦╒86妯″紡涓嬶紝杈撳叆/杈撳嚭鎸囦护鐨勬晱鎰熸潯浠舵湁鎵鍙樺寲銆傛寚浠LI鍜孲TI鐨勬晱鎰熸潯浠朵笉鍙橈紝鐢变簬CPL=3锛屾墍浠ュ鏋淚OPL

[8] [9] [10]

鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆