n¯Âºé¥Î²Õ¦X»y¨¥¡A³B²z¿é¤J¯BÂI¼Æ©Î±N¯BÂI¼Æ¿é¥X¦b¿Ã¹õ¤W¡A¨Ã«D°µ¤£¨ì¡A¦ý«o¤£¬O²³æªº¨Æ¡C©Ò¥H³o¤@³¹§Q¥Î²³æªº¤èªk¶¹L¥h¡A¤£¨Ï¥Î²Õ¦X»y¨¥¡A¦Ó¬O©I¥s C »y¨¥¨ç¦¡¡AÅý¨Ï¥ÎªÌ¿é¤J¯BÂI¼Æ¡AµM«á¹Bºâ¡A³Ì«á¦A±Nµ²ªG¦L¦b¿Ã¹õ¤W¡C
³o¤@³¹·|¨Ï¥Î¨ì scanf¡Bprintf¡Bsqrt ¤TÓ C »y¨¥¨ç¦¡¡A¥¦Ì¨Ã«DÄÝ©ó Win64 API ¨ç¦¡¡A¦Ó¬OÄÝ©ó C »y¨¥¼Ð·Ç¨ç¦¡¡CC »y¨¥¬O¤¦¥§´µ¨½©_¡]Dennis Ritchie¡^µo©úªº¡A¦b¨º¤§«á¤£¤[¡A¦³¤@¸s«e½ú¼¶¼g¥X³\¦h¨ç¦¡¡A¥]§t scanf¡Bprintf¡Bsqrt µ¥¨Ñ C »y¨¥©I¥s¡C¨ì¤F¦è¤¸ 1989 ¦~¡A¬ü°ê°ê®a¼Ð·Ç¨ó·|¡]ANSI¡^¥¿¦¡³q¹L¤F C »y¨¥ªº°ê®a¼Ð·Ç¡A¤]±N±`¥Îªº¨ç¦¡¶°¦X°_¨Ó¡A»s§@¦¨ C »y¨¥¼Ð·Ç¨ç¦¡®w¡A³o¨Ç¨ç¦¡´N¥]§t¤F¥»³¹©Ò¨Ï¥Îªº scanf¡Bprintf¡Bsqrt¡C
·L³nªº Windows §@·~¨t²Î¥Dn¬O¥Ñ C ¤Î C¡Ï¡Ï »y¨¥¼¶¼gªº¡A©Ò¥H¤]·|¨Ï¥Î C »y¨¥¼Ð·Ç¨ç¦¡®w¡C¬°¦¹¡A·L³n¹ê§@¤F C »y¨¥¼Ð·Ç¨ç¦¡®w¡AºÙ¬° MSVCRT.DLL¡]Microsoft Visual C++ Runtime¡^°ÊºA³sµ²¦¨¦¡®w¡CMSVCRT.DLL ¤]¥]§t¤F scanf¡Bprintf¡Bsqrt ¨ç¦¡¡A¦b²Õ¦X»y¨¥¤¤¤]¥i¥H©I¥s¥¦Ì¡A¥»³¹·|»¡©ú¦p¦ó¹ê²{¡C
¥Î²Õ¦X»y¨¥¼¶¼g Win64 µ{¦¡¡A©I¥s C »y¨¥¨ç¦¡®É¡A¸ò©I¥s Win64 API ¤@¼Ë¡A³£n¿í¦u x64 ©I¥sºD¨Ò¡G
⑴¡B¨ç¦¡ªº¦^¶ÇÈÂÇ¥Ñ RAX ¶Ç¦^¡F¦ý¬O¡A¦pªG¦^¶ÇȬO¯BÂI¼Æ¡A¨º»ò·|ÂÇ¥Ñ XMM0 ¼È¦s¾¹¶Ç¦^¡C
⑵¡B«e¥|ӰѼơA¦pªG¬O¾ã¼Æ¡A¾a RCX¡BRDX¡BR8¡BR9 ¶Çµ¹¨ç¦¡¡F¦pªG°Ñ¼Æ¬O¯BÂI¼Æ¡A«h¨Ì§ÇÂÇ¥Ñ XMM0¡BXMM1¡BXMM2¡BXMM3 ¶Çµ¹¨ç¦¡¡C²Ä¤Ó¤Î¨ä¥H«áªº°Ñ¼Æ¡A¤£½×¬O¾ã¼ÆÁÙ¬O¯BÂI¼Æ¡A³£ÂǥѰïÅ|¶Ç¶Çµ¹¨ç¦¡¡C
⑶¡B°²¦p«e¥|ӰѼƬO¾ã¼Æ»P¯BÂI¼Æ¥æ¿ù¡A¨º»ò´N¥u¬Ý°Ñ¼Æ¦b²Ä´XÓ¦ì¸m¡A¥H¬Û¹ïÀ³ªº¼È¦s¾¹¶Ç»¼¡C¨Ò¦p¨ç¦¡ªº²Ä¤@ӰѼƬO¾ã¼Æ¡A²Ä¤GӰѼƬO¯BÂI¼Æ¡A²Ä¤TӰѼƬO¾ã¼Æ¡A²Ä¥|ӰѼƬO¯BÂI¼Æ¡A¨º»ò²Ä¤@¡ã²Ä¥|ӰѼƨ̧ǩñ¦b RCX¡BXMM1¡BR8¡BXMM3¡C
⑷¡B¹ï©ó¥iÅܰѼÆÓ¼Æ¨ç¦¡¡AWindows ³W©w¯BÂI¼Æ¥²¶·¦P®É¦s¤J XMM ¼È¦s¾¹»P¬Û¹ïÀ³ªº³q¥Î¼È¦s¾¹¡A³o¼Ë§Y¨Ï¸ê®ÆÃþ«¬¤£½T©w¡A¨ç¦¡ÁÙ¬O¥i¥H¨ì³q¥Î¼È¦s¾¹¥h§ä¨ì¸ê®Æ¡Cscanf »P printf ¬O¥iÅܰѼÆÓ¼Æ¨ç¦¡¡A¦]¦¹n¿í¦u³o³W«h¡C
⑸¡BXMM0¡ãXMM5 ¬O´§µo©Êªº¡A©I¥s¨ç¦¡«á¨ä¼ÆÈ¥i¯à·|§ïÅÜ¡FXMM6¡ãXMM15 ¬O«D´§µo©Ê¡A¦b¨ç¦¡¤º¦pªGn¥Î¨ì³o¨Ç¼È¦s¾¹¡A¨ç¦¡¥²¶·t³d«O¦s³o¨Ç«D´§µo©Ê¼È¦s¾¹¡C
⑹¡B¨ä¥Lªº x64 ©I¥sºD¨Ò¡A¨Ò¦p¼v¤lªÅ¶¡¡BRSP ¹ï»ô¸`¦ì§}µ¥³£n¿í¦u¡A´N¤£¦AÂØz¡C
¦b Win64 ²Õ¦X»y¨¥¤¤¡An©I¥s C »y¨¥¨ç¦¡¡AÁÙ±o¦bì©lµ{¦¡¤¤±N MSVCRT.LIB ¶×¤Jµ{¦¡®w¯Ç¤J¡C¤§«e§Ú̼¶¼g Win64 ²Õ¦X»y¨¥ì©lµ{¦¡¡A²Ä¤@¦æ³q±`³£¬O
INCLUDE E:\masm64\include64\masm64rt.inc
MASM64RT.INC ùر´N¦³¤@±ø«ü¥O¡uINCLUDELIB MSVCRT.LIB¡v¡A¥i¥H§â MSVCRT.LIB ¯Ç¤J¶i¨Ó¡C¤]´N¬O³o¹D«ü¥O¡A©Ò¥H¦b Win64 ²Õ¦X»y¨¥¤¤¡A§¹¥þ¥i¥H©I¥s C »y¨¥¨ç¦¡¡C
scanf ªº¥\¯à¬O±q¼Ð·Ç¿é¤J¸Ë¸m¡]¤]´N¬OÁä½L¡^Ū¨ú¸ê®Æ¡A¨Ã®Ú¾Ú®æ¦¡±±¨î¦r¦ê¡A§â¸ê®ÆÂà´«¦¨¹ïÀ³ªº¸ê®ÆÃþ«¬¡A³Ì«á¦s¤J°O¾ÐÅ餤¡Cscanf ªº»yªk¦p¤U¡G
int scanf(
const char *format,
argument,
⁝
);
¤W±ªº»yªk¬O·L³nºô¯¸¤W¨Ì¾Ú C »y¨¥®æ¦¡¼gªº¡A¸ò¥H«e MSDN ¤¤ªº®Ñ¼g¤è¦¡¤j¦P¤p²§¡C¨ç¦¡¦WºÙ«eªº¸ê®ÆÃþ«¬¡A¥Nªí¦^¶ÇȪº¸ê®ÆÃþ«¬¡F³o¨à scanf «eªº int ªí¥Ü scanf ªº¦^¶ÇȬ°¾ã¼Æ¡]integer¡^¡A¦b Win64 ùØ¡Aint ³£¬OÂù¦r²Õªø¡]Âù¦r²Õ¬O 32 ¦ì¤¸¡^¡C±µ¤U¨Ó¬O¨ç¦¡¦WºÙ¡A¶·ª`·N¤j¤p¼g¦³§O¡C±µ¤U¨Ó¬O¤@¹ï¤p¬A¸¹¡A¤p¬A¸¹¤º¬O°Ñ¼Æ¡A¤p¬A¸¹«á¬O¡u;¡v¥Nªí¨ç¦¡µ²§ô¡C¨CӰѼƳ£¥Ñ¡u¸ê®ÆÃþ«¬¡v¡B¡u°Ñ¼Æ¦WºÙ¡v¨â³¡¤À²Õ¦¨¡C
²Ä¤@ӰѼƬO¡uconst char *format¡v¡A¨ä¤¤¡uconst char¡v¬O¸ê®ÆÃþ«¬¡A¡u*format¡v¬O°Ñ¼Æ¦WºÙ¡Cchar ¥Nªí¦r¤¸¡A¦b C »y¨¥ùØ¡A¦r¦ê¬O¤@³s¦êªº¦r¤¸²Õ¦¨¡A©Ò¥H¤]¥i¥H§â char ¬Ý¦¨¦r¦ê¡C«e±ªº const ¬O±`¼Æªº·N«ä¡Aªí¥Ü¦b¨ç¦¡°õ¦æ¹Lµ{¡A¤£·|§ïÅÜ format ¦r¦ê¤º®e¡Cformat ºÙ¬°®æ¦¡±±¨î¦r¦ê¡Ascanf ·|¨Ì¾Ú format ªº¤º®e±N¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¡AÂà´«¦¨¾A·í¸ê®ÆÃþ«¬¡A¨Ì§Ç¦s¤J²Ä¤G¡B²Ä¤TÓ¡K¡K°Ñ¼Æ«ü©wªºÅܼƤº¡Cformat «e¦³Ó¡u*¡v¡A¥Nªí¦ì§}¡CÁ`µ²¨Ó»¡¡A¡uconst char *format¡vªí¥Ü²Ä¤@ӰѼƬO®æ¦¡±±¨î¦r¦ê¦ì§}¡A¦Ó¦¹¦r¦ê¦b¨ç¦¡°õ¦æ¹Lµ{¡A¤£·|§ïÅÜ¡C
²Ä¤GӰѼƬO argument¡A¨ä«áÁÙ¦³¡u⁝¡v¡A¥Nªí¥i¯à¦³²Ä¤T¡B¥|Ó¡K¡K°Ñ¼Æ¡A¤]´N¬O»¡ scanf ªº°Ñ¼ÆÓ¼Æ¨Ã¤£©T©w¡C²Ä¤G°Ñ¼Æ¤Î¨ä«áªº°Ñ¼Æ¡A³£¬OÅܼƪº¦ì§}¡A¥i¯à¬O¼ÆÈÅܼơA¤]¥i¯à¬O¦r¦êÅܼơA¤£½×¬Oþ¤@ºØ³£¨S¦³ªí©ú¸ê®ÆÃþ«¬¡A³o¬O¦]¬°¥¦Ìªº¸ê®ÆÃþ«¬¥Ñ®æ¦¡±±¨î¦r¦ê¨M©w¡A¨Ã¤£¬O©T©w¤£Åܪº¡Cscanf §â¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¡A¨Ì¾Ú®æ¦¡±±¨î¦r¦ê¤º«ü©wªº¸ê®ÆÃþ«¬¡AÂà´«¦n«áÂǥѳo¨ÇÅܼƪº¦ì§}¡A¦s¤J¬Û¹ïÀ³ªºÅܼÆùØ¡C
¦b»¡©ú®æ¦¡±±¨î¦r¦ê¤§«e¡A¥ý¬Ý¤@Ó²³æªº¨Ò¤l¡A¥i¯à¦³§U©óÁA¸Ñ scanf¡G
string DB 40h DUP (0) x DD ? szFmt DB "%d %s",0 invoke scanf,ADDR szFmt,ADDR x,ADDR string
¦pªG¨Ï¥ÎªÌ¿é¤J¡u5 books¡v¡A¨º»ò x ·|µ¥©ó 5¡Astring ¦r¦ê·|Åܦ¨¡u"books",0¡v¡C¤W±¨Ò¤l¤¤¡A²Ä¤@ӰѼƬO szFmt ªº¦ì§}¡AszFmt ºÙ¬°®æ¦¡±±¨î¦r¦ê¡A¥¦¥Ñ¤@өΦhӮ榡³W½d²Õ¦¨¡C®æ¦¡³W½d¬O¥Ñ¡u%¡v¶}ÀY¡AszFmt §t¦³¨âӮ榡³W½d¡A¥¦Ì¤À§O¬O¡u%d¡v¡B¡u%s¡v¡A«eªÌªí¥Ü¤Q¶i¦ì¦³¸¹¼Æ¡A«áªÌªí¥Ü¦r¦ê¡C¦]¦¹¨Ï¥ÎªÌÀ³¥ý¿é¤J¼ÆÈ¦r¦ê¡A¦A¿é¤J¦r¦ê¡Cscanf ·|§â¼ÆÈ¦r¦êÂà´«¤Q¶i¦ì¦³¸¹¼Æ¡AµM«á±NÂà´««áªº¼ÆÈ¦s¤J¨ì²Ä¤GӰѼƩҫü©wªº¦ì§}¤W¡F¦P¼Ëªº¡Ascanf ¤]·|§â¨Ï¥ÎªÌ¿é¤Jªº¦r¦ê¡A¦s¤J¨ì²Ä¤TӰѼƩҫü©wªº¦ì§}¤W¡C¦]¦¹¡A®æ¦¡±±¨î¦r¦ê¤ºªº®æ¦¡³W½d¡A¥²¶·©M«á±ªº°Ñ¼Æ·f°t¦n¡C
scanf ªº¦^¶ÇȦs©ó RAX ¤º¡A¦³¤TºØ±¡§Î¡G
①¡B¥¿¾ã¼Æ¡Gªí¥Ü¦¨¥\Âà´«¨ÃÀx¦sªºÅܼÆÓ¼Æ¡C¨Ò¦p¤W±ªº¨Ò¤l¡ARAX¡×2¡C
②¡B0¡G¦³¿é¤J¸ê®Æ¡A¦ý²Ä¤@Ӯ榡³W½d´N¤£²Å¡C¨Ò¦p¤W¨Ò¤¤¡A¨Ï¥ÎªÌ¿é¤J¡ufive books¡v¡A¨º»ò RAX¡×0¡C³o®É³Ì¦nn©I¥s getchar ²M°£¿é¤J½w½Ä°Ï¡A§_«h¤U¦¸Åª¨ú·|¥d¦º¡C
③¡B¡Ð1¡]EOF¡^¡GŪ¨ú¥¢±Ñ©Î¨ì¹F¸ê®Æ¥½ºÝ¡C·í¨Ï¥ÎªÌ«ö¤U Ctrl¡ÐZ¡A·|IJµo EOF¡]ÀÉ®×µ²§ô²Å¸¹¡Aend of file¡^¡A¦b DOS ®É¥N¡ACtrl¡ÐZ¡]ASCII ½X¬° 1Ah¡^³Q¥Î§@¯Â¤å¦rÀɮתºµ²§ô²Å¸¹¡C
scanf ³Ì«nªº°Ñ¼Æ¬O®æ¦¡±±¨î¦r¦ê¡A¥¦¥²¶·¥H¹sµ²§À¡A¨ä¤º®e¥]§t¤@өΦhӮ榡³W½d¡A¤]¥i¥H¥]§t¨ä¥L¦r¤¸¡C®æ¦¡³W½d§i¶D scanf nŪ¨ú¤°»òÃþ«¬ªº¸ê®Æ¡]¨Ò¦p¾ã¼Æ¡B¯BÂI¼ÆÁÙ¬O¦r¤¸¡^¡A¼Ë¤l¦p¤U¡G
%[*][width][size]type
¤W±ªº®æ¦¡³W½d¤¤¡A¦b¤@¹ï¤¤¬A¸¹¤ºªº¥i¥H¬Ù²¤¡A¦Ó¡u%¡v»P type ¤£¥i¬Ù²¤¡A¥ý»¡©ú³o¨âÄæ¡A¦A»¡©ú¨ä¥LÄæ¦ì¡G
⑴¡B%¡G¥Nªí®æ¦¡³W½d¶}©l¡C
⑵¡Btype¡G¨M©w¦p¦ó¸ÑŪ¿é¤Jªº¸ê®Æ¡A¨ÃÂà´«¦¨¹ïÀ³ªº¸ê®Æ«¬§O¡A©³¤Uªº⒜¡ã⒡¦b¹w³]±¡§Î¤U¡A³£·|§â¨Ï¥ÎªÌ¿é¤Jªº¸ê®ÆÂà´«¦¨Âù¦r²Õªº¼ÆÈ¡AµM«áÀx¦s¦b¨ä«á°Ñ¼Æ¬Û¹ïÀ³ªº«ü©w¦ì§}¤W¡Ctype ¥i¥H¬O¤U±Ãþ«¬¡G
⒜¡Bd¡G§â¿é¤Jªº¸ê®Æµø¬°¤Q¶i¦ì¦³¸¹¼Æ¡C
⒝¡Bu¡G§â¿é¤Jªº¸ê®Æµø¬°¤Q¶i¦ìµL¸¹¼Æ¡C
⒞¡Bi¡G»P d Ãþ¦ü¡A¦ý¬O¯à¦Û°Ê§PÂ_´X¶i¦ì¡C§PÂ_¤è¦¡¬O¬Ý«e´XÓ¦r¤¸¡A¦pªG¬O 0X ©Î 0x ´N¬O¤Q¤»¶i¦ì¡A¦pªG¬O 0 ´N¬O¤K¶i¦ì¡A¨ä¥L±¡§Î¬O¤Q¶i¦ì¡C
⒟¡Bx »P X¡G¨âªÌ¬Û¦P¡A¤£½×«e±¦r¤¸¬O§_¦³ 0X ©Î 0x¡A³£§â¸ê®Æµø¬°¤Q¤»¶i¦ì¡C
⒠¡Bo »P O¡G¨âªÌ¬Û¦P¡CC »y¨¥³W©w¡A¾ã¼Æ±`¼Æ¦pªG¥H 0 ¶}ÀY¡A´Nªí¥Ü¬O¤K¶i¦ì¼Æ¡C¦pªG«ü©w¤F %o ©Î %O¡A¨º»ò¤£½×¬O§_¥H 0 ¶}ÀY¡A³£µø¬°¤K¶i¦ì¡Ascanf ±N¨äÂà´«¦¨Âù¦r²Õ«á¡A¦s©ó¬Û¹ïÀ³°Ñ¼Æ©Ò«ü¦ì§}ªºÅܼƤº¡C
⒡¡Bf¡Be¡Bg¡BE¡BG¡G³o¤Ó type ¬O¤@¼Ëªº¡]ª`·N¡I¨S¦³ F¡^¡A³£¬O§â¿é¤Jªº¸ê®Æµø¬°³æºë½T«×¯BÂI¼Æ¡AÂà´««á¦s©ó¬Û¹ïÀ³ªº°Ñ¼Æ©Ò«ü©wªº¦ì§}¤¤¡C¥¦Ì³£¥i¥H³B²z¬ì¾Ç°O¸¹¡A¤]¥i¥H³B²z¹³ 602E21 ¤£¬O¬ì¾Ç°O¸¹¡A¦ý±a¦³¤Qªº¾¦¸¤èªº¯BÂI¼Æ¡]¦¹³Bªº E «á±¥Nªí¤Qªº¾¦¸¤è¡AE ¤]¥i¥H¬O¤p¼gªº e¡^¡C
⒢¡Bc¡G§â¿é¤Jªº¸ê®Æµø¬°¦r¤¸¡A¹J¨ìªÅ¥Õ¡B´«¦æ©Î Tab¡A¤´·|³Q scanf Âà´«¡AÂà´««á¦s©ó¬Û¹ïÀ³ªº°Ñ¼Æ©Ò«ü©wªº¦ì§}¤¤¡C
⒣¡Bs¡G§â¿é¤Jªº¸ê®Æµø¬°¦r¦ê¡A¹J¨ìªÅ¥Õ¡B´«¦æ©Î Tab ´N°±¤î¡AÂà´««á¦s©ó¬Û¹ïÀ³ªº°Ñ¼Æ©Ò«ü©wªº¦ì§}¤¤¡C
⒤¡B[¶°¦X]¡GŪ¨ú¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ®É¡A¥u¦³¶°¦X¤ºªº¦r¤¸¦³®Ä¡A¦p¹J¨ì¤£Äݩ󶰦X¤ºªº¦r¤¸´N°±¤î¡C¥i¥H¥Î¡u-¡v¥Nªí³sÄòªº½d³ò¡A¨Ò¦p¡u%[a-z]¡v¡A¥Nªí¥uŪ¨ú¤p¼g^¤å¦r¥À¡A¦p¹J¨ä¥L¦r¤¸´N°±¤î¡C¡u%[-a-z0-9]¡vªí¥Ü¥uŪ¨ú¡u-¡v¡B¤p¼g^¤å¦r¥À¤Îªü©Ô§B¼Æ¦r¡C
⒥¡B[^¶°¦X]¡GŪ¨ú¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ®É¡A¥u¦³¤£Äݩ󶰦X¤ºªº¦r¤¸¦³®Ä¡A¦p¹J¨ìÄݩ󶰦X¤ºªº¦r¤¸´N°±¤î¡C
©³¤Uªº¨Ò¤l¤¹³\¨Ï¥ÎªÌ¿é¤JªÅ¥Õ¦r¤¸¡Aª`·N¡Atype ¬O %[a-zA-Z0-9 ]¡AÅý¨Ï¥ÎªÌ¥i¥H¿é¤J^¤å¦r¥À¤j¤p¼g¡B0¡ã9¤ÎªÅ¥Õ¡C
string DB 40h DUP (0) szFmt DB "%[a-zA-Z0-9 ]",0 invoke scanf,ADDR szFmt,ADDR string
©³¤Uªº¨Ò¤l¡A«h¬O³Ì¦hŪ¨ú 19 Ó¦r¤¸¡A¦p¹J¨ì´«¦æ¦r¤¸´N°±¤î¡A¤]´N¬O»¡Åª¨ú¤@¾ã¦æ¡A¦Ó³o¤@¦æ³Ì¦h¥iŪ¨ú 19 Ó¦r¤¸¡G
string DB 20 DUP (0) szFmt DB "%19[^\n]",0 invoke scanf,ADDR szFmt,ADDR string
®æ¦¡³W½d¤¤¡A©³¤UªºÄæ¦ì¥i¥H¬Ù²¤¡G
⑶¡B*¡GŪ¨ú¿é¤J®É©¿²¤¸Ó¶µ¸ê®Æ¡A¤£Àx¦s¦ÜÅܼƤ¤¡C¦pªG¬Ù²¤¡A¨º»ò¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ´N¯àÀx¦s¦b«ü©wªºÅܼÆùØ¡A¤j³¡¤À±¡§Î³£¦p¦¹¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A
age DD ? name DB 32 DUP (?) szFmt DB "%*s %31s %*s %d",0 invoke scanf,ADDR szFmt,ADDR name,ADDR age
¦pªG¨Ï¥ÎªÌ¿é¤J¡u"Miss Lin is 21"¡v¡A¨º»ò¡uMiss¡v·|³Q©¿²¤¡A¦]¬°¸Ó®æ¦¡³W½d¬O %*s¡Fname ¦r¦ê·|Åܦ¨¡uLin¡v¡F¡uis¡v³Q©¿²¤¡A¤]¬O¦]¬° * ªºÃö«Y¡Fage ÅܼƷ|Åܦ¨ 21¡C
⑷¡Bwidth¡G¥¿¾ã¼Æ¡A«ü©w scanf Ū¨ú¦h¤Ö¦r¤¸¡C¦pªG¦Ò¼{¨ìÀb«È½w½Ä·¸¦ì§ðÀ»¡A³Ì¦nn³]©w width¡A¥H¨îŪ¨úªø«×¡C¦ý¬OÁÙ¬O¥i¥H¬Ù²¤¡A¦pªG¬Ù²¤ªº¸Ü¡Ascanf ·|¨Ì¾Ú type ¦Û¦æ¨M©wŪ¨úªø«×¡G
⒜¡B¼ÆÈÃþ«¬ªº type¡G¨Ò¦p %d¡B%f¡B%x µ¥¡Ascanf ·|«ùÄòŪ¨úª½¨ì¹J¨ì«D¼Æ¦r¦r¤¸¡]¨Ò¦p¦b %d ®É¹J¨ì¦r¥À¡A%x ¹J¨ì¤£¬O 0¡ã9 ©Î a¡ãf¡BA¡ãF¡^©ÎªÅ¥Õ¦r¤¸¡BTab¡B´«¦æ¡C
⒝¡Btype ¬° %s¡Gscanf ·|¤@ª½Åª¨ú¦r¤¸ª½¨ì¹J¨ìªÅ¥Õ¦r¤¸¡BTab ©Î´«¦æ¡C¦pªG¤£¬Ù²¤ %s ªº width¡A³q±`·|Åý width ¤j¤p¬O½w½Ä°Ï¤j¤p´î¤@¡A¦]¬°n¯d¤@Ӧ줸²Õ¦s©ñ 0¡A§@¬°¦r¦êµ²§ôªº²Å¸¹¡C
⒞¡Btype ¬° %c¡Gscanf ¥u·|Ū¨ú¤@Ó¦r¤¸¡C
¨Ò¦p©³¤Uªºµ{¦¡¡G
szFmt DB "%4d",0 number DD ? invoke scanf,ADDR szFmt,ADDR number
¦pªG¨Ï¥ÎªÌ¿é¤J¡u1234567¡v¡A¦ý¬O number ¥u¯à±µ¨ü¨ì«e¥|Ó¦r¤¸¡A©Ò¥H©I¥s scanf §¹¦¨¤§«á¡Anumber µ¥©ó 1234¡C
⑸¡Bsize¡G«ü©wÅܼƪºªø«×¬O¦h¤ÖӦ줸²Õ¡A³o¨àªºÅܼƬO«üÂà´««áªº¸ê®Æ¦s¤Jªº¦a¤è¡C°²¦p¬Ù²¤ size ªº¸Ü¡A¹ï©ó d¡Bu¡Bi¡Bo¡Bx¡Be¡Bf¡Bg ³£¬OÂù¦r²Õ¡F¹ï©ó c ¬O¤@Ӧ줸²Õ¡F¹ï©ó s «h¨Ì¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¨M©w¡C
⒜¡Bh¡Gh ¬O short ªº·N«ä¡A¥u¯à·f°t d¡Bu¡Bi¡Bx¡Bo¡AÅܼƪø«×¬O¤@Ó¦r²Õ¡C
⒝¡Bhh¡G¥u¯à·f°t d¡Bu¡Bi¡Bx¡Bo¡AÅܼƪø«×¬O¤@Ӧ줸²Õ¡C
⒞¡Bl¡Gl ¬O long ªº·N«ä¡C¦pªG·f°t d¡Bu¡Bi¡Bx¡Bo¡AÅܼƪø«×¬OÂù¦r²Õ¡F¦pªG·f°t f¡Be¡Bg¡AÅܼƪø«×¬O¥|¦r²Õ¡A§YÂùºë½T«×¯BÂI¼Æ¡C
⒟¡Bll »P I64¡G¨âªÌ¬Û¦P¡A¥u¯à·f°t d¡Bu¡Bi¡Bx¡Bo¡AÅܼƪø«×¬O¥|¦r²Õªø«×¡C
⒠¡BL¡G¥u¯à·f°t f¡Be¡Bg¡AÅܼƪø«×¬O¥|¦r²Õ
¦b®æ¦¡±±¨î¦r¦ê¤º¡A¤]¥i¥H²K¥[¨ä¥¦«DªÅ¥Õ¦r¤¸¡C¨Ï¥ÎªÌ¥²¶·¨Ì·Ó³o¨Ç¦r¤¸¿é¤J¡A¦Ó scanf ·|¤@¤@Àˬd¨CÓ¦r¤¸¡A¦pªG¤£²Å¦X¡]¥]§t¤j¤p¼g¤£²Å¦X¡^¡A´N·|¥ß§Y°±¤î¡C¨Ò¦p©³¤Uªºµ{¦¡¡G
x DD ? y DD ? z DD ? szFmt DB "x=%d y=%d z=%d",0 invoke scanf,ADDR szFmt,ADDR x,ADDR y,ADDR z
¦pªG¨Ï¥ÎªÌ¿é¤J¡ux=10 y=20 z=30¡v©Î¡ux=10 y=20 z=30¡v¡A¦]¬°©Ò¿é¤JªºÃB¥~¦r¤¸³£»P®æ¦¡±±¨î¦r¦êªº«DªÅ¥Õ¦r¤¸¬Û²Å¡]sacnf ·|¦Û°Ê¸õ¹L¦h¾lªºªÅ¥Õ¦r¤¸¡A©Ò¥H§Y¨Ï«áªÌ¥Î¨âӪťդÀ¹j¡A¦ý¤£¼vÅT¡^¡Aµ²ªG¬O x=10¡Ay=20¡Az=30¡A¦^¶ÇȬ° 3¡C¦pªG¨Ï¥ÎªÌ¿é¤J¡uX=10 Y=20 Z=30¡v©Î¡u10 20 30¡v¡Aµ²ªG x¡By¡Bz ³£¬O 0¡A¥B¦^¶ÇȤ]¬O 0¡C
printf ¬O§âÅܼƥH«ü©wªº®æ¦¡Åã¥Ü¦b¼Ð·Ç¿é¥X¸Ë¸m¤W¡A¨ä쫬¬O
int printf(
const char *format
[,argument]
⁝
);
printf ªº°Ñ¼ÆÓ¼Æ¨Ã¤£©T©w¡A¦ý²Ä¤@ӰѼƬO®æ¦¡±±¨î¦r¦êªº¦ì§}¡Aµy«á¦A²Ó»¡®æ¦¡±±¨î¦r¦ê¡Cprintf ªº¦^¶ÇȬO¿é¥X¦r¤¸ªºÁ`¼Æ¡C¦pªGµo¥Í¿é¥X¿ù»~¡A«h¦^¶Çt¼Æ¡C
®æ¦¡±±¨î¦r¦ê¬O¥Ñ¤@өΦhӮ榡³W½d¤Î¨ä¥L¦r¤¸²Õ¦¨¡A¥H¹sµ²§À¡A¨CӮ榡³W½d³£¬O¥H¡u%¡v¶}ÀY¡A¦Ó¥B¥²¶·»P«á±°Ñ¼Æªº¸ê®ÆÃþ«¬·f°t¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G
szName DB "¤èµ·¿¢",0 age DD 31 szFmt DB "%s¤p©j¤µ¦~%d·³¡C",0 invoke printf,ADDR szFmt,ADDR szName,age
szFmt ¬O®æ¦¡±±¨î¦r¦ê¡A¤º§t¨âӮ榡³W½d¡A%s¡B%d¡A¨Ì§Ç¬O¦r¦ê»P¤Q¶i¦ì¦³¸¹¼Æ¡A©Ò¥Hºò±µµÛ szFmt ªº°Ñ¼Æ¡A¨ä¸ê®ÆÃþ«¬¤]¥²¶·¨Ì§Ç¬O¦r¦êÅܼƻPÂù¦r²ÕÅܼơC³oÓ¨Ò¤l¤]»¡©ú¤@¥ó¨Æ¡A¥Î printf ¦L¥X¦r¦êÅܼƪº¤º®e¡A¥²¶·¦b¹ïÀ³ªº°Ñ¼Æ¤W¶ñ¤J¦r¦êªº¦ì§}¡F¦pªG¬On¦L¥XÅܼƤ§È¡A«h°Ñ¼Æª½±µ³]¬°¸ÓÅܼƧY¥i¡C°õ¦æ§¹¤W±µ{¦¡½X¡A·|¦b¿Ã¹õ¤W¬Ý¨£¡u¤èµ·¿¢¤p©j¤µ¦~31·³¡C¡v¡A¥B RAX=20¡]RAX ¬O¦^¶ÇÈ¡A¨CÓ¤¤¤å¦r¦û¨âӦ줸²Õ¡^¡C
®æ¦¡³W½dªº¼Ë¤l¦p¤U¡G
%[flags][width][.precision][size]type
¦b¤@¹ï¤¤¬A¸¹¤ºªº¥i¥H¬Ù²¤¡A¦Ó¡u%¡v»P type ¤£¥i¬Ù²¤¡A¥ý»¡©ú³o¨âÄæ¡A¦A»¡©ú¨ä¥LÄæ¦ì¡G
⑴¡B%¡G¥Nªí®æ¦¡³W½d¶}©l¡C¦pªG¯uªº·QÅã¥Ü¡u%¡v¦r¤¸¡A¦b®æ¦¡±±¨î¦r¦ê´N¥H¡u%%¡v¥Nªí¡C
⑵¡Btype¡G«ü©w¹ïÀ³ªº°Ñ¼Æ¥H¾ã¼Æ¡B¯BÂI¼Æ¡B¦r¤¸©Î¦r¦ê§Î¦¡¿é¥X¦Ü¼Ð·Ç¿é¥X¸Ë¸m¡C¦³¤TÂInª`·N¡G
①¿é¥X¦r¦ê®É¡A¬Û¹ïÀ³ªº°Ñ¼Æ¬O¦r¦ê¦ì§}¡F¿é¥X¼ÆÈ®É¡A¬Û¹ïÀ³ªº°Ñ¼Æ¬OÅܼƥ»¨¡C
②¿é¥X¯BÂI¼Æ®É¡Aµø¯BÂI¼Æ¦b²Ä´XӮ榡³W½d¡A°Ñ¼Æ¥²¶·¬O RDX¡BR8¡BR9 ©Î°ïÅ|¡A¥B¬Ò¬°Âùºë½T«×¡]§Y 64 ¦ì¤¸¡^¡C³o¬O¦]¬° Windows ³W©w¥iÅܰѼƨ禡¡]variadic functions¡A°Ñ¼ÆÓ¼Æ¤£©T©wªº¨ç¦¡¡^¡A¯BÂI¼Æ¥²¶·¦P®É¦s¤J XMM ¼È¦s¾¹»P¬Û¹ïÀ³ªº³q¥Î¼È¦s¾¹¡A¥B¥H³q¥Î¼È¦s¾¹¬°¥D¡C
③¿é¥X¾ã¼Æ®É¡]type ¬° d¡Bi¡Bo¡Bu¡Bx¡BX¡^¡AÅܼƪø«×¬OÂù¦r²Õ¡C
type ¥i¥H¬O¤U±´XºØ±¡§Î¡G
⒜¡Bd »P i¡G¨âªÌ¬Û¦P¡A³£¬O¥H¤Q¶i¦ì¦³¸¹¼Æ¿é¥X¡C
⒝¡Bu¡G¥H¤Q¶i¦ìµL¸¹¼Æ¿é¥X¡C
⒞¡Bo¡G¥H¤K¶i¦ìµL¸¹¼Æ¿é¥X¡C
⒟¡Bx »P X¡G¿é¥X¤Q¤»¶i¦ìµL¸¹¼Æ¡C¦pªG¨Ï¥Î %x¡A¨º»ò 9 ¤§«áªº¥H¤p¼gªº abcdef ªí¥Ü¡F%X «h¥Î¤j¼gªº ABCDEF ªí¥Ü¡C
¨Ò¦p©³¤Uªºµ{¦¡¡G
szFmt DB "¦³¸¹¼Æ=%d, µL¸¹¼Æ=%u, ¤Q¤»¶i¦ì=%x©Î%X",0 x DD -31416 invoke printf,ADDR szFmt,x,x,x,x
¦b¿Ã¹õ¤WÅã¥Üªºµ²ªG¬°¡G¡u¦³¸¹¼Æ=-31416, µL¸¹¼Æ=4294935880, ¤Q¤»¶i¦ì=ffff8548©ÎFFFF8548¡v¡C
⒠¡Bc »P C¡G¿é¥X¦r¤¸¡C¦pªG¨Ï¥Î %c¡A¿é¥X ANSI ¦r¤¸¡F¦pªG¬O %C¡A¿é¥X¸U°ê½X¦r¤¸¡C
⒡¡Bs »P S¡G¿é¥X¦r¦ê¡C¦pªG¨Ï¥Î %s¡A¿é¥X ANSI ¦r¦ê¡F¦pªG¬O %C¡A¿é¥X¸U°ê½X¦r¦ê¡C¨Ï¥Î %d ®É¡A¬Û¹ïÀ³ªº°Ñ¼Æ¥²¶·¬On¦L¥X¦r¦êªº¦ì§}¡C
⒢¡Bf¡G³o¬O³Ì±`¥Îªº¯BÂI¼Æ®æ¦¡¡A¥H¤@¯ë¼ÆÈªí¥Ü¡A¹w³]¤p¼ÆÂI«á±¦³¤»¦ì¡C
⒣¡Be »P E¡G¥H¬ì¾Ç°O¸¹¿é¥X¡A¦³®Ä¼Æªº¤p¼Æ³¡¤À¹w³]¦³¤»¦ì¡C¦pªG¨Ï¥Î %E¡A¤Qªº¾¦¸¤è·|¥Î E ªí¥Ü¡F¦pªG¥Î %e¡A«h§ï¥Î e ªí¥Ü¡C
⒤¡Bg »P G¡G¦Û°Ê¦b %f ©M %e¡þ%E ¤§¶¡¿ï¾Ü¸ûµuªº¿é¥X§Î¦¡¡A¦Ó¥B¹w³]ªº¦³®Ä¦ì¼Æ¬O¤»¦ì¡C
⒥¡Ba »P A¡G¥H¤Q¤»¶i¦ì¬ì¾Ç²Å¸¹¿é¥X¯BÂI¼Æ¡A¦³®Ä¼Æªº¤p¼Æ³¡¤À¹w³]¦³¤»¦ì¡C¨Ï¥Î %a¡A¨º»ò 9 ¥H«á¥Î¤p¼g¦r¥À¡]a¡ãf ©M p¡^¡F¨Ï¥Î %A¡A¥Î¤j¼g^¤å¦r¥À¡]A¡ãF ©M P¡^¡CP ©Î p ¤§«áªº¼ÆÈ¡A¥Nªí 2 ªº¾¦¸¤è¡]ª`·N¡I¤£¬O 16 ªº¾¦¸¤è¡^¡C©³¤U¬O¤CºØ»P¯BÂI¼Æ¦³Ãöªº®æ¦¡³W½d¡A¦P¼ËÅã¥Üªk©Ô²Ä±`¼Æ¡A96485.33212331C/mol¡Aªº¤ñ¸û¡G
| %f | %e | %E | %g | %G | %a | %A |
| 96485.332123 | 9.648533e+004 | 9.648533E+004 | 96485.3 | 96485.3 | 0x1.78e555p+16 | 0X1.78E555P+16 |
⒦¡Bp¡G¥H¤Q¤»¶i¦ìµL¸¹¼Æ¿é¥X¬YÓÅܼƪº¦ì§}¡A¶·§â¸ÓÅܼƪº¦ì§}¦s©ñ©ó¬Û¹ïÀ³ªº°Ñ¼Æ¤º¡C
®æ¦¡³W½d¤¤¡A©³¤UªºÄæ¦ì¥i¥H¬Ù²¤¡G
⑶¡Bflag¡G¥Î©ó«ü©w¥¿t¸¹¡BªÅ¥Õ¡B«e¸m¹s¡B¤p¼ÆÂI©M¤K¶i¦ì©M¤Q¤»¶i¦ì«e¸mµüªº¿é¥X¹ï»ô©M±±¨î¿é¥X¡A¥i¥H¬O¤U±¤@өΦhÓ¦r¤¸¡A¤]¥i¥H¬Ù²¤¡C
⒜¡B+¡G±j¨î¨Ï¦³¸¹¼Æ©Î¯BÂI¼Æ¤£½×¥¿©Ît¡A³£·|²K¥[¡u+¡v¡B¡u-¡v¡C¦pªG¬Ù²¤¡A¥u¦³t¼Æ¤~·|²K¥[¡u-¡v¡C
⒝¡B-¡G¤£½×þ¤@ºØ type¡A§¡¦V¥ª¹ï»ô¡F¦pªG¬Ù²¤«h¦V¥k¹ï»ô¡C
⒞¡BªÅ¥Õ¦r¤¸¡G¥Î©ó¹w¯d¥¿t¸¹¦ì¡CY¬°¥¿È¡A«h¦b¼ÆÈ«e±¯d¤@ӪťզӤ£¬OÅã¥Ü¡u+¡v¡FY¬°t«hÅã¥Ü¡u-¡v¡C³o±`¥Î©óÅý¥¿t¼Æ¦C¹ï»ô¡A¥B¤£·|¥¿¼Æ¤]Åã¥Ü¥¿¸¹¨º»ò¬ð¤a¡C
⒟¡B#¡G¥u¼vÅT type ¬° o¡Bx¡BX¡Bf¡Be¡BE¡Bg¡BG¡A¨ä®ÄªG¦p¤U¡G
ⓐ¡Bo¡G¿é¥X·|¥H 0 ¶}ÀY¡C
ⓑ¡Bx ©Î X¡G¿é¥X·|¥H 0x ©Î 0X ¶}ÀY¡C
ⓒ¡Bf¡Be¡BE¡G§Y¨Ï¨S¦³¤p¼Æ¦ì¡A¤]·|±j¨îÅã¥Ü¤p¼ÆÂI¡C
ⓓ¡Bg ©Î G¡G±j¨îÅã¥Ü¤p¼ÆÂI¡A¥B¤£·|§R°£¥½§Àªº¹s¡C
⒠¡B0¡G¦pªG width ¶W¹L¼ÆÈ©Î¦r¦êªø«×¡A¥ª°¼·|¥H 0 ¶ñ¥R¦Ó«DªÅ¥Õ¡A¦ý¥k°¼¤£·|¶ñ¥R 0¡C¦pªG¦P®É«ü©w¤F precision ¥H¤Î flag ¬° 0¡A¨º»ò«áªÌ·|¥¢®Ä¡C
⑷¡Bwidth¡G«ü©w¿é¥X¤º®eªº³Ì¤p¦r¤¸Ó¼Æ¡A¥i¥H¬Ù²¤¡A¤]¥i¥H¬O¥¿¾ã¼Æ©Î¡u*¡v¡C
⒜¡B¬Ù²¤ width¡G¤£½× type ¬°¦ó¡Awidth ªº¹w³]ȳ£¬O 0¡C¦ý³oÓ¡u0¡v¦b¹ê»Ú°õ¦æ®Éªº·N¸q¬O¡u«ö»Ý¿é¥X¡A¤£¥[¶ñ¥R¡v¡C
⒝¡B¥¿¾ã¼Æ¡Gªí¥Ü¿é¥X¤º®eªº³Ì¤p¦r¤¸Ó¼Æ¡C¦pªGn¿é¥Xªº¸ê®Æ¦r¤¸¼Æ¤p©ó width¡A¨Ì¾Ú flag¡A¦b¿é¥Xªº¸ê®Æ¥ªÃä©Î¥kÃä²K¥[ªÅ¥Õ¦r¤¸©Î 0¡Aª½¨ì¹F¨ì width ©Ò«ü©wªº¥¿¾ã¼Æ¡C¦pªGn¿é¥Xªº¸ê®Æ¦r¤¸¼Æ¤j©ó width¡A¨º»ò width ¤£°_§@¥Î¨Ã¿é¥X©Ò¦³¸ê®Æ¡C¨Ò¦p©³¤Uªºµ{¦¡¡G
age1 DD 21 age2 DD 18 szMiss1 DB "³°¨ÌµÓ¤p©j",0 szMiss2 DB "³°¹ÚµÓ¤p©j",0 szFmt DB "%012s¤µ¦~%-03d·³¡A%08s¤µ¦~%3d·³¡C",0 invoke printf,ADDR szFmt,ADDR szMiss1,age1,ADDR szMiss2,age2
¦b¿Ã¹õ¤WÅã¥Üªºµ²ªG¬°¡G¡u00³°¨ÌµÓ¤p©j¤µ¦~21 ·³¡A³°¹ÚµÓ¤p©j¤µ¦~ 18·³¡C¡v¡C¤@Ó¤¤¤å¦r¦û¤F¨âӦ줸²Õ¡A¦Ó¤@Ó^¤å¦r¶È¦û¤@Ӧ줸²Õ¡C¡u³°¨ÌµÓ¤p©j¡v¦@¤QӦ줸²Õ¡A¦ý¹ïÀ³¦b szFmt ¤¤ªº®æ¦¡³W½d¬O¡u%012s¡v¡A®æ¦¡³W½d«ü©w 12 Ó¦r¤¸¼e¡A¬G¥ªÃä»Ý¸É¤W¨âÓ¡u0¡v¡C¨ä¦~ÄÖ 21 ·³¡A¬Û¹ïÀ³ªº®æ¦¡³W½d«ü©w¡u%-03d¡v¡A¦V¥ª¹ï»ô¥B¤TÓ¦r¤¸¼e¡A¬G¥kÃä·|¦h¥X¤@®æ¡A¦ý¥k°¼¤£¸É¡u0¡v¡]¦pªG¸É¤W 0 Åܦ¨ 210¡A´N¦n¯º¤F¡AÁöµM¦r¦ê¥ª°¼¸É 0 ¤]«Ü¦n¯º¡^¡C
⒞¡B*¡Gªí¥Ü¥ÑÀ³¥Îµ{¦¡«ü©w¼e«×¡A©ó * ¬Û¹ïÀ³ªº°Ñ¼Æ¤W¡A³]©w¤@ÅܼơA¦¹ÅܼƥNªí width¡C
⑸¡B.precision¡G¥i¥H¬Ù²¤¡A¤]¥i¥H¬O¥¿¾ã¼Æ©Î¡u*¡v¡A®ÄªG¦p¤U¡G
⒜¡B¥¿¾ã¼Æ¡G·|¨Ì¾Ú type ¤£¦P¡A·N¸q¤]¤£¬Û¦P¡G
ⓐ¡Bd¡Bi¡Bu¡Bo¡Bx¡BX¡G«ü©w¿é¥Xªº³Ì¤Ö¦ì¼Æ¡CY¼ÆÈªº¦ì¼Æ¤Ö©ó¦¹È¡A«h¦b¥ªÃä¸É 0¡FY¦h©ó¦¹È¡A«h§¹¾ã¿é¥X¡CY¬Ù²¤¡A¹w³]Ȭ° 1¡C
ⓑ¡Bf¡Be¡BE¡G«ü©w¤p¼ÆÂI«áªº¦ì¼Æ¡CY¬Ù²¤¡A¹w³]Ȭ° 6¡C³o¬O³Ì±`¨£ªº¥Îªk¡C
ⓒ¡Bg¡BG¡G«ü©w¦³®Ä¼Æ¦rªº³Ì¤j¦ì¼Æ¡]¤£§t¤p¼ÆÂI¡^¡CY¬Ù²¤¡A¹w³]Ȭ° 6¡C
ⓓ¡Ba¡BA¡G«ü©w¤p¼ÆÂI«áªº¦ì¼Æ¡]¤Q¤»¶i¨î¼Æ¦r¡^¡CY¬Ù²¤¡A¹w³]¨¬°÷ºë½Tªí¥Ü¸Ó¼Æ¡C
ⓔ¡Bs¡BS¡G«ü©w³Ì¦h¿é¥Xªº¦r²Å¼Æ¡CY¦r²Å¦êªø«×¤j©ó¦¹È¡A«hºIÂ_¡FY¤p©ó¦¹È¡A«h§¹¾ã¿é¥X¡]¤£¶ñ¥R¡^¡C
¨Ò¦p©³¤Uªºµ{¦¡¡G
dqF DQ 96485.33212331 ddF DD 96485 szF DB "ªk©Ô²Ä±`¼Æ¬ù¬°",0 szFmt DB "%14.12sµ¥©ó%11.4f©Î%8.7d",0 invoke printf,ADDR szFmt,ADDR szF,dqF,ddF
¦b¿Ã¹õ¤WÅã¥Üªºµ²ªG¬°¡G¡u ªk©Ô²Ä±`¼Æ¬ùµ¥©ó 96485.3321©Î 0096485¡v¡CszFmt ªº¡u%14.12s¡v¡Aprecision ©w¦r¦ê³Ì¦h¿é¥X 12 Ó¦r¤¸¡A¦ý¬O width «o³]©w¤F¦³ 14 Ó¦r¤¸¼e¡Aflag ¨S¦³¡u-¡v¡A¬G¦V¥k¹ï»ô¡A¥ªÃä´N·|¦³¨âӪŮæ¡C¦]¬°©w¦r¦ê³Ì¦h¿é¥X 12 Ó¦r¤¸¡A©Ò¥H¥u·|Åã¥Ü szF ªº¡uªk©Ô²Ä±`¼Æ¬ù¡v¦@¤»Ó¤¤¤å¦r¡]¨CÓ¤¤¤å¦r¦û¤F¨âӦ줸²Õ¡^¡C±µµÛªº¬O szFmt ¤ºªº¡uµ¥©ó¡v¡CµM«á¬O¡u%11.4f¡v¡Aªí¥Ü¼e«× 11 Ó¦r¤¸¡A¦Ó¤p¼ÆÂI«á¦³¥|¦ì¡C
⒝¡B*¡Gªí¥Ü¥ÑÀ³¥Îµ{¦¡«ü©w precision¡C¨Ò¦p©³¤Uªºµ{¦¡¡G
Na DQ 6.022140857E23 x DD 15 y DD 5 szNa DB "¨È¦ò¥[³Ö±`¼Æ",0 szFmt DB "%sµ¥©ó%*.*E",0 invoke printf,ADDR szFmt,ADDR szNa,x,y,Na
¦b¿Ã¹õ¤WÅã¥Üªºµ²ªG¬°¡G¡u¨È¦ò¥[³Ö±`¼Æµ¥©ó 6.02214E+023¡v¡CszFmt ¤¤¦³¨âӮ榡³W½d¡A%s »P %*.*E¡A©Ò¥H¨ä«áªº°Ñ¼Æ¨Ì§Ç¬O¦r¦ê¦ì§}¡B¥Nªí width ªºÅܼơ]§Y x¡A¿é¥XÁ`ªø«×¬° 15 Ó¦r¤¸¡A¤£¨¬ªº¸Ü¡A¦b¥ªÃä¸É¤WªÅ¥Õ¡^¡B¥Nªí precision ªºÅܼơ]§Y y¡A¤p¼ÆÂI«á±¦³ 5 ¦ì¡^¡B¥H¬ì¾Ç°O¸¹¿é¥Xªº¯BÂI¼Æ¡ANa¡C
⑹¡Bsize¡G«ü©wÅܼƪºªø«×¬O¦h¤ÖӦ줸²Õ¡A¹ï©ó¾ã¼Æ»P¯BÂI¼Æ¡Aprintf ªº³B²z¤è¦¡¤£¦P¡A¦p¤U¡G
⒜¡B¹ï©ó type ¬O¾ã¼ÆÃþ«¬ªº d¡Bi¡Bu¡Bo¡Bx¡BX¡G
ⓐ¡Bhh¡G¦ì¤¸²Õ¡C
ⓑ¡Bh¡G¦r²Õ¡C
ⓒ¡Bl ©Î¬Ù²¤¡GÂù¦r²Õ¡C
ⓓ¡Bll ©Î I64¡G¥|¦r²Õ¡C
⒝¡B¹ï©ó type ¬O¯BÂI¼ÆÃþ«¬ªº e¡Bf¡BF¡Bg¡BG¡A³£¬O¥|¦r²Õ¡A¤£½×¬O§_¬Ù²¤ size¡A¤]¤£½× size ¬Oþ¤@ºØ¡C
⒞¡B¹ï©ó type ¬O c ªº¦r¤¸¨Ó»¡¡A¤£½×¶Ç¤Jþ¤@ºØ¡Aprintf §¡¨ú¤@Ӧ줸²Õ¡C
printf ùØ¡Asize ªº¥Îªk»P scanf ùØ size ªº¥Îªk¡A¬O§¹¥þ¤£¦Pªº¡AÁöµM³o¨âӨ禡ªº®æ¦¡³W½d«Ü¬Û¦ü¡C¥Dnì¦]¬O scanf ¨Ì¾Ú size ±N¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¼g¶i°O¾ÐÅ餺¡A¦pªG¤£ÄY®æ¨Ì°Ñ¼Æ«ü©w¼g¤J¡A«Ü®e©öÂл\±¼¬Û¾Fªº°O¾ÐÅé¡F¦ý printf ¬O±N¸ê®Æ¿é¥X¦Ü¼Ð·Ç¿é¥X¸Ë¸m¡A¨S¦³³oºØ°ÝÃD¡C
sqrt ¬O C »y¨¥ªº¼Ð·Ç¨ç¦¡¤§¤@¡A¥¦ªº¥Øªº¬Opºâ¥X¬Y¼Æªº¥¤è®Ú¡]¤]´N¬O¹ï¬Y¼Æ¶}®Ú¸¹¡^¡A¨ä쫬¬O¡G
double sqrt(
double x
);
¤W±¬O¦b·L³nºô¯¸¤Wªº®æ¦¡¡C¦b¨ç¦¡¦WºÙ¡Asqrt¡A¤§«eªº double ªí©ú¤F¦^¶ÇȪº¸ê®ÆÃþ«¬¬OÂùºë½T«×¯BÂI¼Æ¡A¦]¦¹ sqrt ªº¦^¶ÇȬOÂÇ¥Ñ XMM0 ¶Ç¦^¨Óªº¡Csqrt ªº°Ñ¼Æ¥u¦³¤@Ó¡A´N¬O x¡A¨ä¸ê®ÆÃþ«¬¤]¬OÂùºë½T«×¯BÂI¼Æ¡A¦]¦¹¤]¬OÂÇ¥Ñ XMM0 ¶Çµ¹ sqrt ¨ç¦¡¡C
©³¤Uªº¨Ò¤l¬O¦b Win64 ²Õ¦X»y¨¥¤¤¡A©I¥s sqrt¡G
number DQ 6.02E23
⁝
sub rsp,28h
movq xmm0,number
call sqrt ;XMM0¤º¦³6.02¡Ñ1023ªº¥¤è®Ú
MOVQ ¬O move quadword ªº·N«ä¡A¥Dn§@¥Î¬O§â 64 ¦ì¤¸ªº¸ê®Æ²¾¤J XMM ¼È¦s¾¹¡A©Î§â XMM ¼È¦s¾¹ªº§C¥b³¡¸ê®Æ²¾¦Ü¨ä¥L¦a¤è¡C¨ä»yªk¬O
MOVQ ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸
¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸¡A¨ä¤¤¤@Ó¥²©w¬O XMM ¼È¦s¾¹¡A¥t¤@Ó¥i¥H¬O XMM ¼È¦s¾¹¡B³q¥Î¼È¦s¾¹©Î°O¾ÐÅéÅܼƤTªÌ¤¤ªº¨ä¤¤¤@ºØ¡CMOVQ ´N¬O§â 64 ¦ì¤¸ªº¸ê®Æ¡A¤@Ӧ줸¡B¤@Ӧ줸ªº½Æ»s¨ì¥Øªº¹Bºâ¤¸¡A¦Ó¤£ºÞ³o¨Ç¸ê®Æ¬O¤°»ò·N¸q¡C
¦¹¥~ XMM ¼È¦s¾¹¬O 128 ¦ì¤¸¡A¦Ó MOVQ «ü¥O¶È¶È·h²¾§C¥b³¡ªº 64 ¦ì¤¸¡A¨º»ò CPU ·|«ç»ò³B²z°ª¥b³¡ªº 64 ¦ì¤¸©O¡H¥i¤À¬°¨âºØ±¡§Î¡G①¦pªG¥Øªº¹Bºâ¤¸¬O³q¥Î¼È¦s¾¹©Î°O¾ÐÅéÅܼơA¨º»ò¥¦Ì¥²¶·¬O 64 ¦ì¤¸ªº¡A³oºØ±¡§Î´N¶È¶È¬O±N 64 ¦ì¤¸ªº¸ê®Æ·h²¾¦Ü³q¥Î¼È¦s¾¹©Î°O¾ÐÅéÅܼơC②¦pªG¥Øªº¹Bºâ¤¸¬O XMM ¼È¦s¾¹¡A¨º»ò XMM ¼È¦s¾¹ªº°ª¥b³¡ 64 ¦ì¤¸¥þ³£·|³Q²M°£Åܬ°¹s¡C¨Ò¦p¡G
number DQ ?
⁝
;Y XMM5 ªº°ª¥b³¡¬O 3.0¡A§C¥b³¡¬O 5.0¡FXMM4 ªº°ª¥b³¡¬O 3.3¡A§C¥b³¡¬O 2.7¡FRDX¡×5.8
movq xmm5,rdx ;XMM5 ªº°ª¥b³¡¬O 0¡A§C¥b³¡¬O 5.8¡A¦]¬°°ª¥b³¡³QÂk¹s
movq number,xmm4 ;number¡×2.7
³o¥|Ó«ü¥O¦WºÙ«Ü¬Û¹³¡A¥ý¬Ý¥¦Ìªºì¤å¡G
SQRTPD ¬O¡usquare root of packed double precision floating-point value¡vªº·N«ä¡A
SQRTSD ¬O¡usquare root of scalar double precision floating-point value¡vªº·N«ä¡A
SQRTPS ¬O¡usquare root of packed single precision floating-point value¡vªº·N«ä¡A
SQRTSS ¬O¡usquare root of scalar single precision floating-point value¡vªº·N«ä¡C
³o¨Çì¤å¤¤ªº square root ¬Opºâ¨Ó·½¹Bºâ¤¸ªº¥¤è®Ú¡Adouble ¬OÂùºë½T«×ªº·N«ä¡]¶À¦r¡^¡Asingle ¬O³æºë½T«×ªº·N«ä¡]¥Õ¦â¦r¡^¡C¹ï·Óì¤å¡A«ü¥O˼ƲĤGÓ¦r¥Àªº S¡BP¡AÀ³¸Ó¤À§O¬O scalar¡Bpacked ªºÁY¼g¡A¨º»ò¥¦Ìªí¥Ü¤°»ò·N¸q©O¡H¨Æ¹ê¤W¡A¥¦Ì¬O¸ê®Æ²Õ´¤è¦¡¡C¤j³¡¤Àªº SSE/SSE2 «ü¥O¡A³£¦³©T©wªº¼Ò¦¡¡G
¾Þ§@½X¡Ï¸ê®Æ²Õ´¤è¦¡¡Ï¸ê®Æ®æ¦¡
³o¤TÄæªº·N¸q¦p¤U¡G
⑴¡B¾Þ§@½X¡G«ü¥O¦p¦ó¹ï¹Bºâ¤¸¹Bºâ¡A¥i¯à¬O·h²¾¡]MOV¡^¡B¥[ªk¡]ADD¡^¡B´îªk¡]SUB¡^¡B¥¤è®Ú¡]SQRT¡^¡K¡Kµ¥µ¥¡C
⑵¡B¸ê®Æ²Õ´¤è¦¡¡G¥u¦³¨âºØ¡A¤£¬O S ´N¬O P¡F«eªÌ¬O scalar¡A«áªÌ¬O packed¡C¥Nªí¡G
①¡BS¡Gscalar ªº·N«ä¡A¥i½Ķ¬°¯Â¶q¡A¤]´N¬O³æ¯Âªº¤@Ó¯BÂI¼Æ¡C
②¡BP¡Gpacked ªº·N«ä¡Aì·N¬O¥´¥]¡A¥ç§Y±N¼ÆÓ¯BÂI¼Æ¥´¥]°_¨Ó¡A¤@°_¹Bºâ¡C¦b¼Æ¾Ç¤W¡A¦pªG x¡Ðy ¥±¤W¦³Ó¦V¶q¡A¥ÑìÂI«ü¦V®y¼Ð¡]3.3,4.5¡^¡A¦¹¦V¶q¡×¡]3.3,4.5¡^¡C¦V¶qªº¹Bºâ¡A¤£½×¬Û¥[©Î¬Û´î¡A¤]³£¬O¨âÓ¤À¶q¤@°_ºâ¡C³oºØ¹Bºâ¤è¦¡»P¥´¥]¤@°_¹Bºâ«Ü¬Û¦ü¡A©Ò¥H¤]¦³¨Ç¤åÄmºÙ packed ¬°¦V¶q¡C¦pªG¸ê®Æ²Õ´¤è¦¡¬O P¡A¥B¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅé¡A¨º»ò¨Ó·½¹Bºâ¤¸¥²¶·¹ï»ô 16 ¦ì¤¸²ÕÃä¬É¡A§_«hÀ³¥Îµ{¦¡·|·í±¼¡C
⑶¡B¸ê®Æ®æ¦¡¡G¥u¦³¨âºØ¡A¤£¬O S ´N¬O D¡C«eªÌ¬O³æºë½T«×¯BÂI¼Æ¡A«áªÌ¬OÂùºë½T«×¯BÂI¼Æ¡C°²¦p¸ê®Æ²Õ´¤è¦¡¬O S¡A¨º»ò´N¥u°w¹ï³Ì§C¦ìªº³æºë½T«×¯BÂI¼Æ¡A©ÎÂùºë½T«×¯BÂI¼Æ¡A¶i¦æ¹Bºâ¡C
¸ê®Æ²Õ´¤è¦¡¦³ S¡BP ¨âºØ¡A¸ê®Æ®æ¦¡¦U¦³ S¡BD ¨âºØ¡A¨â¨â²Õ¦X¦@¦³¥|ºØ¼Ò¦¡¡C¦A¥[¤W¦³¨Ç¾Þ§@½X¥u»Ý¤@Ó¹Bºâ¤¸¡A¨Ò¦ppºâ¥¤è®Ú¡F¦³¨Ç»Ýn¨âÓ¹Bºâ¤¸¡A¨Ò¦p¥[¡B´îªk¡A©Ò¥H¦³¦hºØ²Õ¦X¡A¾ã²z¦p¤Uªí¡G
| SS | SD | PS | PD | pºâµ²ªG | |
| ¤@Ó¹Bºâ¤¸ | ¥u¹ï¨Ó·½¹Bºâ¤¸³Ì§C¦ìªº³æºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¥u¹ï¨Ó·½¹Bºâ¤¸³Ì§C¦ìªºÂùºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¹ï¨Ó·½¹Bºâ¤¸ªº¥|Ó³æºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¹ï¨Ó·½¹Bºâ¤¸ªº¨âÓÂùºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¦s©ó¥Øªº¹Bºâ¤¸ |
| ¨âÓ¹Bºâ¤¸ | ¥u¹ï¨Ó·½¹Bºâ¤¸»P¥Øªº¹Bºâ¤¸ªº³Ì§C¦ìªº³æºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¥u¹ï¨Ó·½¹Bºâ¤¸»P¥Øªº¹Bºâ¤¸ªº³Ì§C¦ìªºÂùºë½T«×¯BÂI¼Æ¶i¦æpºâ | ¹ï¨Ó·½¹Bºâ¤¸»P¥Øªº¹Bºâ¤¸ªº¥|Ó³æºë½T«×¯BÂI¼Æ¦P®É¶i¦æpºâ | ¹ï¨Ó·½¹Bºâ¤¸»P¥Øªº¹Bºâ¤¸ªº¨âÓÂùºë½T«×¯BÂI¼Æ¦P®É¶i¦æpºâ | ¦s©ó¥Øªº¹Bºâ¤¸ |
²{¦b»¡©ú¥¦Ìªº»yªk¡A´N·|§ó¦³·Pı¡C¥¦Ì»yªk¦p¤U¡G
SQRTPD ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸ SQRTSD ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸ SQRTPS ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸ SQRTSS ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸
¥¦Ìªº¥Î³~¬Opºâ¨Ó·½¹Bºâ¤¸ªº¥¤è®Ú¡A¦A±Nµ²ªG¦s¤J¥Øªº¹Bºâ¤¸¡C¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹©Î°O¾ÐÅéÅܼơA¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡C¦]¦¹^¯Sº¸¤â¥U¤W¹ï³o¥|¹D«ü¥Oªº»¡©ú¦p¤U¡A³o¨àªº XMM1¡BXMM2 ¥u¬O¥N¸¹¡A¥i¥H¬O XMM1¡ãXMM15 ¤¤ªº¥ô·N¤@Ó¡A¨Ã«D¶È¶È«ü¬Y¯S©wªº XMM ¼È¦s¾¹¡F¦Ó M32¡BM64¡BM128 ¬O«ü°O¾ÐÅéÅܼơA¤À§O¥Nªí 32¡B64¡B128 ¦ì¤¸ªø¡C
SQRTPD XMM1, XMM2/M128 SQRTSD XMM1, XMM2/M64 SQRTPS XMM1, XMM2/M128 SQRTSS XMM1, XMM2/M32
SQRTPD ·|°w¹ï¨Ó·½¹Bºâ¤¸ªº¨âÓÂùºë½T«×¯BÂI¼Æ¶i¦æ¶}¥¤è®Ú¹Bºâ¡A¨Ã±Nµ²ªG¦s©ó¥Øªº¹Bºâ¤¸¤º¡C¨Ò¦p©³¤Uªºµ{¦¡½X¬Opºâ 25.0¡B36.0¡]Âùºë½T«×¡A©Ò¥H¥Î DQ ©w¸q n¡^ªº¥¤è®Ú¡AµM«á¦s©ó XMM1 ¼È¦s¾¹ùØ¡G
align 16 ;¦³Ãö ALIGN °²«ü¥O¡A¨£¤U¤@³¹¡C n DQ 25.0, 36.0 ;°²¦p°õ¦æSQRTSD«e¡AXMM1°ª=2.0¡AXMM1§C=3.0 sqrtpd xmm1,n ;°õ¦æ«á¡AXMM1°ª=6.0¡AXMM1§C=5.0
¦]¬° SQRTPD ªº¸ê®Æ²Õ´¤è¦¡¬O P¡A¥B¨Ó·½¹Bºâ¤¸¬O°O¾ÐÅé¡A¨º»ò¨Ó·½¹Bºâ¤¸¥²¶·¹ï»ô 16 ¦ì¤¸²ÕÃä¬É¡A¤]´N¬O¨ä¦ì§}´«ºâ¦¨¤Q¤»¶i¦ì¡A³Ì¥k¤@¦ì¥²¶·¬O 0¡C§Q¥Î¡uALIGN 16¡v°²«ü¥O¡A¥i¥H¹F¨ì³oӥتº¡C
SQRTSD ¥u·|°w¹ï¨Ó·½¹Bºâ¤¸ªº³Ì§C¦ìÂùºë½T«×¯BÂI¼Æ¶i¦æ¶}¥¤è®Ú¹Bºâ¡A¨Ã±Nµ²ªG¦s©ó¥Øªº¹Bºâ¤¸ªº 0¡ã63 ¦ì¤¸¤º¡A¦Ó¥Øªº¹Bºâ¤¸ªº 64¡ã123 ¦ì¤¸¤£ÅÜ¡C¨Ò¦p©³¤Uªºµ{¦¡½X¬Opºâ 5.0¡]Âùºë½T«×¡A©Ò¥H¥Î DQ ©w¸q n¡^ªº¥¤è®Ú¡AµM«á¦s©ó XMM1 ¼È¦s¾¹ùØ¡G
n DQ 5.0 ;°²¦p°õ¦æSQRTSD«e¡AXMM1°ª=2.0¡AXMM1§C=6.0 sqrtsd xmm1,n ;°õ¦æ«á¡AXMM1°ª=2.0¡AXMM1§C=2.236068...
¦³Ãö SQRTPD¡BSQRTSD ªº¹Ï¸Ñ»¡©ú¡A¥i°Ñ¦Ò¤U¹Ï¡C¹Ï¤¤ªº A¡BB¡BC¡BD ³£¬O¯BÂI¼Æ¡A¹Ï¤¤Åã¥Ü¡A³o¥|Ó¯BÂI¼Æ¤£¬O¦s©ó 0¡ã63 ¦ì¤¸¡A´N¬O¦s©ó 64¡ã127 ¦ì¤¸¡A©Ò¥H³£¬OÂùºë½T«×¡C
¥t¥~ªº¨âÓ«ü¥O¡GSQRTSS »P SQRTPS¡AÁöµM¨S¦³»¡©ú¡A¦ý¥i¥H±À½×±o¨ì¥¦Ìªº¹Bºâ¤è¦¡¡A³oùØ´N¤£¥²¦h»¡¤F¡C¥¦Ìªº¹Bºâ¹Lµ{¡A¥i¥H°Ñ¾\¤U¹Ï¡C¹Ï¤¤ A¡BB¡BC¡K¡KH ³£¬O³æºë½T«×¯BÂI¼Æ¡C
©I¥s scanf »P printf¡A§ÚÌ´N¯à¿é¤J¤Î¿é¥X¯BÂI¼Æ¡A¦Ó¤£»Ýn¥h³B²z«Ü½ÆÂøªº§â¼ÆÈ¦r¦êÂà´«¦¨ IEEE 754 ®æ¦¡¡A©Î¤Ï¹L¨Óªº¨BÆJ¡C©³¤Uªº¨âÓ¨Ò¤l´N¬O§Q¥Î scanf ¿é¤J¯BÂI¼Æ¡AµM«ápºâ¨ä¥¤è®Ú¡A¦A±Nµ²ªG¥H printf ¦L¥X¨Ó¡C
³oÓ¨Ò¤l¬O FP1.ASM¡A¥¦Åý¨Ï¥ÎªÌ¿é¤J¤@Ó¥¿¾ã¼Æ¡AµM«á©I¥s C »y¨¥ªº sqrt ¨ç¦¡¡Apºâ¨ä¥¤è®Ú¡A³Ì«á¦A¦L¥X¨Ó¡Cì©l½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 28 29 30 31 32
33 34 35 |
INCLUDE E:\masm64\include64\masm64rt.inc
EXTRN scanf:PROC
EXTRN printf:PROC
EXTRN sqrt:PROC
;**********************************************************
.DATA
number DQ ?
szStr DB "½Ð¿é¤J¤@Ó¥¿¼Æ¡A§Ú·|pºâ¥¦ªº¥¤è®Ú¡G",0
szErr1 DB "±z¿é¤Jt¼Æ¡AµLªk¶}¥¤è®Ú¡C",0
szErr2 DB "¿é¤J¥¿¼Æ®Éµo¥Í¿ù»~¡C",0
szFmt1 DB "%lf",0
szFmt2 DB "%gªº¥¤è®Ú=%.8g",0
;***********************************************************
.CODE
;-----------------------------------------------------------
main PROC
invoke printf,ADDR szStr
invoke scanf,ADDR szFmt1,ADDR number
or rax,rax ;Àˬd¬O§_¿é¤J¼ÆÈ
jnz chk_n
lea rcx,szErr2
jmp pnt_it
chk_n: test BYTE PTR number[7],80h ;Àˬd¬O§_¿é¤Jt¼Æ
jz pos
lea rcx,szErr1
pnt_it: call printf
jmp exit
pos: movq xmm0,number
call sqrt
movq r8,xmm0
invoke printf,ADDR szFmt2,number,r8
exit: invoke ExitProcess,0
main ENDP
;***********************************************************
END |
FP1 ¬O¥D±±»Oµ{¦¡¡A¶·¦b©R¥O´£¥Ü¦r¤¸¤¤°õ¦æ¡CÁöµM SSE/SSE2 «ü¥O¤Î´£¨Ñ¤F¥¤è®Úªº¹Bºâ¡A¦ý¬O³oÓ¨Ò¤l»¡©ú©I¥s sqrt ¨ç¦¡®É¡A©Ò»Ýªº°Ñ¼Æ¬OÂùºë½T«×¯BÂI¼Æ¡A¶·§â¥¦¦s©ñ©ó XMM0¡CFP1 ¬O±Ä¥Î©I¥s C »y¨¥¨ç¦¡ªº¤èªkpºâ¥¤è®Ú¡F¤UÓ¨Ò¤l¡AFP2 ¦A¥Î SSE/SSE2 «ü¥Oª½±µpºâ¥¤è®Ú¡C·íµM¥H SSE/SSE2 «ü¥Opºâ¥¤è®Ú·|§ó¦³®Ä²v¡C
²Ä 2¡ã4 ¦æ¡A¦]¬° scanf¡Bprintf¡Bsqrt §¡¬° C ¨ç¦¡®w¤ºªº¨ç¦¡¡A©Ò¥H¥²¶·«Å§i¬°¥~³¡¨ç¦¡¡C
²Ä 17 ¦æ¡A¦L¥X¦r¦ê¡A´£¥Ü¨Ï¥ÎªÌ¸Ó¿é¤J¤°»ò¡H²Ä 18 ¦æ¡A©I¥s scanf¡A±µ¦¬¨Ï¥ÎªÌ¿é¤Jªº¼ÆÈ¦r¦ê¡A¨ÃÂà´«¦¨¼ÆÈ¡A¦s©ó number ÅܼÆùØ¡C²Ä 19 ¦æ¡AÀˬd scanf ªº¦^¶ÇÈ¡A¦pªG¬O 0¡Aªí¥Ü¨S¦³±µ¦¬¨ì¥ô¦ó¼ÆÈ¡A¦L¥X¿ù»~´M®§«áÂ÷¶} FP1¡CY¨Ï¥ÎªÌ¿é¤J¥¿½T¡A«h¸õÅD¦Ü²Ä 23 ¦æ¡C
²Ä 23 ¦æÀˬd¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¬O§_¬°t¼Æ¡A¤èªk«Ü²³æ¡C¨Ì¾Ú IEEE 754 ªº³W©w¡AÂùºë½T«×ªº²Ä 63 ¦ì¤¸¬° 1 ´N¬Ot¼Æ¡C©Ò¥HÀˬd number ªº²Ä¤CӦ줸²Õªº²Ä¤C¦ì¤¸¬O§_¬°¤@¡A¦pªG¬°¤@¡A¦L¥X¿ù»~°T®§«áÂ÷¶} FP1¡C¦pªG¨Ï¥ÎªÌ¿é¤J¥¿¼Æ¡A´N¸õÅD¦Ü²Ä 28 ¦æ¡C
²Ä 28¡ã29 ¦æ¬O©I¥s C »y¨¥¨ç¦¡ sqrt¡A¦¹¨ç¦¡ªº°Ñ¼Æ¬OÂùºë½T«×¯BÂI¼Æ¡A©Ò¥H¥²¶·¦s©ñ©ó XMM0 ¼È¦s¾¹¤º¡C¹ï¸Ó°Ñ¼Æpºâ¨ä¥¤è®Ú«á¡A¬°¨ä¦^¶ÇÈ¡A¤]¬OÂùºë½T«×¯BÂI¼Æ¡AÂÇ¥Ñ XMM0 ¼È¦s¾¹¶Ç¦^¨Óªº¡C
²Ä 30¡ã31 ¦æ¬O±N¶}¤è«áªºµ²ªG¦L¥X¨Ó¡Cª`·N¡IÁöµM³oµ²ªG¬OÂùºë½T«×¯BÂI¼Æ¡A¦ý Windows ³W©w¡A¥iÅܰѼƨ禡¡]¥]§t printf¡^ªº°Ñ¼Æ¦pªG¬O¯BÂI¼Æ¡A¤´µM¦s©ó RCX¡BRDX¡BR8¡BR9¡A¦]¦¹²Ä 31 ¦æ°Ñ¼Æ¡A¨Ã¤£¬OÂÇ¥Ñ XMM ¼È¦s¾¹¶Ç»¼¡C
FP2 ª½±µ¥Î SSE/SSE2 «ü¥O¡ASQRTSD pºâ¥¤è®Ú¡Aì©l½X´X¥G©M FP1.ASM ¬Û¦P¡A©Ò¥H¤£°µ»¡©ú¡C
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 |
INCLUDE E:\masm64\include64\masm64rt.inc
EXTRN scanf:PROC
EXTRN printf:PROC
;**********************************************************
.DATA
number DQ ?
szStr DB "½Ð¿é¤J¤@Ó¥¿¼Æ¡A§Ú·|pºâ¥¦ªº¥¤è®Ú¡G",0
szErr1 DB "±z¿é¤Jt¼Æ¡AµLªk¶}¥¤è®Ú¡C",0
szErr2 DB "¿é¤J¥¿¼Æ®Éµo¥Í¿ù»~¡C",0
szFmt1 DB "%lf",0
szFmt2 DB "%gªº¥¤è®Ú=%.8g",0
;***********************************************************
.CODE
;-----------------------------------------------------------
main PROC
invoke printf,ADDR szStr
invoke scanf,ADDR szFmt1,ADDR number
or rax,rax ;Àˬd¬O§_¿é¤J¼ÆÈ
jnz chk_n
lea rcx,szErr2
jmp pnt_it
chk_n: test BYTE PTR number[7],80h ;Àˬd¬O§_¿é¤Jt¼Æ
jz pos
lea rcx,szErr1
pnt_it: call printf
jmp exit
pos: sqrtsd xmm0,number
movq r8,xmm0
invoke printf,ADDR szFmt2,number,r8
exit: invoke ExitProcess,0
main ENDP
;***********************************************************
END |