Ch 12 ¦r¦ê

¦b¼¶¼gµ{¦¡®É±`±`·|¹J¨ì¸ê®ÆÂಾ¡N¤ñ¸ûµ¥ª¬ªpµo¥Í¡A80X86 ®a±Úªº CPU ùئ³´X­Ó«ü¥O¬O±Mªù³B²z¡y¦r¦ê¡zªº¡A¦b³o¸Ì©Ò¿×ªº¦r¦ê¡A¬O«ü¦b°O¾ÐÅ餺³sÄòªº¦ì¤¸²Õ©Î¦r²Õ¡A¨Ã¤£¤@©w¬O ASCII ¦r¤¸¡A¤]¦³¥i¯à¬O¤@¬q¤G¶i¦ì¼Æ¡C


·§½×

80X86 «ü¥O¶°¤¤¦r¦ê³B²zªº«ü¥O¦³·h²¾¡N±½´y¡N¤ñ¸û¤TºØ¡A¥t¥~¦A¥[¤W¥Ñ°O¾ÐÅé¸ü¤J¦Ü¼È¦s¾¹»P¥Ñ¼È¦s¾¹¦s¤J°O¾ÐÅé¨âºØ¡C

MOVSB¡NMOVSW ©M REP «ü¥O

¥ý»¡·h²¾¦r¦ê¡C·h²¾¦r¦ê«ü¥O¦³¨âºØ¡A¤À§O¬O MOVSB ©M MOVSW¡A¥ý»¡ MOVSB¡CMOVSB ªº­^¤å¬O move string byte¡A·N«ä¬O·h²¾¤@­Ó¦ì¤¸²Õ¡A¥¦¬O§â DS:SI ©Ò«ü¦ì§}ªº¤@­Ó¦ì¤¸²Õ·h²¾¨ì ES:DI ©Ò«üªº¦ì§}¤W¡A·h²¾«á­ì¨Óªº¤º®e¤£ÅÜ¡A¦ý¬O­ì¨Ó ES:DI ©Ò«üªº¤º®e·|³QÂл\¦Ó¥B¦b·h²¾¤§«á SI ©M DI ·|¦Û°Ê¦a§}¦V¤U¤@­Ó­n·h²¾ªº¦ì§}¡C

¤@¯ë¦Ó¨¥¡A³q±`µ{¦¡³]­p®v¤@¯ë¨Ã¤£·|¥u·h¤@­Ó¦ì¤¸²Õ¡A³q±`³£·|­«½Æ³\¦h¦¸¡A¦pªG­n­«½Æªº¸Ü¡A´N±o§â­«½Æ¦¸¼Æ ( ¤]´N¬O¦r¦êªø«× ) ¥ý°O¿ý¦b CX ¼È¦s¾¹¡A¨Ã¥B¦b MOVSB ¤§«e¥[¤W REP «ü¥O¡AREP ¬O­«½Æ (repeat) ªº·N«ä¡C³oºØ¼gªk«Ü¬O©_©Ç¡A¤@¯ë¦Ó¨¥²Õ¦X»y¨¥­ì©lÀɪº¨C¤@¦æ³£¥u¦³¤@­Ó«ü¥O¡A¦ý REP MOVSB «o¥i¥H¦b¦P¤@¦æ¼g¨â­Ó«ü¥O¡A·íµM±z¤À¶}¼g¤]¬O¤@¼Ëªº¡C

Åý¤p¤ì°¸¥Î DEBUG ¨ÓÆ[¹î REP MOVSB °õ¦æ±¡§Î¡G

C:\WINDOWS>debug [Enter]
-a [Enter]
1C6C:0100 mov cx,10 [Enter]
1C6C:0103 mov si,200 [Enter]
1C6C:0106 mov di,300 [Enter]
1C6C:0109 rep movsb [Enter]
1C6C:010B [Enter]
-a 200 [Enter]
1C6C:0200 db "I learn assembly" [Enter]
1C6C:0210  [Enter]

¤W­±ªºµ{¦¡¤ù¬q¬O§â¦ì©ó 1C6C:0200 ªº¡yI learn assembly¡z¦r¦ê²¾·h¨ì 1C6C:0300 ³B¡A¦¹¦r¦ê¦@ 16 ­Ó¦r¤¸¡A©Ò¥H CX ¦s¤J 10H¡C²{¦b¨Ó°lÂܬݬݡC

-t [Enter]

AX=0000  BX=0000  CX=0010  DX=0000  SP=FFEE  BP=0000  SI=0200  DI=0000
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=0106   NV UP EI PL NZ NA PO NC
1C6C:0103 BE0002        MOV     SI,0200
-t [Enter]

AX=0000  BX=0000  CX=0010  DX=0000  SP=FFEE  BP=0000  SI=0200  DI=0000
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=0106   NV UP EI PL NZ NA PO NC
1C6C:0106 BF0003        MOV     DI,0300
-t [Enter]

AX=0000  BX=0000  CX=0010  DX=0000  SP=FFEE  BP=0000  SI=0200  DI=0300
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=0109   NV UP EI PL NZ NA PO NC
1C6C:0109 F3            REPZ
1C6C:010A A4            MOVSB
-d 300 L10 [Enter]

¦bÁÙ¥¼·h²¾¤§«e¡A¥ý¬Ý¬Ý 1C6C:0300 ³Bªº¤º®e¡A¦A°lÂÜ¡C¦¹³B±z·|¬Ý¨ì§Ú­Ì¿é¤J rep «ü¥O¡A¦ý¬O DEBUG «oÅã¥Ü REPZ¡A¨Æ¹ê¤W³o¨â­Ó¬O¤@¼Ëªº¡C

1C6C:0300  E8 A3 F6 74 08 49 46 FE-06 D7 DC EB EF E8 C3 F9   ...t.IF.........
-t [Enter]

AX=0000  BX=0000  CX=000F  DX=0000  SP=FFEE  BP=0000  SI=0201  DI=0301
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=0109   NV UP EI PL NZ NA PO NC
1C6C:0109 F3            REPZ
1C6C:010A A4            MOVSB
-d 300 L10 [Enter]
1C6C:0300  49 A3 F6 74 08 49 46 FE-06 D7 DC EB EF E8 C3 F9   I..t.IF.........

¦b·h²¾¤@¦¸¤§«á¡A¦A¬Ý¬Ý 1C6C:0300 ³Bªº¤º®e¡Aµo²{¤W­±¤w¸g©M­ì¨Ó¤£¤@¼Ë¤F (¬õ¦â³¡¥÷)¡C³o¬O¦]¬° movsb ¤w¸g§â²Ä¹s­Ó¦ì¤¸²Õ·h¨ì 1C6C:0300 ³B¡A¦ÓÂл\¤F­ì¨Óªº¤º®e¡C¦Ó CX ¤]´î¤Ö¤@¡ASI¡NDI ¤]¦U¼W¥[¤@¦Ó«ü¦V¤U¤@­Ó¦ì§}¡C¦n¡I¦A°lÂܬݬݡC

-t [Enter]

AX=0000  BX=0000  CX=000E  DX=0000  SP=FFEE  BP=0000  SI=0202  DI=0302
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=0109   NV UP EI PL NZ NA PO NC
1C6C:0109 F3            REPZ
1C6C:010A A4            MOVSB

±z¦³¨S¦³µo²{¡A¦b·h²¾§¹¤§«e¡AIP ³£«ü¦V REP MOVSB «ü¥O ( §Y REP MOVSB ©Ò¦b¦ì§} )¡C­n°lÂܳo»ò¦h¦¸¡A¤Ó³Â·Ð¤F¡A°®¯Üª½±µ°õ¦æ¨ì·h²¾¦r¦ê¨ìµ²§ô¡C

-g 10b [Enter]

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0210  DI=0310
DS=1C6C  ES=1C6C  SS=1C6C  CS=1C6C  IP=010B   NV UP EI PL NZ NA PO NC
1C6C:010B 06            PUSH    ES
-d 200 L10 [Enter]
1C6C:0200  49 20 6C 65 61 72 6E 20-61 73 73 65 6D 62 6C 79   I learn assembly
-d 300 L 10 [Enter]
1C6C:0300  49 20 6C 65 61 72 6E 20-61 73 73 65 6D 62 6C 79   I learn assembly

·h²¾µ²§ô«á¡A1C6C:0200 ©M 1C6C:0300 ³Bªº¤º®e§¡¬Û¦P¡A©Ò¥H MOVSB ¨Æ¹ê¤W¬O§â­ì¨Ó¦r¦ê½Æ»s¨ì­n·h²¾¤§³B¡A¦Ó­ì¦r¦ê¬O­ì«Ê¤£°Êªº¡C

MOVSW ªº§@¥Î¤è¦¡³£©M MOVSB ¬Û¦P¡A©Ò¤£¦Pªº¬O MOVSW ¨C¦¸·h²¾¤@­Ó¦r²Õ¡A©Ò¥H¨C¦¸·h¹B§¹ SI¡NDI ·|¼W¥[ 2¡A¦Ó CX ¤´µM´î¤Ö¤@¡C

CLD ©M STD «ü¥O

¦¹¥~¡AÁÙ¦³¤@ÂI¡A¤p¤ì°¸¦b¤W­±¨S¦³´£¨ì¡C¨Æ¹ê¤W§Ú­Ì¤]¥i¥H¨Ï¨C·h²¾¤@¦¸¤§«á¡A¨Ï SI¡NDI »¼´î¡A¤]´N¬O©¹§C¦ì§}·h²¾¡C¤èªk¬O¥Ñ¡y¤è¦VºX¼Ð¡z±±¨î( ¦³Ãö¤è¦VºX¼Ð½Ð°Ñ¦Òªþ¿ý¤GºX¼Ð¼È¦s¾¹ )¡C

·í¤è¦VºX¼Ð²M°£®É (§Y¤è¦VºX¼Ð¬°¹s)¡A·h²¾¤è¦V¬O¦V°ª¦ì§}³B¡ASI¡NDI ·|»¼¼W¡A¦P®É±z¥i¥H¬Ý¨ì¦b DEBUG Åã¥ÜºX¼Ð³B·|¦³¡yUP¡zªº¦r¼Ë¡Aªí¥Ü¦V°ª¦ì§}·h²¾¡C³o¬O¤j³¡¤Àªº±¡ªp¡C

·í¤è¦VºX¼Ð³]©w®É (§Y¤è¦VºX¼Ð¬°¤@)¡A·h²¾¤è¦V¬O¦V§C¦ì§}³B¡ASI¡NDI ·|»¼´î¡C¨ì¦b DEBUG Åã¥ÜºX¼Ð³B·|¦³¡yDN¡zªº¦r¼Ë¡C

³Ì«á¡A¤è¦VºX¼Ð²M°£ªº«ü¥O¬O CLD¡A·N«ä¬O clear direction flag¡F³]©wªº«ü¥O¬O STD¡A·N«ä¬O set direction flag¡C

CMPSB ©M CMPSW «ü¥O

³o¨â­Ó«ü¥O¨Ï¥Î¤èªk©M MOVSB¡NMOVSW ¬Û¦P¡A¦Ó¥¦ªº§@¥Î¬O±N¤@­Ó¦r¦ê©M¥t¤@³Bªº¦r¦ê¤ñ¸û¡C¦pªG¥u¦³³æ¿Wªº¤@­Ó CMPSB ©Î CMPSW ®É¡ACPU ¥u¤ñ¸û¤@­Ó¦ì¤¸²Õ©Î¤@­Ó¦r²Õ¡F·í CMPSB ©Î CMPSW «e¥[¤W REP ®É¡A¥i¥H¤ñ¸û¤@­Ó¦r¦ê¡C±z¤]¥i¥H¥Î REPE ( ªí¥Ü repeat while equal¡A¦pªG¨â¦r¬Ûµ¥«h­«½Æ ) ¨Ó¥N´À REP¡A¤]¥i¥H¥Î REPZ ( ªí¥Ü repeat while zero¡A¦pªG¹sºX¼Ð¬° ZR¡A«h­«½Æ ) ¨Ó¥N´À¡A´«¥y¸Ü»¡ REP¡NREPE ©M REPZ ¬O¬Û¦Pªº¡C

¨º±z¥i¯à·|°Ý¡A¦p¦ó¤~ª¾¹D¨â­Ó¦r¦ê¬Ûµ¥¡H³o®É±z´N±oÀˬd¡y¹sºX¼Ð¡z¤F¡A¦pªG¹sºX¼Ð³Q³]¬°¤@ (DEBUG Åã¥Ü ZR)¡Aªí¥Ü¨â¦r¦ê¬Ûµ¥¡A¦¹®É¨â¦r¦ê·|¤ñ¸û§¹²¦©Ò¥H CX ¤]·|¤@ª½´î¤Ö¦Ü¹s¡C¦pªG¹sºX¼Ð³Q³]¬°¹s (DEBUG Åã¥Ü NZ)¡Aªí¥Ü¨â¦r¦ê¤£¬Ûµ¥¡Acmps «ü¥O¶È¶È¤ñ¸û¨ì²Ä¤@­Ó¤£¬Ûµ¥ªº¦r¤¸´N°±¤î¤F¡A©Ò¥H CX ¤£·|¬°¹s¡ASI¡NDI ·|«ü¨ì²Ä¤@­Ó¤£¬Ûµ¥ªº¦ì¤¸²Õ©Î¦r²Õ¤§«áªº¦ì§}¡C

»P MOVS «ü¥O¬Û¦Pªº¬O¡ACMPS «ü¥O¤]¥i¥H¥Î¤è¦VºX¼Ð¨Ó«ü©w¦V°ª¦ì§}¤ñ¸û©Î¦V§C¦ì§}¤ñ¸û¡C

SCASB ©M SCASW «ü¥O

³o¬O scan string ªº·N«ä¡A¤¤¤å¬O±½´y¦r¦ê¡A¥¦ªº§@¥Î¬O¦b¤@­Ó¦r¦ê¤¤§ä¨ì¯S©wªº¦ì¤¸²Õ©Î¦r²Õ¡C¦Ó³o¯S©wªº¦ì¤¸²Õ©Î¦r²Õ©ñ¦b AL ©Î AX ¼È¦s¾¹¤¤¡A³Q±½´y¦r¦êªºªø«×¦ì©ó CX¡A¦r¦ê¦ì§}¦ì©ó ES:DI ©Ò«üªº¦ì§}¡C¦P¼Ë¤]¥i¥H¥Î¤è¦VºX¼Ð¨Ó«ü©w©¹°ª¦ì§}©Î§C¦ì§}±½´y¡C

¦P¼Ëªº SCASB ©Î SCASW ¤]¥i¥H¥Î REPE ¨Ó·f°t¨Ï¥Î¡C¦ý¬O³Ì±`¥ÎªºÁÙ¬O©M REPNE ·f°t¡A¥¦ªº·N«ä¬O repeat while not equal¡A·N«ä¬O¦pªG¤£¬Ûµ¥«h­«½Æ¡A¸Õ·Q·í§A¦b¤@­Ó­^¤å¥y¤l¤¤¡A´M§ä­^¤å¦r¥À¡ya¡z¦³¨S¦³¥X²{¡Aª½Ä±ªº¤èªk¬O¤£¬O¥ý¬Ý²Ä¤@­Ó¦r¥À¡A¦pªG¤£¬O¦A¬Ý²Ä¤G­Ó¦r¥À¡C¦¹³B³Ì±`»P SCASB ·f°tªº REPNE ¤]¬O¦p¦¹¡A¦pªG«e­±ªº¦r¤£¬Ûµ¥¡A¤~§ä«á­±ªº¦r¡A©Ò¥H¥Î REPNE ¡A¦Ó¤Ö¥Î REPE¡C±z¤]¥i¥H¥Î REPNZ ¨Ó¥N´À REPNE¡C

LODSB ©M LODSW

LODSB ³o­Ó 80X86 «ü¥O¬O§â DS:SI ©Ò«ü¦ì§}ªº°O¾ÐÅ餺®e¸ü¤J¤@­Ó¦ì¤¸²Õ¨ì AL ùØ¡A¦P¼Ëµø¤è¦VºX¼Ð¦Ó©w¡A·|¨Ï±o SI ¼È¦s¾¹¼W¥[¤@©Î»¼¤Ö¤@¡CLODSB ¤§·N«ä¬O load string byte¡A¦ý¬O¥¦«o«Ü¤Ö°t¦X REP «ü¥O¡A¦]¬°³q±`§Ú­Ì¥Î¥¦¬O¦]¬°­n³B²z¸Ó¦r¦êùتº¨C¤@­Ó¦ì¤¸²Õ¡A«Ý³B²z§¹¤~¯à¦A¦¸¸ü¤J¡A©Ò¥H¨â¦¸¸ü¤J¤§¶¡±`ÁÙ¦³¨ä¥L«ü¥O¡A¨Ã¤£¹³ MOVS¡NCMPS¡NSCAS ³o¤T­Ó«ü¥O¥i¥H¥Î¤@­Ó«ü¥O´N¸Ñ¨M¤F¡C

LODSW ¬O¸ü¤J DS:SI ©Ò«ü¦ì§}ªº¤º®e¤@­Ó¦r²Õ¨ì AX ¼È¦s¾¹¡A¦P¼Ëªº SI ·|µø¤è¦VºX¼Ð¼W¥[¤G©Î»¼¤Ö¤G¡A³o¬O¦]¬°¤@­Ó¦r²Õ¦û¨â­Ó¦ì¤¸²Õ¡C

STOSB ©M STOSW

³o¨â­Ó«ü¥O©M LODSB¡NLODSW Ãþ¦ü¡A©Ò¤£¦Pªº¬O³o¨â­Ó«ü¥O¬O AL ©Î AX ªº¤º®e²¾¨ì ES:DI ©Ò«üªº°O¾ÐÅé¦ì§}¡CDI ·|µø¤è¦VºX¼Ð¼W¥[©Î»¼¤Ö¡C


¦L¥X ASCII ¦r¤¸ªº¦ì¤¸¹Ï

¦r¤¸¹Ï®×

¦b BIOS ùئ³¤@¬q°O¾ÐÅéªÅ¶¡ ( F000:FA6E ¶}©l ) ¬O¦s©ñ ASCII ¦r¤¸¥Ñ 0 ¶}©l¨ì 127 ¦@ 128 ­Ó¦r¤¸ªº¹Ï®×¡A¨C¤@­Ó¤å¦r³£¥i¥H¬Ý¦¨³\¦h¡yÂI¡z²Õ¦¨¡A³o¨ÇÂIºc¦¨¦r¤¸ªº¹Ï®×¡C¦p¤U¹Ï¬O¤@­Ó­^¤å¦r¡yA¡z

ASCII ¦r¤¸¡AA¡Aªº¦ì¤¸¹Ï

³Ì¤W­±¤@¦æ¡A¥Ñ¥k¦Ó¥ª¦@¦³ 8 ­ÓÂI¡A³o 8 ­ÓÂIºc¦¨¤@­Ó¦ì¤¸²Õ¡A¨ä¤¤¦³¨ÇÂI¬O¬õ¦âªº¡Aªí¥Ü³o­ÓÂI¥²¶·¦b¿Ã¥ú¹õ¤W¦L¥X¨Ó¡A¦Ó¬Û¹ïÀ³ªº¦ì¤¸¬°¤@¡G¦³¨ÇÂI¬O¶Â¦âªí¥Ü³o¬O­I´º¡Aªí¥Ü³o­ÓÂI¤£¥Î¦L¥X¨Ó¡A¬Û¹ïÀ³ªº¦ì¤¸¬°¹s¡C¥H­^¤å¦r¥À¡yA¡z¨Ó»¡¡A²Ä¹s­Ó¦ì¤¸²ÕÀ³¸Ó´N¬O 00 11 00 00¡A´«ºâ¦¨¤Q¤»¶i¦ì´N¬O 30H¡A¦P²z¨ä¾l¦ì¤¸²Õ¤À§O¬O 78H¡N0CCH¡N0CCH¡N0FCH¡N0CCH¡N0CCH¡N0¡C³o¤K­Ó¦ì¤¸²Õ´Nºc¦¨¡yA¡zªº¹Ï¼Ë¡A¨ä¥Lªº ASCII ¦r¤¸¤]³£¬OÃþ¦ü¡C©Ò¥H¦pªG DOS ­nÅã¥Ü­^¤å¦r¥À¡A´N¨ì BIOS ³o­Ó¹Ï®×ªí¥h´M§ä¸Ó¦r¤¸ªº¹Ï®×¦ì¤¸²Õ¡AµM«á¥Îµ{¦¡±N¥¦¨Ì¼Ëµe¸¬Äª¦L¦b¿Ã¥ú¹õ¤W¡C

·íµM¦b¿Ã¥ú¹õ¤W¨C¤@­ÓÂI³£«Ü¤p¡A©Ò¥H±z¬Ý¤£¨ì¿÷¾¦ª¬¡A¤]·Pı¤£¨ìÂIªº¼Ë¤l¡A¦b³oùؤp¤ì°¸·Q±N³o¨Ç¦r¤¸¹Ï®×©ñ¤jÅã¥Ü¦b¿Ã¥ú¹õ¤W¡A³o­Óµ{¦¡ºÙ¬°¡yCHAR_GRA.ASM¡z¡A°õ¦æµ²ªG¦p¤U¡G

H:\HomePage\SOURCE>char_grp [Enter]

«ö¥ô·NÁä(EscÁäÂ÷¶})¡G    «ö¤U A
  AA
 AAAA
AA  AA
AA  AA
AAAAAA
AA  AA
AA  AA


«ö¥ô·NÁä(EscÁäÂ÷¶})¡G    «ö¤U 1
  11
 111
  11
  11
  11
  11
111111


«ö¥ô·NÁä(EscÁäÂ÷¶})¡G    «ö¤U Esc Áä

H:\HomePage\SOURCE>

­ì©lµ{¦¡

­ì©lµ{¦¡¦p¤U¡G

total_len       equ     8*128   ;01 
;***************************************
message segment                 ;03 ¸ê®Æ¬q¶}©l
message0        db      0dh,0ah,'«ö¥ô·NÁä(EscÁäÂ÷¶})¡G$'
char_graph      db      total_len dup (?)
message ends                    ;06 ¸ê®Æ¬qµ²§ô
;***************************************
code    segment                 ;08 µ{¦¡½X°Ï¬q¶}©l
        assume  cs:code,ds:message
;---------------------------------------
main    proc    far             ;11 «üµ{¦¡¶}©l
start:  push    ds              ;12 ±Nªð¦^DOS¸ê°T¦s¤J°ïÅ|
        sub     ax,ax
        push    ax

        mov     bx,0f000h       ;16
        mov     cx,total_len
        mov     ds,bx           ;18 ¨ÏDS«ü¦VBIOS¬q¦ì§}
        mov     si,0fa6eh       ;19 ¨ÏSI«ü¦VBIOS¤¤ASCII¦ì¤¸¹Ï¤§°¾²¾¦ì§}
        mov     ax,message
        mov     di,offset char_graph
        mov     es,ax   ;22 ¨ÏES«ü¦V¥»µ{¦¡ªº¸ê®Æ¬q
        rep     movsb   ;23 ·h²¾

        mov     ds,ax   ;25 ¨ÏDS«ü¦V¥»µ{¦¡ªº¸ê®Æ¬q
nxt_char:
        mov     dx,offset message0
        mov     ah,9
        int     21h     ;29
        call    crlf
input:  mov     ah,0    ;31 ¿é¤J«öÁä
        int     16h
        cmp     al,1bh
        je      exit
        cmp     al,07fh
        ja      input   ;36

        mov     dh,al   ;38 «O¦s¸ÓÁ䪺ASCII©óDH
        mov     si,offset char_graph
        cbw             ;40 ­pºâ¸ÓASCII¤§°¾²¾¦ì§}
        mov     cl,3
        shl     ax,cl
        add     si,ax   ;43 ¨Ã¦s©óSI
        cld             ;44 ¨ÏLODSB©¹°ª¦ì§}³B¨ú±o¸ê®Æ
        mov     ch,8    ;45 ¨C­ÓASCII¦r¤¸¹Ï¥H8¦ì¤¸²Õªí¥Ü
nxt_byte:
        lodsb           ;47 ¨ú±o¸ÓASCII¦r¤¸ªº¨ä¤¤¤@­Ó¦ì¤¸²Õ
        mov     cl,8    ;48 ¨C­Ó¦ì¤¸²Õ¦³8¦ì¤¸
nxt_bit:
        mov     dl,dh   ;50 ¨M©w¬O­n¦L¥XªÅ¥ÕÁÙ¬O¸Ó¦r¤¸
        shl     al,1    ;51 ¨M©w¤èªk¬O¸Ó¦ì¤¸¬°0«h¦LªÅ¥Õ
        jc      print   ;52 ¤Ï¤§¦L¥X¸ÓASCII¦r¤¸
        mov     dl,' '  ;53
print:  mov     ah,2    ;54
        push    ax      ;55 ¬°ÁקKAL­È§ïÅÜ¡A¬G¦s©ó°ïÅ|
        int     21h     ;56 ¦L¥X
        pop     ax      ;57 ¨ú¦^AL­È
        dec     cl
        jnz     nxt_bit ;59 ¬O§_¦L¤U¤@¦ì¤¸

        call    crlf    ;61 §_¡A«h¦L¥X´«¦æ¤ÎÂk¦ì¦r¤¸
        dec     ch
        jnz     nxt_byte;63 ¬O§_¦L¤U¤@¦ì¤¸²Õ
        jmp     nxt_char;64 §_¡A«h¸õ¨ì¿é¤J«öÁä

exit:   ret             ;66 ªð¦^DOS
main    endp            ;67
;---------------------------------------
crlf    proc    near    ;69
        push    ax
        mov     ah,2
        mov     dl,0dh
        int     21h
        mov     dl,0ah
        int     21h
        pop     ax
        ret
crlf    endp            ;78
;---------------------------------------
code    ends            ;80
;***************************************
stack   segment stack   ;82 °ïÅ|¬q
        dw      80 dup (?)
stack   ends            ;84
;***************************************
        end     start   ;86 «ü©wµ{¦¡¶i¤JÂI

µ{¦¡¸Ñ»¡

³o­Óµ{¦¡¤@¶}©l¡A´N¬O§ä¨ì BIOS ¦s©ñ¦r¤¸¹Ï®×ªº¦a¤è¡A§â³o¨Ç¹Ï®×¸ê®Æ²¾¨ì¥»µ{¦¡ªº¸ê®Æ¬q¡C¦¹®É¨Ó·½¦r¦ê¥Ñ DS:SI «ü©w¡AÀ³¸Ó«ü¨ì F000:FA6E ªº¦ì§}¡A¦Ó¥Øªº¦r¦êÀ³«ü¨ì¥»µ{¦¡ªº¸ê®Æ¬q¡A¤]´N¬O message:char_graph ªº¦ì§}¡C¦Ü©ó¦r¦êªø«×¥i¥H¥Ñ±q 0 ¨ì 127 ¦@ 128 ­Ó¦r¤¸¡A¨C­Ó¦r¤¸¦û 8 ­Ó¦ì¤¸²Õ¡A¦]¦¹Á`¦@¦û¥Î 8*128 ­Ó¦ì¤¸²Õ¡C( µ{¦¡²Ä 16 ¦æ¨ì²Ä 23 ¦æ)

²Ä 25 ¦æ¦b°õ¦æ§¹¤F·h²¾«á¡A¤~±N DS «ü¦V§Ú­Ìªº¸ê®Æ°Ï¡C±µ¤U¨Ó²Ä 26 ¦æ¨ì²Ä 36 ¦æ¬O¦L¥X´£¥Ü¦r¦ê¤Î¿é¤J«öÁä¡C²Ä 38 ¦æ¬O«O¦s«öÁ䪺 ASCII ¦r¤¸¡Aµ¥µ{¦¡­pºâ¥X¨Ó¦p¦ó¦C¦L®É¡A¦b»È¹õ¤W¦C¦L®É»Ý­n¥Î¨ì¡C

²Ä 39 ¦æ¨ì²Ä 43 ¦æ¬O­pºâ¸Ó«öÁä©Ò¥Nªíªº ASCII ¦r¤¸ªº 8 ­Ó¦ì¤¸²Õ¦b¨ºùØ¡C¥i¥H·Q¹³¡A¨C¤@­Ó¦r¤¸³£¥Ñ 8 ­Ó¦ì¤¸²Õªº¹Ï®×¨Óªí¥Ü¡A¦Ó³o¨Ç¹Ï®×¬O©ñ¦b char_graph ¶}©lªº¦ì§}¡A©Ò¥H ASCII ¬°¹sªº¦r¤¸´N¬O¦b char_graph ¦ì§}¤W¡AASCII ¬°¤@ªº¦r¤¸ ( ªÅ¤ßªº¯ºÁy¹Ï®×¡A°Ñ¦Òªþ¿ý¥| ) ´N¬O¦b char_graph ¤§«áªº²Ä 8 ­Ó¦ì§}¤W¡AASCII ¬° 2 ªº¦r¤¸ ( ¹ê¤ßªº¯ºÁy¹Ï®× ) ´N¬O¦b char_graph ¤§«áªº²Ä 16 ­Ó¦ì§}¤W¡K¡K¡A·í¨Ï¥ÎªÌ«ö¤U¤@­ÓÁä®É¡A¸ÓÁ䪺 ASCII ¦r¤¸¦b AL ¼È¦s¾¹¡A±N¨ä§ï¦¨¦r²ÕÅܦ¨ AX ( µ{¦¡²Ä 40 ¦æ )¡A¨º¸Ó ASCII ©Ò¦b¦ì§}´NÀ³¸Ó¬O

8*AX + char_graph

µ{¦¡²Ä 41 ¦æ¨ì²Ä 43 ¦æ´N¬O­pºâ³o¤@­Óºâ¦¡¡A¨Ã±Nµ²ªG¦s©ó SI ¼È¦s¾¹¡C

µ{¦¡²Ä 45 ¦æ¨ì²Ä 64 ¦æ¬O¦L¥X¸Ó¦r¤¸ªº¹Ï®×¨Ó¡C¦]¬°¤@­Ó¦r¦³ 8 ­Ó¦ì¤¸²Õ¨Óªí¥Ü¨ä¹Ï®×¡A¦Ó¨C­Ó¦ì¤¸²Õ¦³ 8 ­Ó¦ì¤¸¨Óªí¥Ü 8 ­ÓÂI¡A©Ò¥H¤p¤ì°¸¥Î¨â­Ó°j°é¨Ó¸Ñ¨M¡C²Ä¤@­Ó°j°é¤ñ¸û¤j¡A¥Ñ²Ä 46 ¦æ¨ì²Ä 63 ¦æ¡A³o 8 ­Ó¦ì¤¸²Õªº­Ó¼Æ¦s©ó CH ¤¤¡A¨C³B²z§¹¤@­Ó¦ì¤¸²Õ¡ACH ´N´î¤@ (²Ä 62 ¦æ)¡A³o­Ó°j°é¤@¶}©l´N¨ú±o¥Nªí¸Ó ASCII ¦r¤¸¹Ï®×ªº¤@­Ó¦ì¤¸²Õ¡A¨ú±o¤è¦¡´N¬O¥Î LODSB «ü¥O ( ²Ä47¦æ )¡A¦¹«ü¥O·|¦Û°Ê¨Ï SI ¥[¤@¡AµM«á±N¨ú±oªº¸ê®Æ©ñ¦b AL ¤¤¡A¥æ¥Ñ²Ä¤G­Ó°j°é³B²z¡C¦]¨C¤@­Ó¦ì¤¸²Õ¦³ 8 ­Ó¦ì¤¸©Ò¥H¶i¤J²Ä¤G­Ó°j°é¤§«e¡A¥ý§â 8 ¦s¤J CL ( ²Ä48¦æ )¡C

²Ä¤G­Ó°j°é¤ñ¸û¤p¡A¥¦¥]§t¦b²Ä¤@­Ó°j°éùØ¡A¹³³o¼Ëªº³B²z¤è¦¡¡AºÙ¤§¬°¡y±_ª¬¡z¡C¦b³o­Ó°j°éùØ¡A¥ý§â DH ¤ºªº¼Æ­È«þ¨©¨ì DL ¤¤¡ADH ªº¼Æ­È¬O¨Ï¥ÎªÌ©Ò«ö¤UÁ䪺 ASCII ¦r¤¸¡A«þ¨©¨ì DL ¤¤¬O­n¨Ï¦L¥X¦b¿Ã¹õ¤W¡C²Ä¤G¨B¬O¦V¥ªÃä²¾¤@­Ó¦ì¤¸¨ì¡y¶i¦ìºX¼Ð¡z¡AX86 «ü¥O¶°¤¤¦³¤@­Ó«ü¥O SHL «ê¦n¥i¥H°µ³o¥ó¨Æ ( ²Ä51¦æ )¡A±µ¤U¨Ó´N¬OÀˬd¶i¦ìºX¼Ð ( ²Ä52¦æ )¡A¦pªG­è¤~ SHL «áªº¦ì¤¸¬°¤@¡A¨º¶i¦ìºX¼Ð·|³Q³]©w¡AÀ³¸Ó¦L¥X ASCII ¦r¤¸¡F¤Ï¤§¡A­Y¬°¹s¡A¶i¦ìºX¼Ð·|³Q²M°£¡AÀ³¸Ó¦L¥XªÅ¥Õ ( ²Ä53¦æ )¡C±µ¤U¨Ó²Ä 54 ¦æ¨ì²Ä 57 ¦æ¬O¦L¥XªÅ¥Õ©Î ASCII ¦r¤¸ªºµ{¦¡¡A²Ä 59 ¦æ¬OÀˬd¬O§_¤w±N 8 ­Ó¦ì¤¸³£³B²z§¹²¦¡C

­Y³B²z§¹²¦«h¤Sªð¦^²Ä¤@­Ó°j°é¡A¥ý¦L¥X´«¦æ¦r¤¸ ( ²Ä61¦æ )¡A¦AÀˬd¬O§_¤w³B²z§¹ 8 ­Ó¦ì¤¸²Õ¡C³o¨â­Ó°j°éªºµ²ºc¦p¤U¹Ï¡G

±_ª¬°j°é»¡©ú

³Ì«á²Ä 66 ¦æ¬O¤@­Óªð¦^ DOS ªº«ü¥O¡A¦ý¦]¬° main °Æµ{¦¡¹ï DOS ¦Ó¨¥¬O»·µ{©I¥s¡A¦]¦¹³o­Ó ret «ü¥O·|¨ú¥X¨â­Ó¦r²Õ¡A¤]´N¬Oµ{¦¡²Ä 12¡N14 ¦æ©Ò±À¤Jªº°ïÅ|¸ê®Æ¡A¦Ó±N±±¨îÅv¥æÁÙµ¹ DOS¡A·íµM¡A¦pªG±z¥Î AH=4CH/INT 21H ¨Óµ²§ô¥»µ{¦¡¤]¥i¥H¡C


¦^¨ì­º­¶¡A ¨ì²Ä¤Q¤@³¹¡A ¨ì²Ä¤Q¤T³¹