³o¤@³¹ùؤp¤ì°¸±N©µÄò¤W¤@³¹ªº«ü¥O¡A¼g¤@Ópºâ¤@¤¸¤G¦¸¤èµ{¦¡ªºµ{¦¡¡AROOT.ASM¡C
©³¤U¤p¤ì°¸´N§Q¥Î¥H¤W©Ò´£ªº 8087 «ü¥O¨D±o¤@¤¸¤G¦¸¤èµ{¦¡¤§®Ú¡C®Ú¾Ú°ê¤¤©Ò¾Çªº¡A°²¦p¦³¤@Ó¤@¤¸¤G¦¸¤èµ{¦¡ ax2+bx+c=0¡A«h¦¹¤èµ{¦¡ x ¤§¸Ñ¬°
©³¤U³oÓµ{¦¡¬O¨D x2-25=0 ¤èµ{¦¡¤§¸Ñ¡A¦pªG±zn¨D¨ä¥L¤èµ{¦¡ªº¸Ñ¡A¥²¶·×§ïì©lµ{¦¡¤§ªº lr_a¡Blr_b¡Blr_c ¤T«Y¼Æ (¦b MASM 6.x ¸Ì¡Ac ¬O«O¯d¦r¡A©Ò¥H¬°¤F¨Ï MASM 5.x »P 6.x ³£¯à¶¶§Q²ÕĶ¡A§Ú¦b«Y¼Æ¤§«e¥[¤W lr¡Aªí¥Üªø¹ê¼Æ¤§·N)¡C³oÓµ{¦¡¤]¥u¯à¥Ñ SYMDEB.EXE Æ[¬Ýµ²ªG¡A¤p¤ì°¸±N©óµy«á¦A¼¶¼gª½±µÅã¥Ü ST ¤§¤Q¶i¦ì¼ÆÈ©ó¿Ã¹õ¤Wªº°Æµ{¦¡¡C
;*************************************** code segment assume cs:code,ds:code org 100h ;--------------------------------------- start: finit ;---st--;-st(1)-;-st(2)-;-st(3)-;06 fld lr_b ; b ; fmul lr_b ; b2 ; ; ; ;08 fld lr_a ; a ; b2 ; fmul lr_c ; ac ; b2 ; ; ;10 fimul const ; 4ac ; b2 ; fsubp st(1),st ;D=bb-4ac ; ; ;12 shr const,1 fsqrt ; SQR(D); ; ; ;14 fld lr_b ; b ; SQR(D) fchs ; -b ; SQR(D); ; ;16 fld st ; -b ; -b ; SQR(D) fadd st,st(2) ;-b+SQ(D) -b ; SQR(D); ;18 fild const ; 2 ;-b+SQ(D) -b ; SQR(D) fmul lr_a ; 2a ;-b+SQ(D) -b ; SQR(D);20 fdiv st(1),st ; 2a ; x1 ; -b ; SQR(D) fxch st(1) ; x1 ; 2a ; -b ; SQR(D);22 fstp x1 ; 2a ; -b ; SQR(D) fxch st(1) ; -b ; 2a ; SQR(D); ;24 fsubrp st(2),st ; 2a ;-b-SQ(D) fdivp st(1),st ; x2 ; ; ; ;26 fstp x2 int 20h ;28 org 160h ;29 lr_a dq 1.00 ;30 lr_b dq 0.00 ;31 lr_c dq -25.0 ;32 x1 dq ? ;33 ¨ä¤¤¤§¤@®Ú x2 dq ? ;34 ¨ä¤¤¤§¤@®Ú const dw 4 ;35 ;--------------------------------------- code ends ;*************************************** end start
¥ý¨Ó¬Ý¬Ý°õ¦æµ²ªG¡C
h:\homepage\source>e:symdeb root.com [Enter] Microsoft (R) Symbolic Debug Utility Version 4.00 Copyright (C) Microsoft Corp 1984, 1985. All rights reserved. Processor is [80286] -G [Enter] Program terminated normally (0) -DL 160 L5 [Enter] 2117:0160 00 00 00 00 00 00 F0 3F +0.1E+1 2117:0168 00 00 00 00 00 00 00 00 +0.0E+0 2117:0170 00 00 00 00 00 00 39 C0 -0.25E+2 2117:0178 00 00 00 00 00 00 14 40 +0.5E+1 2117:0180 00 00 00 00 00 00 14 C0 -0.5E+1 -Q [Enter]
¬°¤F¯à°÷¤è«KÆ[¹î«Y¼Æ»P®Ú¡A©Ò¥H¤p¤ì°¸¦bµ{¦¡²Ä 29 ¦æ¥[¤J¡yorg 160h¡z¡A¨Ï±o©Ò¦³ªø¹ê¼ÆÅܼƯà°÷¥Ñ¦ì§} 160H ¶}©l¡A«e¤TÓªø¹ê¼Æ¨Ì¦¸¬O¤G¦¸¤èµ{¦¡ªº«Y¼Æ¡A²Ä¥|¡B¤Óªø¹ê¼Æ¬O¨â®Ú¡C¦b SYMDEB ùØ¡A¡yE¡z¬Oªí¥Ü 10 ªº¾¤èªº·N«ä¡A¨Ò¦p¡A¦ì§} 160H ªºªø¹ê¼Æ¬O +0.1E+1 ´N¬Oªí¥Ü +0.1 ¼¥H 10 ªº¤@¦¸¤è¡A¤]´N¬O 1 ªº·N«ä¡C
¦Ü©ó¬°¦ó§Ú¿ï¦b¦ì§} 160H ¶}©l¦s©ñÅܼƩO¡H¨ä¹ê 160H ³oÓ¦ì§}ªºÀò±o¸g¹L°²³]¦Aºë½T¨D±o¡C¸Ó¦ì§}ªº¨î¬O¤£¯àÂл\µ{¦¡½X¡A¦]µ{¦¡¤£¤j¡A¤p¤ì°¸¥ý°²³]¦ì§}¬° 1C0H¡A²ÕĶ³sµ²«á¥Ñ SYMDEB Æ[¹î±oª¾³Ì«á¤@¦æ¡yINT 20H¡z¦b¦ì§} 157H¡A©Ò¥H§Ú¦Aקאּ 160H¡C
ROOT.ASM µ{¦¡¦³¤@ӯʳ´¡A°²¦p b2-4ac < 0¡A¨ä¥¤è®Ú·|²£¥Í¿ù»~¡A³o®ÉÀ³¨Ï¥Î FPU ªº¤ñ¸û«ü¥O¶i¦Ó²£¥Í±ø¥ó¸õÅD¡A¨Ïµ{¦¡Âà¦V¡C
©Ò¿×±ø¥ó¸õÅD´N¬O¤ñ¸û¨â¼Æªº¤j¤p¡A¦pªG¬Y¼Æ¸û¤j¡A´N°õ¦æ¤@¬qµ{¦¡¡AY¸û¤p«h°õ¦æ¥t¤@¬qµ{¦¡¡AÃþ¦ü³o¼Ëªº¸õÅDºÙ¬°±ø¥ó¸õÅD¡C¦b FPU ªº«ü¥O¶°¨Ã¨S¦³¯à¨Ï FPU ¸õÅDªº«ü¥O¡A¨Æ¹ê¤W FPU ¤]µLªk§ïÅÜ CPU ¼È¦s¾¹¤§È (ÁÙ°O±on§ïÅܵ{¦¡°õ¦æ¦ì§}¥²¶·§ïÅÜ CS:IP ¤§È)¡A©Ò¥Hn²£¥Í FPU ±ø¥ó¸õÅD¥²¶·¥Î¶¡±µ¤èªk¡C¨ä¨BÆJ¦³¥|Ó¡G
FPU ¦³¤Ãþ¼È¦s¾¹¡A«e³¹¤w¤¶²Ð¹L³Ì±`¥Îªº°ïÅ|¼È¦s¾¹¡A³o¸Ì±N¤¶²Ðª¬ºA¦r²Õ(status word)¡CÅU¦W«ä¸q¡Aª¬ºA¦r²Õ¬O¤@Ó 16 ¦ì¤¸ªº¼È¦s¾¹¡Aªí¥Ü FPU ªºª¬ºA¡A©Ò¿×ª¬ºA¬O«ü FPU ¬O¤£¬O¦b¦£¸L¤¤¡B¬O§_°£¥H¹s¡B¬O§_µL®Ä¹Bºâ¡B²{¦b°ïÅ|³»ºÝ¬O¨º¤@Ó°ïÅ|¼È¦s¾¹µ¥µ¥¡A¦b¦¹³B§ÚÌnª`·Nªº¬O¥|Óª¬ºA½X¦ì¤¸¡AC0¡BC1¡BC2¡BC3¡C³o¨Ç¦ì¤¸¤À¥¬¦p¤U¹Ï¡G
¼ÐÃD©Ò¨£ªº³o¨Ç¤ñ¸û«ü¥O³£¬O¥H°ïÅ|³»¬°¥Øªº¹Bºâ¤¸¡A¦Ó¨Ó·½¹Bºâ¤¸¥i¥H¬O°O¾ÐÅéÅܼƩάO¨ä¥Lªº°ïÅ|¼È¦s¾¹¡A¨Ò¦p
FCOM ST,ST(1) FCOM ST,x
¤Wz²Ä¤@¨Ò¬O¤ñ¸û ST ©M ST(1) ¤§¼ÆÈ¡A²Ä¤G¨Ò¬O¤ñ¸û ST ©M°O¾ÐÅéÅÜ¼Æ x ¤§¼ÆÈ¡A¦Ó³o°O¾ÐÅéÅܼƪº§ÎºA¥i¥H¬Oµu¹ê¼Æ©Mªø¹ê¼Æ¡C¦]¬° FCOM µ¥«ü¥O§¡¥H ST ¬°¥Øªº¹Bºâ¤¸¡A©Ò¥H ST ¬O¥i¥H¬Ù²¤¤£¼gªº¡A¨Ò¦p¤Wz¨â¨Ò¡A¥i¥H¼g¦¨¤U±ªº¼Ë¤l¡A
FCOM ST(1) FCOM x
µ²ªG¬O¤@¼Ëªº¡C°²¦p ST ªº¤ñ¸û¹ï¶H¬O ST(1) ªº¸Ü( ¨Ó·½¹Bºâ¤¸¬O ST(1) )¡A³s ST(1) ¤]¥i¥H¬Ù²¤¡C¦Ü©ó FCOMP ©M FCOMPP ¤À§O¬O¤ñ¸û«á¼u¥X¤@¦¸©M¼u¥X¨â¦¸¡A³o¸Ì¼u¥Xªº¼Æ·|®ø¥¢¤£¨£¨Ã¨S¦³¦s¤J°O¾ÐÅ餤¡A³oÂI©M FSTP ¤£¦P¡C¦Ó FICOM ©M FICOMP ¬O¥Î¨Ó¤ñ¸û¾ã¼Æªº¡A¦Ó³o¨Ó·½¹Bºâ¤¸¾ã¼Æ§ÎºA¥i¥H¬O¦r²Õ¾ã¼Æ©Mµu¾ã¼Æ¡C
FPU ªº¤ñ¸û«ü¥O·|§ïÅܪ¬ºA¦r²Õªº C3 ©M C0 ¦ì¤¸¡AC3¡BC0 ¦ì¤¸¬O¦bª¬ºA¦r²Õªº²Ä¤K¡B14 ¦ì¤¸¡A¦p¤W¹Ï¡C¤ñ¸û«á¨Ì ST ©M¨Ó·½¹Bºâ¤¸ªº¤j¤p¡AC3 ©M C0 ³]©w¤è¦¡¦p¤Uªí¡G
¤ñ¸ûµ²ªG C3 C0 ---------------------------- ST>¨Ó·½¹Bºâ¤¸ 0 0 ST<¨Ó·½¹Bºâ¤¸ 0 1 ST=¨Ó·½¹Bºâ¤¸ 1 0
FSTSW (store status word) ³oÓ«ü¥Oªº¥\¥Î¬O¥Î¨Ó§âª¬ºA¦r²Õ¨ú¥X¨Ã¦s¤JAX¼È¦s¾¹©Î 16 ¦ì¤¸ªøªº°O¾ÐÅéÅܼÆùØ¡A¨ä»yªk¬O
FSTSW mem16 FSTSW AX
ª`·N¡IFSTSW ¤§«á©Ò±µªº¹Bºâì¥i¥H¬O AX ©Î 16 ¦ì¤¸ªøªº°O¾ÐÅéÅܼơA«eªÌ¥u¯à¥Î¦b 387 µ¥¯Å¥H¤Wªº FPU¡F¦Ü©ó 16 ¦ì¤¸ªøªº°O¾ÐÅéÅܼƫh¬O 8087 ´N¥i¥H¨Ï¥Î¤F¡C¬°¤°»ò¥u¯à±µ AX ¦Ó¤£¥i±µ¨ä¥L 16 ¦ì¤¸ªº¼È¦s¾¹©O¡H¥Dn¬O¬°¤F¤U± SAHF «ü¥O¯à«Ü¤è«Kªº§â AH ¼È¦s¾¹¤ºªº¸ê®Æ²¾¨ìºX¼Ð¼È¦s¾¹ùØ¡A§_«h FPU ªº¹Bºâ¤¸¬O¤£¯à¨Ï¥Î CPU ªº¼È¦s¾¹¡C
SAHF ¬O 8088 «ü¥O¶°¤¤ªº¤@Ó«ü¥O¡A¨Ã«D FPU «ü¥O¡C³oÓ«ü¥O¬O§â AH ¼È¦s¾¹¤¤ªºÈ²¾¨ìºX¼Ð¼È¦s¾¹ªº¸û§Cªº 8 Ӧ줸¡A³o 8 Ӧ줸¥u¦³²Ä¤C¡B¤»¡B¥|¡B¤G¡B¹s¦ì¤¸¦³¥Î¡A²Ä¤¡B¤T¡B¤@¦ì¤¸¨S¦³¨Ï¥Î¡A½Ð°Ñ¦Òªþ¿ý¤G8088 ªººX¼Ð¼È¦s¾¹¡C
©Ò¥H°²¦p AH ¬° 0100 0000B¡A«h°õ¦æ SAHF «ü¥O«á¡A¹sºX¼Ð·|³Q³]¬°¤@¡A±z¥i¥H¹w´ú¬Ý¬Ý¤U¦Cµ{¦¡¤ù¬q±N·|¦³¦óµ²ªG¡H
mov ah,01000000b sahf jz zf_set mov dx,offset mes1 jmp short print zf_set: mov dx,offset mes2 print: mov ah,9 int 21h mes2 db '¹sºX¼Ð¤w³]©w$' mes1 db '¹sºX¼Ð¥¼³]©w$'
³oµ{¦¡¤ù¬q·|Åã¥Ü¥X¡y¹sºX¼Ð¤w³]©w¡z¡C©Ò¥H¨Æ¹ê¤W¡A¸õÅD«ü¥O¨ä¹ê¬O¶È¶È¬ÝºX¼Ð¼È¦s¾¹ªº³]©wȨM©w¦p¦ó¸õ¨ì¨º¸Ì¥h°õ¦æ¡A¦Ü©óºX¼Ð¼È¦s¾¹¦p¦ó³]©w¡A¦b¸õÅD«ü¥O°õ¦æ®É¬O¤£¶·²z·|ªº¡C
FPU ªºª¬ºA¼È¦s¾¹ùتº C3 ©M C0 ¦ì¤¸¡A¸g FSTSW «ü¥O¶Ç¨ì 16 ¦ì¤¸°O¾ÐÅéÅܼơA¦A±µµÛ²¾¨ì AX ¼È¦s¾¹ùخɡAAH ªº²Ä 6¡B0 ¦ì¤¸´N¬Oªí¥Ü C3 ©M C0 ¦ì¤¸¡A±z¥i¥H¹ï·Ó¤W± 8087 ª¬ºA¦r²Õ»P 8088 ºX¼Ð¼È¦s¾¹¨â±i¹Ï¡Aµo²{ C3 «ê¦n¹ïÀ³ ZF¡AC0 «ê¦n¹ïÀ³ CF¡C¤§«á¦A¥Ñ SAHF «ü¥O§â AH ²¾¨ìºX¼Ð¼È¦s¾¹¡A©Ò¥H C3¡BC0 ´N²¾¨ì¹sºX¼Ð»P¶i¦ìºX¼Ð¤F¡A¥unÀˬd³o¨âÓºX¼Ð´N¥i¥H¤ñ¸û ST »P¨Ó·½¹Bºâ¤¸ªº¤j¤p¡A¦Ó¨M©w¸õÅD¤è¦V¡C
«e±©Ò¼¶¼gªº¨D¤@¤¸¤G¦¸¤èµ{¦¡¨â®Úªºµ{¦¡ ROOT.ASM ¦³¯Ê³´¡A¦b³o¸Ì¤p¤ì°¸±N¥Lקï¦pªG§P§O¦¡¤p©ó¹s¡Aµ{¦¡¯àÂà¦V°õ¦æ¡Cק蠟«áµ{¦¡¦p¤U¡G
;*************************************** code segment assume cs:code,ds:code org 100h ;--------------------------------------- start: finit ;---st--;-st(1)-;-st(2)-;-st(3)-;06 fld lr_b ; b ; fmul lr_b ; b^2 ; ; ; ;08 fld lr_a ; a ; b^2 ; fmul lr_c ; ac ; b^2 ; ; ;10 fimul const ; 4ac ; b^2 ; fsubp st(1),st ;D=bb-4ac ; ; ;12 shr const,1 fcom zero ;§P§O¦¡¬O§_¤p©ó 0 14 fstsw status ;µ²ªG¦s©ó status ÅܼÆùØ 15 fwait ;µ¥«ÝÀx¦s§¹²¦ 16 mov ax,status ;¤ñ¸ûµ²ªG²¾¤J AX 17 sahf ;¤ñ¸ûµ²ªG²¾¤JºX¼Ð¼È¦s¾¹ 18 jb d_less_0 ;Y¤p©ó«h¸õÅD¨ì d_less_0 ³B 19 fsqrt ; SQR(D); ; ; ;20 fld lr_b ; b ; SQR(D) fchs ; -b ; SQR(D); ; ;22 fld st ; -b ; -b ; SQR(D) fadd st,st(2) ;-b+SQ(D) -b ; SQR(D); ;24 fild const ; 2 ;-b+SQ(D) -b ; SQR(D) fmul lr_a ; 2a ;-b+SQ(D) -b ; SQR(D);26 fdiv st(1),st ; 2a ; x1 ; -b ; SQR(D) fxch st(1) ; x1 ; 2a ; -b ; SQR(D);28 fstp x1 ; 2a ; -b ; SQR(D) fxch st(1) ; -b ; 2a ; SQR(D); ;30 fsubrp st(2),st ; 2a ;-b-SQ(D) fdivp st(1),st ; x2 ; ; ; ;32 fstp x2 int 20h ;34 µ²§ôµ{¦¡ d_less_0: ;35 §P§O¦¡¤p©ó¹s¡AµL¹ê¼Æ¸Ñ mov dx,offset message ;36 ¦L¥XµL¹ê¼Æ¸Ñ mov ah,9 int 21h int 20h ;39 µ²§ôµ{¦¡ org 1e0h ;41 lr_a dq 1.00 ;42 lr_b dq 0.00 ;43 lr_c dq 25.0 ;44 x1 dq ? ;45 ¨ä¤¤¤§¤@®Ú x2 dq ? ;46 ¨ä¤¤¤§¤@®Ú zero dq 0 ;47 const dw 4 ;48 status dw ? ;49 ª¬ºA¦r²Õ message db 'µL¹ê¼Æ¸Ñ$' ;--------------------------------------- code ends ;*************************************** end start
±N¥L¦s¬° ROOT2.ASM¡A¨Ã²ÕĶ¦¨ ROOT2.COM ÀÉ¡A¦b SYMDEB.EXE ùØ°õ¦æ¨ÃÆ[¹îµ²ªG¡C¦pªG§P§O¦¡¬°tÈ¡A«h°±¤î¹Bºâ¦Ó¦L¥X¡yµL¹ê¼Æ¸Ñ¡z«á²×¤îµ{¦¡¡C
קï«áªºµ{¦¡¼W¥[¤F´X¦æ¡A²Ä 14 ¨ì²Ä 19 ¦æ¡A¤]´N¬O¦b°µ¶}¥¤è®Ú¹Bºâ«e¥ýÀˬd ST ¬O§_¤p©ó¹s¡A¦¹®É ST ¤ºªº¼ÆÈ´N¬O©Ò¿×ªº§P§O¦¡ (b2-4ac)¡Cȱoª`·Nªº¬O²Ä 16 ¦æ¡A¤p¤ì°¸¥[¤W¤F FWAIT «ü¥O¡A½T«O FPU ¤w¸g§âª¬ºA¦r²Õ¦s¤J status Åܼƫá¡ACPU ¤~±N status ¤§È¦s¤J AX ùØ¡C¤p¤ì°¸¤]¸Õ¹L¦pªG§â³o¦æ®³±¼¡A¦ü¥G¤]¯à¥¿½T°õ¦æ¡C
FPU ùئ³ 7 Ó«ü¥O¬O¥Î¨Ó§â±`¥Îªº±`¼Æ±À¤J°ïÅ|³»ºÙ¬°¡y±`¼Æ«ü¥O¡z¡C³o¨Ç±`¼Æ³£¬O¤º«Ø¦b FPU ùتº¼ÆÈ¡A³£ÄÝ©ó¼È®É¹ê¼Æ¡A¨ä¦³®Ä¦ì¼Æ¹F 19 ¦ì¼Æ¡A·íµ{¦¡»Ýn¥Î¨ì®É¥i¥H«Ü§Öªº¸ü¤J¡A¸`¬Ù®É¶¡»P°O¾ÐÅé¡C³o 7 Ó±`¼Æ«ü¥O¤¶²Ð¦p¤U¡G
¸ü¤J 1.0¡C( §â 1.0 ±À¤J°ïÅ|³» )
¸ü¤J¹s¡C( §â 0.0 ±À¤J°ïÅ|³» )
¸ü¤J¶ê©P²v¡A3.141592653589793239¡C( §â £k ±À¤J°ïÅ|³» )
¸ü¤J Log210¡C( §â Log210 ±À¤J°ïÅ|³» )
¸ü¤J Log2e¡Ae ¬O¦ÛµM¹ï¼Æªº©³¼Æ¡C( §â Log2e ±À¤J°ïÅ|³» )
¸ü¤J Log102¡C( §â Log102 ±À¤J°ïÅ|³» )
¸ü¤J Loge2¡A¨Æ¹ê¤W Loge2 µ¥©ó Ln 2¡C( §â Loge2 ±À¤J°ïÅ|³» )
µù¤@¡G¨Æ¹ê¤W¦³¥t¤@Ó«ü¥O¥i¥Hª½±µ¤ñ¸û ST ©M¹s¡A³oÓ«ü¥O¬O FTST (¥i¥H°O¦¨ TeST)¡C
FTST «á¤£¶·±µ¥ô¦ó¹Bºâ¤¸¡A¤ñ¸û«áª¬ºA¦r²Õªº³]©w¤è¦¡©M FCOM ¬Û¦P¡G
¤ñ¸ûµ²ªG C3 C0 ---------------------------- ST>0 0 0 ST<0 0 1 ST=0 1 0
°£¤F FTST ¥i¥HÀˬd°ïÅ|³»¬O§_¬° 0 ¤§¥~¡AFXAM ¤]¥i¥H¡CFXAM ªº¯à¤O¤£¶È¦p¦¹¡AÁÙ¥i¥HÀˬd°ïÅ|³»ªº¼ÆÈÄÝ©óþ¤@Ãþ«¬¡A¥¦·|§âµ²ªG°O¿ý¦bª¬ºA¦r²Õªº C0¡BC1¡BC2¡BC3 ¥|Ӧ줸ùØ¡A¦p¤Uªí¡CC1 ¦ì¤¸¬O ST(0) ªº²Å¸¹¡A¦pªG¬O¥¿¼Æ¡A¦¹¦ì¤¸¬° 0¡F¦pªG¬Ot¼Æ¡A¦¹¦ì¤¸¬° 1¡C
C3 | C2 | C0 | ¤ÀÃþ |
0 | 0 | 0 | ¤£¤ä´© |
0 | 0 | 1 | «D¼ÆÈ ( NaN¡ANot a Number ) |
0 | 1 | 0 | ¥¿±`¼ÆÈ |
0 | 1 | 1 | µL½a¤j |
1 | 0 | 0 | ¹s |
1 | 0 | 1 | ST ¬OªÅªº |
1 | 1 | 0 | ¤Ï±`È ( denormal ) |