ªþ¿ý¤@¡@¯BÂI¼Æ


½t°_

³Ìªñ´X­Ó¤ë ( ¥Á°ê 106 ¦~ 10 ¤ë )¡A¤p¤ì°¸¦b·d¦³Ãö½è¼Æªºµ{¦¡¡A¦ý¤p¤ì°¸©Ò¾Ç¦³­­¡A¥[¥H¨Ã«D¬ì¯Z¥X¨­¡A¬G©Ò¼gªºµ{¦¡¤£¬O³Ìºë²¡A¤]¤£¬O³Ì¦³®Ä²v¡C§Y¨ÏÁö¤£¯à¦Ü¡A¦ý¤´¤ßÂQ©¹¤§¡C¬°¤F­n­pºâ½è¼Æ¦Cªíªº°Æµ{¦¡¡A·|ªá¥h¦h¤Ö®É¶¡¡A¥²¶·­pºâ¨ì¤@¬í¥H¤Uªº®É¶¡¡F¤×¨ä¬O·í©Ò»Ý¨Dªº½è¼Æ¤£¤j®É¡A¨Ò¦p¨D 100 ¥H¤ºªº½è¼Æ¦Cªí¡A©Òªá®É¶¡§óµu¡A¬Æ¦Ü¦b·L¬í ( 10¡Ð6 ¬í ) ¥H¤U¡C¦]¦¹¥²¶·­n¦³¤@°Æµ{¦¡¯àÅã¥Ü¯BÂI¼Æ¡A¨ä¥\¯àÃþ¦ü wsprintf API¡C¤]´N¬O»¡¡A¯à§â¯BÂI¼Æ¥H ASCII ¦r¦ê©Î¸U°ê½X¦r¦êªí¥Ü¡C¦ý¤p¤ì°¸¸ê½è¾q¶w¡A¤W½aºÑ¸¨¤U¶À¬u¡A·j¯Á¦h®É¡A¤´µLµ²ªG¡C©ó¬O«K¿³°_¤@­Ó·Qªk¡A¦ó¤£¦Û¤v¼g¤@­Ó¡H¥t¥~¡A¬JµM¥´ºâ¼¶¼g§â¯BÂI¼ÆÂà´«¦¨¦r¦êªº°Æµ{¦¡¡A¨º¬Û¤Ïªº¹Lµ{¡A¦ó¤£¶¶«K¤]¼g¦n¡H©ó¬O´N¦³¤F³o­Óªþ¿ý¡C

¤]©¯¦n¤p¤ì°¸Áö¤£¦~»´¡A¦ý¤]ÁÙ¤£¦Ü¦Ñ¨ì±w¦³Ã¨§b¯g¡A·Q°_¨ä¹ê¦b DOS ®É¥N¡A¤w¸g¼g¹L¤@­ÓÃþ¦üªºµ{¦¡¡C²{¦b¥u»Ý­n°Ñ¦Ò¥H«eªº¡uµ§°O¡v¡A¦A§â¦o§ï¦¨ Win64 ª©¥»§Y¥i¡C©Ò¥H³o¤@­Óªþ¿ý¡A¨ä¹ê°Ñ¦Ò¡uDOS ²Õ¦X»y¨¥¤º®e¡vªº¡uFPU(1) ²¤¶¡v¡B¡uFPU(2) ¤G¦¸¤èµ{¦¡¡v¡B¡uFPU(3) «ü¼Æ¡v¡B¡uFPU(4) IEEE »P BCD¡v¡C


­ì²z

§â¼È®É¹ê¼ÆÅܦ¨ ASCII ©Î¸U°ê½X¦r¦êªº°Æµ{¦¡¡Gst0_to_sn

¥ý»¡»¡¦¹ªþ¿ý­n¹ê§@¤§°Æµ{¦¡¥\¯à¡G§â FPU °ïÅ|³»¡A§Y ST ¼È¦s¾¹ªº¼È®É¹ê¼Æ ( 80 ¦ì¤¸ªí¥Üªº¹ê¼Æ )¡AÅܦ¨¥H¬ì¾Ç°O¸¹ªí¥Üªºªü©Ô§B¼Æ¦r¦r¦ê¡A¦s¤J«ü©wªº°O¾ÐÅ餤¡C¤p¤ì°¸·Q¡A³o­Ó°Æµ{¦¡©h¥BºÙ¬° st0_to_sn¡Cst0 «üªº¬O FPU ³Ì¤W­±ªº°ïÅ|¼È¦s¾¹¡A§Y ST¡Asn «üªº¬O¬ì¾Ç°O¸¹ ( scientific notation ) ªº·N«ä¡A©Ò¿×¬ì¾Ç°O¸¹¡A´N¬O§â¤@¼ÆÅܦ¨¹³ a¡Ñ10n §Î¦¡ªº¼Æ¡An ºÙ¬°¤Qªº¾­¤è¼Æ¡A¬°¤@¾ã¼Æ¡A¥i¥H¬O¥¿¼Æ¡A¤]¥i¥H¬O­t¼Æ¡Fa ºÙ¬°«Y¼Æ ( mantissa ) ©ÎºÙ¦³®Ä¼Æ ( significand )¡A¨ä½d³ò¬O 10¡Öa¡Ù1¡C§â¤@­Ó¼ÆÅܦ¨¬ì¾Ç°O¸¹ªº§Î¦¡¡A¥u¦³¤@ºØµ²ªG¡C´«¥y¸Ü»¡¡A¼Æ­È»P¬ì¾Ç°O¸¹¬O¤@¹ï¤@ªºÃö«Y¡C¨¥Âk¥¿¶Ç¡AÄ~Äò»¡ st0_to_sn ªº­ì«¬¡A¬°

st0_to_sn   PROTO   pBuffer:LPSTR,flag:QWORD

¥ýÁ¿²Ä¤G­Ó°Ñ¼Æ¡Aflag¡CÅU¦W«ä¸q¡A¥¦¬O¤@­ÓºX¼Ð¡A«ü©w¦p¦ó¿é¥X¬ì¾Ç°O¸¹¡A¦U­Ó¦ì¤¸©Ò¥Nªíªº·N¸q¦p¤U¡G

¦A¨Ó»¡©ú²Ä¤@­Ó°Ñ¼Æ¡ApBuffer¡A¥¦¬O°O¾ÐÅé¦ì§}¡A¦¹°O¾ÐÅé¦s©ñ¸g st0_to_sn ­pºâ«á¡A©Ò±oªº¬ì¾Ç°O¸¹¡C¦pªG flag «ü©w¬° ASCII ½X¡A¦¹°O¾ÐÅé¦Ü¤Ö­n¦³ 27 ­Ó¦ì¤¸²Õ¡C¤U¹Ï¬O¥H¡u¡Ð96485.33289¡v¬°¨Ò¡Aªí¥Ü¸g¹L st0_to_sn ³B²z¹L«á¡AÅܬ°¬ì¾Ç°O¸¹¬O¡u¡Ð9.648533289¡Ñ104¡v¡AÀx¦s¦b°O¾ÐÅ餤ªº±¡§Î¡G

FPU ©Ò¦s¤Jªº¦³®Ä¦ì¼Æ¡A³Ì¦h¦³ 18 ¦ì¡A¦A¥[¤W²Å¸¹¡B¤p¼ÆÂI¤Îµ²§ÀªºªÅ¦r¤¸ ( Null )¡A¦@ 21 ­Ó¦ì¤¸²Õ¡F¦¹¥~¡AFPU ¯àªí¹Fªº¼È®É¹ê¼Æ¡A±q 10¡Ð4932 ¨ì 104932¡A¬G»Ý­n¥|­Ó¦ì¤¸²Õ¦s©ñ¼Æ¦r¡A¦A¥[¤W²Å¸¹¤Îµ²§ÀªºªÅ¦r¤¸¡A¦@»Ý 6 ­Ó¦ì¤¸²Õ©ñ¸m 10 ªº¾­¤è¼Æ ( exponential )¡C¥ç§Y²Ä 0¡ã20 ­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ«Y¼Æ¡F²Ä 21¡ã26 ­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ¤Qªº¾­¤è ( ©ÎºÙ¤Qªº¦¸¤è¼Æ )¡C¦pªG flag «ü©w¸U°ê½X¡A¦¹°O¾ÐÅé¦Ü¤Ö­n¦³ 54 ­Ó¦ì¤¸²Õ¡C«e 42 ­Ó¦ì¤¸²Õ©ñ¸m«Y¼Æ¡A«á 12 ­Ó¦ì¤¸²Õ©ñ¸m 10 ªº¾­¤è¼Æ¡C¥ç§Y²Ä 0¡ã41 ­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ«Y¼Æ¡F²Ä 42¡ã53 ­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ¤Qªº¾­¤è¡C

¨D¼È®É¹ê¼Æªº«Y¼Æ»P¾­¤è

²{¦b°ÝÃD¨Ó¤F¡A­n«ç»ò¨D¥X«Y¼Æ»P¤Qªº¾­¤è¼Æ©O¡H¤p¤ì°¸¥´ºâ¥ý»¡¤Qªº¾­¤è«ç»òºâ¡A¦]¬°¤Qªº¾­¤è¨D¥X¤§«á¡A¤~¯àºâ¥X«Y¼Æ¨Ó¡C¤Qªº¾­¤èªººâªk¡A¨ä¹ê«Ü²³æ¡A¥u­n§Q¥Î¥H 10 ¬°©³ªº¹ï¼Æ«Ü®e©ö´Nºâ¥X¨Ó¤F¡C

log10(a¡Ñ10x)¡×log10a¡Ïlog1010x¡×log10a¡Ïx

¨ä¾ã¼Æ³¡¥÷¡Ax¡A´N¬O¾­¤è¼Æ¡A°ÝÃD¬O FPU «ü¥OùØ¡A¨Ã¨S¦³¨D¥H 10 ¬°©³ªº¹ï¼Æ­È¡A¥u¦³¨D¥H 2 ¬°©³ªº¹ï¼Æ­È¡A§Y FYL2X¡A¤£¹LÁÙ¦n¤p¤ì°¸ÁÙ°O±o°ê¤¤¦Ñ®v±Ðªº¡A¥Î¡u´«©³¤½¦¡¡v¥i¥H­pºâ¥X¨Ó¡A´«©³¤½¦¡¬O¡G

FYL2X ·|­pºâ ST(1)¡Ñlog2ST ¤§­È¡A¦A§âµ²ªG¦s¤J ST(1)¡A³Ì«á¼u¥X¤@¦¸°ïÅ|¡C¦Ü©ó log210 ¤§­È¡A¥i¥H¥Î¥t¤@­Ó¸ü¤J±`¼Æªº FPU «ü¥O¡AFLDL2T¡A¨ú±o¡C¨âªÌ¬Û°£¡A¦A¡u¦V­tµL½a¤j¡v±Ë¥h¡A´N¯à±o¨ì¤Qªº¾­¤è¼Æ¡C¨D¥X¤Qªº¾­¤è¼Æ¤§«á¡A¦A¨D«Y¼Æ´N¤£Ãø¤F¡C¨ä¹ê±z¥i¥H·Q¹³¡A«Y¼Æ´N¬O­ì¨Óªº­È°£¥H 10x¡C¨Ò¦p 123 ¼g¦¨¬ì¾Ç°O¸¹¬O 1.23¡Ñ102¡Alog 123¡Ü2.0899¡A¹³­tµL­­¤j±Ë¥h¬° 2¡A´N¬O¤Qªº¾­¤è¡A¦pªG§â 123¡Ò102¡A©Ò±o¨ìªº´N¬O«Y¼Æ¡A1.23¡C¦ý¬O FPU ¨Ã¨S¦³«ü¥O¯à°÷§â±a¦³¤p¼Æªº¼Æ­È¡A¥H¦r¦ê¤è¦¡¦s¤J°O¾ÐÅ餺¡A©Ò¥HµLªk§â 1.23 Åܦ¨¦r¤¸¡A¦s¨ì°O¾ÐÅéùØ¡C¦pªG¦³ªº¸Ü¡A¤]¤£¥²¼g st0_to_sn °Æµ{¦¡¤F¡C¦ý¬O¡AFPU ­Ë¬O¦³­Ó FBSTP «ü¥O¡A¯à§â ST ªº¾ã¼Æ³¡¥÷¡A¥H»E¶°ªº BCD ¤è¦¡¦s¤J°O¾ÐÅéùØ¡C¦³Ãö FBSTP ªº»¡©ú¡A½Ð°Ñ¦Ò³oùØ¡C

¦ý¬OÁÙ±o¦Ò¼{¥t¤@­Ó¦]¯À¡C«Y¼Æ¦³´X¦ì¦³®Ä¼Æ¡AÁÙ¥²¶·¥Ñ st0_to_sn ªº flag °Ñ¼Æ«ü©w¦ì¼Æ¡CÁ|­Ó¨Ò¤l¨Ó»¡¡A¦pªG­n§â¡u¡Ð96485.33289¡vÅܦ¨¬ì¾Ç°O¸¹¡A¥B­n¦³ 8 ¦ì¦³®Ä¦ì¼Æ¡A¨äµ²ªGÀ³¸Ó¬O¡u¡Ð9.6485333¡Ñ104¡v¡C­è¤~´£¹L¡AFPU ¥u¦³ FBSTP «ü¥O¯à§â¾ã¼ÆÅܦ¨»E¶°ªº BCD ¼Æ¦s©ó°O¾ÐÅéùØ¡A¦]¦¹¥²¶·§â¡Ð96485.33289 ­¼¤W 103¡AÅܦ¨¡Ð96485332.89 «á¡A¦A¥|±Ë¤­¤J¡A´N¯à±o¨ì«Y¼Æ¡A¡Ð96485333¦A½Õ¾ã¤p¼ÆÂI§Y¥i¡C¦ý¬O³o 103 ªº¡u3¡v¦¸¤è¬O«ç»ò¨Óªº©O¡HÅãµM¬O 8 ¦ì¦³®Ä¦ì¼Æ´î¥h¤Qªº¾­¤è¼Æ¡A4¡A¦A´î¥h¤@¡C´î¥h¤@¬O¦]¬°¤T¦ì¼Æ®É¡A¥u¦³ 102¡F¥|¦ì¼Æ®É¡A¬° 103¡A¬G 8 ¦ì¼Æ®É¡AÀ³¸Ó¬O¤Qªº 7 ¦¸¤è¡A©Ò¥HÁÙ­n¦A´î¥h¤@¡C

¤p¤ì°¸¦AÁ|¤@­Ó¨Ò¤l»¡©ú¡A¥i¯à·|§ó²M·¡¤@¨Ç¡C¦pªG·Q¥H¦³®Ä¦ì¼Æ 5 ¦ì¡AÂà´« 1.60217662¡Ñ10¡Ð19¡A¨BÆJ¦p¤U¡G

  1. ¨D¥X¤Qªº¾­¤è¼Æ¡Glog101.60217662¡Ñ10¡Ð19¡Ü¡Ð18.79529¡A¦V¡u­tµL­­¤j¡v±Ë¥h¤§«á¬°¡u¡Ð19¡v¡C
  2. ¥H FBSTP «ü¥O¡A§â¡u¡Ð19¡v¦s¤J°O¾ÐÅ餤¡A§Y¬°¤Qªº¾­¤è¼Æ¡A¦b°O¾ÐÅ餺¬°¡u19 00 00 00 00 00 00 00 00 80¡v¡C
  3. 5¡Ð(¡Ð19)¡Ð1¡×23¡C
  4. 1.60217662¡Ñ10¡Ð19¡Ñ1023¡×16021.7662
  5. ¥Î FRNDINT «ü¥O¡A¥|±Ë¤­¤J¦Ü¾ã¼Æ¦ì¡AÅܦ¨ 16022¡C
  6. ¦A¥H FBSTP «ü¥O¦s©ó°O¾ÐÅé¡A¸Ó°O¾ÐÅ餺®e¬°¡u22 60 01 00 00 00 00 00 00 00¡v¡C
  7. §â¥[¤W¤p¼ÆÂI¡A¨Ï¤§¦¨¬°¦³®Ä¼Æ¡C

¨D 2X ªº°Æµ{¦¡¡Gtwo_p_x

ÁöµM¸Ñ¨M¤F¦³®Ä¼Æ»P¾­¤è¼Æªº°ÝÃD¡A¦ý¤]²£¥Í¤F·sªº°ÝÃD¡C³o­Ó°ÝÃD´N¬O¡A¤W­±ªº¨Ò¤lùØ²Ä 4 ­Ó¨BÆJ¡A­n­pºâ¤Qªº´X¦¸¤èªº¼Æ¡A¨º»ò¡A­n¦p¦ó¥h­pºâ©O¡H¦b FPU «ü¥OùØ¡A¤£¶È¨S¦³­pºâ XY ªº«ü¥O¡A¤]¨S¦³­pºâ 10X ªº«ü¥O¡A¶È¦³¯à­pºâ 2X ªº¨â±ø«ü¥O¡GFSCALE ©M F2XM1¡C

¦n§a¡A¤p¤ì°¸ªº·Qªk¬O¡A¥ý¼¶¼g¤@­Ó¯à°÷¨D¥X 2X ªº°Æµ{¦¡¨Ó¡A³o­Ó°Æµ{¦¡ºÙ¬° two_p_x¡A¦Ó X ¥i¥H¬O¥ô·N¼Æ¡C§¹¦¨³o­Ó°Æµ{¦¡¤§«á¡A¦A§Q¥Î FPU ªº«ü¥O¡AFYL2X ¤Î¼Æ¾Ç¤½¦¡¡G

XY¡×2log2XY¡×2Y¡Ñlog2X

´N¯à¼g¥X¥i¥H¨D XY ªº°Æµ{¦¡¡C·í X¡×10¡A´N¯à¨D¥X 10 ªº´X¦¸¤èªº¼Æ¤F¡C¸g¹L¤W­zªº»¡©ú¡A¦U¦ìŪªÌÀ³·í©ú¥Õ¡A­n§â ST ¼È¦s¾¹ªº¼È®É¹ê¼Æ¡AÅܦ¨¥H¬ì¾Ç°O¸¹ªí¥Üªºªü©Ô§B¼Æ¦r¦r¦ê¡A¦s¤J«ü©wªº°O¾ÐÅ餤¡A¦¹¹Lµ{¤¤·|­n¥h­pºâ XY ªº¼Æ­È¡A¤p¤ì°¸§â¥¦¼g¦¨¤@­Ó°Æµ{¦¡¡Ax_p_y¡F¦Ó¦b x_p_y °Æµ{¦¡¤¤¡A·|¸g¹L­pºâ 2X ªºªº¹Lµ{¡A¤p¤ì°¸¤]§â¥¦¼g¦¨°Æµ{¦¡¡Atwo_p_x¡C¤]´N¬O»¡¡A±ý¹F¦¹¥Øªº¡A¥²¶·¥ý«á¼¶¼g¥X¨â­Ó°Æµ{¦¡¡Gtwo_p_x ¤Î x_p_y¡C©³¤U´N¥ý»¡©ú two_p_x ªº­pºâ¹Lµ{¡C

FSCALE ·|¥ý§â ST(1) ¤ºªº¼Æ­È¥H¦V 0 ±Ë¥hªº¤è¦¡Åܦ¨¾ã¼Æ¡AµM«á­pºâ ST¡Ñ2ST(1)¡A¦A§â¨äµ²ªG¦s¤J ST ùØ¡A¦Ó ST(1) ¤§­È¤£ÅÜ¡CF2XM1 «h¬O­pºâ 2ST¡Ð1 ¤§­È¡AµM«á¦A¦s¦^ ST ¼È¦s¾¹ùØ¡A­ì¥ýªº ST ¥²¶·¦b ¡Ð1 »P 1 ¤§¶¡¡A¦pªG¶W¥X³o½d³ò¡A©Ò±oµ²ªG¬°¥¼©w¸q¡C¬Ý¤F¦³Ãö FSCALE »P F2XM1 ªº»¡©ú¡A±zÀ³·íµo²{¡A¦pªG¯u­n­pºâ 2X¡A¦Ó X ¬O¥ô·N¼Æªº¸Ü¡AÁÙ¯uµLªk³æ³æ¾a¤@±ø FPU «ü¥O´N¯à§¹¦¨¡A¥²¶·¸g¹L¦n´X­Ó¨BÆJ¤~¦æ¡C

³o®É­Ô¡A¤S±o¾a¼Æ¾Çªº«ü¼Æ«ß¡A¤~¯à°µ¨ì¡G

2X¡×2i¡Ïf¡×2i¡Ñ2f

¤p¤ì°¸ªº·Qªk¬O¡A§â¥ô·N¼Æ¡AX¡A¤À¦¨¾ã¼Æ³¡¥÷¤Î¤p¼Æ³¡¥÷¡A¤À§O¥H i ©M f ªí¥Ü¡A¥ç§Y X¡×i¡Ïf¡C³o¼Ë´N¥i¥H¥Î F2XM1 ­pºâ 2f¡Ð1¡A¦A¥[¤W¤@¡A´N¯à±o¨ì 2f¡CµM«á¦A§â 2f ©ñ¦b ST¡Ai ©ñ¦b ST(1)¡A°õ¦æ FSCALE ´N¯à±o¨ì 2X ¤F¡C

¦Ü©ó­n«ç»ò§â¥ô·N¼Æ¤À¦¨¤p¼Æ³¡¥÷»P¾ã¼Æ³¡¥÷©O¡H¦³±ø FPU «ü¥O¡AFRNDINT ¥i¥H¹F¦¨¥Øªº¡C¦ý¬O FRNDINT ±Ë¥h¤èªk¦³¥|ºØ¡A­n¨Ï¥Î­þ¤@ºØ¤~¦æ©O¡H¦Ò¼{¨ì 2X¡AX ¥i¯à¬O¥¿¼Æ¡A¤]¥i¯à¬O­t¼Æ¡A¬G¦³¨âºØ±¡§Î¡G

  1. ²Ä¤@ºØ±¡§Î¡A«ü¼Æ¬°¥¿¼Æ¡A¨Ò¦p 25.11¡AÅãµM«ü¼Æ¥i¥H¤À¦¨ 5¡Ï0.11¡C
  2. ²Ä¤GºØ±¡§Î¡A«ü¼Æ¬°­t¼Æ¡A¨Ò¦p 2¡Ð5.11¡A«ü¼Æ¥i¥H¤À¦¨ ¡Ð6¡Ï0.89¡C

¦pªG FRNDINT ¬O¦V­tµL½a¤j±Ë¥h¡A¦Ó¤p¼Æ³¡¥÷¬O­ì«ü¼Æ´î¥h¦V­tµL½a¤j±Ë¥h«áªº¾ã¼Æ³¡¥÷¡A¨º»ò³o¨âºØ±¡§Î¨ä¹ê¬O¤@¼Ëªº¡A´N¯à¸`¬Ùµ{¦¡½X¡C¥H²Ä¤@ºØ±¡§Î¦Ó¨¥¡A 5.11 ¦V­tµL­­¤j±Ë¥h¡A©Ò±o¾ã¼Æ¬O 5¡F­ì«ü¼Æ¬O 5.11¡A´î¥h 5¡A±o®t¬° 0.11¡C¥H²Ä¤GºØ±¡§Î¨Ó»¡¡A¡Ð5.11 ¦V­tµL½a¤j±Ë¥h«á©Òªº¾ã¼Æ¬° ¡Ð6¡A­ì«ü¼Æ¬O ¡Ð5.11¡A´î¥h ¡Ð6¡A±o¨ìªº¬O 0.89¡C

¨D XY ªº°Æµ{¦¡¡Gx_p_y

¦pªG¤w¸g¼g¦n¤F two_p_x °Æµ{¦¡¡A¨º»ò´N¥i¥H§Q¥Î©³¤Uªº¼Æ¾Ç¤½¦¡­pºâ XY¡G

XY¡×2log2XY¡×2Y¡Ñlog2X

¦b¼Æ¾Ç¤W¡A¯u¼Æ ( log2X ¤¤¡A2 ¬O©³¼Æ¡AX ¬O¯u¼Æ ) ¥²©w¬O¥¿¼Æ¡A¦ý¬O¨ä¹ê§Ú­Ìª¾¹D¡A¦b XY ùØ¡AX ¥i¥H¬O ¡Ð2¡AY ¬O 3¡A³o¼Ë´NÅܦ¨ ¡Ð8¡C¤£¹L·í Y ¤£¬O¾ã¼Æ®É¡A©³¼Æ X ´N¤£¥i¥H¬O­t¼Æ¡C¥t¥~¡A¼Æ¾Ç¤W¤]©w¸q 00 ¼Æ­È¥¼©w¡C¦]¦¹¤p¤ì°¸¾ã²z¤F¤Uªí¡A¤Uªíùاâ«ü¼Æ»P©³¼Æ¤À§O°Ï¤À«°¥¿¼Æ¡B0¡B­t¼Æ¦U¤TºØ±¡§Î¡A¨â¨â²Õ¦X¡A±o¨ì 9 ºØ²Õ¦X±¡§Î¡G

¥¿¹s­t
¥¿XY1 XY
¹s0¥¼©w­È µL·N¸q
­t­Y Y ¬°¾ã¼Æ¡A¤~¯à¨D XY ¤§­È¡A§_«hµL·N¸q 1­Y Y ¬°¾ã¼Æ¡A¤~¯à¨D XY ¤§­È¡A§_«hµL·N¸q

¸g¥Ñ¤Wªí¤ÀªR¡A±oª¾¥i¥H¦b¤@¶i¤J x_p_y ®É¡A¥ýÀˬd©³¼Æ ( §Y ST ¤§­È¡A¤Wªí¤¤ªº X ) ¬° 0¡B¥¿¼Æ©Î­t¼Æ¡C¥i¤À©³¤U¤TºØ±¡§Î¡G

  1. ¦pªG©³¼Æ¬°¥¿¼Æ¡A¨º´N«Ü³æ¯Â¡Aª½±µ°õ¦æ FYL2X «ü¥O¡A¦A©I¥s two_p_x °Æµ{¦¡§Y¥i¡C
  2. ¦pªG©³¼Æ¬O¹sªº¸Ü¡A¦AÀˬd ST(1) ¬O§_¬°¥¿¼Æ¡A¦pªG¬°¥¿¼Æ¡Aªí¥Ü­pºâ¹sªº¥¿¼Æ¦¸¤è¡Aµ²ªG´N¬O 0¡A©Ò¥H¶Ç¦^ 0 ¨Ã²M°£¶i¦ìºX¼Ð´N¥i¥H¤F¡F¦pªG ST(1) ¬° 0 ©Î­t¼Æ¡A³]©w¶i¦ìºX¼Ð¡Aªí¥ÜµL·N¸q©Î¥¼©w­È¡C
  3. ¦pªG©³¼Æ¬O­t¼Æ¡A´N±oÀˬd«ü¼Æ¬O§_¬°¾ã¼Æ¡AÀˬdªº¤èªk¬O§â«ü¼Æ«þ¨©¤@¥÷¡A¦V­tµL­­¤j±Ë¥h¡A¦A¸ò­ì«ü¼Æ¤ñ¸û¡A¦pªG¬Û¦P¡A«h¬°¾ã¼Æ¡A§_«h¬°«D¾ã¼Æ¡C¦pªG¬O¾ã¼Æ¡A¯à°÷¨D¥X XY¡A¦ý­nª`·N«ü¼Æ¬O°¸¼Æ¡AXY ¬°¥¿­È¡F¤Ï¤§¬°­t­È¡C

Àˬd ST ¤§­È¬°¥¿¼Æ¡B­t¼Æ©Î¹sªº¤èªk¡A¥i¥H°Ñ¾\ DOS ²Õ¦X»y¨¥ªº²Ä 23 ³¹¤Î¨äµù¸Ñ¡C

§â ASCII ©Î¸U°ê½X¦r¦êÅܦ¨¼È®É¹ê¼Æªº°Æµ{¦¡¡Gstr_to_st0

³o­Ó°Æµ{¦¡¬O§â¥H 0 µ²§Àªº¦r¦ê¡AÅܦ¨¼È®É¹ê¼Æ¡A¨Ã¦s©ó ST(0) ¼È¦s¾¹ùØ¡C¨ä­ì«¬¬°

str_to_st0      PROTO   pStr:QWORD,unicode:QWORD

¥ý»¡²Ä¤G­Ó°Ñ¼Æ¡Aunicode¡A³o­Ó°Ñ¼Æ¬Oªí©ú¦r¦êºØÃþ¡G¦pªG¬O ASCII ¦r¦ê¡Aunicode ¬° 0¡F¦pªG¬O¸U°ê½X¦r¦ê¡Aunicode ¬° 1¡C²Ä¤@­Ó°Ñ¼Æ¡ApStr¡A¬O¦r¦ê¦ì§}¡A¥]§tµ²§Àªº 0¡A¦pªG¬OASCII½X¡A³Ì¤jªø«×¬O 27 ­Ó¦ì¤¸²Õ¡F¦pªG³o­Ó¦r¦ê¬°¸U°ê½X¡A³Ì¤jªø«×¬° 54 ­Ó¦ì¤¸²Õ¡C³o­Ó¦r¦ê¯à±µ¨üªº¦r¤¸¡A¥u¦³¡u0¡v¡ã¡u9¡v¡B¤p¼ÆÂI¡B¥¿­t¸¹©M¡uE¡v©Î¡ue¡vµ¥ 15 ­Ó¦r¤¸¡A¨ä¾l¦r¤¸³£¬O¤£¦Xªkªº¡C¡uE¡v©Î¡ue¡v¥Nªí 10 ªº´X¦¸¤è¡A¡uE¡v©Î¡ue¡v«á­±±µµÛªº¡A´N¬O 10 ªº¦¸¤è¼Æ¡C°£¦¹¤§¥~¡A·íµMÁÙ¦³¨Ç­­¨î¡A³o¨Ç­­¨î¥D­n¨Ó¦Û¼Æ¾Ç¤Wªº­­¨î¡C¨Ò¦p¡G

  1. 10 ªº´X¦¸¤è¼Æ¥u¯à¬O¾ã¼Æ¡C
  2. ¥¿­t¸¹¥u¯à¦b²Ä¤@­Ó¦r¤¸¡A©Î¬Oºò±µµÛ¡uE¡v©Î¡ue¡v«á­±ªº¨º­Ó¦r¤¸¡C
  3. ¤p¼ÆÂI¥u¯à¦³¤@­Ó¡A¦Ó¥B¤£¯à¦b¡uE¡v©Î¡ue¡vªº«á­±¡C

¨Ò¦p¡A¡u123.456E-5¡v¡B¡u0.000¡v¡B¡uE3¡vµ¥¬O¦Xªkªº¡A¡u123.4.56E5¡v¡B¡u-1233E0.2¡v¡B¡u2E¡v¬O¤£¦Xªkªº¡Cstr_to_st0 ¦³¤@¤j³¡¥÷¦bÀˬd¿é¤Jªº¦r¦ê¬O§_¦Xªk¡A¥H¤Î¤Æ²¡A³o³¡¥÷¤p¤ì°¸¦Û»{¼g±o¤£¦n¡A¦ü¥G¬Oµw·F¡A´Á«Ý¦³¸û¦nªººtºâªk¯àÀË´ú¦r¦ê¬O§_¦Xªk¤Î¤Æ²¡C¤p¤ì°¸ªº·Qªk«Ü²³æ¡A§â¿é¤Jªº¦r¦ê¡A¤À¦¨«Y¼Æ¤Î¤Qªº¾­¤è¼Æ¨â³¡¥÷¡C¥H¡uE¡v©Î¡ue¡v§@¬°¬É½u¡A¦b¡uE¡v©Î¡ue¡v¤§«e¬°«Y¼Æ¡A¦s©ó¡ustr_manti¡v°Ï°ìÅܼÆùØ¡F¦b¡uE¡v©Î¡ue¡v¤§«á¬°¤Qªº¾­¤è¡A¦s©ó¡ustr_exp¡v°Ï°ìÅܼÆùØ¡C²¤Æ«áªº¡ustr_manti¡v¡B¡ustr_exp¡v¨â¦r¦ê¡AÅܦ¨¬O¥H ASCII ¦r¤¸ùتºªü©Ô§B¼Æ¦r¤Î¤p¼ÆÂI©Ò§Î¦¨¤§¦r¦ê¡C¨Ò¦p

    pStr©Ò«ü¦r¦ê   sign_manti  str_manti   sign_exp    str_exp
    0.00200            0       0.002          0           0
    00254.125E-02      0       254.125        1           2
    e+08               0       1              0           8
    -e-5               1       1              1           5
    -1.602E-19         1       1.602          1           19

¬°¦ó­n³o¼Ë¤À¶}©O¡H¦]¬°±q¤@­Ó¦r¦ê­pºâ¥X¾ã¼Æ¡A«Ü²³æ¡A¦Ó¥B¤£·|¦³»~®t¡C³o¥ó¨Æ¥æ¥Ñ°Æµ{¦¡ calc_integer ¥h°µ¡A¨ä­ì²z«Ü²³æ¡CÁ|¨Ò¨Ó»¡¡A¤@­Ó¦r¦ê¡u245¡v¥Nªí¤T¦ì¼Æ¡A¥i¥H¬Ý¦¨¬O¤T¦¸ªº°j°é¡CRAX ­n°O¿ý³Ì«áªº¼Æ­È¡A¥ý¨Ï RAX ¬° 0¡C¨C¦¸°j°é¥ý¨Ï RAX ­¼¥H 10¡A¦AŪ¨ú¦r¦êªº¤@¦ì¼Æ¡A¦]¦¹°µ§¹²Ä¤@¦¸°j°é¡ARAX ¬° 2¡C²Ä¤G¦¸°j°é®É¡A10¡Ñ2¡Ï4¡ARAX Åܦ¨ 24¡C°µ§¹²Ä¤T¦¸°j°é®É¡A10¡Ñ24¡Ï5¡ARAX ´NÅܦ¨ 245 ¤F¡C¦pªG§â«Y¼Æ»P¤Qªº¾­¤è¤À¶}¡A«áªÌ¥²¬°¾ã¼Æ¡A«Ü®e©ö´N¯àºâ¥X¨Ó¡F¦Ó«Y¼Æ¤]¥i¥H¤À¦¨¾ã¼Æ³¡¤À»P¤p¼Æ³¡¤À¡C¾ã¼Æ³¡¤À¤]¥i¥H³q¹L calc_integer ­pºâ¥X¨Ó¡F¦Ó¤p¼Æ³¡¤À¨ä¹ê¤]¥i¥H·Qµ{¦¡¬Y­Ó¾ã¼Æ¡A°£¥H 10 ªº¬Y­Ó¦¸¤è¡A¨Ò¦p¡A0.125 ¥i¥H¬Ý¦¨¬O 125 °£¥H 103¡A¦Ó³o¡u¬Y­Ó¦¸¤è¡vªº¼Æ­È¡A«ê¦n¬O¤p¼ÆÂI«áªº¦ì¼Æ¡C¥H 254.125¡Ñ10¡Ð2 ¬°¨Ò¤l¡A³o­Ó¼Æ¥i¥H¼g¦¨

254.125¡Ñ10¡Ð2¡×(254¡Ï125/1000)¡Ñ10¡Ð2¡×254¡Ñ10¡Ð2¡Ï125¡Ñ10¡Ð2¡Ð3

´«¥y¸Ü»¡¡A²{¦b¤w¸g§â°ÝÃDÅܤƦ¨¡G§â¨â­Ó¦r¦ê¡u245¡v¡B¡u125¡vÅܦ¨¼Æ­È¡A¦A¥h­pºâ 10¡Ð2 ¤Î 10¡Ð5 µM«á§â³o¥|­Ó¼Æ­È¡A©ñ¤J FPU ùعBºâ¡A´N¯à±o¨ìµª®×¤F¡C


­ì©l½X¡Gtwo_p_x¡Bx_p_y¡Bst0_to_sn¡Bstr_to_st0

©³¤U¬O two_p_x¡Bx_p_y¡Bst0_to_sn¡Bstr_to_st0 ¥|­Ó°Æµ{¦¡ªº­ì©l½X¡A¤p¤ì°¸§â¥L­Ì¼g¦¨°ÊºA³sµ²µ{¦¡®wªº§Î¦¡¡A©R¦W¬° MYFPU.ASM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
;¦¹µ{¦¡¥]§t¥|­Ó°Æµ{¦¡¡A§¡¬°64¦ì¤¸ª©¥»
;1.two_p_x¡G¨D2^X¡C
;2.x_p_y¡G¨DX^Y¡C
;3.st0_to_sn¡G§âST¤§¼Æ­È¡AÅܦ¨¬ì¾Ç°O¸¹(scientific notation)§Î¦¡¡A¥Hªü©Ô§B¼Æ¦rªº¦r¦ê¦s©ó°O
;¡@¡@¡@¡@¡@¡@¡@¾ÐÅ餺¡C
;4.str_to_st0¡G§â¦r¦êÂà´«¦¨¼È®É¹ê¼Æ¡A¦s©óSTùØ
        OPTION  CASEMAP:NONE
        OPTION  WIN64:7
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
DLLEntry        PROC    hInstance,dwReason,dwReserved
                mov     rax,1
                ret
DLLEntry        ENDP
;-----------------------------------------------------------------------------------------
;¥Øªº¡G¨D2^x¡A¦¹«ü¼Æ¥i¥H¬O¾ã¼Æ¡B­t¼Æ¡B¯BÂI¼Æ¡C¦¹°Æµ{¦¡¥Î¨ì°ïÅ|¼È¦s¾¹²`«×¬°ST(3)¡C
;¿é¤J¡ÐST(0)¡G«ü¼Æ
;¿é¥X¡ÐST(0)¡G2ªº¦¸¤è¼Æ¡A­ì¨Ó¦s©óST(0)ªº«ü¼Æ·|³Q¯}Ãa
;³Æµù¡G1.¦¹°Æµ{¦¡¥i¥H¥Î¦bpentium¤Î¨ä¥H¤Wµ¥¯ÅªºFPU¡C
;      2.¦¹°Æµ{¦¡­ì²z¬O§Q¥Î2^(a+b)=(2^a)*(2^b)¡Aa ªí¥Ü¾ã¼Æ³¡¤À¡Abªí¥Ü¤p¼Æ³¡¤À
two_p_x         PROC
                LOCAL   cw:WORD
                fstcw   cw       ;¨ú±o±±¨î¦r²Õ
                fwait            ;µ¥«Ý pentium Àx¦s§¹²¦
                push    cw       ;«O¦s­ì±±¨î¦r²Õ
                and     cw,0f3ffh;¨Ï±±¨î¦r²ÕÅܦ¨¦V­tµL½a¤j±Ë¤J¡A±ý¹F¦¹¥Ø
                or      cw,00400h;ªº¥²¶·¨Ï±±¨î¦r²Õ²Ä10¡B11¦ì¤¸Åܬ°01
                fldcw   cw       ;¸ü¤J·sªº±±¨î¦r²Õ
                fld     st       ;   x   ;   x   ;
                frndint          ;i=int x;   x   ;¦V­tµL½a¤j±Ë¤J
                pop     cw                       ;¨ú¦^ªº±±¨î¦r²Õ
                fldcw   cw       ;   i   ;   x   ;¸ü¤Jªº±±¨î¦r²Õ
                fsub    st(1),st ;   i   ; f=x-i ;ST(1)¬°¤p¼Æ³¡¤À¡Af
                fxch             ;   f   ;   i   ;¥æ´«
                f2xm1            ; 2^f-1 ;   i   ;¨D2ªº¤p¼Æ³¡¤À¦¸¤è
                fld1             ;   1   ; 2^f-1 ;   i  ;¸ü¤J1
                faddp   st(1),st ;  2^f  ;   i   ;      ;§¹¦¨2ªº¤p¼Æ³¡¤À¦¸¤è
                fscale           ;  2^x  ;   i   ;      ;­pºâST(0)*2^ST(1)
                fstp    st(1)    ;  2^x  ;       ;      ;¥h±¼¾ã¼Æ³¡¤À
                ret
two_p_x         ENDP
;-----------------------------------------------------------------------------------------
;x_p_y°Æµ{¦¡¥Î¨Ó­pºâX^Y¡AX¡×ST(0)¡AY¡×ST(1)¡Aªð¦^®É±NX^Y¦s©óST(1)«á¡A¦A§â°ïÅ|¼u¥X¤@¦¸¡C
;x_p_y¾¨¶qºâ¥XX^Y¡A¦p¤Uªí
;X\Y¡@¥¿¡@¡@¡@¡@¹s¡@¡@¡@­t
;¥¿ ¡@X^Y¡@¡@¡@¡@1¡@¡@¡@X^Y
;¹s¡@¡@0¡@¡@¡@¤£©w¡@¡@µL·N¸q
;­t¡@¡@¡¸¡@¡@¡@¡@1¡@¡@¡@¡¸
;¡¸¡G­YY¬°¾ã¼Æ¡A¤~¯à¨DX^Y¤§­È¡F­YY§t¦³¤p¼Æ³¡¥÷¡AX^Y¡×µL·N¸q
;¿é¤J¡G«ü¼Æ(Y)¡ÐST(1)
;¡@¡@¡@©³¼Æ(X)¡ÐST
;¿é¥X¡GCY¡Ð¦pªGX^YµL·N¸q©Î¥¼©w­È¡A«h¶Ç¦^CY
;¡@¡@¡@NC¡Ð­pºâ¦¨¥\¡AX^Y¦s©óSTùØ
x_p_y           PROC    USES rax
                LOCAL   power:DWORD
                LOCAL   cw:WORD ;±±¨î¦r²Õ
;Àˬd©³¼Æ¬O§_¬°¹s¡A¦pªG¬O¡A¸õ¦Übase_0¡F¦pªG¤p©ó0¡A¸õ¦Übase_ng¡F¦pªG¤j©ó¹s¡A¸õ¨ìcalc³B¡C
                ftst
                fstsw   ax      ;§âª¬ºA¦r²Õ¦s¤JAX
                sahf            ;§âª¬ºA¦r²Õªº°ª¦ì¤¸³¡¥÷²¾¤JºX¼Ð
                jz      base_0  ;­YZR¡A©³¼Æ¬°0¡A¸õ¦Übase_0¡F
                jc      base_ng ;--st0--;--st1--;­YCY¡Aªí¥Ü©³¼Æ¬°­t¼Æ¡A¸õ¦Übase_ng:
                                ;   X   ;   Y   ;
calc:           fyl2x           ; Ylog2X;
                call    two_p_x ;  X^Y  ;
                jmp     finish
base_0:         fcomp           ;©³¼Æ¬°¹s¡A¼u¥X©³¼Æ¡AFPU°ïÅ|¤º¥u³Ñ«ü¼Æ
                ftst            ;Àˬd«ü¼Æ¬O§_¬°¹s
                fstsw   ax
                sahf
                jbe     err3    ;¦b©³¼Æ¬°¹sªº±¡§Î¤U¡A0^0¡×¤£©w¡A0^­t¼Æ¡×µL·N¸q
                fcomp           ;©³¼Æ¬°¹s¥B«ü¼Æ¬°¥¿¡A¦]¬°©³¼Æ¤w¼u¥X¡A¦¹³B¼u¥X«ü¼Æ§Y¥i
                fldz            ;0^¥¿¼Æ¡×0
                jmp     finish
;­Y©³¼Æ¬°­t­È¡A«hÀˬd«ü¼Æ¬O§_¬°0¡B«D¹s¾ã¼Æ¡B§t¦³¤p¼Æ¡C(X¡×©³¼Æ¡AY¡×«ü¼Æ)
;¦pªG«ü¼Æ¬°0¡AX^0¡×1¡F¦pªG«ü¼Æ¬°«D¹s¾ã¼Æ¡A¥i­pºâX^Y¡F¦pªG«ü¼Æ§t¦³¤p¼Æ³¡¥÷¡A«hµLªk­pºâX^Y
base_ng:        fstcw   cw      ;¨ú±o±±¨î¦r²Õ
                and     cw,0f3ffh;¨Ï±±¨î¦r²ÕÅܦ¨¦V­tµL½a¤j±Ë¤J¡A±ý¹F¦¹¥Ø
                or      cw,00400h;ªº¥²¶·¨Ï±±¨î¦r²Õ²Ä10¡B11¦ì¤¸Åܬ°01
                fldcw   cw      ;--st0--;--st1--;--st2--;
                fld     st(1)   ;   Y   ;   X   ;   Y   ;
                ftst            ;Àˬd«ü¼Æ¬O§_¬°0
                fstsw   ax      ;§âª¬ºA¦r²Õ¦s¤JAX
                sahf            ;§âª¬ºA¦r²Õªº°ª¦ì¤¸³¡¥÷²¾¤JºX¼Ð
                jz      exp_z   ;¦pªG«ü¼Æ¬°0¡A¸õ¦Üexp_z³B
                frndint         ;i=INT Y;   X   ;   Y   ;
                fist    power   ;   i   ;   X   ;   Y   ;
                fsub    st,st(2);   i   ;   X   ;   Y   ;
                ftst            ;ÀˬdST¬O§_¬°0¡A­Y¬°0¡Aªí¥Ü«ü¼Æ¬°¾ã¼Æ¡F§_«h«ü¼Æ§t¦³¤p¼Æ
                fstsw   ax
                sahf            ;§âª¬ºA¦r²Õªº°ª¦ì¤¸³¡¥÷²¾¤JºX¼Ð
                jnz     err2    ;­YST¡Ú0¡Aªí¥Ü«ü¼Æ¤£¬°¾ã¼Æ¡A¸õ¦Üerr2³B
                fcomp           ;   X   ;   Y   ;       ;­YST¡×0¡Aªí«ü¼Æ¬°¾ã¼Æ¥B©³¼Æ¬°­t¼Æ
                test    power,1 ;´ú¸Õ«ü¼Æ¬°©_¼Æ©Î°¸¼Æ
                jnz     exp_odd
                fchs            ;  -X   ;   Y   ;       ;«ü¼Æ¬°°¸¼Æ¡A©³¼Æ¬°­t­È¡A¦ýX^Y¤§­È¬°¥¿
                jmp     calc
exp_odd:        fchs            ;  -X   ;   Y   ;
                fyl2x           ; Ylog2X;
                call    two_p_x ;  X^Y  ;
                fchs
                jmp     finish

;©³¼Æ¬°­t­È¡A«ü¼Æ¬°0¡AX^0¡×1¡CX¡×©³¼Æ
exp_z:          fcompp
                fcomp
                fld1
finish:         clc
                jmp     exit

err2:           fcompp
err3:           fcomp           ;«ü¼Æ»P©³¼Æ§¡¬°¹s©Î©³¼Æ¬°­t¼Æ
                stc             ;³]©w¶i¦ìºX¼Ð
exit:           ret
x_p_y           ENDP
;-----------------------------------------------------------------------------------------
;st0_to_sn§âST¤ºªº¼È®É¹ê¼Æ¡AÅܦ¨¬ì¾Ç°O¸¹(scientific notation)¡A¦s©ópBuffer©Ò«üªº°O¾ÐÅ餺¡C
;flag¡G²Ä0¡ã4¦ì¤¸¡G¬°«Y¼Æ¦³´X¦ì¼Æ(¥]§t­Ó¦ì¼Æ¤Î¤p¼ÆÂI«áªº¦ì¼Æ¡A¨Ò¦p1.234¦³4¦ì)¡A³Ì¦h16¦ì¡A
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¤£¥i¬°0
;¡@¡@¡@²Ä8­Ó¦ì¤¸¡G¦pªG¬°0¡Aªí¥Ü¤Qªº¾­¤è¼Æ¬°¥¿¸¹®É¡A¤£Àx¦s¡u+¡v¡F¦pªG¬°1¡Aªí¥Ü¤Qªº¾­¤è¼Æ¬°
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¥¿¸¹®É¡A­nÀx¦s¡u+¡v
;¡@¡@¡@²Ä9­Ó¦ì¤¸¡G­Y¬°0¡Aªí¥Ü«Y¼Æ¬°¥¿¸¹®É¡A¤£Àx¦s¡u+¡v¡F­Y¬°1¡Aªí¥Ü«Y¼Æ¬°¥¿¸¹®É¡A­nÀx¦s¡u+¡v
;¡@¡@¡@²Ä10­Ó¦ì¤¸¡G¦pªG¬°0¡Aªí¥ÜpBuffer©Ò«üªº°O¾ÐÅé¡A¥HASCII½XÀx¦s¡F¦pªG¬O1¡A«h¥H¸U°ê½XÀx¦s
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¦pªGflag«ü©wASCII½X¡G¦¹°O¾ÐÅé¦Ü¤Ö­n¦³27­Ó¦ì¤¸²Õ¡C«e21­Ó¦ì¤¸²Õ©ñ¸m«Y¼Æ¡A«á
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@6­Ó¦ì¤¸²Õ©ñ¸m10ªº¾­¤è¼Æ(exponential)¡C¦]¦¹²Ä0¡ã20­Ó¦ì
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¤¸²Õ¥Î©ó¦s©ñ«Y¼Æ¡F²Ä21¡ã26­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ¤Qªº¾­¤è¡C
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¦pªGflag«ü©w¸U°ê½X¡G¦¹°O¾ÐÅé¦Ü¤Ö­n¦³54­Ó¦ì¤¸²Õ¡C«e42­Ó¦ì¤¸²Õ©ñ¸m«Y¼Æ¡A«á
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@12­Ó¦ì¤¸²Õ©ñ¸m10ªº¾­¤è¼Æ(exponential)¡C¦]¦¹²Ä0¡ã41­Ó
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¦ì¤¸²Õ¥Î©ó¦s©ñ«Y¼Æ¡F²Ä42¡ã53­Ó¦ì¤¸²Õ¥Î©ó¦s©ñ¤Qªº¾­¤è¡C
;pBuffer¬°¤@¦ì§}¡A«ü¦V¤@¶ô°O¾ÐÅé¡Aªø«×¦Ü¤Ö¬°27©Î54­Ó¦ì¤¸²Õ(«eªÌ¬°ASCII¡A«áªÌ¬°¸U°ê½X)¡C©Ò¦s
;¡@¡@¡@¡@¡@¡@©ñ¸ê®Æ¡A¤À¨â³¡¥÷¡G
;¡@¡@1.«Y¼Æ¡G¤j¤pÀ³¬°21­Ó(©Î42)¦ì¤¸²Õ¡A¦³¥i¯à¨Ï¥Î®É¤ñ21­Ó(©Î42)¦ì¤¸²Õ¤Ö¡A¥¦¥Î¨ÓÀx¦s«Y¼Æ(¥ç
;¡@¡@¡@¡@¡@¡@ºÙ§À¼Æmantissa)¡A¤À¤T³¡¥÷¡G
;¡@¡@¡@¡@¡@a.²Ä0­Ó¦ì¤¸²Õ(©Î²Ä0­Ó¦r²Õ)¬°²Å¸¹(+©Î-)¡A¦pªGflag¤¤«ü©w¥¿¸¹¤£Àx¦s¡A¦¹¦ì¤¸²Õ´N¬O«Y
;¡@¡@¡@¡@¡@¡@¼Æªº¾ã¼Æ³¡¥÷¡C
;¡@¡@¡@¡@¡@b.¨ä¦¸ªº19­Ó¦ì¤¸²Õ(©Î19­Ó¦r²Õ)¬°«Y¼Æ(¦¹19­Ó¦ì¤¸²Õ¥]§t¡u.¡v©Î19­Ó¦r²Õ)¡A­Yflag«ü
;¡@¡@¡@¡@¡@¡@©w¤£¶·³o»ò¦h¦ìªº«Y¼Æ¡A´N¥i¯à·|¤Ö©ó19­Ó¦ì¤¸²Õ(©Î19­Ó¦r²Õ)¡C¦pªGflagªº0¡ã4¦ì¤¸«ü
;¡@¡@¡@¡@¡@¡@©wªº¦ì¼Æ¦h©ó¹ê»Ú«Y¼Æªº¦ì¼Æ®É¡A«h¤p¼ÆÂI«áªº0¤£·|Åã¥Ü¥X¨Ó¡A¨Ò¦pflag¡×5¡AST¡×123
;¡@¡@¡@¡@¡@¡@¡A¨º»ò¥u·|Åã¥Ü1.23E2¡A¤£·|Åã¥Ü1.2300E2¡C
;¡@¡@¡@¡@¡@c.³Ì«á¤@­Ó¦ì¤¸²Õ(©Î¦r²Õ)¬O¡u0¡v¡Aºò±µµÛb.¤§«á¡C
;¡@¡@2.¤Qªº¾­¤è¡G¤j¤pÀ³¬°6­Ó¦ì¤¸²Õ(©Î6­Ó¦r²Õ)¡A¥Î¨ÓÀx¦s10ªº¦¸¤è¼Æ¡C²Ä0­Ó¦ì¤¸²Õ(©Î²Ä0­Ó¦r²Õ)
;¡@¡@¡@¡@¡@¡@¬°10ªº¦¸¤è¼Æªº²Å¸¹(+©Î-)¡A±µ¤U¨Óªº4­Ó¦ì¤¸²Õ(©Î4­Ó¦r²Õ)¬°«ü¼Æ³¡¥÷¡A³Ì«á¤@­Ó¦ì¤¸
;¡@¡@¡@¡@¡@¡@²Õ(©Î¦r²Õ)¬°¡u0¡v
;¿é¤J¡GST¡Ð­nÂà´«ªº¼È®É¹ê¼Æ¡A¦ý°õ¦æ§¹«á¡AST¤§­È¤£ÅÜ
;¡@¡@¡@pBuffer¡ÐÂà´«¦¨¥Hªü©Ô§B¼Æ¦r¬°§Î¦¡ªº¬ì¾Ç°O¸¹¦s©ñ¦ì§}
;¡@¡@¡@flag¡ÐºX¼Ð¡A¨£¤W­±»¡©ú
;¿é¥X¡GNC¡Ð¦pªGÂà´«¦¨¥\¡ANC¡A¥BpBuffer©Ò«ü¦r¦ê¦³¬ì¾Ç°O¸¹¡FCY¡Ð¿ù»~¡A¦³¥i¯à¬Oflag¬°0
st0_to_sn       PROC    USES rax rcx rdx rsi rdi pBuffer:QWORD,flag:QWORD
                LOCAL   cw:WORD ;±±¨î¦r²Õ
                LOCAL   power:WORD
                LOCAL   unicode:WORD    ;19¡×ASCII¦r¤¸¡F38¡×¸U°ê½X
                LOCAL   len_manti:QWORD ;©I¥sªÌ«ü©wªº«Y¼Æ¦ì¼Æ¡A¥ç§Yflag¤¤0¡ã4¦ì¤¸ªº¼Æ­È
                LOCAL   mantissa:TBYTE
                LOCAL   exp:TBYTE
                LOCAL   x87stat[108]:BYTE
                fsave   x87stat
                lea     rax,x87stat
                mov     rdx,flag
                fld     TBYTE PTR [rax+28]
                and     rdx,1fh ;­Y©I¥sªÌ«ü©wflagªº0¡ã4¦ì¤¸¬°0¡A¸õ¥Xst0_to_sn¨Ã³]CY
                jnz     n_zero0 ;­Y©I¥sªÌ«ü©wflagªº0¡ã4¦ì¤¸¤£¬°0¡A«hDX¡×©I¥sªÌ«ü©wªº«Y¼Æ¦ì¼Æ
error:          stc
                jmp     exit1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;©³¤U¬°¤@°Æµ{¦¡¡A¨Ìflag«ü©w¦s¤JASCII©Î¸U°ê½X¡A¦brdi©Ò«ü¦ì§}¦s¤J¦ì¤¸²Õ©Î¦r²Õ
st_hi_nibble:   mov     al,[rsi]
                shr     al,4
store_number:   add     al,"0"
store:  .IF unicode==19
                stosb
        .ELSE
                stosw
        .ENDIF
                DB      0c3h    ;0c3h¡×retªº¾÷±ñ½X¡C¦p¥Îret¡AÁÙ·|³Q²ÕĶ¾¹¦h¥[leaveµ¥«ü¥O
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;©³¤Uªº°Æµ{¦¡¡A§â¤@¦ì¤¸²Õªº¸û§C¥|¦ì¤¸Åܦ¨ªü©Ô§B¼Æ¦r¡A¦s©órdi©Ò«ü°O¾ÐÅéùØ
st_low_nibble:  mov     al,[rsi]
                and     al,0fh
                call    store_number
                DB      0c3h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;³B²z«Y¼Æ»P«ü¼Æªº²Å¸¹¡C¦pªGrcx¡×0¡Aªí¥Ü§Y¨Ï¥¿¼Æ¡A¤]­nÀx¦s¡u+¡v¡F¦pªGrcx¡×1¡A¤£Àx¦s¡u+¡v
sign:   .IF BYTE PTR [rsi+9]==80h
                mov     al,"-"
sv_pos:         call    store
        .ELSE
                mov     al,"+"
                jrcxz   sv_pos
        .ENDIF
                DB      0c3h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
word_ten        DW      10
szNanW          DW      975eh,6578h,503ch,0h            ;«D¼Æ­È
szPosInfinityW  DW      6b63h,7121h,7aaeh,5927h,0h      ;¥¿µL½a¤j
szNegInfinityW  DW      8ca0h,7121h,7aaeh,5927h,0h      ;­tµL½a¤j
szError         DW      45h,52h,52h,4fh,52h,0h          ;ERROR
szNanA          DB      "«D¼Æ­È",0,0
szPosInfinityA  DB      "¥¿µL½a¤j",0,0
szNegInfinityA  DB      "­tµL½a¤j",0,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
n_zero0:        test    flag,400h
        .IF ZERO?
                mov     unicode,19      ;19¥Nªí¦s¤JASCII¦r¤¸
        .ELSE
                mov     unicode,38      ;38¥Nªí¦s¤J¸U°ê½X
        .ENDIF
;¦pªG©I¥sªÌ«ü©wflagªº«Y¼Æ¦ì¼Æ¶W¹L16¦ì¡A¥H16¦ì­pºâ¡A¦s©ólen_manti¤ÎrdxùØ
        .IF rdx>16
                mov     rdx,10h
        .ENDIF
                mov     len_manti,rdx
                mov     rdi,pBuffer
;ÀˬdST¬O§_¬°¤£¤ä´©¡B«D¼Æ­È¡BµL½a¤j¡BªÅªº¡B¤Ï±`­È¡B0¡A¦pªG¬O«e¤­ªÌ¡A«h§â¹ïÀ³ªº¦r¦ê¼g¤J
;pBuffer©Ò«üªº¦ì§}¡A³]©wCY«áªð¦^¡F¦pªG¬O0¡A¸õ¨ìzero1:¼Ð°O³B¡F¦pªG¬O¼Æ­È¡A«h¸õ¨ìvalue:³B
                fxam
                add     rsi,9   ;«ü¦V«Y¼Æªº²Å¸¹
                fstsw   ax
                xor     rcx,rcx
                bt      rax,8   ;§âAHªº²Ä0¡B2¡B6¤T­Ó¦ì¤¸¡AÅܦ¨CLªº²Ä0¡B1¡B2¦ì¤¸
                jnc     @f      ;AHªº³o¤T­Ó¦ì¤¸¡A¤À§O¹ïÀ³C0¡BC2¡BC3
                or      cl,1
@@:             bt      rax,10
                jnc     @f
                or      cl,2
@@:             bt      rax,14
                jnc     @f
                or      cl,4
@@: .IF cl==2
                jmp     value
    .ELSEIF cl==4
                jmp     zero1
    .ELSEIF cl==1
                lea     rsi,szNanW
                mov     rcx,8
        .IF unicode==19
                lea     rsi,szNanA
        .ENDIF
    .ELSEIF cl==3
                mov     rcx,10
                test    ah,2
        .IF ZERO?
                lea     rsi,szPosInfinityW
            .IF unicode==19
                lea     rsi,szPosInfinityA
            .ENDIF
        .ELSE
                lea     rsi,szNegInfinityW
            .IF unicode==19
                lea     rsi,szNegInfinityA
            .ENDIF
        .ENDIF
    .ELSE
        .IF unicode==19
                lea     rsi,szErrorA
                mov     rcx,6
        .ELSE
                lea     rsi,szErrorW
                mov     rcx,12
        .ENDIF
    .ENDIF
                rep     movsb
                jmp     error
;­YST¡×0¡A§â«Y¼Æ¤Î¤Qªº¾­¤è¼Æ¬Ò¶ñ¤J30h¡B0¡AµM«á¸õ¦Üexit0³B¡C
zero1:          mov     rax,30h
                call    store
                movzx   rax,unicode
                add     rdi,rax
                xor     rax,rax
                stosw
                jmp     exit0
;­YST¤£¬°¹s¡A¥ý­pºâ¥X«ü¼Æ¬°¦ó   ;--st0--;--st1--;--st2--;
value:          fld     st      ;   x   ;   x   ;       ;°²³]­n¦L¥Xªº¼Æ¬°x
                fabs            ;  |x|  ;   x   ;
                fld1            ;   1   ;  |x|  ;   x   ;
                fxch    st(1)   ;  |x|  ;   1   ;   x   ;
                fyl2x           ;log2|x|;   x   ;
                fldl2t          ;log2 10;log2|x|;   x   ;
                fdivp   st(1),st;e=log x;   x   ;«ü¼Æ¬°¡ueªº¾ã¼Æ³¡¥÷¡v
                fstcw   cw                      ;¨ú±o²{¦³±Ë¤J¤èªk¡AÅܬ°¡u¦V­tµL½a¤j¡v±Ë¤J
                and     cw,not 0c00h
                or      cw,0400h
                fldcw   cw                      ;¸ü¤J¡u¦V­tµL½a¤j¡v±Ë¤J
                frndint         ;i=int e;   x   ;§âe±Ë¤J¦¨i¡Ai§Y¬°«ü¼Æ³¡¥÷
                fist    power   ;   i   ;   x   ;§â«ü¼Æ¦s©ópowerÅܼÆùØ
                fbstp   exp     ;   x   ;       ;§âiÅܦ¨»E¶°BCD¡A¦s¤JexpÅܼÆùØ
                and     cw,0f3ffh               ;§ï¦¨¥|±Ë¤­¤Jªk¡A³B²z«Y¼Æ
                sub     dx,power
                dec     dx
                lea     rsi,mantissa
                fldcw   cw
                mov     power,dx;DX¡×len_manti¡Ði¡Ð1  ;­ì¼Æ¡Ñ10^DX¡A¨Ï«Y¼Æ¦b¾ã¼Æ¦ì¥|±Ë¤­¤J
                fild    power   ;   p   ;   x   ;       ;p¡×DX
                fild    word_ten;   10  ;   p   ;   x   ;
                call    x_p_y   ;  10^p ;   x   ;
                fmul    st,st(1); x*10^p;   x   ;
                frndint         ; x*10^p;   x   ;       ;¥|±Ë¤­¤J¨ì©I¥sªÌ«ü©w¦ì¼Æ
                fbstp   mantissa
;³B²z«Y¼Æªº²Å¸¹¡Arsi+9«ü¦Vmantissaªº²Ä¤E­Ó¦ì¤¸²Õ
                xor     rcx,rcx
                mov     rax,rcx
                test    flag,200h
                jnz     manti_sign
                inc     rcx     ;­Yrcx¡×1¡Aªí¥Ü§Y¨Ï«Y¼Æ¬°¥¿¡A¤]¤£Àx¦s¡u+¡v
manti_sign:     call    sign
;­pºâ«Y¼Æªº¾ã¼Æ¦ì¼Æ¥Ñ­þ¤@¦ì¤¸²Õ¶}©l¡C©I¥sªÌ«ü©wªº«Y¼Æ¦ì¼Æ¡A¨C¨â¦ìºc¦¨¤@­Ó¦ì¤¸²Õ¡A¬G«Y¼Æ¦ì
;¬°1¡B2¡A¤£¨Ïrsi¥[¤@¡F«Y¼Æ¦ì¼Æ3¡B4¡Arsi¶·¥[¤@¡F«Y¼Æ¦ì¼Æ56¡A¶·¥[¤G¡F¡K¡K
                mov     rdx,len_manti
                mov     rcx,len_manti
                dec     rdx
                shr     rdx,1
                add     rsi,rdx         ;rsi«ü¦V«Y¼Æ¾ã¼Æ©Ò¦b¦ì§}
                test    len_manti,1     ;­Y©I¥sªÌ«ü©wªº«Y¼Æ¦ì¼Æ¬°©_¼Æ¡A«h±q¬Y­Ó¦ì¤¸²Õªº§C
                lea     rdx,mantissa    ;¥|¦ì¤¸¶}©l¡F§_«h±q°ª¥|¦ì¤¸¶}©l
                jz      int_at_hi
                call    st_low_nibble
                dec     rcx
                jz      del_end_zero
                mov     al,"."
                call    store
                jmp     next_byte
int_at_hi:      call    st_hi_nibble
                dec     rcx
                jz      del_end_zero
                mov     al,"."
                call    store
                jmp     st_low
next_byte:      dec     rsi
                call    st_hi_nibble
st_low:         call    st_low_nibble
                cmp     rsi,rdx
                je      del_end_zero
                jmp     next_byte
;¦pªG¦³®Ä¦ì¼Æ¥½´X¦ì¬°0¡A¥h±¼³o¨Ç0
del_end_zero:   mov     rdx,-2
        .IF unicode==19
                mov     rdx,-1
        .ENDIF
@@:             cmp     BYTE PTR [rdi+rdx],"0"
                jne     @f
                add     rdi,rdx
                jmp     @b
@@:             cmp     BYTE PTR [rdi+rdx],"."  ;Àˬd¬O§_¤p¼ÆÂI«á¥þ¬°0
                jne     @f
                add     rdi,rdx         ;¦pªG¤p¼ÆÂI«á¥þ¬°0¡A¥h±¼¤p¼ÆÂI
@@:             xor     rax,rax
                call    store

;©³¤Uªºµ{¦¡¡A¶}©l³B²z¤Qªº¾­¤è¼Æ¡C¥ý¨Ïrsi¡Brdi¤À§O«ü¦Vexp¤ÎpBuffer©Ò«ü«ü¼Æ¦ì§}
                mov     rdi,pBuffer
                lea     rsi,exp
        .IF unicode==19
                add     rdi,21
        .ELSE
                add     rdi,42
        .ENDIF
;Àˬd¤Qªº¾­¤è¬O§_¬°0¡A¦pªG¬°0¡Aª½±µ¦s¤Jªü©Ô§B¼Æ¦r¡u0¡v
                cmp     WORD PTR [rsi],0;¦]«ü¼Æ³Ì¦h¥u¦³¥|¦ì¼Æ¡A­è¦n¤@­Ó¦r²Õ
                jnz     non_zero3
                mov     rax,30h
                stosd
                jmp     exit0
non_zero3:      xor     rcx,rcx         ;³B²z¤Q¾­¤èªº²Å¸¹
                test    flag,100h       ;¦pªGrcx¡×1¡Aªí¥Ü§Y¨Ï«ü¼Æ¬°¥¿¡A¤]¤£Àx¦s¡u+¡v
                jnz     exp_sign
                inc     rcx
exp_sign:       call    sign
                inc     rsi             ;¦]¬°FPU¼È®É¹ê¼Æ½d³ò3.4E-4932¡ã1.2E4932
                mov     al,[rsi]        ;¬G¥u»Ý³B²z¨â­Ó¦ì¤¸²Õªº»E¶°BCD¼Æ§Y¥i
        .IF al==0
                movzx   rdx,al          ;rdx¡×0¡Aªí¥Ü°ª¦ì¤¸²Õ¬°0¡A¨Ò¦p«ü¼Æ¬O10^0025¡A
                jmp     low_byte        ;«e­±¨â­Ó0¡A¤£¥²Àx¦s¡A¥u»Ý¦s¤J25§Y¥i
        .ELSE
                mov     rdx,1           ;rdx¡×1¡Aªí¥Ü°ª¦ì²Õ¤£¬°0¡A§Y¨Ï§C¦ì¤¸²Õ¦³0
                shr     al,4            ;¤]­nÀx¦s0
                jz      zero2
                call    store_number
zero2:          call    st_low_nibble
        .ENDIF
low_byte:       dec     rsi
                mov     al,[rsi]
        .IF rdx==0
                shr     al,4            ;­Yrdx¡×0¡Aªí¥Ü°ª¦ì¤¸²Õ¬°0¡A¦pªGALªº°ª¥|¦ì¤¸¥ç¬°
                jz      zero3           ;0¡A¨º»ò¦¹0¤£Àx¦s¡F§_«h¦¹0­nÀx¦s
                call    store_number
zero3:          call    st_low_nibble
        .ELSE
                shr     al,4
                call    store_number
                call    st_low_nibble
        .ENDIF
                xor     rax,rax
                call    store
exit0:          clc
exit1:          frstor  x87stat
                ret
st0_to_sn       ENDP
;-----------------------------------------------------------------------------------------
;str_to_st0¯à§â¼Æ¦r¦r¦ê¡AÂà´«¦¨¼È®É¹ê¼Æ(80¦ì¤¸ªøªº¹ê¼Æ)¡A¨ÃÀx¦s¦bST(0)ùØ¡C
;¿é¤J¡GpStr¡Ð¼Æ¦r¦r¦ê¦ì§}¡A¦¹¼Æ¦r¦r¦ê¥H0µ²§À¡A¨Ò¦p38 31 32 2E 39 45 35 00¡Aªí¥Ü¡u812.9E5¡v
;¡@¡@¡@¡@¡@¡@0¡A¼Æ¦r¦r¦ê¥i¥H¥]§t"0"¡ã"9"ªü©Ô§B¼Æ¦r¡B¤p¼ÆÂI¡B¥¿­t¸¹¤Î"E"©Î"e"(ªí¥Ü¤Qªº¾­¤è)
;¡@¡@¡@¡@¡@¡@¡A¨ä¾l¦r¤¸³£¬O¤£¦Xªkªº¡C¦pªGpStr©Ò§}¦r¦ê¬°¸U°ê½X¡A³Ì¤jªø«×¬°54­Ó¦ì¤¸²Õ¡F¦pªG
;¡@¡@¡@¡@¡@¡@¬OASCII½X¡A³Ì¤jªø«×¬O27­Ó¦ì¤¸²Õ¡CpStr©Ò«üªº¦r¦ê¡A¥i¥H¥]§t¤Qªº¾­¤è¡A¥H"E"©Î"e"
;¡@¡@¡@¡@¡@¡@«á­±ªº¼Æªí¥Ü¡A¥i¥H¬O¥¿¼Æ¡A¤]¥i¥H¬O­t¼Æ¡A¦ý¤£¯à¥]§t¤p¼ÆÂI¡C
;¡@¡@¡@unicode¡Ð¦¹¼Æ¦r¦r¦ê¬O§_¬°¸U°ê½X¡C1¡A¸U°ê½X¡F0¡AASCII½X
;¿é¥X¡GCY¡Ð¿ù»~¡FNC¡Ð¥¿±`µ²§ô¡AST¦s¤J¼È®É¹ê¼Æ
str_to_st0      PROC    USES rax rbx rcx rdx rsi rdi pStr:QWORD,unicode:QWORD
;sign_manti¡×0¡A¥¿¼Æ¡Fsign_manti¡×1¡A­t¼Æ¡Csign_exp¡×0¡A¥¿¼Æ¡Fsign_exp¡×1¡A­t¼Æ
                LOCAL   sign_manti:BYTE,sign_exp:BYTE
                LOCAL   exp:WORD
                LOCAL   pPoint:QWORD    ;str_manti¦r¦ê¤¤¤p¼ÆÂI¦ì§}¡A­YµL¤p¼ÆÂI¡ApPoint¡×0
                LOCAL   pEndManti:QWORD ;str_manti¦r¦ê³Ì«á¤@¼Æ¦rªº¦ì§}¡A§Yµ²§ÀªºNULL¦ì§}
                LOCAL   qword_integer:QWORD
                LOCAL   str_manti[20h]:BYTE
                LOCAL   str_exp[10h]:BYTE
                LOCAL   x87stat[108]:BYTE
                fsave   x87stat
                cld
                mov     al,0
                mov     rdx,26          ;rdx¡×©I¥sªÌ¶Ç¨ÓpStr©Ò«ü©w¦r¦êªº³Ì¤jªø«×¬O´X¦ì¤¸²Õ
                cmp     unicode,0       ;Àˬdunicode°Ñ¼Æ¥u¯à¬O0©Î1¡A¦pªG¤£¬O¡A¿ù»~
                je      max_len_ok
                cmp     unicode,1
                je      uni_max_len
error:          stc
                jmp     exit1
uni_max_len:    mov     rdx,52
max_len_ok:     lea     rdi,str_exp     ;§âstr_exp¦r¦ê³]¬°0
                mov     rcx,SIZEOF str_exp
                rep     stosb
                lea     edi,str_manti   ;;§âsti_manti¦r¦ê³]¬°0
                mov     rcx,SIZEOF str_manti
                rep     stosb
                mov     sign_manti,al
                mov     sign_exp,al
;¥ýÀˬd¬O§_¦³¤£¦Xªk¦r¤¸¡A°£¤Fªü©Ô§B¼Æ¦r¡B¤p¼ÆÂI¡B¡uE¡v¡B¡ue¡v¡B¥¿­t¸¹¥H¥~¡A³£¬O¤£¦Xªkªº¡C
;°£¤FÀˬd¤§¥~¡A¤]§â¨C­Óªü©Ô§B¼Æ¦rÅܦ¨¤@­Ó¦ì¤¸²ÕªºASCII¦r¤¸¡A¦s¨ìstr_manti¡Bstr_exp¦r¦êùØ
;CL¥Nªí¤p¼ÆÂI­Ó¼Æ¡ACH¥Nªí"E"ªº­Ó¼Æ¡ACL¡BCH¥u¯à¬O1©Î0¡C¦]¬°«e­±¤w°õ¦æ¹Lrep stosb¡A¬Grcx¡×0
;BLªí¥Ü¬O§_Àx¦s"0"¡A­nÀx¦sBL¡×1¡A¦p¤p¼ÆÂI«áªº0¡B¾ã¼Æ¤w¥X²{«D¹s¼Æ¦r«áªº0¡F¤£Àx¦s¡ABL¡×0
;¡A¦p00022¡A«e¤T­Ó0¤£Àx¦s
                mov     rsi,pStr
                lea     rdi,str_manti
                add     rdx,rsi ;rdx¡×pStr³Ì«á¦ì§}
                mov     rbx,rcx
    ;¦pªG²Ä¤@­Ó¦r¤¸¬O¥¿­t¸¹¡B"E"©Î0¡A¯S§O³B²z¡C
    ;¥¿­t¸¹Àx¦s¨ìsign_mantiÅܼÆùØ¡A¦AÀˬd²Ä¤G­Ó¦r¤¸¬O§_¬°"E"©Î"e"¡A¦pªG¬Oªº¸Ü¡A¦b
    ;str_mantiÀx¦s¤@­Ó¦ì¤¸²Õ"1"¡A¦¹¥~¡A¦pªG¬O¸U°ê½X¡A°ª¦ì¤¸²ÕÀ³¬°0¡A§_«h¿ù»~¡C
    .IF BYTE PTR [rsi]=="+"
ascii_or_uni:   cmp     unicode,1
                jne     ascii_str
                cmp     BYTE PTR [rsi+1],0
                jne     error
                cmp     WORD PTR [rsi+2],0      ;¥¿­t¸¹«á¬°0
                je      error
                cmp     WORD PTR [rsi+2],"E"
                je      deal_e0
                cmp     WORD PTR [rsi+2],"e"
                jne     next_char_addr
deal_e0:        add     rsi,2
deal_e1:        mov     al,"1"
                stosb
                jmp     deal_e3
ascii_str:      cmp     BYTE PTR [rsi+1],0      ;¥¿­t¸¹«á¬°0
                je      error
                cmp     BYTE PTR [rsi+1],"E"
                je      deal_e2
                cmp     BYTE PTR [rsi+1],"e"
                jne     next_char_addr
deal_e2:        inc     rsi
                jmp     deal_e1
    .ELSEIF BYTE PTR [rsi]=="-"
                inc     sign_manti
                jmp     ascii_or_uni
    .ELSEIF (BYTE PTR [rsi]=="E")||(BYTE PTR [rsi]=="e")
                jmp     deal_e1 ;©I¥sªÌ¿é¤JÃþ¦ü"E2"(§Y100)ªº¦r¦ê
    .ELSEIF BYTE PTR [rsi]==0   ;©I¥sªÌ¿é¤JªÅ¦r¦ê
                jmp     error
    .ENDIF
    ;Àˬd¨C­Ó¦r¤¸¬O§_¦b³W©wªº½d³ò¤º¡A¥B§â«Y¼Æ©ñ¦bstr_manti¦r¦ê¡A«ü¼Æ©ñ¦bstr_exp¦r¦ê¡C
    ;¨ä²Å¸¹¦U¦s©ñ¦bsign_manti¡Bsign_expùØ¡A¨Ã°£¥h¦h¾lªº0¡C½d¨Ò¦p¤Uªí¡G
    ;©I¥sªÌ         sign_manti  str_manti   sign_exp    str_exp
    ;0.00200        0           0.002       0           0
    ;00254.25E-02   0           254.25      1           2
    ;e+08           0           1           0           8
    ;-e-5           1           1           1           5
    ;-1.602E-19     1           1.602       1           19
next_char:      mov     al,[rsi]
    .IF al==0
        .IF pEndManti==0                ;¦pªG¤w¨ìpStr©Ò«ü¦r¦êµ²§À¡ApEndManti¤´¬°0
                mov     pEndManti,rdi   ;ªí¥ÜpStr©Ò«ü¦r¦ê¤¤¡AµL"E"©Î"e"¦r¤¸
        .ENDIF
                jmp     calc_exp
    .ELSEIF al=="."
                inc     cl
                cmp     cl,1            ;¶W¹L¤@­Ó¤p¼ÆÂI
                ja      error
                cmp     bl,0            ;­YBL¡×0¡Aªí¥ÜÃþ¦ü¡u000.12¡vµL¾ã¼Æ³¡¥÷
                jnz     @f              ;¬G­n¦s¤@­Ó"0"¡A¦A¦s¤@­Ó"."
                mov     BYTE PTR [rdi],"0"
                inc     rdi
@@:             mov     pPoint,rdi
                mov     bl,1
                stosb
    .ELSEIF al=="0"
                cmp     bl,0
                jz      next_char_addr
                stosb
    .ELSEIF (al>="1")&&(al<="9")
                mov     bl,1            ;¥X²{«D¹s¼Æ¤§«áªº"0"¡A­nÀx¦s
                stosb
    .ELSEIF (al=="E")||(al=="e")
deal_e3:        inc     ch
                cmp     ch,1            ;¶W¹L¤@­Ó"E"©Î"e"
                ja      error
                mov     pEndManti,rdi
                mov     bl,0            ;¥X²{"E"«á¡A¦b«D¹s¼Æ¤§«eªº"0"¡A¤£Àx¦s
                lea     rdi,str_exp     ;­Y"E"©Î"e"¡A¨Ïrdi¡×str_exp¦r¦ê¦ì§}¡A¥H¦s¤Qªº¾­¤è
        .IF unicode==1
                add     rsi,2
                cmp     BYTE PTR [rsi],0;"E"«á­±¨S¦³¦r¤¸¡A¿ù»~
                je      error
                cmp     WORD PTR [rsi],"+"
                jne     chk_neg0
                cmp     WORD PTR [rsi+2],0
                je      error
                jmp     next_char_addr
chk_neg0:       cmp     WORD PTR [rsi],"-"
                jne     next_address
                cmp     WORD PTR [rsi+2],0
                je      error           ;"E-"¤§«á¨S¦³¦r¤¸¡A¿ù»~
                inc     sign_exp
        .ELSE
                inc     rsi
                cmp     BYTE PTR [rsi],0
                je      error
                cmp     BYTE PTR [rsi],"+"
                jne     chk_neg1
                cmp     BYTE PTR [rsi+1],0
                je      error           ;"E+"¤§«á¨S¦³¦r¤¸¡A¿ù»~
                jmp     next_char_addr
chk_neg1:       cmp     BYTE PTR [rsi],"-"
                jne     next_address
                cmp     BYTE PTR [rsi+1],0
                je      error           ;"E-"¤§«á¨S¦³¦r¤¸¡A¿ù»~
                inc     sign_exp
        .ENDIF
    .ELSE
                jmp     error           ;¥X²{¤£¦Xªk¦r¤¸
    .ENDIF
next_char_addr: test    unicode,1       ;¨Ì¾ÚpStr¦r¦ê¬O§_¬°¸U°ê½X¡A¨M©wrsi¥[¤@©Î¥[¤G
                jz      not_unicode     ;¦pªG¬O¸U°ê½X¡A°ª¦ì¤¸²ÕÀ³¬°0¡A§_«h¿ù»~
                cmp     BYTE PTR [rsi+1],0
                jnz     error
                add     rsi,2
                jmp     next_address
not_unicode:    inc     rsi
next_address:   cmp     rsi,rdx ;¦pªGpStr©Ò«ü¦r¦ê¡A¶W¹Lªø«×ÁÙ¨Sµ²§ô¡A¿ù»~
                je      error
                jmp     next_char
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
qword_ten       DQ      10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;calc_integer°Æµ{¦¡§ârsi©Ò«ü¦r¦ê¤ºªºªü©Ô§B¼Æ¦r¦r¦ê¡AÅܦ¨¤Q¤»¶i¦ì¾ã¼Æ¡A¦s©óRAXùØ
calc_integer:   xor     rax,rax
next_number:    movzx   rbx,BYTE PTR [rsi]
                cmp     bl,0
                je      calc_int_ok
                cmp     bl,"."
                je      calc_int_ok
                mul     qword_ten
                sub     bl,"0"
                add     rax,rbx
                jmp     next_number
calc_int_ok:    mov     qword_integer,rax
                DB      0c3h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;­pºâ¤Qªº¾­¤è¼Æ¡A¥ç§Y§âstr_exp¦r¦ê¡AÅܦ¨¤Q¤»¶i¦ì¼Æ­È¡A¨Ã¦s©óexpÅܼÆùØ¡Cstr_to_st0°Æµ{¦¡°õ
;¦æ¨ìcalc_exp³B¡A¤w¸g§â©I¥sªÌ¶Ç¨Óªº¦r¦ê¡AÅܦ¨«Y¼Æ¦r¦ê(str_manti)¤Î¾­¤è¦r¦ê(str_exp)¡A¥B³o
;¨â­Ó¦r¦ê¡A³£¤w²¤Æ¡C
calc_exp:       lea     rsi,str_exp
                call    calc_integer
                mov     exp,ax
;Àˬd©I¥sªÌ¿é¤JªºpStr©Ò«ü¦r¦ê¡A¬O§_Ãþ¦ü"0"¡B"000"µ¥¦r¦ê¡A¦¹¦r¦êªí¥Ü¼Æ­È0
                mov     rsi,pEndManti
                lea     rdx,str_manti
                cmp     rsi,rdx
                jne     chk_end_0
zero_input:     fldz
                jmp     exit0
;Àˬd©I¥sªÌ¿é¤JªºpStr©Ò«ü¦r¦ê¡A¬O§_Ãþ¦ü"00.000"¡B"000.00E2"µ¥¦r¦ê¡A¦¹¦r¦ê¤]ªí¥Ü¼Æ­È0¡C°µ¦¹
;Àˬd®É¡A¥ý§R°£¤p¼ÆÂI«á¡A¦r¦êµ²§Àªº"0"¡F¦ý¦b§R°£0¤§«e¡A¥ýÀˬd¬O§_¨S¦³¤p¼Æ³¡¤À
chk_end_0:      mov     rbx,pPoint      ;¦pªG¨S¦³¤p¼ÆÂI¡Aªí¥Ü¨S¦³¤p¼Æ¡A¥u¦³¾ã¼Æ
                or      rbx,rbx
                jz      del_end_0_ok
@@:             cmp     BYTE PTR [rsi-1],"0"
                jne     @f
                dec     rsi
                jmp     @b
@@:             cmp     BYTE PTR [rsi-1],"."
                jne     point_part
                dec     rsi
                mov     BYTE PTR [rsi],0
                mov     pEndManti,rsi
                mov     pPoint,0
                jmp     del_end_0_ok
point_part:     mov     BYTE PTR [rsi],0
                mov     pEndManti,rsi   ;--st0--;--st1--;--st2--;
;©I¥sªÌ©Ò¶Ç¤Jªº¦r¦ê©Ò¥Nªíªº¼Æ­È¡A¥i¥H¼g¦¨r¡Ar¡×m¡Ñ10^e¡Am¥i¥H¼g¦¨¾ã¼Æ³¡¤À¡Ai¡A¤Î¤p¼Æ³¡¤Àf
;¡Cf¤S¥i¥H¬Ý¦¨¬O¤p¼Æ³¡¤À­¼¥H¬Y­Ó¤Qªº¾­¤è¡A¦Ó¦¨ªº³Ì¤p¾ã¼Æ¦A°£¥H¬Y­Ó¤Qªº¾­¤è¡C¨Ò¦p¡A©I¥sªÌ
;¿é¤Jªº¦r¦ê©Ò¥Nªíªº¼Æ¬°1.602¡Ñ10^2¡Am¡×1.602¡Ai¡×2¡Af¡×0.602¡×602¡Ò1000¡×x¡Ò10^3¡Ax§Y¬°¤p¼Æ
;³¡¤À­¼¥H¬Y­Ó¤Qªº¾­¤è¡A¦Ó¦¨ªº³Ì¤p¾ã¼Æ¡C¬Y­Ó¤Qªº¾­¤èªº¾­¤è¼Æ§Y¬°10^(¤p¼Æ¦ì¼Æ)
;r¡×(i¡Ïf)¡Ñ10^e¡×i¡Ñ10^e¡Ïf¡Ñ10^e¡×i¡Ñ10^e¡Ïx¡Ò10^d¡Ñ10^e¡Ad¡×¤p¼Æ¦ì¼Æ
del_end_0_ok:   fild    exp             ;   e   ;e¡×pStr©Ò«ü¦r¦ê¤¤¤Qªº¾­¤èµ´¹ï­È
                cmp     sign_exp,1
                jne     pos_exp
                fchs                    ;¦pªG¤Qªº¾­¤è¬°­t¡A«h§ïÅÜST(0)¤§²Å¸¹
                fist    exp             ;exp¡×¯u¥¿ªº¤Qªº¾­¤è¼Æ
pos_exp:        fild    qword_ten       ;  10   ;   e   ;       ;
                call    x_p_y           ; 10^e  ;       ;       ;
                lea     rsi,str_manti
                call    calc_integer
                fild    qword_integer   ;   i   ;  10^e ;       ;
                fmul                    ; i*10^e;       ;       ;
                cmp     pPoint,0        ;¦pªGpPoint¡×0¡Aªí¥Ü¨S¦³¤p¼Æ³¡¤À
                je      exit0
                mov     rbx,pEndManti
                sub     rbx,pPoint
                dec     rbx             ;rbx¡×d¡×pStr©Ò«ü¦r¦ê¤¤¡A¤p¼Æ¦ì¼Æ
                sub     exp,bx          ;exp¡×e¡Ðd¡×p
                fild    exp             ;   p   ; i*10^e;       ;
                fild    qword_ten       ;  10   ;   p   ; i*10^e;
                call    x_p_y           ; 10^p  ; i*10^e;       ;
                mov     rsi,pPoint
                inc     rsi
                call    calc_integer    ;©³¤Uªºf¡×pStr©Ò«ü¦r¦êªº¤p¼Æ³¡¤À¡AÅܦ¨ªº³Ì¤p¾ã¼Æ
                fild    qword_integer   ;   x   ; 10^p  ; i*10^e;
                fmul                    ; x*10^p; i*10^e;       ;
                fadd                    ;   r   ;       ;       ;
exit0:          cmp     sign_manti,1
                jne     pos_manti
                fchs
pos_manti:      clc
                fstp    TBYTE PTR str_manti
exit1:          frstor  x87stat
                jc      exit2
                fld     TBYTE PTR str_manti
exit2:          ret
str_to_st0      ENDP
;*****************************************************************************************
END             DLLEntry

¼Ò²Õ©w¸qÀÉ¡AMYFPU.DEF ªº¤º®e¦p¤U¡G

1
2
3
4
EXPORTS
        two_p_x
        x_p_y
        st0_to_s

¨Ì©³¤Uªº¤è¦¡²ÕĶ¤Î³sµ²¡A´N¯à±o¨ì MYDLL.DLL ¤Î MYDLL.LIB¡G

E:\HomePage\SOURCE\Win64\FPU>uasm64 -win64 mydll.asm [Enter]
UASM v2.46, Jan  8 2018, Masm-compatible assembler.
Portions Copyright (c) 1992-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.

MYDLL.ASM: 645 lines, 4 passes, 15 ms, 0 warnings, 0 errors

E:\HomePage\SOURCE\Win64\FPU>link /DLL /DEF:myfpu.def myfpu.obj [Enter]
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/SUBSYSTEM:WINDOWS /DEBUG
   Creating library myfpu.lib and object myfpu.exp

E:\HomePage\SOURCE\Win64\FPU>

¦b°Æµ{¦¡ùØ­±ªº¤º´O°Æµ{¦¡

¦b st0_to_sn °Æµ{¦¡ùØ¡A±`·|¥Î¨ì­n§âªü©Ô§B¼Æ¦r¡A¨Ì¾Ú©I¥sªÌ©Ò«ü©wªº¤è¦¡¡AÀx¦s¦¨ ASCII ©Î¸U°ê½X¦r¤¸¡C¦pªG§â¥¦¼g¦¨°Æµ{¦¡¡A´N¯à¸`¬Ùµ{¦¡½X¡C·Q­n¦b°Æµ{¦¡ùØ¡A­n¦w´¡­Ó°Æµ{¦¡¡A¨Ã¤£¬O±`³Wªº°µªk¡A¦ý¬O¤]¤£¬O¤£¥i¥H¡C³oºØ°Æµ{¦¡¬Oª½±µ±N¨äµ{¦¡½X¡A¦w´¡¦b¥t¤@­Ó°Æµ{¦¡¤¤¡A¦ü¥G¨S¦³¯S§Oªº¦WºÙ¡A¤p¤ì°¸©h¥BºÙ¬°¤º´O°Æµ{¦¡¡C¦b st0_to_sn °Æµ{¦¡ùØ¡A¨ä¹ê´N¦w´¡¤F¤T­Ó¤º´O°Æµ{¦¡¡A¦b²Ä 165¡ã192 ¦æ¡A¤p¤ì°¸¥H¤@¾ã¦æªº¡u;;;;;;;¡K¡K¡v¤À¹j¡C

±z¥i¥HÀ˵ø³o­Ó¨Ò¤l¡A±z·|µo²{¤º´O°Æµ{¦¡¡A¬O¥H¼Ð¸¹¥N´À°Æµ{¦¡¦WºÙ¡A¦Ó¦b¦¹°Æµ{¦¡µ²§À¤§³B¡A¥H¡uDB 0c3h¡v¥N´À¡uret¡v«ü¥O§Y¥i¡C­n©I¥s¤º´O°Æµ{¦¡®É¡A¥u»Ý¤U¹F¡ucall¡v«ü¥O§Y¥i¡C·Q·íµM¦Õ¡A¦pªG¦³°Ñ¼Æªº¸Ü¡A¥Î°ïÅ|¶Ç»¼¥i¯à¸û¬°³Â·Ð¡A¥ÎÅܼƩμȦs¾¹¶Ç»¼¡A¥i¯à¬O¸û¤è«Kªº°µªk¡C

©³¤U¸ÑÄÀ¬°¦ó¤£¥Î¡uret¡v«ü¥Oªð¦^°Æµ{¦¡©O¡H³o¬O¦]¬°²ÕĶ¾¹¦b«Å§i°Æµ{¦¡¡A©Mµ²§ô°Æµ{¦¡®É¡A·|¥[¤W³\¦h³B²z°ïÅ|®Øªº«ü¥O¡C·í²ÕĶ¾¹²ÕĶ­ì©l½X®É¡A¬Ý¨£¡uret¡v«ü¥O®É¡A´N·|ª¾¹D°Æµ{¦¡­nµ²§ô¤F¡A´N·|¥[¤J¤@¨Ç³B²z°ïÅ|®Øªº«ü¥O¡C¦]¦¹¡A¦pªG­ì©l½X¤¤¡A¤º´O°Æµ{¦¡¥H¡uret¡vªð¦^¡A¨º»ò²ÕĶ¾¹·|¦h¥[³B²z°ïÅ|®Øªºªº«ü¥O¡C¦Ó¦b°õ¦æ®É¡A·í¤º´O°Æµ{¦¡°õ¦æ§¹¦¨¡A­nªð¦^°Æµ{¦¡®É¡A¦pªG°õ¦æ¨ì³o¨Ç¦h¥X¨Ó³B²z°ïÅ|®Øªº«ü¥O¡A¨º»ò´N·|ªð¦^¨ì©I¥s°Æµ{¦¡ªºµ{¦¡¡A¦Ó¤£¬Oªð¦^°Æµ{¦¡¤F¡C©Ò¥H¤º´O°Æµ{¦¡ªºªð¦^«ü¥O¡A¤£¯à¦b­ì©l½X¤¤¼g¡uret¡v¡A¦ý¬O¹ê»Ú¤W¬O¡A¥u­n°õ¦æ¡uret¡v«ü¥O¡A«o¤£­n¦³¦h¥X¨Ó³B²z°ïÅ|®Øªº«ü¥O¡C¤S¦]¬°¡uret¡v«ü¥Oªº¾÷±ñ½X¬O¡u0c3h¡v¡A©Ò¥H°®¯Ü¦b­ì©l½X¼g¤J¦¹¦ì¤¸²Õ¡A´N¥u±o¡uret¡v«ü¥O¡A¦Ó¨S¦³¦h¾l³B²z°ïÅ|®Øªº«ü¥O¡C¦pªG·Q­n¦b¤@°Æµ{¦¡¤º¡A´¡¤J¤@¤º´O°Æµ{¦¡¡A¨äµ{¦¡½X¦p¤U¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
;-------------------------------------------------------------------------------
°Æµ{¦¡¦W        PROC    USES ¼È¦s¾¹¦Cªí °Ñ¼Æ1:DWORD,°Ñ¼Æ2:DWORD,...
                °Æµ{¦¡¤§µ{¦¡½X
                   .
                   .
                   .
                jmp     label1
;;;;¤º´O¤§°Æµ{¦¡¶}©l;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
subroutine:     ¤º´O°Æµ{¦¡¤§µ{¦¡½X¶}©l
                   .
                   .
                   .
                ¤º´O°Æµ{¦¡¤§µ{¦¡½Xµ²§ô
DB              0c3h
;;;;¤º´O¤§°Æµ{¦¡µ²§ô;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
label1:         °Æµ{¦¡¨ä¾lµ{¦¡½X
                   .
                   .
                   .
                call    subroutine      ;©I¥s¤º´O¤§°Æµ{¦¡
                   .
                   .
                   .
                °Æµ{¦¡µ²§ô
                ret
°Æµ{¦¡¦W        ENDP
;-------------------------------------------------------------------------------

¥t¥~¡A±z¤]¥i¥H¬Ý¨£¡A¦pªG¦b°Æµ{¦¡¤¤¡A­n¥Î¨ì¥u¦³¦¹°Æµ{¦¡·|¨Ï¥Î¨ìªº±`¼Æ¡A¤]¥i¥H¦b¬Y¦¸¸õÅD«á¡A©w¸q¦¹±`¼Æ¡C¨Ò¦p 193 ¦æªº word_ten ±`¼Æ¡A¥H¤Î«á­±ªº±`¼Æ¦r¦ê¡A³£¬OÄݩ󦹺ر¡§Î¡C


«á°O

¦b¼¶¼g str_to_st0 ªº¹Lµ{¤¤¡A¤p¤ì°¸µo²{ UASM ²ÕĶ®É¡A°Ï°ìÅܼƶñ¤J°ïÅ|ªº¦ì¸m¡A¨Ã¨S¦³·Ó¶¶§Ç¡A


¾\Ūªþ¿ý¤G