Ch 14¡@¦³¸¹¼Æ¡]¤@¡^

¦b²Ä¤»³¹¤w¸gµyµy´£¹LµL¸¹¼Æ ( unsigned number ) »P¦³¸¹¼Æ ( signed number )¡A«eªÌ¨S¦³¥¿­t¸¹¡A¤@¯ë¥iµø¬°¥¿¼Æ¡F«áªÌ¦³¥¿­t¸¹¡A¥H³Ì°ª¦ì¤¸ªí¥Ü¨ä²Å¸¹¡A³Ì°ª¦ì¤¸¬°¹s¡Aªí¥Ü¥¿¼Æ¡F¬°¤@ªí¥Ü­t¼Æ¡C³o¤@³¹¤p¤ì°¸±N±´°Q¦³¸¹¼Æ¡A¨Ã³]­p¤@µ{¦¡¥i¥H¿é¤J¨â­Ó¦³¸¹¼Æ¡AµM«á¥H³o¨â¼Æ°µ¥[´î¹Bºâ¡A¨Ã±Nµ²ªGÅã¥Ü¦b¿Ã¥ú¹õ¤W¡C

¦b¼Æ¾Ç¤Wªí¥Ü­t¼Æ«Ü²³æ¡A¥u­n¦b¼Æ­È«e¥[¤W¡u¡Ð¡v¸¹§Y¥i¡A¨Ò¦p ¡Ð88¡C¦ý¦b¹q¸£¤W­nªí¥Ü­t¼Æ¸Ó«ç»ò¿ì©O¡H¨ä¹ê¦³³\¦hºØ¤è¦¡¡A¦³¸¹¶q¼Æ ( ­ì½X )¡B¤G¸É¼Æµ¥µ¥¤èªk¡A¤£½×­þ¤@ºØ¤èªk³£¬O¥Î³Ì°ª¦ì¤¸ªí¥Ü¥¿¸¹©Î­t¸¹¡A³o³Ì°ª¦ì¤¸¤]ºÙ¬°²Å¸¹¦ì¤¸¡C¦pªG¬O¤K¦ì¤¸ªº¼Æ­È¡A²Ä¤C¦ì¤¸´N¬O²Å¸¹¦ì¤¸¡F¦pªG¬O¤Q¤»¦ì¤¸ªº¼Æ­È¡A²Ä¤Q¤­¦ì¤¸´N¬O²Å¸¹¦ì¤¸¡C¦b¹q¸£»â°ìùØ¡A³Ì§C¦ì¤¸¬O²Ä¹s¦ì¤¸¡C¦p¤U¹Ï¤¤ªº S ´N¥Nªí²Å¸¹¦ì¤¸¡G

¦³¤@ºØªí¥Ü¦³¸¹¼Æªº¤èªkºÙ¬°¡u¦³¸¹¶q¼Æ¡v¡A¥¦ªí¥Ü¥¿­t¼Æªº¤è¦¡«Üª½Ä±¡A´N¬O§â¥¿¼Æªº²Å¸¹¦ì¤¸Åܦ¨¤@´N¦æ¤F¡A¨Ò¦p 5 ªº¤K¦ì¤¸¤G¶i¦ì¼Æ¬O¡u0000 1001¡v¡A¡Ð5 ´N¬O¡u1000 1001¡v¡C³o¼Ëªºªí¥Ü¤è¦¡Áö²³æ¡A¦ý¹Bºâ°_¨Ó´N«Ü½ÆÂø¤F¡C¨Ò¦p§Ú­Ìª¾¹D 5¡Ï(¡Ð5¡~¡×0¡A¦ý¬O¦pªG¥H¦³¸¹¶q¼Æ­pºâ«oµLªk±o¨ì¹s¡A¥²¶·§â²§¸¹¼Æªº¥[ªk§ï¦¨´îªk¹Bºâ¤~¦æ¡C¦ý¦pªG­nºâ¦P¸¹¼Æªº¥[ªk¹Bºâ¡A´N¯uªº¥u­n¥Î¥[ªk¡C©Ò¥H°²³]¥Î¦³¸¹¶q¼Æªí¥Ü¦³¸¹¼Æ¡A°µ¥[ªk¹Bºâ«eÁÙ­n¥ýÀˬd³o¨â¼Æ¬O§_¬°²§¸¹¼Æ¡CÅãµM¥Î³oºØ¤è¦¡ªí¥Ü¦³¸¹¼Æ¡A­n¶i¦æ¹Bºâ¬O«Ü³Â·Ðªº¡A¦h¼Æ¹q¸£¤£±Ä¥Î³oºØ¤èªk¡C

¥t¤@ºØªí¥Ü¦³¸¹¼Æªº¤èªk¬O¥Î¡u¤G¸É¼Æ¡v¡A³o¤]¬O²{¤µ¤j¦h¼Æ¹q¸£©Ò±Ä¥Îªº¤è¦¡¡A¤]¥]§t x86/x64 ¬Û®e¹q¸£¡C


¥H¤G¸É¼Æªí¥Ü¦³¸¹¼Æ

¤G¸É¼Æ ( Two's Complement )

¤j¦h¼Æ¹q¸£¥Î¤G¸É¼Æªkªí¥Ü¦³¸¹¼Æ¡A·N«ä´N¬O¬Y¼Æªº¤G¸É¼Æ¡A´N¬O¨ä­t­È¡C¥ý¨Ó»¡»¡¡A«ç»ò¥h­pºâ¬Y¼Æªº¤G¸É¼Æ©O¡H¨ä¹ê¨Ã¤£Ãø¡A§Q¥Î©³¤Uªº¨BÆJ¡A«Ü®e©ö´N¯àºâ¥X¨Ó¡G

  1. ²Ä¤@¨B¡G§â¬Y¼ÆÅܬ°¤G¶i¦ì¼Æ¡AµM«á±N¨C¤@­Ó¦ì¤¸¤ÏÂà¡A¤ÏÂ઺·N«ä´N¬O 1 Åܬ° 0¡A0 Åܬ° 1¡C
  2. ²Ä¤G¨B¡G§â²Ä¤@¨Bªºµ²ªG¥[¤@¡A§Y±o¬Y¼Æªº¤G¸É¼Æ¡C

Á|´X­Ó¨Ò¤l¨Ó¸Õ¸Õ¬Ý¡G

²Ä¤@­Ó¨Ò¤l¡A¨D¤K¦ì¤¸ 52h ªº¤G¸É¼Æ¡A¦p¤U¹Ï¡G ¬G 52h ªº¤G¸É¼Æ¬O AEh ¦AÁ|¥t¤@­Ó¨Ò¤l¡A¨D¤K¦ì¤¸ 9Bh ªº¤G¸É¼Æ¡A¦p¤U¹Ï¡G ¬G 9Bh ªº¤G¸É¼Æ¬O 65h

¥t¥~ÁÙ¦³¤@ºØ¤è¦¡¤]¯à­pºâ¬Y¼Æªº¤G¸É¼Æ¡G

  1. ²Ä¤@¨B¡G§â¬Y¼ÆÅܬ°¤G¶i¦ì¼Æ¡A±q³Ì§C¦ì¤¸ ( ¥ç§Y²Ä¹s¦ì¤¸ ) ¶}©l¦V°ª¦ì¤¸¤è¦V¼g¡A¦pªG¬O 0¡A«h·Ó§Û¡Aª½¨ì²Ä¤@¦¸¹J¨ì 1¡A¤]·Ó§Û¡C
  2. ²Ä¤G¨B¡G¦b¹J¨ì 1 ¤§«áªº¨C­Ó¦ì¤¸³£¤ÏÂà¡A§Y¥i±o¬Y¼Æªº¤G¸É¼Æ¡C

¨Ò¦p¤U­±­n¨D 52h ªº¤G¸É¼Æ¡A¹Lµ{¦p¤U¡G ¡@①¥Ñ³Ì§C¦ì¤¸¶}©l¦V°ª¦ì¤¸¡A¦pªG¬O 0 ´N·Ó§Û¡Aª½¨ì¥X²{ 1¡A²Ä¤@¦¸¥X²{ªº 1 ¤]·Ó§Û¡C
¡@②¤ÏÂà³Ñ¤Uªº¦ì¤¸¡A³Ì«áªºµ²ªG´N¬O 52h ªº¤G¸É¼Æ¡C

¥Ñ¤W­±¨âºØ¤èªk³£¯à­pºâ¥X¨Ó¡A52h ªº¤G¸É¼Æ¬° AEh¡A9Bh ªº¤G¸É¼Æ¬O 65h¡C²{¦b¤w¸gª¾¹D¦p¦ó­pºâ¬Y¼Æªº¤G¸É¼Æ¡A¦ý¬O³o¦³¤°»ò¥Î³~©O¡H¡C

¥J²ÓÆ[¹î«á¡A¥i¥Hµo²{¤G¸É¼Æ¦³´X­Ó©Ê½è¡G

  1. ¦b¦P¼Ëªº¦ì¤¸¼Æ¤º¡A¬Y¼Æ»P¥¦ªº¤G¸É¼Æ¬Û¥[¡A¨ä©M¬°¹s¡C¨Ò¦p 52h ªº¤G¸É¼Æ¬O AEh¡A52h¡ÏAEh¡×100h¡A¦ý¬O¦pªG¥u¨ú¤K¦ì¤¸¡A¨º»ò©M´N¬O¹s¤F¡A¦p¤U¹Ï¥ª¹Ï¡C¥t¤@­Ó¨Ò¤l¡A9Bh »P¨ä¤G¸É¼Æ 65h ¤§©M¡A¤]¬O 9Bh¡Ï65h¡×100¡A¥u¨ú¤K¦ì¤¸¡A©M¤]¬O 00¡A¨£¤U¹Ï¥k¡C
  2. ¬Y¼Æªº¤G¸É¼Æ¡A¦A°µ¤@¦¸¤G¸É¼Æ¹Bºâ¡Aµ²ªG©M­ì¼Æ¤@¼Ë¡C¨Ò¦p 52h ªº¤G¸É¼Æ¬O AEh¡A¨£¤U¹Ïºñ¦â¦r¡A¦pªG§A¦A¥hºâ AEh ªº¤G¸É¼Æ¡Aµ²ªG³º¬O­ì¼Æ 52h¡A¦p¤U¹Ï¤ÑÂŦ⪺¦r¡G

¦^·Q°ê¤¤®É¾Ç¥¿­t¼Æ¡A¦pªG¨â¼Æ¬Û¥[¬°¹s¡A³o¨â­Ó¼Æ¥²¬O¤@¥¿¤@­t¡A¨Ò¦p ¡Ï58 ©M ¡Ð58¡A¥¦­Ìµ¥­È²§¸¹¡A¤¬¬°¬Û¤Ï¼Æ ( ¦b¼Æ¾Ç¤W¡A¨â¼Æ¤§©M¬°¹sªº¡A³o¨â¼Æ´N¤¬¬°¬Û¤Ï¼Æ )¡C¥t¥~¡A¦pªG§â ¡Ð58 ¦A¨ú­t¸¹¡Aµ²ªG¤SÅܦ¨ ¡Ï58¡C

¬Y¼Æ»P¨ä¤G¸É¼Æ¡A«ê¦n³£²Å¦X¤W­±ªº³W«ß¡A¦]¦¹§Ú­Ì§â¬Y¼Æ»P¨ä¤G¸É¼Æ·í¦¨¨â­Ó¬Û¤Ï¼Æ¡A¤]´N¬O»¡¡A52h ¨ú¨ä­t­È¬O AEh¡A9Bh ¨ú¨ä­t­È¬O 65h¡C¤j¦h¼Æªº²{¥N¹q¸£ùØ¡A¥Î¤G¸É¼Æ¥N´À­t¼Æ¡C


¤Q¤»¶i¦ìªº¦³¸¹¼Æ¦p¦óÂà´«¦¨¤Q¶i¦ì¼Æ

ÁA¸Ñ¤F¥H¤G¸É¼Æªí¥Ü­t¼Æ«á¡A­n¦p¦ó§â¤Q¤»¶i¦ìªº¦³¸¹¼ÆÂà´«¦¨¤Q¶i¦ì¼Æ©O¡H³o¥i¥H¤À¤T³¡¤À¨Ó»¡¡G

¦³¸¹¼Æªº¥¿¼ÆÅܤQ¶i¦ì¼Æ

¦pªG³Ì°ª¦ì¤¸¬° 0¡Aªí¥Ü¬°¥¿¼Æ¡A¨º»ò´N·ÓµL¸¹¼Æªº¤è¦¡­pºâ¡C¥i¥H°Ñ¦Òªþ¿ý¤Gªº»¡©ú¡A¥Î¦h­Ó 16 ªº¾­¦¸¤è¤§©M¨D±o¡C¨Ò¦p¤K¦ì¤¸ªº¦³¸¹¼Æ 63h Åܦ¨¤Q¶i¦ì¬°¦ó¡H¦p¥k¹Ï©Ò¥Ü¡A¥ý¬Ý³Ì°ª¦ì¤¸¬O 0¡A¦]¦¹¬O¥¿¼Æ¡C¦A§â¥¦Åܦ¨ 6¡Ñ161¡Ï3¡Ñ160¡×99¡A¦]¦¹ 63h¡×99d¡C¤]¥i¥H§â 63h Âà´«¦¨¤G¶i¦ì¡A0110 0011¡A©ó¬OÅܦ¨ 26¡Ï25¡Ï21¡Ï20¡A¥[°_¨Ó¤]¬O 99¡C

¤W­±ªº¤èªk¬O§Ú­Ì¤HÃþ¨Ï¥Î¯Èµ§¦b¸£³U¤¤­pºâªº¹Lµ{¡A¦b¹q¸£¤¤¥²¶·¥Î²Ä¤C³¹ªº¤èªk¡A¥H³sÄò°£¥H¤Q©Ò±oªº¾l¼Æ²Õ¦X°_¨Ó¡A´N¬O¤Q¶i¦ì¼Æ¦r¦r¦ê¡C

¦³¸¹¼Æªº­t¼ÆÅܤQ¶i¦ì¼Æ

¦pªG³Ì°ª¦ì¤¸¬° 1¡Aªí¥Ü¬°­t¼Æ¡A¤£¥iª½±µ­pºâ¡F¥²¶·¥ý¨ú¨ä¤G¸É¼Æ¡AµM«á¦A¨ÌµL¸¹¼Æ¤è¦¡¹Bºâ¡A³Ì«á¦A¥[¤W­t¸¹¡C³o­ì²z¬O³o¼Ëªº¡A¦³¸¹¼Æ­Y¬°­t¼Æ¡AÁöµM§Ú­Ì¤£ª¾¹D³o¼Æ¬O¤°»ò¡A¦ý¬O±N¨äÅܬ°¤G¸É¼Æ¤§«á¡A´N¬O­ì¼Æªº¬Û¤Ï¼Æ¡A´NÅܦ¨¥¿¼Æ¤F¡A¦A¨ÌµL¸¹¼Æ¤è¦¡±N³o­Ó¥¿¼ÆÅܦ¨¤Q¶i¦ì¼Æ¡A³Ì«á¦A¥[¤W­t¸¹¡C

¨Ò¦p­n§â¤K¦ì¤¸ªº¦³¸¹¼Æ 84h Åܦ¨¤Q¶i¦ì¡A¦p¥k¹Ï¡C²Ä¤@¨B¡A¥ý§â¥¦Åܦ¨¤G¶i¦ì¡A¡u1000 0100¡vÀˬd³Ì°ª¦ì¤¸¬° 1¡A±oª¾¬°­t¼Æ¡C²Ä¤G¨B±N¨äÅܦ¨¤G¸É¼Æ¡A0111 1100¡A¦A§â³o­Ó¤G¸É¼ÆÅܦ¨¤Q¶i¦ì¼Æ¡A26¡Ï25¡Ï24¡Ï23¡Ï22¡A¥[°_¨Ó¬O 124¡A³Ì«á¦A¥[¤W­t¸¹¡A¦]¦¹ 84h¡×¡Ð124¡C

¦P¼Ëªº¡A¦b¹q¸£ùØ­pºâ¹Lµ{¬O¥ý§â³o­Ó­t¼Æ°µ¤G¸É¼Æ¹Bºâ¡A¨Ï¥¦Åܦ¨¥¿¼Æ¡AµM«á¥H³sÄò°£¥H¤Q©Ò±oªº¾l¼Æ²Õ¦X°_¨Ó¡A´N¬O¤Q¶i¦ì¼Æ¦r¦r¦ê¡A³Ì«á¦b¦¹¼Æ¦r¦r¦ê«e¥[¤W­t¸¹¡A´N¤j¥\§i¦¨¤F¡C

¦³¸¹¼Æªº©Ò¦³¦ì¤¸§¡¬° 0

³o¤£¥²¸ÑÄÀ¡A¸Ó¼Æ´N¬O 0¡C¨Ò¦p¤K¦ì¤¸ªº¦³¸¹¼Æ¡A0000 0000¡A´N¥Nªí¹s¡C

«Å§i¦³¸¹¼Æ

«Å§i¦³¸¹¼Æªº¤èªk¬O¨Ï¥Î¤U­±¥|­Ó°²«ü¥O¡G

ÅܼƦW  SBYTE   ªì©l­È
ÅܼƦW  SWORD   ªì©l­È
ÅܼƦW  SDWORD  ªì©l­È
ÅܼƦW  QWORD   ªì©l­È

SBYTE¡BSWORD¡BSDWORD ¤¤ªº¡uS¡v¬O sign ªº·N«ä¡A¤ñ¸û¯S§Oªº¬O¨S¦³¡uSQWORD¡v¨Ó«Å§i¥|¦r²Õªº¦³¸¹¼Æ¡C³]­pµ{¦¡®É¨Ì¾Ú¦³¸¹¼Æªº½d³ò¨M©w¨Ï¥Î­þ¤@ºØ°²«ü¥O¡A¥¦­Ìªº½d³ò¦p¤Uªí¡G

ºØÃþ°²«ü¥O¦WºÙªø«× ( ¦ì¤¸²Õ )©Ò¯àªí¥Üªº¾ã¼Æ½d³ò
µL¸¹¼ÆDB¡BBYTE¦ì¤¸²Õ10¡ã255
DW¡BWORD¦r²Õ20¡ã65,535
DD¡BDWORDÂù¦r²Õ40¡ã4,294,967,295
DQ¡BQWORD¥|¦r²Õ80¡ã18,446,744,073,709,551,615
¦³¸¹¼ÆSBYTE¦ì¤¸²Õ1¡Ð128¡ã127
SWORD¦r²Õ2¡Ð32,768¡ã32,767
SDWORDÂù¦r²Õ4¡Ð2,147,483,648¡ã2,147,483,647

Æ[¹î¤Wªí¡A±oª¾µL¸¹¼Æªº¦ì¤¸¼Æ¶V¦h¡A©Ò¯àªí¥Üªº½d³ò¤]¶V¤j¡F¦³¸¹¼Æ¤]¬O¤@¼Ë¡C¦ý¬O¦b¬Û¦P¦ì¤¸®É¡A¥¿¼Æ»P­t¼Æ¤j¬ù¦U¦û¤@¥b¡A¦]¦¹¦³¸¹¼Æ©Ò¯àªí¥Üªº¥¿¼Æ½d³ò¸ûµL¸¹¼Æ¤p¡C

ÁöµM¦b¤Wªí¤¤¡A¥Î¤£¦Pªº°²«ü¥O«Å§i¦³¸¹¼Æ©MµL¸¹¼Æ¡A¦ý¬O¹ê»Ú¤W²ÕĶ¾¹¨Ã¤£¤Ó¦b¥G³oºØ°Ï§O¡A¨Ò¦p§A¤]¥i¥H¥Î DB/DW/DD «Å§i¦³¸¹¼Æ¡A¤Ï¹L¨Ó¤]¥i¥H¥Î SBYTE/SWORD/SDWROD «Å§iµL¸¹¼Æ¡A¤U­±ªº¨Ò¤l³£¬O¥¿½Tªº«Å§i¡G

x       DB      -1
y       DW    -100
z       SWORD   65535

¦¹¥~­nª¾¹Dªº¬O¡AµL¸¹¼Æ©Î¦³¸¹¼Æªº§P§O¤è¦¡¨ä¹ê§¹¥þ¥Ñµ{¦¡¨M©w¡A¨Ã«D¥Ñ«Å§i®É¨M©w¡A³o¤]´N¬O¬°¦ó²ÕĶ¾¹¤£¤Ó¦b¥G DB/BYTE »P SBYTE ªº°Ï§O¡C¨Ò¦p¬Y­Ó¦ì¤¸²Õ¬O 0FFh ¨ä¹ê¥i¥Hªí¥ÜµL¸¹¼Æªº 255¡A¤]¥i¥Hªí¥Ü¦³¸¹¼Æªº ¡Ð1¡A§¹¥þ¬Ýµ{¦¡¦p¦ó¸ÑÄÀ¡C¤U¹Ï¬O¤@­Ó¦ì¤¸²Õªº¦³¸¹¼Æ»PµL¸¹¼Æ¥Ü·N¹Ï¡A¥i¥H¬Ý±o¥X¨Ó¡G

¤f»¡µL¾Ì¡A©³¤Uªºµ{¦¡½X¡A¥ªÃ䪺·|§â 0FFh ·í¦¨µL¸¹¼Æ¡A§Y 0FFh¡×255¡A°õ¦æ«á·|¦b¿Ã¥ú¹õ¤WÅã¥Ü 255¡F¦Ó¥kÃ䪺µ{¦¡·|§â 0FFh ·í¦¨¦³¸¹¼Æ¡A§Y 0FFh¡×¡Ð1¡A°õ¦æ«á·|¦b¿Ã¥ú¹õ¤WÅã¥Ü ¡Ð1¡G

.MODEL  SMALL,C
.386
;*************************************************
.DATA
x       DB      0FFh
ten     DB      10
string  DB      6 DUP (?),"$"
;*************************************************
.CODE
        .STARTUP
        mov     al,x
        mov     cx,3
        mov     bx,OFFSET string+SIZEOF string-2
.WHILE cx
        xor     ah,ah
        div     ten
        add     ah,"0"
        mov     [bx],ah
.BREAK .IF al==0
        dec     bx
        dec     cx
.ENDW
        mov     dx,bx
        mov     ah,9
        int     21h
        .EXIT
;*************************************************
END
.MODEL  SMALL,C
.386
;*************************************************
.DATA
x       DB      0FFh
ten     DB      10
string  DB      6 DUP (?),"$"
;*************************************************
.CODE
        .STARTUP
        mov     al,x
        neg     al
        mov     cx,3
        mov     bx,OFFSET string+SIZEOF string-2
.WHILE cx
        xor     ah,ah
        div     ten
        add     ah,"0"
        mov     [bx],ah
.BREAK .IF al==0
        dec     bx
        dec     cx
.ENDW
        dec     bx
        mov     BYTE PTR [bx],"-"
        mov     dx,bx
        mov     ah,9
        int     21h
        .EXIT
;*************************************************
END

¥ªÃ䪺µ{¦¡¡A¨ä¹ê»P²Ä¤C³¹ªº DECIMAL.ASM Ãþ¦ü¡A¥u¬O§â¤Q¤»¶i¦ì¼Æ­È¥Ñ¦ì¤¸²Õ§ï¦¨¦r²Õ¡A¨ä¾l§¡¬Û¦P¡C¦Ó¥kÃ䪺µ{¦¡«h¦h¤F NEG «ü¥O©M¦b¦r¦ê«e¥[¤W¡u¡Ð¡v¸¹¡C


·¸¦ì ( Overflow )

¥H¤G¸É¼Æªí¥Ü¦³¸¹¼ÆªºÀuÂIÁöµM¦h¡A¦ý¬O¦³­Ó¤p¯ÊÂI¡A§Ú­Ì¥u­n¤p¤ß³B²z³o­Ó¯ÊÂI¡A¨Ã¤£·|³y¦¨¤Ó¤jªº§xÂZ¡C³o­Ó¯ÊÂI¬O¤°»ò©O¡H¥ý¨Ó¬Ý©³¤Uªº¨Ò¤l¡C

¦pªG­n­pºâ¤Q¶i¦ìªº¨â¼Æ 96¡Ï92¡A§Ú­Ì³£ª¾¹D¡Aµª®×¬O 188¡A¨º»ò¦b¹q¸£ùجO¦p¦ó­pºâªº©O¡H­º¥ý§â³o¨â¼ÆÅܦ¨¤G¶i¦ì¡A¤À§O¬O 0110 0000 ( 96d¡×60h )¡B0101 1100 ( 92d¡×5Ch )¡A¥[°_¨ÓÅܦ¨ 1011 1100¡Aµ²ªGÅܦ¨­t¼Æ¡A¦p¥k¹Ï¡C«Ü©úÅ㪺¥i¥H¬Ý¥X¨Ó¡A³o¬O¦]¬°¨â­Ó¼Æªº²Ä¤»¦ì¤¸³£¬O¤@¡A¬Û¥[¤§«á¶i¦ì¨ì²Å¸¹¦ì¤¸¡A¥H­P¨Ï¨â¼Æ¤§©MÅܦ¨­t¼Æ¡C¹³³oºØ±¡§Î¡A¹Bºâªºµ²ªG¶W¹L©Ò¯àªí¥Üªº½d³ò¡A´NºÙ¬°·¸¦ì¡C¥H³o­Ó¨Ò¤l¨Ó»¡¡A¤K¦ì¤¸©Ò¯àªí¥Üªº¦³¸¹¼Æ½d³ò¬O ¡Ð128¡ã127¡A¦Ó 96¡Ï92 ¬O 188¡A¶W¹L¤F 127¡A³o¼Ëªº±¡§Î´N¬O·¸¦ì¡C

ÁÙ¦³¤@ºØ±¡§Î¡A¨â­Ó­t¼Æ¬Û¥[¡A¤]¦³¥i¯à³y¦¨·¸¦ì¡C¨Ò¦p ¡Ð80¡Ï(¡Ð90) ( ¡Ð80d¡×B0h¡B¡Ð90¡×A6h )¡Aµ²ªGÀ³¸Ó¬O ¡Ð170¡A¦pªG¥H¦³¸¹¼Æ¹Bºâµ²ªG¦p¥k¹Ï¡A¥i¥Hµo²{²Å¸¹¦ì¤¸Åܦ¨ 0¡Aµ²ªG¬°¥¿¼Æ¡C³o¬O¦]¬°µ²ªG¤p©ó ¡Ð128¡A¶W¹L¤F¦³¸¹¼Æªº½d³ò¡A¦]¦¹³y¦¨·¸¦ì¡C

´îªk¤]¦³¥i¯à·¸¦ì¡A¨Ò¦p 96¡Ð(¡Ð92)¡Aµ²ªGÀ³¸Ó¬O 188¡A¶W¹L ¡Ð128¡ã127 ªº½d³ò¡F¥t¤@ºØ±¡§Î¬O¹³ ¡Ð96¡Ð92¡Aµ²ªG¬O ¡Ð188¡A¤]¶W¹L ¡Ð128¡ã127 ªº½d³ò¡C

¾ã²z¤§«áµo²{¡A¦pªG¨Ï«Ü¤jªº¨â¥¿¼Æ¬Û¥[¡A©Î¬O«Ü¤pªº¨â­t¼Æ¬Û¥[¡A´N¦³¥i¯àµo¥Í·¸¦ì¡F©Î¬O¨Ï«Ü¤jªº¥¿¼Æ´î«Ü¤pªº­t¼Æ¡A©Î«Ü¤pªº­t¼Æ´î«Ü¤jªº¥¿¼Æ¡A³£¦³¥i¯àµo¥Í·¸¦ì¡C¨º»ò¬O§_¦³¤èªk¯à°÷³B²z³oºØ·¸¦ì¿ù»~©O¡H¨Æ¹ê¤W¡ACPU ¦b³]­p®É´N¤w¸g¦Ò¼{³o­Ó°ÝÃD¤F¡C·í¹Bºâµo¥Í·¸¦ì®É¡ACPU ·|¦Û°Ê³]©w·¸¦ìºX¼Ð ( overflow flag )¡A¨Ï·¸¦ìºX¼ÐÅܦ¨¤@¡A¦b DEBUG/SYMDEB ùØÅã¥Ü OV¡F¦pªG¨Sµo¥Í·¸¦ì¡A´N·|²M°£·¸¦ìºX¼Ð¡A¨Ï·¸¦ìºX¼ÐÅܦ¨¹s¡ADEBUG/SYMDEB Åã¥Ü NV¡C¦b³]­pµ{¦¡®É¡A´N¯à°÷¨Ì¾Ú·¸¦ìºX¼Ðªºª¬ºA¡A¦Ò¼{¦p¦ó³B²z·¸¦ìªº°ÝÃD¡C


¦³Ãö¸É¼Æ©Î·¸¦ìªº«ü¥O


NEG «ü¥O

NEG «ü¥O¬O¥Î¨Ó­pºâ¤G¸É¼Æªº«ü¥O¡A¥¦ªº»yªk¬O

NEG     ¥Øªº¹Bºâ¤¸

NEG ·|­pºâ¥Øªº¹Bºâ¤¸ªº¤G¸É¼Æ¡AµM«á¦A¦s¦^¥Øªº¹Bºâ¤¸¡A¥Øªº¹Bºâ¤¸·|³Q¯}Ãa¡C¥Øªº¹Bºâ¤¸¥i¥H¬O¤K©Î¤Q¤»¦ì¤¸ªº¼È¦s¾¹©ÎÅܼơA­Y¦b 80386 µ¥¯Å¥H¤Wªº CPU¡A¥Øªº¹Bºâ¤¸¥i¥H¨Ï¥Î¤T¤Q¤G¦ì¤¸ªº¼È¦s¾¹©ÎÅܼơC


NOT «ü¥O

NOT «ü¥O¬O¥Î¨Ó­pºâ¤@¸É¼Æªº«ü¥O¡C¤@¸É¼Æ¬O§â©Ò¦³¦ì¤¸¤ÏÂà¡A¥ç§Y¤@Åܹs¡A¹sÅܤ@¡CNOT ªº»yªk¬O

NOT     ¥Øªº¹Bºâ¤¸

NOT ·|­pºâ¥Øªº¹Bºâ¤¸ªº¤@¸É¼Æ¡AµM«á¦A¦s¦^¥Øªº¹Bºâ¤¸¡A¥Øªº¹Bºâ¤¸·|³Q¯}Ãa¡C¥Øªº¹Bºâ¤¸¥i¥H¬O¤K©Î¤Q¤»¦ì¤¸ªº¼È¦s¾¹©ÎÅܼơA­Y¦b 80386 µ¥¯Å¥H¤Wªº CPU¡A¥Øªº¹Bºâ¤¸¥i¥H¨Ï¥Î¤T¤Q¤G¦ì¤¸ªº¼È¦s¾¹©ÎÅܼơC


JO/JNO «ü¥O

JO/JNO «ü¥O¬O±ø¥ó¸õ¶V¡AO ¬O«ü·¸¦ìªº·N«ä¡ANO ¬O¨S¦³·¸¦ì¡F·í¹Bºâµo¥Í·¸¦ì®É¡ACPU ·|³]©w·¸¦ìºX¼Ð¡A¨Ï¤§Åܬ°¤@¡F·í¹Bºâ¨Sµo¥Í·¸¦ì®É¡ACPU ´N²M°£·¸¦ìºX¼Ð¡A¨Ï¤§Åܬ°¹s¡C¥¦ªº»yªk¬O¡G

JO      ¼Ð°O
JNO     ¼Ð°O

JO ¬O¦pªGµo¥Í·¸¦ì¡A´N¸õ¨ì¼Ð°O³B°õ¦æ¡FJNO «h¬O¨S¦³·¸¦ì¡A¤~¸õ¨ì¼Ð°O³B°õ¦æ¡C


TEST «ü¥O

TEST «ü¥Oªº»yªk¬O

TEST    ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸

TEST «ü¥O©M AND «ü¥O´X¥G¤@¼Ë¡A®t§O¦b©ó TEST ¶È¶È°µ¹Bºâ¦Ó¤w¡A¤£·|§â¹Bºâµ²ªG¼g¤J¥Øªº¹Bºâ¤¸¡A´«¥y¸Ü»¡¡A¥Øªº¹Bºâ¤¸¤£ÅÜ¡CÁö¬O¦p¦¹¡A¦ý TEST ·|§ïÅܺX¼Ð¡CTEST ·|²M°£¶i¦ìºX¼Ð»P·¸¦ìºX¼Ð¡A·|¨Ì¾Ú¹Bºâµ²ªG§ïÅܲŸ¹ºX¼Ð¡B¹s­ÈºX¼Ð¡B¦P¦ìºX¼Ð¡C

§Ú­Ì¥i¥HÂÇ¥Ñ TEST ªº¯S©Ê¡AÀˬd¬Y­Ó¦³¸¹¼Æ¬O¥¿¼ÆÁÙ¬O­t¼Æ¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G

            mov     ax,0ffffh
            test    ax,8000h
            jnz     negative
positive:    .
             .
negative:    .

¦pªG AX ¬O­t¼Æ¡A¨º»ò²Ä 15 ¦ì¤¸¬° 1¡A»P 8000h °µ TEST ¹Bºâ¡A¦Ó 8000h ªº²Ä 15 ¦ì¤¸¤]¬O 1¡A¬G¹Bºâ«áµ²ªG¤£¬°¹s¡A´N·|¸õÅD¨ì negative ³B¡C


½d¨Ò¡GCOMPUTE.ASM

COMPUTE Åý¨Ï¥ÎªÌ¿é¤J¨â­Ó¦b ¡Ð32768¡ã32767 ½d³ò¤ºªº¦³¸¹¼Æ¡ACOMPUTE ·|°µ¥[ªk©M´îªk¹Bºâ¡A¦b§âµ²ªG¦L¦b¿Ã¹õ¤W¡C²ÕĶ COMPUTE.ASM ¤Î°õ¦æµ²ªG¦p¤U¹Ï¡G

COMPUTE.ASM §¹¾ãµ{¦¡½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
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
;¥ô¿é¤J¨â¼Æ¡An1»Pn2¡ACOMPUTE·|¹ï¦¹¤G¼Æ°µ¥[´îªk¹Bºâ¡AµM«á¦L¥Xµª®×¨Ó
.MODEL  SMALL,C
.386
;*******************************************************************************
.STACK          256
;*******************************************************************************
.DATA
n1              SWORD   ?
n2              SWORD   ?
plus_or_minus   DW      0
n_str           DB      8 DUP (?),"$"
msg1            DB      "Input a number (-32768~32767):$"
msg2            DB      0dh,0ah,"Error input.$"
crlf            DB      0dh,0ah,"$"
buffer          DB      9 DUP (?)
exit_code       DB      ?
;*******************************************************************************
.CODE
;-------------------------------------------------------------------------------
print_string    PROC    p_str:WORD
                mov     dx,p_str
                mov     ah,9
                int     21h
                ret
print_string    ENDP
;-------------------------------------------------------------------------------
;get_number·|§âpoint©Ò«ü¦ì§}ªº¼Æ¦r¦r¦êÅܦ¨¦³¸¹¼Æ¦s¤JAX
;¿é¤J¡Gpoint¡G¼Æ¦r¦r¦ê¤§¦ì§}¡A¦¹¦r¦ê²Ä¤@­Ó¦ì¤¸²Õ¥Nªí¼Æ¦r¦û¥Î¦h¤Ö¦ì¤¸²Õ¡C
;¡@¡@¡@¡@¡@¡@ ¨Ò¦p¡u03,2dh,33h,33h¡v¡A§Y¡u-33¡v¡A³Ì«áAX¡×FFDFh
;¿é¥X¡G¶i¦ìºX¼Ð¡GCX¡×0¡A¿ù»~
;¡@¡@¡@¡@¡@¡@¡@¡@CX¡×1¡A¥¿½T¡AAX¡×¦³¸¹¼Æ
get_number      PROC    point:WORD
                LOCAL   n:SWORD
                LOCAL   sign:WORD
                mov     si,point
                mov     n,0
                movzx   cx,BYTE PTR [si]        ;CX¡×¨Ï¥ÎªÌ¿é¤Jªº¦ì¤¸²Õ­Ó¼Æ
        ;Àˬd¨Ï¥ÎªÌ¿é¤Jªº²Ä¤@­Ó¦ì¤¸²Õ¬O§_¬°"+"¡B"-"¡A¦pªG¬O«h¨Ïsign¶ñ¤J²Å¸¹¡A¨Ã
        ;½Õ¾ãCX»PSI¡A¨Ï¨ä«ü¦V¤U¤@­Ó¦ì¤¸²Õ
                inc     si
                cmp     BYTE PTR [si],"-"
                jne     chk_positive
                mov     sign,2dh                ;2dh="-"
                jmp     short adjust
chk_positive:   mov     sign,2bh                ;2bh="+"¡A­Y¨Ï¥ÎªÌ¨S¿é¤J²Å¸¹¡A·í¦¨
                cmp     BYTE PTR [si],"+"       ;¥¿¼Æ¡A¦]¦¹¡umov sign,2bh¡v¦b cmp
                jne     arabic_numeral          ;¤§«e
adjust:         inc     si                      ;¦pªG¨Ï¥ÎªÌ¦³¿é¤J"+"¡B"-"¡AÅý
                dec     cx                      ;SI«ü¦V¤U¤@¦ì¤¸²Õ¡ACX´î¤@
                cmp     cx,5                    ;¤@­Ó¦r²Õªº¤Q¶i¦ì¼Æ³Ì¤j¬°5¦ì¼Æ
                ja      error                   ;­Y¶W¹L¡Aªí¥Ü¿é¤J¿ù»~
arabic_numeral: cld
next:           mov     dx,n    ;¦¹¦æ¨ì¤U­±¤T¦æ¡A¨ä¹ê¬O­pºâ10*n
                shl     n,3     ;10*n¡×2*n+8*n¡A¡ushl n,3¡v¥ç§Y­pºâ8*n
                shl     dx,1    ;­pºâ2*n
                add     n,dx    ;¤£¨Ï¥ÎMUL«ü¥O¬O¦]¬°MUL¶O®É¸û¦h
                jo      ovflw
                lodsb
                sub     al,"0"
        ;Àˬd¨Ï¥ÎªÌ¿é¤Jªº¦Û¬O§_¬°ªü©Ô§B¼Æ¦r¡A¥²¶·¦b0¡ã9¤§¶¡
                cmp     al,0
                jb      error
                cmp     al,9
                ja      error
                cbw
                add     n,ax
                jo      ovflw   ;¦pªG·¸¦ì¡Aªí¥Ü¤£¦b-32768~32767
                loop    next
                jmp     ok
ovflw:  .IF sign==2dh
                cmp     n,8000h
                je      ok
        .ENDIF
error:          sub     cx,cx
                jmp     exit
ok:             mov     ax,n
        .IF sign==2dh
                neg     ax
        .ENDIF
                mov     cx,1
exit:           ret
get_number      ENDP
;-------------------------------------------------------------------------------
;hex2dec_str§â¤Q¤»¶i¦ì¼Æ­ÈÅܦ¨¤Q¶i¦ìªº¦r¦ê
;¿é¤J¡Gn¡Ð¤Q¤»¶i¦ì¼Æ­È
;¡@¡@¡@sign¡Ð«ü©w¥¿­t¸¹¡C0¡G¥Hnªº³Ì°ª¦ì¤¸¨M©w¥¿©Î­t¡F"+"¡Gn¬°¥¿¼Æ¡F"-"¡Gn¬°­t¼Æ
;¡@¡@¡@address¡Ð¤Q¶i¦ì¦r¦êªº­Ó¦ì¼Æ
;¿é¥X¡GAX¡Ð¤Q¶i¦ì¦r¦ê°_©l¦ì§}
hex2dec_str     PROC    n:WORD,sign:WORD,address:WORD
                LOCAL   ten:WORD
                mov     ax,n
.IF sign==0
                mov     sign,2bh        ;2bh="+"
                test    ax,8000h
                jz      positive0
                mov     sign,2dh        ;2dh="-"
                neg     ax
.ELSEIF sign==2dh
                neg     ax
.ENDIF
positive0:      mov     cx,5
                mov     bx,address
                mov     ten,10
.WHILE cx
                xor     dx,dx
                div     ten
                add     dl,"0"
                mov     [bx],dl
.BREAK .IF ax==0
                dec     bx
                dec     cx
.ENDW
.IF sign==2dh
                dec     bx
                mov     BYTE PTR [bx],"-"
.ENDIF
                mov     ax,bx
                ret
hex2dec_str     ENDP
;-------------------------------------------------------------------------------
print_char      PROC    char:BYTE
                mov     dl,char
                mov     ah,2
                int     21h
                ret
print_char      ENDP
;-------------------------------------------------------------------------------
expression      PROC    char:BYTE
            ;¦L¥Xn1
                INVOKE  hex2dec_str,n1,0,OFFSET n_str+SIZEOF n_str-2
                INVOKE  print_string,ax
            ;¦L¥X¡u+¡v©Î¡u-¡v
                INVOKE  print_char,char
            ;¦pªGn2¬°­t¼Æ¡A¨º»ò­n¦L¥X¡u(¡v¡A§_«h¤£¥²
                test    n2,8000h
                jz      positive1
                INVOKE  print_char,"("
            ;¦L¥Xn2
positive1:      INVOKE  hex2dec_str,n2,0,OFFSET n_str+SIZEOF n_str-2
                INVOKE  print_string,ax
            ;¦pªGn2¬O­t¼Æ¡A¨º»ò­n¦L¥X¡u)¡v¡A§_«h¤£¥²
                test    n2,8000h
                jz      positive2
                INVOKE  print_char,")"
            ;¦L¥X¡u=¡v
positive2:      INVOKE  print_char,"="
                ret
expression      ENDP
;-------------------------------------------------------------------------------
                .STARTUP
        ;¦L¥X¡uInput a number (-32768~32767):¡v¡A¨ÃÅý¨Ï¥ÎªÌ¿é¤J¼Æ¦r¦r¦ê
                INVOKE  print_string,OFFSET msg1
                mov     ah,0ah
                lea     dx,buffer
                mov     buffer,7
                int     21h
            ;§â¼Æ¦r¦r¦êÅܦ¨¦³¸¹¼Æ¡A¦s©ón1
                INVOKE  get_number,OFFSET buffer+1
                jcxz    err1
                mov     n1,ax
                INVOKE  print_string,OFFSET crlf        ;´«¦æ
        ;¦L¥X¡uInput a number (-32768~32767):¡v¡A¨ÃÅý¨Ï¥ÎªÌ¿é¤J¼Æ¦r¦r¦ê
                INVOKE  print_string,OFFSET msg1
                mov     ah,0ah
                lea     dx,buffer
                mov     buffer,7
                int     21h
            ;§â¼Æ¦r¦r¦êÅܦ¨¦³¸¹¼Æ¡A¦s©ón2
                INVOKE  get_number,OFFSET buffer+1
                jcxz    err1
                mov     n2,ax
                INVOKE  print_string,OFFSET crlf
                jmp     compute
err1:           INVOKE  print_string,OFFSET msg2
                mov     exit_code,1
                jmp     quit
        ;­pºân1¡Bn2¤§©M¡A¨Ã¦L¥Xµ²ªG¨Ó
            ;¦L¥X¡un1+n2=¡vªº¹Bºâ¦¡
compute:        INVOKE  expression,"+"
            ;­pºâAX=n1+n2¡A¤@¯ë±¡§Î¤U¡AAX¬°¦³¸¹¼Æ¡A¦ý¦pªG¦³·¸¦ì¡A­nÂÇ¥Ñ
            ;plus_or_minusªí¥Ü¥¿­t¸¹¡A¦¹³B¥ý°²³]¬°¤@¯ë±¡§Î
                mov     plus_or_minus,0
                mov     ax,n1
                add     ax,n2
                jno     not_overflow1
            ;¦pªGµo¥Í·¸¦ì¡A­Yn1¡Bn2¬Ò¬°­t¡AAX¥ç¬°­t¡F­Yn1¡Bn2¬Ò¬°¥¿¡AAX¥ç¬°¥¿
                mov     plus_or_minus,2bh       ;2bh="+"
                test    n1,8000h
                jz      not_overflow1
                mov     plus_or_minus,2dh       ;2dh="-"
            ;¦L¥XAX
not_overflow1:  INVOKE  hex2dec_str,ax,plus_or_minus,OFFSET n_str+SIZEOF n_str-2
                INVOKE  print_string,ax
        ;¦L¥X´«¦æ²Å¸¹
                INVOKE  print_string,OFFSET crlf
        ;­pºân1¡Bn2¤§®t¡A¨Ã¦L¥Xµ²ªG¨Ó
            ;¦L¥X¡un1-n2=¡vªº¹Bºâ¦¡
                INVOKE  expression,"-"
            ;­pºâAX=n1-n2¡A¤@¯ë±¡§Î¤U¡AAX¬°¦³¸¹¼Æ¡A¦ý¦pªG¦³·¸¦ì¡A­nÂÇ¥Ñ
            ;plus_or_minusªí¥Ü¥¿­t¸¹¡A¦¹³B¥ý°²³]¬°¤@¯ë±¡§Î
                mov     plus_or_minus,0
                mov     ax,n1
                sub     ax,n2
                jno     not_overflow2
            ;¦pªGµo¥Í·¸¦ì¡A­Yn1¡Bn2¬Ò¬°­t¡AAX¥ç¬°­t¡F­Yn1¡Bn2¬Ò¬°¥¿¡AAX¥ç¬°¥¿
                mov     plus_or_minus,2bh       ;2bh="+"
                test    n1,8000h
                jz      not_overflow2
                mov     plus_or_minus,2dh       ;2dh="-"
            ;¦L¥XAX
not_overflow2:  INVOKE  hex2dec_str,ax,plus_or_minus,OFFSET n_str+SIZEOF n_str-2
                INVOKE  print_string,ax
                mov     exit_code,0
                jmp     quit
quit:           .EXIT   exit_code
;*******************************************************************************
END

COMPUTE.ASM ¦@¦³¨â¦Ê¦h¦æ¡A¬O¤p¤ì°¸¨ì¥Ø«e©Ò¤¶²Ð¹L³Ì¤jªºµ{¦¡¤F¡A¦ý¬O¦³³\¦hÆ[©À¦b«e­±´X³¹³£¤¶²Ð¹L¤F¡A¨ä¤¤ÁÙ¦³³\¦h¬Oµù¸Ñ¡A¦]¦¹ÁöµMµ{¦¡¸ûªø¡A«o¤£·|¤ÓÃø¡C

¤p¤ì°¸¦b¼¶¼g COMPUTE.ASM ®É¡AºÉ¶q§â°Æµ{¦¡»P¨ä¥L°Æµ{¦¡©Î¥Dµ{¦¡¹jÂ÷¡C·N«ä¬O¥u¦³´X­Ó»Ý­nªº°Ñ¼Æ¶Çµ¹°Æµ{¦¡¡AµM«á°Æµ{¦¡°õ¦æ¹Lµ{¥u·|¥Î¨ì³o¨Ç°Ñ¼Æ¡A¦Ó¤£·|¦A¨Ï¥Î¨ì¨ä¥L¸ê®Æ¡F³Ì«á°Æµ{¦¡°õ¦æ§¹«á¡A¦A§â¶Ç¦^­È¶Çµ¹¥Dµ{¦¡¡C³o¼Ë°µªº¦n³B¬O①Åý°Æµ{¦¡³æ¿W¹B§@¨B²o¯A¨ä¥Lµ{¦¡®e©ö­×§ïºûÅ@¡A②¸û¨ã¦³¥iŪ©Ê¡A③°Æµ{¦¡¯à°µ¦¨µ{¦¡®w¨Ñµ¹¨ä¥Lµ{¦¡¨Ï¥Î¡C©³¤U¨Ó¬Ý¬Ý¨â­Ó­«­nªº°Æµ{¦¡¡C


°Æµ{¦¡¡Gget_number

get_number ¬O¥Î¨Ó§â¨Ï¥ÎªÌÂÇ¥Ñ AH¡×0AH/INT21H ¿é¤Jªº¦r¦êÂà´«¦¨¤Q¤»¶i¦ì¦³¸¹¼Æ¡C©Ò¥Î°Ñ¼Æ¥u¦³¤@­Ó¡A¨º´N¬O¦r¦ê¦ì§}¡C¦ý¨Ï¥Î AH¡×0AH/INT 21H ®É¡A¦r¦êªº²Ä¤@­Ó¦ì¤¸²Õ¬O½w½Ä°Ï¤j¤p´î¤G¡A³o­Ó¸ê®Æ¦b get_number ¨S¥ÎµÛ¡A©Ò¥H get_number ªº°Ñ¼Æ¡A¦r¦ê¦ì§}¬O¥Ñ½w½Ä°Ïªº²Ä¤G­Ó¦ì¤¸²Õ¶}©l¡C¨£µ{¦¡²Ä 158¡B169 ¦æ¡A©I¥s get_number ®Éªº°Ñ¼Æ¬O¡uOFFSET buffer+1¡v¡A³o­Ó°Ñ¼Æ¦b get_number ùØ¥s°µ point¡A²Ä 35 ¦æ´N§â³o­Ó¦ì§}²¾¨ì SI ùØ¡A¦Ó«á¥Î SI «ü¦V¦r¦êªº¨C­Ó¦ì¤¸²Õ¡A¥H´£¨ú¸ê®Æ¡C

±µ¤U¨Ó get_number ¨ú±o¦r¦êªø«×¡A¦]¬°¦b½w½Ä°Ï¤¤ªº¦r¦êªø«×¬O¤@­Ó¦ì¤¸²Õªí¥Ü¡A¦Ó«Ý·|­n¥Î LOOP °j°é¡A¦]¦¹¥Î movzx «ü¥O§â³o¤@­Ó¦ì¤¸²ÕÂX¥R¦¨ CX¡C

²Ä 40¡ã51 ¦æ¡AÀˬd¨Ï¥ÎªÌ¬O§_¿é¤J¥¿­t¸¹¡AµM«á§â¥¿­t¸¹¦s¤J sign ùØ¡C°²¦p¨Ï¥ÎªÌ¨S¿é¤J¥¿­t¸¹¡A´Nªí¥Ü¦¹¼Æ¬°¥¿­È¡F¦pªG¦³¿é¤J¥¿­t¸¹¡A´N¨Ì¾Ú¨Ï¥ÎªÌ«ü©w¤è¦¡§â¥¿­t¸¹¦s¤J sign¡A¦P®É¨Ï CX ´î¤@¨Ã¨Ï SI «ü¦V¤U¤@­Ó¦ì¤¸²Õ¡C

²Ä 44 ¦æ¬O«ü¦pªG¨Ï¥ÎªÌ¦³¿é¤J­t¸¹¡A§â 2Dh ¦s¤J sign «á¸õÅD¨ì¨Ï CX ´î¤@¨Ã¨Ï SI «ü¦V¤U¤@­Ó¦ì¤¸²Õªº¦a¤è¡A¨Ï¥Î¡ujmp short adjust¡v¡C¦¹³B§Ú­Ì¯à°÷«Ü©ú½Tª¾¹D¡Aadjust Â÷ jmp «ü¥O«Üªñ¡A¤£¶W¹L 127 ­Ó¦ì¤¸²Õ¡A¦]¦¹¬Oµuµ{¸õÅD¡A´N¥i¥H¥Î¡ushort¡v°²«ü¥O¥[¥H«ü©w¡C

±µµÛ·|¶i¤J°j°é¡A¦b³o°j°éùØ¡Aget_number ¨ä¹ê¬O§â¨Ï¥ÎªÌ¿é¤Jªº¦r¦ê³£·í¦¨¥¿¼Æªº¨C¤@¦ì¥h­pºâ¡C­pºâµ²ªG¦A¨Ì¾Ú¨Ï¥ÎªÌ sign ¥h½Õ¾ã¥¿­t¼Æ¡A¦pªG¬O­t¼Æ¡A´N¥Î neg ½Õ¾ã¡F¦pªG¬O¥¿¼Æ´N¤£¥²½Õ¾ã¡C

§â¤@­Óªü©Ô§B¼Æ¦r²Õ¦¨ªº¦r¦êÅܦ¨¤Q¤»¶i¦ì¼Æ¨Ã¤£Ãø¡C¨Ò¦p¨Ï¥ÎªÌ¿é¤J¡u33¡v¡A¦b°O¾ÐÅ餤·|Åܦ¨¤@­Ó¥Ñ ASCII ½X²Õ¦¨ªº¦r¦ê¡A¡u02¡B33h¡B33h¡v¡C2 ¬O¦¹¼Æ¥u¦³¨â¦ì¼Æ¡A³o­Ó 2 ·|¦s¤J CX¡A·í¦¨°j°é­n°õ¦æªº¦¸¼Æ¡C¨C¦¸Åª¨ú³o¨Çªü©Ô§B¼Æ¦r®É¡A¥ý´î¥h 30h¡AÅܦ¨¯u¥¿ªº¼Æ¡A3¡C´î¥h«á¡A³o¨â­Ó 3 ªí­±¤@¼Ë¦ý·N¸q¤£¦P¡A«eªÌ¥Nªí 30¡A«áªÌ¤~¬O 3¡C©Ò¥H«e­±ªº 3 ­n­¼¥H 10¡A¤p¤ì°¸§â³o­Ó¼Æ¦r¥ý¼È®É¦s¦b n ùØ­±¡C

ÁA¸Ñ¤F­ì²z¤§«á¡A±µ¤U¨Ó¶i¤J LOOP °j°é¡Cget_number ¥Î SI ³v¤@«ü¦V¦r¦êªº¨C­Ó¦ì¤¸²Õ¡AµM«á§â¥¦¸ü¤J¨ì AL ùØ¡AÀˬd AL ¬O§_¦b 0¡ã9 ¤§¶¡ ( ²Ä 60¡ã64 ¦æ )¡A¦pªG¬Oªº¸Ü¡A§â­ì¥ý¤wŪªº¼Æ­È¡A´N¬O n¡A­¼¥H¤Q¥H«á ( ¨£²Ä 53¡ã56 ¦æ )¡A¦A¥[¤W AX ( ²Ä 66 ¦æ )¡C¦¹³B¤p¤ì°¸¤£ª½±µ¥Î mul «ü¥O¡A¦Ó¬O¥Î§â¦ì¤¸¦V¥ª²¾¤Î¥[ªk§¹¦¨¡C³o¼Ë°µªº­ì¦]¬O¬°¤F¼W¥[¹Bºâ³t«×¡C

­ì¥ýªº¼Æ­È¬O«O¦s¦b°Ï°ìÅܼơAn¡AùØ­±¡C¦bµ{¦¡²Ä 36 ¦æ´N¥ý°²³] n ¬°¹s¡A³o¬O¦]¬°²Ä¤@¦¸¶i¤J°j°é¡A¤°»ò¼Æ­È³£¥¼³B²z¡A¦]¦¹¬°¹s¡C¤§«á¨CŪ¤@­Óªü©Ô§B¼Æ¦r¡A´N­nÅý n ¥ý­¼¥H¤Q¡C­¼¥H¤Qªº¤è¦¡¥Î¼Æ¾Ç¦¡ 10n¡×2n¡Ï8n¡A¬Y¼Æ­¼¥H¤G«ê¦n¥i¥Î¡ushl ¬Y¼Æ,1¡v­pºâ¡A¬Y¼Æ­¼¥H¤K¥i¥Î¡ushl ¬Y¼Æ,3¡v­pºâ¡AµM«á¦A¬Û¥[¡C¦]¬° n ¬O¦r²Õ¡A¦Ó AL ¶È¦û¤@­Ó¦ì¤¸²Õ¡A¦]¦¹²Ä 65 ¦æ¥Î CBW §â AL ÂX¥R¦Ü AX¡A¦A¬Û¥[¡C

³B²z§¹©Ò¦³ªü©Ô§B¼Æ¦r«á¡A´N¨ì²Ä 76 ¦æ¡A§â n ²¾¤J AX¡AÀˬd¨Ï¥ÎªÌ¬O§_¿é¤J­t¼Æ¡A¦pªG¬O­t¼Æ¡A´N¥Î neg «ü¥O§â AX ¨ú¤G¸É¼Æ¡A´NÅܦ¨­t¼Æ¤F¡C­ì¦]«Ü²³æ¡A¨Ò¦p¡A°²³]¨Ï¥ÎªÌ¿é¤J¡u¡Ð23¡v¡Aget_number ¥u¦b²Ä 40¡ã51 ¦æÅý sign Åܦ¨­t¸¹¡AµM«á¨Ì¥¿¼Æ¤è¦¡¨D±o 23¡A¨ì¤F²Ä 76 ¦æ¨ú¤G¸É¼Æ®É¡AAX ´NÅÜ­t¼Æ¤F¡C

¦pªG¤@¤Á³£¨S°ÝÃD¡A¶Ç¦^ CX ¬°¤@¡A¦Ó AX ´N¬O¦³¸¹¼Æ¡F¦pªGµo¥Í¿ù»~¡A¨Ò¦p¨Ï¥ÎªÌ¿é¤J¤F¥¿­t¸¹¤Îªü©Ô§B¼Æ¦r¥H¥~ªº¦r¡ACX ³]¬° 0¡AAX ¨S¦³·N¸q¡C¥Dµ{¦¡ÂÇ¥ÑÀˬd CX ±oª¾¨Ï¥ÎªÌ¬O§_¿é¤J¥¿½Tªº¸ê®Æ¡C

¦³´XºØ±¡§Î·|¿ù»~µo¥Í¡G①¨Ï¥ÎªÌ¿é¤J¤F¥¿­t¸¹¤Îªü©Ô§B¼Æ¦r¥H¥~ªº¦r¡A②¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È¶W¹L½d³ò¡C«eªÌ¦b²Ä 60¡ã64 ¦æ¥i¥HÀˬd¦Ó±oª¾¬O§_¥¿½T¡F«áªÌ«h­n¾a¬O§_·¸¦ì¨ÓÀˬd¡A·¸¦ìªºµo¥Í¥i¯à¦b²Ä 53¡ã56 ¦æ¡An ­¼¥H¤Qªº¦a¤è¡A©Î¬O¦b²Ä 66 ¦æ¡AAX ­n¥[¦b n ªº®É­Ô¡C¤ñ¸û¯S§Oªº¬O¡A¦]¬°§Ú­Ì¬O¥H¥¿¼Æ¥h­pºâ¡A¦Ó¦³¸¹¼Æªº½d³ò¬O ¡Ð32768¡ã32767 ¤§¶¡¡A­t¼Æ­Ó¼Æ¤ñ¥¿¼Æ¦h¤@¡A´N¬O¦h¤F ¡Ð32768¡C·í¨Ï¥ÎªÌ¿é¤J ¡Ð32768 ®É¡A·|³y¦¨·¸¦ì¡A¦ý¦¹¼Æ¬O¦b½d³ò¤º¡A¦bµ{¦¡²Ä 70¡ã73 ¦æ³B²z³o¥ó¨Æ¡C


°Æµ{¦¡¡Ghex2dec_str

hex2dec_str ¬O¥Î¨Ó§â¤Q¤»¶i¦ì¼ÆÂà´«¦¨¤Q¶i¦ì¼Æ¦r¦r¦ê¡Ahex2dec_str »Ý­n¤T­Ó°Ñ¼Æ¡A²Ä¤@­Ó°Ñ¼Æ¬O¦¹¤Q¤»¶i¦ì¼Æ¡An¡C²Ä¤G­Ó°Ñ¼Æ sign ¬O¥Î¨Ó«ü©w n ¬O¥¿¼Æ¡BÁÙ¬O­t¼Æ¡A©ÎªÌ¥Ñ hex2dec_str ¦Û¦æ§PÂ_¡C¦p­n«ü©w n ¬O¥¿¼Æ¡A´N§â sign «ü©w¬° 2Bh (¡u¡Ï¡vªº ASCII ½X¬O 2Bh )¡F¦pªG«ü©w n ¬O­t¼Æ¡A´N§â sign ³]¬° 2Dh (¡u¡Ð¡vªº ASCII ½X¬O 2Dh )¡F¦pªG­n¥Ñ hex2dec_str ¦Û°Ê§PÂ_¡Asign ´N³]¬° 0¡C¦Û¦æ§PÂ_ªº®É­Ô¡A¬O§â n ·í¦¨¦³¸¹¼Æ¡Ahex2dec_str §PÂ_¤èªk¬O¦pªG³Ì°ª¦ì¤¸¬O¤@¡An ¬°­t¼Æ¡A³Ì°ª¦ì¤¸¬O¹s¡An ¬°¥¿¼Æ¡C²Ä¤T­Ó°Ñ¼Æ¬O¦s©ñ¤Q¶i¦ì¼Æ¦r¦r¦êªº­Ó¦ì¼Æ¦ì§}¡C

¨Ò¦p¡A¦pªG n ¬° FFFFh¡Asign ¬° 2Bh¡Aªí¥Ü n ¬°¥¿¼Æ¡A¬OµL¸¹¼Æ¡Ahex2dec_str °õ¦æ«á·|±o¨ì¤Q¶i¦ì¦r¦ê¬° 36h¡B35h¡B35h¡B33h¡B35h ( §Y 65535 )¡C¦pªG n ¬° FFFFh¡Asign ¬° 0 ©Î 2Dh¡A±o¨ìªº¤Q¶i¦ì¦r¦ê¬O 2Dh¡B31h ( §Y ¡Ð1 )¡C

hex2dec_str ªº­ì²z»P²Ä¤C³¹ªº DECIMAL.ASM ¬Û¦ü¡A®t§O¦b©ó«eªÌ·|Àˬd¿é¤J¼Æ­Èªº¥¿­t¸¹¡C¦pªG¬O¥¿¼Æ¡A¬yµ{´N¸ò DECIMAL.ASM ¤@¼Ë¡C¦pªG¬O­t¼Æ¡A¤£½×¬O sign «ü©w 2Dh ©Î 0¡A³£¥ý¨ú n ªº¤G¸É¼Æ ( ²Ä 97 ¦æ»P²Ä 99 ¦æ )¡A¦A¨Ì¥¿¼Æªº¬yµ{³B²z¡Aµ¥­pºâ¦n¤Q¶i¦ì¦r¦ê«á¡A©ó¦r¦ê³Ì«e­±¥[¤W¡u¡Ð¡v§Y¥i ( ²Ä114¡ã115¦æ )¡C¥i¥H°Ñ¦Ò«e­±¦³¸¹¼Æªº­t¼ÆÅܤQ¶i¦ì¼Æ¡C

hex2dec_str ¦³¶Ç¦^­È¡A¦¹¶Ç¦^­È¬O¤Q¶i¦ì¦r¦êªº°_©l¦ì§}¡A¶Ç¦^³o­Ó¦ì§}¡A¯à°÷Åý¥Dµ{¦¡«Ü»´©öªº¥Î AH¡×09H/INT 21H ¦L¥X¤Q¶i¦ì¼Æ¦r¦r¦ê¨Ó¡C


x86 «ü¥O¡GJCXZ/JECXZ/JRCXZ

JCXZ «ü¥O¥Î¨ÓÀˬd CX ¬O§_¬°¹s¡A¦pªG CX µ¥©ó¹s¡A´Nµo¥Í¸õÅD¡A¸õ¨ì«á­±±µªº¼Ð°O³BÄ~Äò°õ¦æ¡C¨ä»yªk¦p¤U¡G

        JCXZ    ¼Ð°O

Ãþ¦üªº«ü¥OÁÙ¦³ JECXZ »P JRCXZ¡A¤À§O¥Nªí­Y ECX µ¥©ó¹s¡B­Y RCX µ¥©ó¹s®Éµo¥Í¸õÅD¡C

©I¥s hex2dec_str

ÁöµM COMPUTE ­­¨î¨Ï¥ÎªÌ¿é¤Jªº¨â­Ó¼Æ­È­n¦b ¡Ð32768¡ã32767 ¤§¶¡¡A¦ý¬O¨â¼Æ¬Û¥[©Î¬Û´î¡A´N¦³¥i¯à¶W¹L³o­Ó½d³ò¡A³o´Nµo¥Í¤F·¸¦ì¡C¦pªGµ{¦¡³]­p³æ¯Â¡A§Ú­Ì¤]¥i¥H¦bµo¥Í·¸¦ì®É¡A´NÅã¥Ü¿ù»~°T®§¦Óµ²§ôµ{¦¡¡A¦ý¤]¥i¥H³B²z·¸¦ì¨ÃÅã¥Ü¥¿½Tµ²ªG¡C

¨Ò¦pµ{¦¡²Ä 183¡ã184 ¦æ¡A§â¨â¼Æ¬Û¥[¡A§Y n1¡Ïn2¡A°²¦pµo¥Í·¸¦ì¡A¨Ã¤£¬O­pºâµ²ªG¦³°ÝÃD¡A¦Ó¬Oµ²ªG¶W¹L¦³¸¹¼Æ¯àªí¥Üªº½d³ò¡A§Ú­Ì¥i¥H¥Î«ü©w¥¿©Î­tªº¤èªk©I¥s hex2dec_str¡Ahex2dec_str ´N¯à¥¿½T­pºâ¥Xµ²ªG¨Ó¡Cµo¥Í·¸¦ì®É¡A´NÀˬd¨Ï¥ÎªÌ¿é¤Jªº¨â¼Æ¬O¥¿¼Æ¡AÁÙ¬O­t¼Æ¡C¦pªG¬°¥¿¡Aªí¥Ü©M¤]¬O¥¿¼Æ¡A§Y¨Ï©Mªº³Ì°ª¦ì¤¸¬°¤@¡A¦b©I¥s hex2dec_str ªº sign °Ñ¼Æ¬°¡u2Bh¡v¡F¦pªG¨â¼Æ¬°­t¡A¨â¼Æ¬Û¥[¤]¬°­t¡Ahex2_dec_str ªº sign ´N­n«ü©w¬° 2Dh¡C¨£µ{¦¡²Ä 186¡ã192 ¦æ¡C

¨â¼Æªº´îªk¤]¬O¦p¦¹¡A¨£µ{¦¡²Ä 201¡ã211 ¦æ¡A¤p¤ì°¸´N¤£Åo­ö¤F¡C


¦^ÅU

³o¤@³¹¤p¤ì°¸¤¶²Ð¤F¦³¸¹¼Æ¥[´îªkªº¹Bºâ¡A³o¨ä¤¤²o¯A¨ì¤F¤G¸É¼Æ¡B·¸¦ìµ¥Æ[©À¡C³Ì«á°µ­Ó¦^ÅU¡A¤U¤@³¹¤¶²Ð¦³¸¹¼Æªº­¼°£ªk¡C

¤G¸É¼Æ

¦b¹q¸£¤¤¡A¬Y¥¿¼Æªº¤G¸É¼Æ¥Nªí¨ä­t¼Æ¡F¤Ï¹L¨Ó¤]¦¨¥ß¡A¥ç§Y¬Y­t¼Æªº¤G¸É¼Æ¥Nªí¨ä¥¿¼Æ¡C­pºâ¬Y¼Æªº¤G¸É¼Æ¡A¨BÆJ¦p¤U¡G

  1. ²Ä¤@¨B¡G§â¬Y¼ÆÅܬ°¤G¶i¦ì¼Æ¡AµM«á±N¨C¤@­Ó¦ì¤¸¤ÏÂà¡A¤ÏÂ઺·N«ä´N¬O 1 Åܬ° 0¡A0 Åܬ° 1¡C
  2. ²Ä¤G¨B¡G§â²Ä¤@¨Bªºµ²ªG¥[¤@¡A§Y±o¬Y¼Æ 2 ªº¸É¼Æ¡C

ÁÙ¦³¤@­Ó¤èªk¤]¯à­pºâ¤G¸É¼Æ¡A¨BÆJ¦p¤U¡G

  1. §â¬Y¼ÆÅܬ°¤G¶i¦ì¼Æ¡AµM«á¥Ñ²Ä¹s¦ì¤¸¶}©l¦V°ª¦ì¤¸³B²z¡A¦pªG²Ä¹s¦ì¤¸¬O¹s´N·Ó§Û¡A¦A¬Ý²Ä¤@¦ì¤¸¡A¬O¹s´N·Ó§Û¡Aª½¨ì¥X²{ªº¦ì¤¸¬°¤@®É°±¤î¡C²Ä¤@¦¸¥X²{¦ì¤¸¬O¤@ªº¤]·Ó§Û¡C
  2. ³Ñ¾lªº¸û°ª¦ì¤¸¡A¨C¤@­Ó¦ì¤¸³£¤ÏÂà¡C

µo¥Í·¸¦ì¡B³B²z·¸¦ì

·¸¦ì¬O«ü¹Bºâµ²ªG¶W¹L©Ò¯àªí¥Üªº½d³ò¡Aµo¥Íªº­ì¦]¦³¤U­±¨â¶µ¡G

  1. °µ¦³¸¹¼Æ¥[ªk¹Bºâ®É¡A¦pªG¨â¥¿¼Æ¤Ó¤j¡A©Î¨â­t¼Æ¤Ó¤p¡A©Ò±oªºµ²ªG¦³¥i¯à¶W¹L©Ò¯àªí¥Üªº½d³ò¡C
  2. °µ¦³¸¹¼Æ´îªk¹Bºâ®É¡A¦pªG¬O«Ü¤jªº¥¿¼Æ´î¥h«Ü¤pªº­t¼Æ¡A©Î¬O«Ü¤pªº­t¼Æ´î«Ü¤jªº¥¿¼Æ¡A©Ò±oªºµ²ªG¦³¥i¯à¶W¹L©Ò¯àªí¥Üªº½d³ò¡C

¹Bºâµ²ªGµo¥Í·¸¦ì®É¡ACPU ·|§â·¸¦ìºX¼Ð³]¬°¤@¡A¦¹°Ê§@ºÙ¬°³]©w·¸¦ìºX¼Ð¡ADEBUG/SYMDEB ùØÅã¥Ü OV¡F¹Bºâµ²ªG¨Sµo¥Í·¸¦ì®É¡ACPU ·|§â·¸¦ìºX¼Ð³]¬°¹s¡A¦¹°Ê§@ºÙ¬°²M°£·¸¦ìºX¼Ð¡ADEBUG/SYMDEB ùØÅã¥Ü NV¡Cµ{¦¡¥i¥HÂÇ¥Ñ JO «ü¥O¸õ¨ì¦pªG·¸¦ì®É¦p¦ó³B²z¡A©Î¬O JNO «ü¥O¸õ¨ì¦pªG¨S¦³·¸¦ì®É¦p¦ó³B²z¡C