You are on page 1of 399

‫وزارت ﻋﻠﻮم ﺗﺤﻘﻴﻘﺎت و ﻓﻦآوري‬

‫داﻧﺸﮕﺎه ﭘﻴﺎم ﻧﻮر‬

‫زﺑﺎن ﻣﺎﺷﻴﻦ و ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺳﻴﺴﺘﻢ‬


‫) ﺭﺷﺘﻪ ﻣﻬﻨﺪﺳﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ(‬

‫ﻣﻬﻨﺪﺱ ﺩﺍﺭﻳﻮﺵ ﻧﻴﻚﻣﻬﺮ‬


‫ﻓﻬﺮﺳﺖ ﻣﻄﺎﻟﺐ‬
‫ﺻﻔﺤﻪ‬ ‫ﻋﻨﻮان‬

‫ﭘﻴﺸﮕﻔﺘﺎر ‪1....................................................................................................................................‬‬

‫ﻓﺼﻞ اول ‪ :‬ﺳﻴﺴﺘﻢ اﻋﺪاد‬


‫ﻫﺪف ﻛﻠﻲ ‪2................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪2.........................................................................................................................‬‬
‫‪ -1-1‬ﻣﻘﺎدﻳﺮ دودوﺋﻲ )‪3................................................................................. (Binary‬‬
‫‪ -1-2‬ﺟﻤﻊ و ﺗﻔﺮﻳﻖ در ﺳﻴﺴﺘﻢ دوﺗﺎﺋﻲ ‪5.....................................................................‬‬
‫‪ -1-3‬ﺑﺎﻳﺖ )‪8...................................................................................................... (Byte‬‬
‫‪ -1-4‬ﻣﻘﺎدﻳﺮ ﻣﻨﻔﻲ ‪8........................................................................................................‬‬
‫‪ -1-5‬ﮔﺮوهﺑﻨﺪي ﺑﻴﺖﻫﺎ‪12..................................................................................................‬‬
‫‪ -1-6‬ﻋﻤﻠﻴﺎت در ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدهﺗﺎﺋﻲ ‪14........................................................................‬‬
‫‪ -1-7‬ﻋﻤﻠﻴﺎت در ﺳﻴﺴﺘﻢ ﻫﺸﺖﺗﺎﺋﻲ )‪18......................................................... (Octal‬‬
‫‪ -1-8‬ﻣﻘﺎدﻳﺮ اﻋﺸﺎري ‪22....................................................................................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪24..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪25..............................................................................................................................‬‬

‫ﻓﺼﻞ دوم ‪ :‬ﻣﻌﻤﺎري رﻳﺰﭘﺮدازﻧﺪه ‪80286‬‬


‫ﻫﺪف ﻛﻠﻲ ‪27................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪27.........................................................................................................................‬‬
‫‪ -2-1‬رﻳﺰ ﭘﺮدازﻧﺪه ‪27....................................................................................... 80286‬‬
‫‪ -2-1-1‬ﺛﺒﺎت ﻓﻠﮓ )‪30............................................................. (Flag register‬‬
‫‪ -2-1-2‬ﺛﺒــﺎت ‪33................................................................................................ IP‬‬
‫‪ -2-1-3‬ﺻﻒ دﺳﺘﻮراﻟﻌﻤﻞ )‪33.................................. (Instruction Queue‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪35..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪36..............................................................................................................................‬‬
‫ﻓﺼﻞ ﺳﻮم ‪ :‬ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ‬
‫ﻫﺪف ﻛﻠﻲ ‪37................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪37........................................................................................................................‬‬
‫‪ -3-1‬ﺑﺮﻧﺎﻣﻪ و دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ‪38........................................................................................‬‬
‫‪ -3-2‬ﻗﺎﻧﻮن ﻧﺎﻣﮕﺬاري ‪38...................................................................................................‬‬
‫‪ -3-3‬ﻣﺘﻐﻴﺮﻫﺎ )‪39...................................................................................... (Variables‬‬
‫‪ -3-4‬ﺑﺮﭼﺴﺐﻫﺎ )‪39......................................................................................... (Labels‬‬
‫‪ -3-5‬ﺛﺎﺑﺖﻫﺎ )‪40....................................................................................... (Constants‬‬
‫‪ -3-6‬ﻓﻴﻠﺪ ﻋﻤﻠﻴﺎت ‪42........................................................................................................‬‬
‫‪ -3-7‬ﻓﻴﻠﺪ ﻋﻤﻠﻮﻧﺪ ‪42...........................................................................................................‬‬
‫‪ -3-8‬ﻓﻴﻠﺪ ﻣﻼﺣﻈﺎت )‪43......................................................................... (Comment‬‬
‫‪ -3-9‬ﺗﻜﻨﻴﻜﻬﺎي آدرسدﻫﻲ ‪43........................................................................................‬‬
‫‪ -3-9-1‬آدرس دﻫﻲ ﺑﻼواﺳﻄﻪ ‪44...........................................................................‬‬
‫‪ -3-9-2‬آدرسدﻫﻲ ﻣﺴﺘﻘﻴﻢ ‪44..............................................................................‬‬
‫‪ -3-9-3‬آدرسدﻫﻲ رﺟﻴﺴﺘﺮ ‪44..............................................................................‬‬
‫‪ -3-9-4‬آدرسدﻫﻲ ﻏﻴﺮﻣﺴﺘﻘﻴﻢ رﺟﻴﺴﺘﺮ ‪45........................................................‬‬
‫‪ -3-9-5‬آدرسدﻫﻲ ﻣﺒﻨﺎ ‪45.....................................................................................‬‬
‫‪ -3-9-6‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺴﺘﻘﻴﻢ ‪46.................................................................‬‬
‫‪ -3-9-7‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺒﻨﺎ ‪47........................................................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪48..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪49................................................................................................................................‬‬

‫ﻓﺼﻞ ﭼﻬﺎرم ‪ :‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺳﺎﺳﻲ‬


‫ﻫﺪف ﻛﻠﻲ ‪50................................................................................................................................‬‬
‫اﻫﺪاف ‪50.......................................................................................................................................‬‬
‫‪ -4-1‬اﻧﺘﻘﺎل دادهﻫﺎ در ﺣﺎﻓﻈﻪ ‪51......................................................................................‬‬
‫‪ -4-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪60............................................................................................ LEA‬‬
‫‪ -4-3‬ﻣﺒﺎدﻟﺔ دادهﻫﺎ ‪61.......................................................................................................‬‬
‫‪ -4-4‬ﺟﻤﻊ و ﺗﻔﺮﻳﻖ ‪63......................................................................................................‬‬
‫‪ -4-5‬ﺿﺮب دو ﻣﻘﺪار ‪80....................................................................................................‬‬
‫‪ -4-6‬ﺿﺮب دو ﻣﻘﺪار ‪ 32‬ﺑﻴﺘﻲ ﺑﺪون ﻋﻼﻣﺖ ‪88...........................................................‬‬
‫‪ -4-7‬ﺗﻘﺴﻴﻢ دو ﻣﻘﺪار ‪90..................................................................................................‬‬
‫‪ -4-8‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻛﺎﻫﺶ و اﻓﺰاﻳﺶ ‪96......................................................................‬‬
‫‪ -4-9‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺎﺳﺒﻪ ﻣﻜﻤﻞ ‪99.......................................................................... 2‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪101..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪102..............................................................................................................................‬‬

‫ﻓﺼﻞ ﭘﻨﺠﻢ ‪ :‬اﻧﺸﻌﺎب و ﺗﻜﺮار‬


‫ﻫﺪف ﻛﻠﻲ ‪104................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪104........................................................................................................................‬‬
‫‪ -5-1‬دﺳﺘﻮراﻟﻌﻤﻞ ﭘﺮش ﻏﻴﺮ ﺷﺮﻃﻲ ‪104.........................................................................‬‬
‫‪ -5-2‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش ﺷﺮﻃﻲ ‪105............................................................................‬‬
‫‪ -5-3‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎﻳﺴﻪ ‪109...........................................................................................‬‬
‫‪ -5-4‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺗﻜﺮار ‪113.........................................................................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪118..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪119..............................................................................................................................‬‬

‫ﻓﺼﻞ ﺷﺸﻢ ‪ :‬ﻋﻤﻠﻴﺎت ﺑﻴﺘﻲ‬


‫ﻫﺪف ﻛﻠﻲ ‪122................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪122........................................................................................................................‬‬
‫‪ -6-1‬ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ ‪123...................................................................................................‬‬
‫‪ -6-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪123.............................................................................. NOT‬‬
‫‪ -6-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪123............................................................................... AND‬‬
‫‪ -6-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪125..................................................................................... OR‬‬
‫‪ -6-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪126............................................................................... XOR‬‬
‫‪ -6-1-5‬دﺳﺘﻮراﻟﻌﻤﻞ‪127.............................................................................. TEST‬‬
‫‪ -6-2‬ﻋﻤﻠﻴﺎت ﺷﻴﻔﺖ ‪132....................................................................................................‬‬
‫‪ -6-2-1‬دﺳﺘﻮراﻟﻌﻤﻞ‪133.................................................................................. SHL‬‬
‫‪ -6-2-2‬دﺳﺘﻮراﻟﻌﻤﻞ‪134.................................................................................. SHR‬‬
‫‪ -6-2-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪136.................................................................................SAL‬‬
‫‪ -6-2-4‬دﺳﺘﻮراﻟﻌﻤﻞ‪137................................................................................ SAR‬‬
‫‪ -6-3‬ﻋﻤﻠﻴﺎت ﭼﺮﺧﺶ )‪138............................................................................. ( Rotate‬‬
‫‪ -6-3-1‬دﺳﺘﻮراﻟﻌﻤﻞ‪138................................................................................ ROL‬‬
‫‪ -6-3-2‬دﺳﺘﻮراﻟﻌﻤﻞ‪140................................................................................ ROR‬‬
‫‪ -6-3-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪141................................................................................ RCL‬‬
‫‪ -6-3-4‬دﺳﺘﻮراﻟﻌﻤﻞ‪143................................................................................ RCR‬‬
‫‪ -6-4‬ﻋﻤﻠﻴﺎت ﻓﻠﮓﻫﺎ ‪145....................................................................................................‬‬
‫‪ -6-5‬ﺗﺒﺪﻳﻞ ﺣﺮوف ‪146.......................................................................................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪148..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪149..............................................................................................................................‬‬

‫ﻓﺼﻞ ﻫﻔﺘﻢ‪ :‬ﻣﻜﺮوﻫﺎ و روالﻫﺎ و وﻗﻔﻪﻫﺎ‬


‫ﻫﺪف ﻛﻠﻲ ‪151................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪151.........................................................................................................................‬‬
‫‪ -7-1‬ﭘﺸﺘﻪ ) ‪152.................................................................................................. ( Stack‬‬
‫‪ -7-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ‪152............................................................................ PUSH‬‬
‫‪ -7-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪153............................................................................... POP‬‬
‫‪ -7-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪154......................................................................... PUSHF‬‬
‫‪ -7-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ‪155............................................................................. POPF‬‬
‫‪ -7-2‬روال )‪155........................................................................................ (Procedures‬‬
‫‪ -7-3‬ﻣﻜﺮوﻫﺎ )‪157.............................................................................................(Macros‬‬
‫‪ -7-3-1‬دﻳﺮﻛﺘﻴﻮﻫﺎ ‪161.......................................................Macro directives‬‬
‫‪ -7-3-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪165.........................................................................EXITM‬‬
‫‪ -7-3-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪166.................................................................................. IRP‬‬
‫‪ -7-3-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪167.............................................................................. IRPC‬‬
‫‪ -7-3-5‬دﺳﺘﻮراﻟﻌﻤﻞ ‪168............................................................................REPT‬‬
‫‪ -7-3-6‬دﻳﺮﻛﺘﻴﻮ ‪171............................................................................... LOCAL‬‬
‫‪ -7-3-7‬ﻋﻤﻠﮕﺮﻫﺎي ﻣﻜﺮو ‪175.....................................................................................‬‬
‫‪ -7-3-8‬ﻋﻤﻠﮕﺮ & ‪175..................................................................................................‬‬
‫‪ -7-4‬وﻗﻔﻪﻫﺎ )‪177........................................................................................ (Interrupts‬‬
‫‪ -7-4-1‬ﻧﺤﻮة ﻛﺎر وﻗﻔﻪﻫﺎ ‪177.....................................................................................‬‬
‫‪ -7-4-2‬ﻣﻨﺎﺑﻊ وﻗﻔﻪﻫﺎ ‪178...........................................................................................‬‬
‫‪ -7-4-3‬وﻗﻔﻪﻫﺎي رزرو ﺷﺪه )‪179...........................( Reserved Interrupts‬‬
‫‪ -7-4-4‬وﻗﻔﻪﻫﺎي ﺳﻴﺴﺘﻢ ‪179...................................................................................‬‬
‫‪ -7-4-5‬وﻗﻔﻪﻫﺎي ‪180...................................................................................... DOS‬‬
‫‪ -7-4-6‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي وﻗﻔﻪ ‪181.............................................................................‬‬
‫‪ -7-4-7‬ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ وﻗﻔﻪ ﻧﻮع ‪184.................................................................. 21‬‬
‫‪ -7-5‬ﺧﻮاﻧﺪن رﺷﺘﻪﻫﺎ ‪197....................................................................................................‬‬
‫‪ -7-6‬ﻋﻤﻠﻴﺎت ‪ date‬و ‪199........................................................................................ time‬‬
‫‪ -7-6-1‬اﻧﺪازهﮔﻴﺮي زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ ‪200........................................................‬‬
‫‪ -7-6-2‬اﻳﺠﺎد ﺗﺄﺧﻴﺮ )‪201............................................ (Generating delays‬‬
‫‪ -7-7‬ﻛﺪﻫﺎي اﺳﻜﻲ و دودوﺋﻲ ‪204............................................................................‬‬
‫‪ -7-7-1‬ﺗﺒﺪﻳﻞ رﺷﺘﻪﻫﺎي ‪ ASCII‬ﺑﻪ دودوﺋﻲ ‪205.............................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎب ﻓﺼﻞ ‪213...........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪214..............................................................................................................................‬‬

‫ﻓﺼﻞ ﻫﺸﺘﻢ ‪ :‬ﻋﻤﻠﻴﺎت ﭘﺮدازش رﺷﺘﻪﻫﺎ‬


‫ﻫﺪف ﻛﻠﻲ ‪216................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪216........................................................................................................................‬‬
‫‪ -8-1‬رﺷﺘﻪ )‪216................................................................................................... (String‬‬
‫‪ -8-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪217.......................................................................... MOVS‬‬
‫‪-8-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪222.............................................................................. STOS‬‬
‫‪-8-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪225............................................................................. LODS‬‬
‫‪-8-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪225............................................................................. CMPS‬‬
‫‪-8-1-5‬دﺳﺘﻮراﻟﻌﻤﻞ ‪228.............................................................................. SCAS‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪231..........................................................................................................‬‬
‫‪ a‬ﺗﻤﺮﻳﻦ ‪232..............................................................................................................................‬‬
‫ﻓﺼﻞ ﻧﻬﻢ ‪ :‬ﺑﺮﻧﺎﻣﻪﻫﺎي ﻧﻤﻮﻧﻪ‬
‫ﻫﺪف ﻛﻠﻲ ‪233................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪233.........................................................................................................................‬‬
‫‪ -9-1‬اﺟﺰاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ‪234..................................................................................................‬‬
‫‪ -9-2‬ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻤﻮﻧﻪ ‪234..................................................................................................‬‬
‫‪ -9-3‬ﻧﺤﻮة اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ‪236..............................................................................................‬‬
‫‪ -9-4‬ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﻤﺒﻠﻲ ﻧﻮﺷﺘﻪ ﺷﺪه ‪237........................................................................‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‪269..........................................................................................................‬‬
‫ﻓﺼﻞ دﻫﻢ ‪ :‬اﺳﻤﺒﻠﻲ ‪80386‬‬
‫ﻫﺪف ﻛﻠﻲ ‪270................................................................................................................................‬‬
‫اﻫﺪاف رﻓﺘﺎري ‪270........................................................................................................................‬‬
‫‪ -10-1‬رﻳﺰ ﭘﺮدازﻧﺪه ‪270....................................................................................... 80386‬‬
‫‪ -10-2‬اﻧﻮاع دادهﻫﺎ ‪271.........................................................................................................‬‬
‫‪ -10-3‬ﻣﺤﺎﺳﺒﻪ آدرس ﻣﺆﺛﺮ )‪272......................................... (Effective Address‬‬
‫‪ -10-4‬ﻣﻌﻤﺎري ‪272..............................................................................................................‬‬
‫‪ -10-5‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪276..................................................................................80386‬‬
‫ﻣﺠﻤﻮﻋﺔ ﻛﺎﻣﻞ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪279..................................................................... 80386‬‬
‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ ‪285.............................................................................................................‬‬
‫ﺿﻤﺎﺋﻢ‬
‫ﺿﻤﻴﻤﻪ ‪ :1‬ﻋﻤﻠـﮕﺮﻫﺎ )‪286............................................................. (OPERATORS‬‬
‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪290............................................... Instruction Set Summary :2‬‬
‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪293................................................................. Instruction times : 3‬‬
‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪ :4‬ﻛﺪ ﻣﺎﺷﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ ‪300..............................................................‬‬
‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪ :5‬ﺟﺪول ﻛﺪ اﺳﻜﻲ ‪302..............................................................................‬‬
‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪ :6‬ﻛﺪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ‪303..............................................................................‬‬
‫ﺳﺌﻮاﻻت ﭼﻬﺎر ﮔﺰﻳﻨﻪاي ‪318............................................................................................................‬‬
‫واژه ﻧﺎﻣﻪ ‪368.......................................................................................................................................‬‬
‫‪١‬‬

‫ﭘﻴﺸﮕﻔﺘﺎر‬

‫ﺑﺎ ﻟﻄﻒ و ﻋﻨﺎﻳﺖ ﭘﺮودﮔﺎر ﻣﺘﻌﺎل ﻛﺘـﺎب زﺑـﺎن ﻣﺎﺷـﻴﻦ و ﺑﺮﻧﺎﻣـﻪ ﺳـﺎزي‬

‫ﺳﻴﺴﺘﻢ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻧﻴﺎز داﻧﺸﺠﻮﻳﺎن داﻧﺸﮕﺎه ﭘﻴﺎم ﻧﻮر در رﺷﺘﻪ ﻣﻬﻨﺪﺳﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ‬

‫ﺑﺼﻮرت ﺧﻮدآﻣﻮز و ﺑﺎ ﻣﺜﺎﻟﻬﺎي زﻳﺎد و ﺳﺎده و روان ﺗﻬﻴﻪ ﮔﺮدﻳﺪه اﺳﺖ‪ .‬ﻣﻄﺎﻟﺐ‬

‫اراﺋﻪ ﺷﺪه ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺗﺠﺮﺑﻴﺎت ﺗﺪرﻳﺲ در درس ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ زﺑﺎن اﺳﻤﺒﻠﻲ در‬

‫ﺳﺎﻟﻴﺎن ﻣﺘﻤﺎدي در داﻧﺸﮕﺎه ﻣﻲﺑﺎﺷﺪ‪ .‬اﻳﻦ ﻛﺘﺎب در ده ﻓﺼﻞ آﻣﺎده ﺷﺪه ﻛـﻪ ﻫـﺮ‬

‫ﻓﺼﻞ داراي اﻫﺪاف ﻓﺼﻞ‪ ،‬ﺗﻤﺮﻳﻦ و ﻣـﺮوري ﺑـﺮ ﻣﻄﺎﻟـﺐ ﻓـﺼﻞ ﻣـﻲﺑﺎﺷـﺪ‪ .‬در‬

‫اﻧﺘﻬﺎي ﻛﺘﺎب ﺳﺆاﻻت ﭼﻬﺎر ﮔﺰﻳﻨﻪاي و ﻧﻬﺎﻳﺘﺎً واژه ﻧﺎﻣﻪ ﮔﻨﺠﺎﻧﺪه ﺷﺪه اﺳﺖ‪.‬‬

‫در ﻧﻬﺎﻳﺖ از زﺣﻤﺎت و ﻫﻤﻜﺎري آﻗﺎي ﻣﻬﻨﺪس ﻧﻮﻳﺪ ﻧﻴﻚﻣﻬـﺮ در ﺗﻬﻴـﻪ‬

‫اﻳﻦ ﻛﺘﺎب ﻗﺪرداﻧﻲ و ﺳﭙﺎﺳﮕﺰاري ﻧﻤﻮده و اﻳﻦ ﻛﺘﺎب را ﺑـﻪ ﻫﻤـﺴﺮ ﻣﻬﺮﺑـﺎﻧﻢ و‬

‫ﻓﺮزﻧﺪان دﻟﺒﻨﺪم ﻛﻪ ﻫﻤﻮاره ﻣﺸﻮق اﻳﻨﺠﺎﻧـﺐ در ﻛﺎرﻫـﺎي ﻋﻠﻤـﻲ و ﭘﮋوﻫـﺸــﻲ‬

‫ﻣﻲﺑﺎﺷﻨﺪ ﺗﻘﺪﻳﻢ ﻣﻲﻧﻤﺎﻳﻢ‪.‬‬

‫ﺩﺍﺭﻳﻮﺵ ﻧﻴﻚﻣﻬﺮ‬
‫‪٢‬‬

‫ﻓﺼﻞ اول‬
‫ﺳﻴﺴﺘﻢ اﻋﺪاد‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ در ﺳﻴﺴﺘﻢ دودوﺋﻲ و ﻧﺤﻮه ﺗﺒﺪﻳﻞ آﻧﻬﺎ ﺑﻪ ﺳﺎﻳﺮ ﺳﻴﺴﺘﻤﻬﺎ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬
‫‪-1‬ﻣﻘﺎدﻳﺮ دودوﺋﻲ ﻳﺎ ﺑﺎﻳﻨﺮي‪.‬‬
‫‪-2‬واﺣﺪﻫﺎي ﻣﺨﺘﻠﻒ اﻧﺪازهﮔﻴﺮي ﺣﺎﻓﻈﻪ‪.‬‬
‫‪-3‬ﻧﻤﺎﻳﺶ اﻋﺪاد ﻣﻨﻔﻲ‪.‬‬
‫‪-4‬ﺗﺒﺪﻳﻞ ﻣﻘﺎدﻳﺮ ﺑﺎﻳﻨﺮي ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ و ﺑﺮﻋﻜﺲ‪.‬‬
‫‪٣‬‬

‫‪-5‬ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ در ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰده ﺗﺎﺋﻲ‪.‬‬


‫‪-6‬ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ در ﺳﻴﺴﺘﻢ ﻫﺸﺖ ﺗﺎﺋﻲ‪.‬‬
‫‪-7‬ﺗﺒﺪﻳﻞ ﻣﻘﺎدﻳﺮ از ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻫﺸﺖ ﺗﺎﺋﻲ و ﺑﺮﻋﻜﺲ‪.‬‬
‫‪-8‬ﺗﺒﺪﻳﻞ ﻣﻘﺎدﻳﺮ از ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ و ﺑﺮﻋﻜﺲ‪.‬‬
‫‪-9‬ﺗﺒﺪﻳﻞ ﻣﻘﺎدﻳﺮ از ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ و ﺑﺮﻋﻜﺲ‪.‬‬

‫‪ -1-1‬ﻣﻘﺎدﻳﺮ دودوﺋﻲ )‪(Binary‬‬


‫ﺑﺸﺮ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺗﻌﺪاد اﻧﮕﺸﺖﻫﺎﻳﺶ از ده رﻗﻢ ‪ 0,1,2,3,4,5,6,7,8,9‬ﺑـﺮاي‬
‫اﻳﺠﺎد ﻣﻘﺎدﻳﺮ و اﻋﺪاد و اﻧﺠﺎم ﻣﺤﺎﺳﺒﺎت روي آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﻳـﺪ‪ .‬ﺑـﻪ ﺑﻴـﺎﻧﻲ دﻳﮕـﺮ‬
‫ﺑﺸﺮ در ﻳﻚ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻳﺎ ‪ Decimal‬ﻛﺎر ﻣﻲﻛﻨـﺪ‪ .‬از ﻃـﺮف دﻳﮕـﺮ ﻛـﺎﻣﭙﻴﻮﺗﺮ در‬
‫ﻳﻚ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻳﺎ ‪ Binary‬ﻛﺎر ﻣﻲﻛﻨﺪ و ﻓﻘﻂ دو رﻗﻢ ‪ 1‬و ‪ 0‬را ﻣﻲﺷﻨﺎﺳـﺪ‪ .‬در‬
‫ﻧﺘﻴﺠﻪ ﻫﺮ ﻣﻘﺪاري ﻛﻪ ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ داده ﺷﻮد ﺑﺎﻳﺴﺘﻲ ﺗﺒﺪﻳﻞ ﺑﻪ ﻳﻚ ﺳﺮي ‪ 0‬و ‪ 1‬ﮔـﺮدد‬
‫ﺗﺎ ﺑﺘﻮاﻧﺪ در ﻛﺎﻣﭙﻴﻮﺗﺮ ذﺧﻴﺮه و ﻣﻮرد اﺳﺘﻔﺎده در ﻣﺤﺎﺳـﺒﺎت ﻗـﺮار ﮔﻴـﺮد‪ .‬ﺑـﺮاي ﺗﺒـﺪﻳﻞ‬
‫ﻣﻘﺎدﻳﺮ از ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﺎﻳـﺴﺘﻲ آن ﻣﻘـﺪار ﺑﻄـﻮر ﻣﺘـﻮاﻟﻲ ﺑـﺮ ‪2‬‬
‫ﺗﻘﺴﻴﻢ ﻧﻤﺎﺋﻴﻢ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 50‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-1‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪50‬‬ ‫‪2‬‬ ‫‪25‬‬ ‫‪0‬‬
‫‪25‬‬ ‫‪2‬‬ ‫‪12‬‬ ‫‪1‬‬
‫‪12‬‬ ‫‪2‬‬ ‫‪6‬‬ ‫‪0‬‬
‫‪6‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬
‫ﻋﺪد ‪ 50‬ﻣﻌﺎدل ‪ 110010‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪٤‬‬

‫ﺑﻪ ﻣﻨﻈﻮر ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ ﺑﺎﻳﻨﺮي ﺑﻪ ﺳﻴﺴﺘﻢ دﻫـﺪﻫﻲ‪ ،‬ارﻗـﺎم ﻋـﺪد را‬
‫ﻣﻲﺑﺎﻳﺴﺘﻲ ﺑﺘﺮﺗﻴﺐ از راﺳﺖ ﺑﻪ ﭼﭗ در ‪ … 16 ،8 ،2 ،1‬ﺿﺮب ﻧﻤﻮده ﺑـﺎ ﻫـﻢ ﺟﻤـﻊ‬
‫ﻧﻤﺎﺋﻴﻢ‪ .‬ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 11010‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬
‫ﻣﺜﺎل ‪1-2‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪16*1+‬‬ ‫‪16+‬‬
‫‪8*1‬‬ ‫‪8‬‬
‫‪4*0‬‬ ‫‪0‬‬
‫‪2*1‬‬ ‫‪2‬‬
‫‪1*0‬‬ ‫‪0‬‬
‫‪26‬‬

‫ﺑﻌﺒﺎرت دﻳﮕﺮ ارﻗﺎم را ﺑﺎﻳﺴﺘﻲ ﺑﺘﺮﺗﻴﺐ در ‪ ... ، 2 4 ، 23 ، 2 2 ، 21 ، 2 0‬ﺿﺮب‬


‫ﻧﻤﻮد‪.‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪24‬‬ ‫‪23‬‬ ‫‪22‬‬ ‫‪21‬‬ ‫‪20‬‬
‫ﻣﺜﺎل ‪1-3‬‬
‫ﻋﺪد ‪ 37‬را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪37‬‬ ‫‪2‬‬ ‫‪18‬‬ ‫‪1‬‬
‫‪18‬‬ ‫‪2‬‬ ‫‪9‬‬ ‫‪0‬‬
‫‪9‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫‪1‬‬
‫‪4‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪٥‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻘﺪار ‪ 37‬ﺑﺮاﺑﺮ ﺑﺎ ‪ 100101‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-4‬‬
‫ﻋﺪد ‪ 1101101‬را ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬


‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪64+‬‬
‫‪32‬‬
‫‪8‬‬
‫‪4‬‬
‫‪1‬‬
‫‪109‬‬

‫ﻧﺘﻴﺠﻪ ﻣﻴﺸﻮد ﻛﻪ ﻋﺪد ‪ 1101101‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻌـﺎدل ‪ 109‬در ﺳﻴـﺴﺘﻢ‬


‫دﻫﺪﻫﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ -1-2‬ﺟﻤﻊ و ﺗﻔﺮﻳﻖ در ﺳﻴﺴﺘﻢ دودوﻳﻲ‬


‫ﺟﻤﻊ و ﺗﻔﺮﻳﻖ در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺷﺒﻴﻪ ﺟﻤـﻊ و ﺗﻔﺮﻳـﻖ در ﺳﻴـﺴﺘﻢ دﻫـﺪﻫﻲ‬
‫ﻣﻲﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﻪ ﺟﺎي ده ﺑﺮ ﻳﻚ‪ ،‬دو ﺑﺮ ﻳـﻚ )‪ ( Carry‬اﻳﺠـﺎد ﻣـﻲﺷـﻮد‪.‬‬
‫ﻓﺮض ﻛﻨﻴﺪ دو ﻣﻘﺪار ‪ 3‬و ‪ 10‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻧﻤـﺎﺋﻴﻢ‪ .‬اﺑﺘـﺪا ﺑﺎﻳـﺴﺘﻲ‬
‫ﻫﺮ ﻛﺪام از اﻳﻦ ﻣﻘﺎدﻳﺮ را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮده ﺳﭙﺲ آﻧﻬﺎ را ﺑﺎ ﻫـﻢ ﺟﻤـﻊ‬
‫ﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪٦‬‬

‫‪10‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪0‬‬


‫‪5‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬
‫ﻣﻼﺣﻈﻪ ﻣﻲﺷﻮد ﻛﻪ ‪ 10‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ ‪.1010‬‬
‫از ﻃﺮف دﻳﮕﺮ ﻣﻘﺪار ‪ 3‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ را ﺑﺪﺳﺖ ﻣﻲآورﻳﻢ‪.‬‬

‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬


‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﺣﺎل دو ﻣﻘﺪار ‪ 11‬و ‪ 1010‬ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪1‬‬ ‫‪Carry‬‬
‫‪1010+‬‬
‫‪11‬‬
‫‪1101‬‬

‫در ﻣﻮرد ‪ 1+1‬ﺑﺎﻳﺴﺘﻲ در ﻧﻈﺮ داﺷﺖ ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻴﺸﻮد ‪ .10‬ﻛﻪ ﻳﻚ ‪ carry‬ﻳﻚ‬


‫ﺑﻪ ﺳﺘﻮن ﺑﻌﺪي ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪1-5‬‬
‫ﻣﺠﻤﻮع دو ﻣﻘﺪار ‪ 20‬و ‪ 17‬را ﺑﺪﺳﺖ آورﻳﺪ‪.‬‬
‫اﺑﺘﺪا ﻣﻘﺎدﻳﺮ ‪ 17‬و ‪ 20‬را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪20‬‬ ‫‪2‬‬ ‫‪10‬‬ ‫‪0‬‬


‫‪10‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪0‬‬
‫‪5‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪٧‬‬

‫ﻣﻘﺪار ‪ 20‬ﻣﻴﺸﻮد ‪ 10100‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ‪.‬‬

‫‪17‬‬ ‫‪2‬‬ ‫‪8‬‬ ‫‪1‬‬


‫‪8‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬
‫اﻳﻦ ﻧﺸﺎن ﻣﻲدﻫﺪ ﻛﻪ ‪ 17‬ﻣﻌﺎدل ‪ 10001‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ﺣﺎل‬

‫‪1‬‬ ‫‪Carry‬‬
‫‪10001+‬‬
‫‪10100‬‬
‫‪100101‬‬

‫ﻛﻪ اﻳﻦ ﻣﻘﺪار ﻳﻌﻨﻲ ‪ 100101‬اﮔﺮ ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺗﺒﺪﻳﻞ ﺷﻮد ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ‬

‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬


‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪32+‬‬
‫‪4‬‬
‫‪1‬‬
‫‪37‬‬

‫در ﻣﻮرد ﺗﻔﺮﻳﻖ در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻼﺣﻈﻪ ﻣﻲﮔﺮدد در ﺻـﻮرت‬


‫ﻟﺰوم ﻳﻚ ‪ 1‬در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻗﺮض ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد‪.‬‬
‫ﻣﺜﺎل ‪1-6‬‬
‫‪534 -‬‬
‫‪281‬‬
‫‪253‬‬
‫‪٨‬‬

‫وﻟﻲ در ﺳﻴﺴﺘﻢ دودوﻳﻲ در ﺻﻮرت ﻟﺰوم ﻳﻚ ‪ 1‬در ﺳﻴـﺴﺘﻢ دودوﻳـﻲ ﻗـﺮض‬


‫ﮔﺮﻓﺘﻪ ﻛﻪ ‪ borrow‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد‪ .‬ﻣﺜﺎل‬
‫‪1011-‬‬
‫‪0110‬‬
‫‪0101‬‬

‫‪ -1-3‬ﺑﺎﻳﺖ )‪(Byte‬‬
‫در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻓﻘﻂ ﻣﻘﺎدﻳﺮ ‪ 0‬و ‪ 1‬ذﺧﻴﺮه ﻣﻴﺸﻮد‪ .‬ﺑـﻪ ارﻗـﺎم ‪ 0‬و ‪ 1‬ﺑﻴـﺖ‬
‫ﮔﻔﺘﻪ ﻣﻴﺸﻮد‪ .‬ﺑﻴﺖ ﻣﺨﻔﻒ ﻛﻠﻤﺎت ‪ binary digit‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﻪ ﻫﺮ ﻫﺸﺖ ﺑﻴﺖ ﻛﻨﺎر ﻫـﻢ‬
‫در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎﻳﺖ ﮔﻔﺘﻪ ﻣﻴﺸﻮد‪ .‬ﺑﻴﺖﻫﺎي ﻳﻚ ﺑﺎﻳﺖ از ‪ 0‬ﺗـﺎ ‪ 7‬ﺷـﻤﺎره ﮔـﺬاري‬
‫ﺷﺪه و ﺑﻴﺖ ﺷﻤﺎره ‪ 0‬ﺑﻴﺖ ﻛﻢ ارزشﺗﺮﻳﻦ ﻳﺎ ‪ LSB‬و ﺑﻴﺖ ﺷﻤﺎره ‪ 7‬ﺑﻴﺖ ﺑﺎ ﺑﻴـﺸﺘﺮﻳﻦ‬
‫ارزش ﻳﺎ ‪ MSB‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬


‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬

‫ﻫﺮ ﺑﺎﻳﺖ ‪ 256‬وﺿﻌﻴﺖ ﻣﺨﺘﻠﻔﻪ از ‪ 0‬و ‪ 1‬را اﻳﺠﺎد ﻣـﻲﻧﻤﺎﻳـﺪ‪ .‬ﺑﻨـﺎﺑﺮاﻳﻦ اﻋـﺪاد‬
‫ﺻﺤﻴﺢ ﺑﻴﻦ ‪ 0‬ﺗﺎ ‪ 255‬را ﻣﻲﺗﻮان در ﻳﻚ ﺑﺎﻳﺖ ﻗﺮار داد‪ .‬از ﻃﺮف دﻳﮕﺮ در ﻛﺎﻣﭙﻴﻮﺗﺮ از‬
‫‪ 256‬ﻛﺎرﻛﺘﺮ ﻣﺨﺘﻠﻒ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﺑﺎ اﺳﺘﻔﺎده از ﺟﺪول ﻛﺪ ‪ ASCII‬ﻣﻲﺗـﻮان‬
‫ﺑﻪ ﻫﺮ ﻛﺎراﻛﺘﺮ ﻳﻚ ﻛﺪ ﻣﻨﺤﺼﺮ ﺑﻔﺮد ﺑﻴﻦ ‪ 0‬ﺗﺎ ‪ 255‬ﺗﺨﺼﻴﺺ داد‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ ﻫﺮ ﻛـﺎراﻛﺘﺮ‬
‫ﻋﻤﻼً ﻳﻚ ﺑﺎﻳﺖ اﺷﻐﺎل ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪ -1-4‬ﻣﻘﺎدﻳﺮ ﻣﻨﻔﻲ‬
‫اﻋﺪاد و ﻣﻘﺎدﻳﺮ ﻣﻨﻔﻲ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎ اﺳـﺘﻔﺎده از روش ﻣﻜﻤـﻞ ‪ 2‬ﻧﻤـﺎﻳﺶ داده‬
‫ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﻣﻘﺪار ﻣﻨﻔﻲ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎﻳﺴﺘﻲ ﻣﺮاﺣﻞ زﻳﺮ را ﻃﻲ ﻧﻤﻮد‪.‬‬
‫‪٩‬‬

‫‪-1‬اﺑﺘﺪا ﻋﺪد را ﺑﺪون ﻋﻼﻣﺖ ﺗﺼﻮر ﻧﻤﻮده آﻧﺮا ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-2‬ﺳﭙﺲ آﻧﻘﺪر رﻗﻢ ‪ 0‬در ﺳﻤﺖ ﭼﭗ ﻧﺘﻴﺠﻪ ﻣﺮﺣﻠﻪ ‪ 1‬ﻗﺮار ﻣﻲدﻫﻴﻢ ﺗﺎ ﺗﻌﺪاد ارﻗـﺎم آن‬
‫ﻣﻀﺮﺑﻲ از ﻫﺸﺖ ﮔﺮدد‪ .‬ﭼﻨﺎﻧﭽﻪ ﻧﺘﻴﺠﻪ ﻣﺮﺣﻠﻪ ‪ 1‬از ﻫﺸﺖ رﻗـﻢ ﺑﻴـﺸﺘﺮ ﺑﺎﺷـﺪ ﺑﺎﻳـﺴﺘﻲ‬
‫آﻧﻘﺪر ‪ 0‬در ﺳﻤﺖ ﭼﭗ ﻗﺮار دﻫﻴﻢ ﺗﺎ ﺷﺎﻧﺰده رﻗﻤﻲ ﮔﺮدد‪.‬‬
‫‪-3‬ﺳﭙﺲ ارﻗﺎم ﻧﺘﻴﺠﻪ ﻣﺮﺣﻠﻪ ‪ 2‬را ﻣﻜﻤﻞ ﻣﻲﻧﻤـﺎﺋﻴﻢ ﻳﻌﻨـﻲ ‪ 0‬ﺑـﻪ ‪ 1‬و ‪ 1‬ﺑـﻪ ‪ 0‬ﺗﺒـﺪﻳﻞ‬
‫ﻣﻲﻛﻨﻴﻢ‪.‬‬
‫‪-4‬ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﺎ ‪ 1‬ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫ﻣﺜﺎل ‪1-7‬‬
‫ﻋﺪد ‪ –26‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬اﺑﺘـﺪا ﻋـﺪد ‪ 26‬را ﺑـﻪ ﺳﻴـﺴﺘﻢ دودوﻳـﻲ ﺗﺒـﺪﻳﻞ‬
‫ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪26‬‬ ‫‪2‬‬ ‫‪13‬‬ ‫‪0‬‬
‫‪13‬‬ ‫‪2‬‬ ‫‪6‬‬ ‫‪1‬‬
‫‪6‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﻛﻪ ﻣﻴﺸﻮد ‪.11010‬‬


‫ﺣﺎل ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را ﻫﺸﺖ رﻗﻤﻲ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪00011010‬‬

‫ﺳﭙﺲ ‪ 0‬ﻫﺎ را ﺑﻪ ‪ 1‬و ‪ 1‬ﻫﺎ را ﺑﻪ ‪ 0‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﻴﻢ‪.‬‬


‫‪11100101‬‬

‫ﺣﺎل ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را ﺑﺎ ‪ 1‬ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪11100101+‬‬
‫‪1‬‬
‫‪11100110‬‬
‫‪١٠‬‬

‫ﻋﺪد ‪ 11100110‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻧﻤﺎﻳﺶ ‪ –26‬ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﻳـﻚ ﺑﺎﻳـﺖ‬
‫اﺷﻐﺎل ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻧﻜﺘﻪ ﻣﻬﻤﻲ ﻛﻪ ﺑﺎﻳﺴﺘﻲ در ﻧﻈﺮ داﺷﺖ اﻳـﻦ اﺳـﺖ ﻛـﻪ ‪ MSB‬اﻋـﺪاد‬
‫ﻣﻨﻔﻲ در روش ﻣﻜﻤﻞ ‪ 2‬ﻫﻤﻴﺸﻪ ‪ 1‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-8‬‬
‫ﻋﺪد ‪ –35‬را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪35‬‬ ‫‪2‬‬ ‫‪17‬‬ ‫‪1‬‬
‫‪17‬‬ ‫‪2‬‬ ‫‪8‬‬ ‫‪1‬‬
‫‪8‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪ 35‬ﻣﻌﺎدل ‪ 100011‬در ﺳﻴـﺴﺘﻢ دودوﻳـﻲ ﻣـﻲﺑﺎﺷـﺪ‪ .‬ﺣـﺎل‬


‫ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را ﻫﺸﺖ رﻗﻤﻲ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪00100011‬‬

‫ﺳﭙﺲ ‪0‬ﻫﺎ را ﺑﻪ ‪ 1‬و ‪ 1‬ﻫﺎ را ﺑﻪ ‪ 0‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﻴﻢ‪.‬‬


‫‪11011100‬‬

‫ﺣﺎل ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را ﺑﺎ ‪ 1‬ﺟﻤﻊ ﻣﻲﻛﻨﻴﻢ‬

‫‪1101100 +‬‬
‫‪1‬‬
‫‪11011101‬‬

‫ﻣﻘﺪار ‪ 11011101‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻌﺎدل ‪ –35‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﻛﻪ ﻫﻤﺎﻧﻄﻮرﻳﻜـﻪ‬


‫ﻣﻼﺣﻈﻪ ﻣﻴﮕﺮدد ﺑﻴﺖ ‪ MSB‬آن ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪١١‬‬

‫ﻣﺜﺎل ‪1-9‬‬
‫ﻋﻤﻞ زﻳﺮ را ﺑﺎ اﺳﺘﻔﺎده از روش ﻣﻜﻤﻞ ‪ 2‬اﻧﺠﺎم دﻫﻴﺪ‪.‬‬

‫‪27-‬‬
‫‪20‬‬

‫اﻳﻦ ﻋﻤﻞ ﺗﻔﺮﻳﻖ در ﺣﻘﻴﻘﺖ ﺑﻤﻨﺰﻟﻪ ﺟﻤﻊ دو ﻣﻘﺪار زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫)‪27+(-20‬‬
‫ﺣﺎل ﻣﻘﺎدﻳﺮ ‪ –20‬و ‪ 27‬را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮده‪.‬‬

‫‪27‬‬ ‫‪2‬‬ ‫‪13‬‬ ‫‪1‬‬


‫‪13‬‬ ‫‪2‬‬ ‫‪6‬‬ ‫‪1‬‬
‫‪6‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﻣﻘﺪار ‪ 27‬ﻣﻌﺎدل ‪ 11011‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬ﺣﺎل اﺑﺘﺪا ﻣﻘـﺪار ‪ 20‬را‬
‫ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮد‪.‬‬

‫‪20‬‬ ‫‪2‬‬ ‫‪10‬‬ ‫‪0‬‬


‫‪10‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪0‬‬
‫‪5‬‬ ‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﻣﻘﺪار ‪ 20‬ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ ‪ 10100‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ‪ .‬ﺣﺎل ‪ -20‬را در ﺳﻴـﺴﺘﻢ‬


‫دودوﻳﻲ ﺑﺪﺳﺖ ﻣﻲآورﻳﻢ‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر اﺑﺘﺪا ﻋﺪد را ﻫﺸﺖ رﻗﻤﻲ ﻧﻤﻮده‬
‫‪00010100‬‬
‫ﺳﭙﺲ ﺻﻔﺮﻫﺎ را ﺑﻪ ‪ 1‬و ﻳﻜﻬﺎ را ﺑﻪ ﺻﻔﺮ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪11101011‬‬
‫‪١٢‬‬

‫آﻧﮕﺎه ﻣﻘﺪار ‪ 1‬ﺑﻪ آن اﺿﺎﻓﻪ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪11101011+‬‬
‫‪1‬‬
‫‪11101100‬‬
‫ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ﻛﻪ ﻣﻘﺪار ‪ –20‬ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ ‪ 11101100‬در ﺳﻴﺴﺘﻢ دودوﻳـﻲ‪.‬‬
‫ﺣﺎل دو ﻣﻘﺪار ‪ –20‬و ‪ 27‬را در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪11101100 +‬‬
‫‪11011‬‬
‫‪100000111‬‬

‫ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ آﻧﻜﻪ ﻧﺘﻴﺠﺔ ﺟﻤﻊ دو ﺑﺎﻳﺖ ﺑﺼﻮرت ﻳـﻚ ﺑﺎﻳـﺖ ﻣـﻲﺑﺎﺷـﺪ ﺑﻴـﺖ ‪1‬‬
‫ﺳﻤﺖ ﭼﭗ ﺑﺎﻳﺴﺘﻲ ﺣﺬف ﮔﺮدد‪ ،‬ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪ 111‬ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ‪ 7‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ -1-5‬ﮔﺮوهﺑﻨﺪي ﺑﻴﺖﻫﺎ‬
‫ﺑﻪ ﻫﺮ ﻫﺸﺖ ﺑﻴﺖ ﻛﻨﺎر ﻫﻢ ﺑﺎﻳﺖ ﮔﻔﺘـﻪ ﻣـﻲﺷـﻮد‪ .‬دو ﺑﺎﻳـﺖ ﻛﻨـﺎر ﻫـﻢ ﻳﻌﻨـﻲ‬
‫ﺷﺎﻧﺰده ﺑﻴﺖ ﻣﺘﻮاﻟﻲ را ‪ word‬ﻣﻲﻧﺎﻣﻨﺪ)اﻟﺒﺘﻪ در ﺑﻌﻀﻲ از ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫـﺎ ﻫـﺮ ﻛﻠﻤـﻪ ﻣـﻲ‬
‫ﺗﻮاﻧــــﺪ ﺷــــﺎﻣﻞ ‪ 4‬ﺑﺎﻳــــﺖ ﺑﺎﺷــــﺪ(‪ .‬ﺑﻴــــﺖﻫــــﺎي ﻳــــﻚ ‪ word‬از ‪ 0‬ﺗــــﺎ ‪15‬‬
‫ﺷــﻤﺎرهﮔــﺬاري ﻣــﻲ ﮔــﺮدد‪ .‬در ﻳــﻚ ‪ word‬ﺑﺎﻳــﺖ ﺳــﻤﺖ راﺳــﺖ را ﺑﺎﻳــﺖ‬
‫ﻣﺮﺗﺒــﻪ ﭘــﺎﺋﻴﻦ )‪ (Low order byte‬و ﺑﺎﻳــﺖ ﺳــﻤﺖ ﭼــﭗ را ﺑﺎﻳــﺖ ﻣﺮﺗﺒــﻪ ﺑــﺎﻻ‬
‫)‪(High order byte‬ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪.‬‬

‫‪15‬‬ ‫‪8 7‬‬ ‫‪0‬‬


‫‪High order byte‬‬ ‫‪Low order byte‬‬
‫‪١٣‬‬

‫در ﻳﻚ ‪ Word‬ﺑﻴﺖ ﺷﻤﺎره ‪ 0‬را ‪ LSB‬و ﺑﻴﺖ ﺷﻤﺎره ‪ 15‬را ‪ MSB‬ﻣﻲﻧﺎﻣﻨـﺪ‪.‬‬


‫از ﻃﺮف دﻳﮕﺮ ﭼﻬﺎر ﺑﺎﻳﺖ ﻣﺘﻮاﻟﻲ ﺗﺸﻜﻴﻞ ﻳﻚ ‪ Double word‬ﻣﻴﺪﻫﻨﺪ‪.‬‬

‫‪31‬‬ ‫‪24 23‬‬ ‫‪16 15‬‬ ‫‪8 7‬‬ ‫‪0‬‬

‫ﻫﺮ ﻫﺸﺖ ﺑﺎﻳﺖ ﻣﺘﻮاﻟﻲ ﺗﺸﻜﻴﻞ ﻳﻚ ‪ Quadword‬ﻣﻴﺪﻫﺪ و ﻧﻬﺎﻳﺘـﺎً ﻫـﺮ ﻫـﺸﺘﺎد‬


‫ﺑﻴﺖ ﻣﺘﻮاﻟﻲ ﻳﺎ ده ﺑﺎﻳﺖ ﻣﺘﻮاﻟﻲ ﺗﺸﻜﻴﻞ ﻳﻚ ‪ Tenbyte‬ﻣﻲدﻫﺪ‪ .‬ﺟﺪول ذﻳﻞ ﻣﻘـﺎدﻳﺮي‬
‫ﻛﻪ در ﻳﻚ ‪ double word ،word ، byte‬ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬

‫ﺟﺪول ‪1-1‬‬

‫ﻧﻮع‬ ‫ﻣﻘﺎدﻳﺮ ﺑﺪون ﻋﻼﻣﺖ‬ ‫ﻣﻘﺎدﻳﺮ ﻋﻼﻣﺖ دار‬


‫‪Byte‬‬ ‫‪ 255‬ﺗﺎ ‪0‬‬ ‫‪ 127‬ﺗﺎ ‪–128‬‬
‫‪Word‬‬ ‫‪ 65535‬ﺗﺎ ‪0‬‬ ‫‪ 32767‬ﺗﺎ ‪–32768‬‬
‫‪Double word‬‬ ‫‪ 232-1‬ﺗﺎ ‪0‬‬ ‫‪ 231-1‬ﺗﺎ ‪-231‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻋﻤﻠﻴﺎت ﺑﺎﻳﻨﺮي روي ﺑﻴﺖﻫﺎ اﻧﺠﺎم ﻣـﻲﺷـﻮد‪ .‬ﺟـﺪول‬
‫ﻋﻤﻠﮕﺮ ﺟﻤﻊ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﺟﺪول ‪1-2‬‬
‫ﺑﻴﺖ ‪1‬‬ ‫ﺑﻴﺖ ‪2‬‬ ‫ﻧﺘﻴﺠﻪ‬ ‫دوﺑﺮﻳﻚ )‪(carry‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﺟﺪول ﻋﻤﻠﮕﺮ ﺗﻔﺮﻳﻖ ﻧﻴﺰ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫‪١٤‬‬

‫ﺟﺪول ‪1-3‬‬
‫ﺑﻴﺖ ‪1‬‬ ‫ﺑﻴﺖ ‪2‬‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﻳﻚ ﻗﺮﺿﻲ )‪(borrow‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬

‫‪ -1-6‬ﻋﻤﻠﻴﺎت در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده‬


‫ارﻗﺎم در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﻳﺎ ‪ Hexadecimal‬ﻋﺒﺎرﺗﻨﺪ از ‪ 0‬ﺗﺎ ‪ .15‬ﺑﻤﻨﻈﻮر‬
‫ﺟﻠﻮﮔﻴﺮي از اﺑﻬﺎم‪ ،‬ارﻗﺎم ‪ 10‬ﺗﺎ ‪ 15‬را ﺑﺘﺮﺗﻴﺐ ﺑﺎ ﺣﺮوف ‪ A‬ﺗﺎ ‪ F‬ﻧﺸﺎن داده ﻣﻴﺸﻮﻧﺪ‪.‬‬

‫‪A‬‬ ‫‪10‬‬
‫‪B‬‬ ‫‪11‬‬
‫‪C‬‬ ‫‪12‬‬
‫‪D‬‬ ‫‪13‬‬
‫‪E‬‬ ‫‪14‬‬
‫‪F‬‬ ‫‪15‬‬
‫ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴـﺴﺘﻢ ﻣﺒﻨـﺎي ﺷـﺎﻧﺰده آن ﻋـﺪد را‬
‫ﺑﻄﻮر ﻣﺘﻮاﻟﻲ ﺑﺮ ‪ 16‬ﺗﻘﺴﻴﻢ ﻣﻲﻧﻤﺎﺋﻴﻢ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 174‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-10‬‬
‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬
‫‪174‬‬ ‫‪16‬‬ ‫‪10‬‬ ‫‪14‬‬ ‫‪E‬‬
‫‪10‬‬ ‫‪16‬‬ ‫‪0‬‬ ‫‪10‬‬ ‫‪A‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪.AE‬‬

‫ﻣﺜﺎل ‪1-11‬‬
‫ﻋﺪد ‪ 3740‬را از ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪١٥‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪3740‬‬ ‫‪16‬‬ ‫‪233‬‬ ‫‪12 C‬‬
‫‪233‬‬ ‫‪16‬‬ ‫‪14‬‬ ‫‪9‬‬
‫‪14‬‬ ‫‪16‬‬ ‫‪0‬‬ ‫‪14 E‬‬
‫ﭼﻮن ‪ 14‬ﻣﻌﺎدل ‪ E‬ﻣﻲﺑﺎﺷﺪ و ‪ C‬ﻣﻌﺎدل ‪ 12‬ﻣﻲﺑﺎﺷﺪ ﺑﻨﺎﺑﺮاﻳﻦ ﺟﻮاب ﻣـﻲﺷـﻮد‬
‫‪ E9C‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده‪.‬‬

‫ﻣﺜﺎل ‪1-12‬‬
‫ﻣﻘﺪار ‪ 27845‬را ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬
‫‪27845‬‬ ‫‪16‬‬ ‫‪1740‬‬ ‫‪5‬‬
‫‪1740‬‬ ‫‪16‬‬ ‫‪108‬‬ ‫‪12‬‬ ‫‪C‬‬
‫‪108‬‬ ‫‪16‬‬ ‫‪6‬‬ ‫‪11‬‬ ‫‪B‬‬
‫‪6‬‬ ‫‪16‬‬ ‫‪0‬‬ ‫‪6‬‬

‫ﻣﻘﺪار ‪ 27845‬ﺑﺮاﺑﺮ ﺑﺎ ‪ 6CC5‬در ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدﻫﺪﻫﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ارﻗﺎم ﻋﺪد را از‬
‫ﺳﻤﺖ راﺳﺖ ﺑﺘﺮﺗﻴﺐ در ‪ ... ،163،162،16،1‬ﺿﺮب ﻧﻤﻮده ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫ﻣﺜﺎل ‪1-13‬‬
‫ﻋﺪد ‪ 2AF5‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬
‫‪2‬‬ ‫‪A‬‬ ‫‪F‬‬ ‫‪5‬‬
‫‪163‬‬ ‫‪162‬‬ ‫‪16‬‬ ‫‪1‬‬

‫‪5*1+‬‬ ‫‪5 +‬‬


‫‪F*16‬‬ ‫‪1‬‬ ‫‪15*16‬‬
‫‪A*162‬‬ ‫‪1‬‬ ‫‪10*256‬‬
‫‪2*163‬‬ ‫‪1‬‬ ‫‪2*4096‬‬
‫‪1‬‬ ‫‪10997‬‬
‫‪١٦‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻨﺠﺮ ﻣﻴﺸﻮد ﺑﻪ ‪ 2AF5‬ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ‪ 10997‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-14‬‬
‫ﻣﻘــﺪار ‪ 4F2‬در ﺳﻴــﺴﺘﻢ ﻣﺒﻨــﺎي ﺷــﺎﻧﺰده ﭼــﻪ ﻣﻘــﺪار در ﺳﻴــﺴﺘﻢ دﻫــﺪﻫﻲ‬
‫ﻣــﻲﺑﺎﺷــﺪ؟ ﺑــﺮاي اﻳﻨﻜــﺎر اﺑﺘــﺪا رﻗــﻢ ‪ 2‬را در ‪ ،1‬رﻗــﻢ ‪ F‬را در ‪ 16‬و رﻗــﻢ ‪ 4‬را‬
‫در ‪ 162‬ﺿﺮب ﻣﻲﻧﻤﺎﺋﻴﻢ‪ .‬ﺳﭙﺲ ﻣﻘﺎدﻳﺮ ﺑﺪﺳﺖ آﻣﺪه را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻛﻨﻴﻢ‪.‬‬

‫‪4‬‬ ‫‪F‬‬ ‫‪2‬‬


‫‪162‬‬ ‫‪16‬‬ ‫‪1‬‬

‫‪4*162+‬‬
‫‪F*16‬‬
‫‪2*1‬‬

‫ﻛﻪ ﻣﻨﺠﺮ ﻣﻴﺸﻮد ﺑﻪ‬


‫‪4*256+‬‬
‫‪15*16‬‬
‫‪2*1‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد‬


‫‪1024+‬‬
‫‪240‬‬
‫‪2‬‬
‫‪1266‬‬
‫ﻣﻘــﺪار ‪ 4F2‬در ﺳﻴــﺴﺘﻢ ﺷــﺎﻧﺰدﻫﺪﻫﻲ ﺑﺮاﺑــﺮ ﺑــﺎ ‪ 1266‬در ﺳﻴــﺴﺘﻢ دﻫــﺪﻫﻲ‬
‫ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫از ﻃﺮف دﻳﮕﺮ ﻫﺮ رﻗﻢ در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده را ﻣﻲﺗﻮان ﺑﻮﺳﻴﻠﻪ ﭼﻬﺎر رﻗـﻢ‬
‫در ﺳﻴﺴﺘﻢ ﺑﺎﻳﻨﺮي ﻧﻤﺎﻳﺶ داد‪.‬‬
‫‪١٧‬‬

‫‪0‬‬ ‫‪0000‬‬
‫‪1‬‬ ‫‪0001‬‬
‫‪2‬‬ ‫‪0010‬‬
‫‪3‬‬ ‫‪0011‬‬
‫‪4‬‬ ‫‪0100‬‬
‫‪5‬‬ ‫‪0101‬‬
‫‪6‬‬ ‫‪0110‬‬
‫‪7‬‬ ‫‪0111‬‬
‫‪8‬‬ ‫‪1000‬‬
‫‪9‬‬ ‫‪1001‬‬
‫‪A‬‬ ‫‪1010‬‬
‫‪B‬‬ ‫‪1011‬‬
‫‪C‬‬ ‫‪1100‬‬
‫‪D‬‬ ‫‪1101‬‬
‫‪E‬‬ ‫‪1110‬‬
‫‪F‬‬ ‫‪1111‬‬
‫ﺣﺎل ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار در ﺳﻴـﺴﺘﻢ ﻣﺒﻨـﺎي ﺷـﺎﻧﺰده ﺑـﻪ ﺳﻴـﺴﺘﻢ دودوﻳـﻲ‬
‫ﻣﻲﺗﻮان از ﺟﺪول ﻣﺬﻛﻮر اﺳﺘﻔﺎده ﻧﻤﻮده و ارﻗﺎم را ﺑﺎ ﻣﻘﺪار ﻣﻌﺎدل آن ﺟﺎﻳﮕﺰﻳﻦ ﻧﻤﻮد‪.‬‬
‫ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 2FA5B‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬ﺑﺎ ﺟﺎﻳﮕﺰﻳﻨﻲ ﻫﺮ رﻗﻢ ﺑـﺎ ﭼﻬـﺎر رﻗـﻢ‬
‫ﻣﻌﺎدل آن در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻧﺘﻴﺠﻪ زﻳﺮ ﺣﺎﺻﻞ ﻣﻲﮔﺮدد‪.‬‬
‫‪00101111101001011011‬‬
‫ﺑﻪ ﻣﻨﻈﻮر ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار از ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨـﺎي ﺷـﺎﻧﺰده اﺑﺘـﺪا‬
‫ارﻗﺎم را از ﺳﻤﺖ راﺳﺖ ﭼﻬﺎر ﺗﺎ ﭼﻬﺎر ﺗﺎ ﺟﺪا ﻧﻤﻮده ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺟﺪول ﻓـﻮق‬
‫ﻣﻘﺎدﻳﺮ ﻣﻌﺎدل را ﻗﺮار ﻣﻲدﻫﻴﻢ‪.‬‬

‫ﻣﺜﺎل ‪1-15‬‬
‫‪111011001011101‬‬
‫ﻛﻪ اﺑﺘﺪا ﺑﺼﻮرت زﻳﺮ در ﻣﻲآورﻳﻢ‪.‬‬
‫‪0111‬‬ ‫‪0110‬‬ ‫‪0101‬‬ ‫‪1101‬‬
‫ﻛﻪ ﻣﻌﺎدل ‪ 765D‬ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪١٨‬‬

‫‪ -1-7‬ﻋﻤﻠﻴﺎت در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ )‪(Octal‬‬


‫ارﻗﺎم در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫـﺸﺖ ﻋﺒﺎرﺗﻨـﺪ از ‪ 0‬ﺗـﺎ ‪ . 7‬ﺑـﺮاي ﺗﺒـﺪﻳﻞ ﻣﻘـﺪاري از‬
‫ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺑﺎﻳﺴﺘﻲ آن ﻣﻘﺪار را ﺑﻄﻮر ﻣﺘـﻮاﻟﻲ ﺑـﺮ ﻫـﺸﺖ‬
‫ﺗﻘﺴﻴﻢ ﻧﻤﻮد‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 125‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-16‬‬
‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬
‫‪125‬‬ ‫‪8‬‬ ‫‪15‬‬ ‫‪5‬‬
‫‪15‬‬ ‫‪8‬‬ ‫‪1‬‬ ‫‪7‬‬
‫‪1‬‬ ‫‪8‬‬ ‫‪0‬‬ ‫‪1‬‬
‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪ 175‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ‪.‬‬

‫ﻣﺜﺎل ‪1-17‬‬
‫ﺑﻤﻨﻈﻮر ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ‪ ،‬ارﻗﺎم ﻋـﺪد‬
‫را از ﺳــﻤﺖ راﺳــﺖ ﺑﺘﺮﺗﻴــﺐ در ‪ … ،83 ،82 ،8 ،1‬ﺿــﺮب ﻧﻤــﻮده ﻧﺘــﺎﻳﺞ ﺣﺎﺻــﻠﻪ‬
‫را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻋﺪد ‪ 237‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫـﺸﺖ را در ﻧﻈـﺮ‬
‫ﺑﮕﻴﺮﻳﺪ‪.‬‬
‫‪2 3 7‬‬
‫‪82 8 1‬‬
‫‪7*1+‬‬ ‫‪7‬‬
‫‪3*8‬‬ ‫‪24‬‬
‫‪2*82‬‬ ‫‪128‬‬
‫‪159‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪ 159‬در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ‪.‬‬


‫‪١٩‬‬

‫ﻣﺜﺎل ‪1-18‬‬
‫ﻋﺪد ‪ 4260‬را از ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪4260‬‬ ‫‪8‬‬ ‫‪532‬‬ ‫‪4‬‬
‫‪532‬‬ ‫‪8‬‬ ‫‪66‬‬ ‫‪4‬‬
‫‪66‬‬ ‫‪8‬‬ ‫‪8‬‬ ‫‪2‬‬
‫‪8‬‬ ‫‪8‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪8‬‬ ‫‪0‬‬ ‫‪1‬‬

‫ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ﻛﻪ ‪ 4260‬در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻣﻌﺎدل ‪ 10244‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨـﺎي‬


‫ﻫﺸﺖ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-19‬‬
‫ﻋﺪد ‪ 382‬را ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫ﻣﻘﺪار‬ ‫ﺗﻘﺴﻴﻢ ﺑﺮ‬ ‫ﻧﺘﻴﺠﻪ‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬


‫‪382‬‬ ‫‪8‬‬ ‫‪47‬‬ ‫‪6‬‬
‫‪47‬‬ ‫‪8‬‬ ‫‪5‬‬ ‫‪7‬‬
‫‪5‬‬ ‫‪8‬‬ ‫‪0‬‬ ‫‪5‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪ 576‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ‪.‬‬

‫ﻣﺜﺎل ‪1-20‬‬
‫ﻣﻘﺪار ‪ 4327‬را از ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫـﺸﺖ ﺑـﻪ ﺳﻴـﺴﺘﻢ دﻫـﺪﻫﻲ ﺗﺒـﺪﻳﻞ ﻧﻤﺎﺋﻴـﺪ‪.‬‬
‫ﺑﺮاي اﻳﻨﻜـﺎر اﺑﺘـﺪا رﻗـﻢ ‪ 7‬را در ‪ ،1‬رﻗـﻢ ‪ 2‬را در ‪ ،8‬رﻗـﻢ ‪ 3‬را در ‪ 82‬و ﻧﻬﺎﻳﺘـﺎً رﻗـﻢ‬
‫‪ 4‬را در ‪ 83‬ﺿــﺮب ﻣــﻲﻧﻤــﺎﺋﻴﻢ ﺳــﭙﺲ ﻣﺠﻤــﻮع ﻣﻘــﺎدﻳﺮ ﺑﺪﺳــﺖ آﻣــﺪه را ﻣﺤﺎﺳــﺒﻪ‬
‫ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪٢٠‬‬

‫‪4327‬‬
‫‪83 82 8 1‬‬
‫ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد‬
‫‪4*83 +‬‬
‫‪3*82‬‬
‫‪2*8‬‬
‫‪7*1‬‬
‫ﻛﻪ ﻣﻌﺎدل اﺳﺖ ﺑﺎ‬
‫‪4*512+‬‬
‫‪3*64‬‬
‫‪2*8‬‬
‫‪7*1‬‬
‫ﻛﻪ ﻧﻬﺎﻳﺘﺎًﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ‬
‫‪2048+‬‬
‫‪192‬‬
‫‪16‬‬
‫‪7‬‬
‫‪2263‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻘﺪار ‪ 4327‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ ‪ 2263‬در ﺳﻴـﺴﺘﻢ‬
‫دﻫﺪﻫﻲ‪.‬‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ ﻧﻤﻮد ﻛﻪ ﻫﺮ رﻗﻢ در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ را ﻣﻲﺗﻮان ﺑﻮﺳﻴﻠﻪ ﺳـﻪ‬
‫رﻗﻢ در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻧﻤﺎﻳﺶ داد‪.‬‬
‫‪٢١‬‬

‫‪0‬‬ ‫‪000‬‬
‫‪1‬‬ ‫‪001‬‬
‫‪2‬‬ ‫‪010‬‬
‫‪3‬‬ ‫‪011‬‬
‫‪4‬‬ ‫‪100‬‬
‫‪5‬‬ ‫‪101‬‬
‫‪6‬‬ ‫‪110‬‬
‫‪7‬‬ ‫‪111‬‬

‫ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ ﻫﺸﺖ ﺗﺎﺋﻲ ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻛﺎﻓﻲ اﺳﺖ ﻛـﻪ‬
‫ﺑﻪ ﺟﺎي ﻫﺮ رﻗﻢ در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺳﻪ رﻗﻢ ﻣﻌﺎدل آﻧـﺮا ﻗـﺮار داد‪ .‬ﺑﻌﻨـﻮان ﻣﺜـﺎل‬
‫ﻋﺪد ‪ 417‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻣﻌﺎدل ‪ 100001111‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ﺑﻤﻨﻈﻮر ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﻪ ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻛﺎﻓﻲ اﺳﺖ‬
‫ﻛﻪ ارﻗﺎم ﻋﺪد از ﻃﺮف راﺳﺖ ﺳﻪ ﺗﺎ ﺳﻪ ﺗﺎ ﺟﺪا ﻧﻤﻮده و ﺑﻪ ﺟﺎي آﻧﻬﺎ ﻣﻘﺪار ﻣﻌـﺎدل در‬
‫ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻗﺮار دﻫﻴﻢ‪.‬‬

‫ﻣﺜﺎل ‪1-21‬‬
‫ﻋﺪد ‪ 10110111010111‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ در ﻧﻈﺮ ﺑﮕﻴﺮﻳـﺪ ﻛـﻪ ﻣـﻲﺗـﻮان‬
‫ﺑﺼﻮرت زﻳﺮ ﺟﺪا ﻧﻤﻮد‪.‬‬
‫‪010‬‬ ‫‪110‬‬ ‫‪111‬‬ ‫‪010‬‬ ‫‪111‬‬

‫ﻛﻪ ﺟﻮاب ﻧﻬﺎﺋﻲ ﻣﻴﺸﻮد ‪ 26727‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ‪.‬‬


‫از ﻃﺮف دﻳﮕﺮ ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﻘﺪاري از ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﺑـﻪ ﺳﻴـﺴﺘﻢ ﻣﺒﻨـﺎي‬
‫ﺷﺎﻧﺰده و ﺑﺮﻋﻜﺲ ﻣﻲﺑﺎﻳﺴﺘﻲ اﺑﺘﺪا ﻣﻘﺪار را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮده ﺳﭙﺲ ﺑـﻪ‬
‫ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻳﺎ ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺗﺒﺪﻳﻞ ﻧﻤﻮد‪.‬‬
‫‪٢٢‬‬

‫ﻣﺜﺎل ‪1-22‬‬
‫ﻋﺪد ‪ 2AFB5‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪2AFB5‬‬
‫‪2‬‬ ‫‪A‬‬ ‫‪F‬‬ ‫‪B‬‬ ‫‪5‬‬
‫‪0010‬‬ ‫‪1010‬‬ ‫‪1111‬‬ ‫‪1011‬‬ ‫‪0101‬‬

‫ﺣﺎل ﺳﻪ رﻗﻢ ﺳﻪ رﻗﻢ از ﺳﻤﺖ راﺳﺖ ﺟﺪا ﻧﻤﻮده‪.‬‬


‫‪000 101 010 111 110 110 101‬‬

‫ﻛﻪ ﻧﻬﺎﻳﺘﺎً ﺑﺮاﺑﺮ ﺑﺎ ‪ 527665‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ -1-8‬ﻣﻘﺎدﻳﺮ اﻋﺸﺎري‬
‫ﺑﻪ ﻣﻨﻈﻮر ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار اﻋﺸﺎري ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ اﺑﺘﺪا ﻗـﺴﻤﺖ ﺻـﺤﻴﺢ‬
‫آﻧﺮا ﺑﻪ ﻃﺮﻳﻖ ﮔﻔﺘﻪ ﺷﺪه ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮده‪ ،‬ﺳﭙﺲ ﻗﺴﻤﺖ اﻋﺸﺎري آﻧـﺮا‬
‫ﺟﺪا ﻧﻤﻮده ﺑﻄﻮر ﻣﻜﺮر در ‪ 2‬ﺿﺮب ﻣﻲﻧﻤﺎﺋﻴﻢ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻋـﺪد ‪ 14.725‬را در ﻧﻈـﺮ‬
‫ﺑﮕﻴﺮﻳﺪ‪ .‬ﻋﺪد ‪ 14‬ﺑﺼﻮرت ‪ 1110‬در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑـﺮاي ﺗﺒـﺪﻳﻞ ﻗـﺴﻤﺖ‬
‫اﻋﺸﺎري ﻳﻌﻨﻲ ‪ 0.725‬ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ آﻧﺮا در ‪ 2‬ﺿﺮب ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫ﻣﺜﺎل ‪1-23‬‬
‫*‪0.725‬‬
‫‪2‬‬
‫‪1.450‬‬
‫ﻗــﺴﻤﺖ ﺻــﺤﻴﺢ ﻳﻌﻨــﻲ ‪ 1‬را ﺟــﺪا ﻧﻤــﻮده‪ ،‬ﻗــﺴﻤﺖ اﻋــﺸﺎر را در ‪ 2‬ﺿــﺮب‬
‫ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫*‪0.45‬‬
‫‪2‬‬
‫‪0.90‬‬
‫‪٢٣‬‬

‫ﻗﺴﻤﺖ ﺻﺤﻴﺢ ﻳﻌﻨﻲ ‪ 0‬را ﺟﺪا ﻧﻤﻮده‪ ،‬ﻗﺴﻤﺖ اﻋﺸﺎر را در ‪ 2‬ﺿﺮب ﻣﻲﻛﻨﻴﻢ‪.‬‬

‫*‪0.8‬‬
‫‪2‬‬
‫‪1.6‬‬
‫و ﺑﻪ ﻫﻤﻴﻦ روال ﻛﺎر را اداﻣﻪ ﻣﻲدﻫﻴﻢ‪.‬‬

‫*‪0.6‬‬
‫‪2‬‬
‫‪1.2‬‬

‫‪1110.10111‬‬ ‫ﺟﻮاب ﻣﻲﺷﻮد‬


‫ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار اﻋﺸﺎري از ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻗـﺴﻤﺖ‬
‫ﺻﺤﻴﺢ آﻧﺮا از ﺳﻤﺖ راﺳﺖ ﺑﺘﺮﺗﻴﺐ در ‪ .… ، 23 ، 2 ، 21 ، 20‬ﺿﺮب ﻧﻤـﻮده ﺑـﺎ ﻫـﻢ‬
‫ﺟﻤﻊ ﻣﻲﻛﻨﻴﻢ ﺳﭙﺲ ﻗﺴﻤﺖ اﻋـﺸﺎر آﻧـﺮا ﺑﺘﺮﺗﻴـﺐ از ﺳـﻤﺖ ﭼـﭗ در‪، 2-3 ، 2-2 ،2-1‬‬
‫‪ …،2-4‬ﺿﺮب ﻧﻤﻮده ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲﻧﻤـﺎﺋﻴﻢ‪ .‬ﺑﻌﻨـﻮان ﻣﺜـﺎل ﻋـﺪد ‪ 1101.01011‬در‬
‫ﺳﻴﺴﺘﻢ دودوﻳﻲ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪1-24‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪.‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪4‬‬ ‫‪8‬‬ ‫‪16‬‬ ‫‪32‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬


‫* ‪1 * 8 + 4 *1 + 2 * 0 + 1*1 + 0 * + 1 * + 0 * + 1 * + 1‬‬
‫‪2‬‬ ‫‪4‬‬ ‫‪8‬‬ ‫‪16‬‬ ‫‪32‬‬

‫ﻛﻪ ﺧﻼﺻﻪ ﻣﻲﺷﻮد‬


‫‪1 1‬‬ ‫‪1‬‬
‫‪8 + 4 +1+‬‬ ‫‪+ +‬‬ ‫‪= 13.34375‬‬
‫‪4 16 32‬‬
‫‪٢٤‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻓﻘﻂ ارﻗﺎم ‪ 0‬و ‪ 1‬ذﺧﻴﺮه ﻣﻲﮔﺮدد‪ .‬ﺑﻪ اﻳﻦ ارﻗﺎم ‪ 0‬و ‪ 1‬ﺑﻴﺖ‬
‫ﮔﻔﺘﻪ ﻣﻲﺷﻮد‪ .‬ﺑﻪ ﻫﺮ ﻫﺸﺖ ﻛﻨﺎر ﻫﻢ ﺑﺎﻳﺖ و ﺑﻪ ﻫﺮ ﺷﺎﻧﺰده ﺑﻴﺖ ﻛﻨﺎر ﻫﻢ ‪ word‬ﮔﻔﺘـﻪ‬
‫ﻣﻲﺷﻮد‪ .‬ﺑﺮاي ذﺧﻴﺮه ﻳﻚ ﻣﻘﺪار در ﺣﺎﻓﻈﻪ ﺑﺎﻳﺴﺘﻲ اﺑﺘﺪا آﻧﺮا ﺑﺼﻮرت ﻳﻚﺳـﺮي ﺑﻴـﺖ‬
‫درآورد‪ .‬و ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﺑﺎﻳﺴﺘﻲ آﻧﻬﺎ را ﺑﻪ ﺳﻴـﺴﺘﻢ دهﺗـﺎﻳﻲ‬
‫ﺗﺒﺪﻳﻞ ﻧﻤﻮد‪ .‬در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻓﻘﻂ از ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬اﺳـﺘﻔﺎده ﻣـﻲﮔـﺮدد‪ .‬در ﺳﻴـﺴﺘﻢ‬
‫دودوﻳﻲ ﻓﻘﻂ از ارﻗﺎم ‪ 0‬و ‪ 1‬اﺳﺘﻔﺎده ﻣﻲﮔـﺮدد‪ .‬اﻋـﺪاد ﻣﻨﻔـﻲ را ﻣـﻲﺗـﻮان در ﺣﺎﻓﻈـﻪ‬
‫ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎ اﺳﺘﻔﺎده از روش ﻣﻜﻤﻞ ‪ 2‬ﻧﺸﺎن داد‪ .‬اﺳﺘﻔﺎده از ﺳﻴﺴﺘﻢﻫﺎﻳﻲ ﻣﺒﻨﺎي ﺷـﺎﻧﺰده‬
‫و ﻣﺒﻨﺎي ﻫﺸﺖ ﻧﻴﺰ اﻣﻜﺎن ﭘﺬﻳﺮ ﻣﻲﺑﺎﺷﺪ‪ .‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده از ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬و ‪A‬‬
‫ﺗﺎ ‪ F‬اﺳﺘﻔﺎده ﻣﻴﮕﺮدد‪ .‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ ﻓﻘﻂ از ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 7‬ﻣـﻲﺗـﻮان اﺳـﺘﻔﺎده‬
‫ﻧﻤﻮد‪ .‬ﻣﻘﺎدﻳﺮ اﻋﺸﺎري را ﻧﻴﺰ ﻣﻲﺗﻮان در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻗﺮار داد‪.‬‬
‫‪٢٥‬‬

‫ ﺗﻤﺮﻳﻦ‬
‫‪-1‬ﻫﺮ ﺑﺎﻳﺖ از ………‪ .‬ﺑﻴﺖ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ‪.‬‬
‫‪-2‬ﻫﺮ ﻛﻠﻴﻮ ﺑﺎﻳﺖ ﻣﻌﺎدل ………‪ .‬ﺑﺎﻳﺖ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪-3‬در ﻫﺮ ‪ Word‬اﻋﺪاد ‪ 0‬ﺗﺎ ………‪ .‬را ﻣﻲﺗﻮان ﺟﺎ داد‪.‬‬
‫‪-4‬در ﻫﺮ ﺑﺎﻳﺖ اﻋﺪاد ………‪ – .‬ﺗﺎ ………‪ +.‬را ﻣﻲﺗﻮانﻗﺮار داد‪.‬‬
‫‪-5‬در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺮاي ﻧﻤﺎﻳﺶ اﻋﺪاد ﻣﻨﻔﻲ از ………‪ .‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫‪-6‬در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ ﺟﺎي ﻋﻤﻞ ﺗﻔﺮﻳﻖ از ………‪ .‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫‪-7‬در ﻫﺮ ‪ Word‬ﺑﻪ ﺗﻌﺪاد ………‪ .‬وﺿﻌﻴﺖ ﻣﺨﺘﻠﻔﻪ ‪ 1‬و ‪ 0‬وﺟﻮد دارد‪.‬‬
‫‪-8‬ﻋﺪد ‪ –20‬را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-9‬ﻋﻤﻞ ‪ 25-18‬را ﺑﺎ اﺳﺘﻔﺎده از روش ﻣﻜﻤﻞ دو اﻧﺠﺎم دﻫﻴﺪ‪.‬‬
‫‪-10‬ﻋﺪد ‪ 1101101‬را ﺑﻪ ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-11‬ﻋﺪد ‪ 101101.11001‬را ﺑﻪ ﺳﻴﺴﺘﻢ ده ﺗﺎﺋﻲ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ‪.‬‬
‫‪-12‬ﻋﺪد ‪ 2FABC‬را ﺑﻪ ﺳﻴﺴﺘﻢ ﻫﺸﺖ ﺗﺎﺋﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-13‬ﻋﺪد ‪ 43271‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﻫﺸﺖ را ﺑﻪ ﺳﻴﺴﺘﻢ دودوﻳﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-14‬ﻣــﺸﺨﺺ ﻧﻤﺎﺋﻴــﺪ ﻛــﻪ اﮔــﺮ ‪ MSB‬ﻳــﻚ ﻣﻘــﺪاري ﻳــﻚ ﺑﺎﺷــﺪ آﻳــﺎ آن ﻣﻘــﺪار‬
‫ﻣﻨﻔﻲ اﺳﺖ؟‬
‫‪-15‬ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ ﻛﻪ آﻳﺎ ﻣﻲﺗﻮان ﻋﻤﻞ ﺿﺮب و ﺗﻔﺮﻳﻖ و ﺗﻘﺴﻴﻢ را ﺑـﻪ ﻋﻤـﻞ ﺟﻤـﻊ‬
‫ﺗﺒﺪﻳﻞ ﻧﻤﻮد؟‬
‫‪-16‬اﮔﺮ ﻣﻘﺪاري ﻣﻨﻔﻲ ﺑﺎﺷﺪ‪.‬‬
‫ب‪ MSB-‬آن ﻳﻚ اﺳﺖ‪.‬‬ ‫اﻟﻒ‪ MSB-‬آن ﺻﻔﺮ اﺳﺖ‪.‬‬
‫د‪-.‬ﻫﻴﭽﻜﺪام‪.‬‬ ‫ج‪ LSB-‬آن ﻳﻚ اﺳﺖ‪.‬‬
‫‪٢٦‬‬

‫‪-17‬اﮔﺮ ﻣﻘﺪاري از ﻧﻮع ‪ double word‬داﺷﺘﻪ ﺑﺎﺷـﻴﻢ ﺑـﻪ ﭼﻨـﺪ ﺑﺎﻳـﺖ ﺣﺎﻓﻈـﻪ ﻧﻴـﺎز‬
‫اﺳﺖ؟‬
‫ب‪3-‬‬ ‫اﻟﻒ‪2-‬‬
‫د‪-‬ﻫﻴﭽﻜﺪام‬ ‫ج‪4-‬‬

‫‪-18‬ﻣﻘﺪار ‪ 7AB‬در ﺳﻴﺴﺘﻢ ﺷﺎﻧﺰدﻫﺪﻫﻲ ﭼﻪ ﻣﻘﺪاري در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ؟‬


‫ب‪101110100111-‬‬ ‫اﻟﻒ‪11110101011-‬‬
‫د‪-‬ﻫﻴﭽﻜﺪام‬ ‫ج‪11011011111-‬‬

‫‪-19‬ﻣﻘﺪار ‪ –6‬در ﺳﻴﺴﺘﻢ دﻫﺪﻫﻲ ﻣﻌﺎدل ﭼﻪ ﻣﻘﺪاري در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻣﻲﺑﺎﺷﺪ؟‬


‫ب‪11111010-‬‬ ‫اﻟﻒ‪11111001-‬‬
‫د‪-‬ﻫﻴﭽﻜﺪام‬ ‫ج‪11110111-‬‬

‫‪-20‬ﺗﻔﺎﺿﻞ ﻛﺪ اﺳﻜﻲ ‪ ′a′‬و‪ ′A′‬ﭼﻴﺴﺖ؟‬


‫ب‪32-‬‬ ‫اﻟﻒ‪30-‬‬
‫د‪-‬ﻫﻴﭽﻜﺪام‬ ‫ج‪40-‬‬
‫‪٢٧‬‬

‫ﻓﺼﻞ دوم‬
‫ﻣﻌﻤﺎري رﻳﺰﭘﺮدازﻧﺪه ‪80286‬‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻣﻌﺮﻓﻲ رﻳﺰﭘﺮدازﻧﺪه ‪80286‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‬
‫‪-1‬ﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬و ﻋﻤﻠﻴﺎت آن‪.‬‬
‫‪-2‬ﻣﻌﻤﺎري رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬و اﺟﺰاء ﺗﺸﻜﻴﻞ دﻫﻨﺪه‪.‬‬
‫‪ -3‬ﺛﺒﺎتﻫﺎ‬
‫‪ -4‬ﻓﻠﮓﻫﺎ‬
‫‪ -2-1‬رﻳﺰ ﭘﺮدازﻧﺪه ‪80286‬‬
‫اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه داراي وﻳﮋﮔﻴﻬﺎي ﭘﻴﺸﺮﻓﺘﻪاي ﺑﺮاي ﻋﻤﻠﻜﺮد در ﺳﻄﺢ ﺑﺎﻻﺋﻲ را‬
‫دارد‪ .‬در ‪ ،80286‬ﻫﻤﭽﻨﻴﻦ اﺳﺘﻔﺎده از وﻳﮋﮔﻲﻫﺎي ذﻳﻞ اﻣﻜﺎن ﭘﺬﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪Multitasking -1‬‬
‫‪٢٨‬‬

‫‪Multiuser systems -2‬‬


‫اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه داراي ﻫﺸﺖ ﺛﺒﺎت )‪ (Register‬ﺷﺎﻧﺰده ﺑﻴﺘـﻲ ﺑﻨﺎﻣﻬـﺎي ‪،AX‬‬
‫‪ DI ،SI ،BP ،SP ،DX ،CX ،BX‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﭼﻬـﺎر ﺛﺒـﺎت ‪ DX ،CX ، BX،AX‬را‬
‫ﻣﻲﺗﻮان ﺑﻌﻨﻮان ﺛﺒﺎﺗﻬﺎي ﺷﺎﻧﺰده ﺑﻴﺘﻲ در ﻧﻈﺮ ﮔﺮﻓﺖ ﻳـﺎ ﻫـﺮ ﻛـﺪام را ﺑﻌﻨـﻮان دو ﺛﺒـﺎت‬
‫ﻫﺸﺖ ﺑﻴﺘﻲ در ﻧﻈﺮ ﮔﺮﻓﺖ و اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫‪15‬‬ ‫‪8 7‬‬ ‫‪0‬‬


‫‪AH‬‬ ‫‪AL‬‬ ‫‪AX‬‬
‫‪BH‬‬ ‫‪BL‬‬ ‫‪BX‬‬
‫‪CH‬‬ ‫‪CL‬‬ ‫‪CX‬‬
‫‪DH‬‬ ‫‪DL‬‬ ‫‪DX‬‬

‫‪AX‬‬ ‫‪Accumulator‬‬
‫‪BX‬‬ ‫‪Base‬‬
‫‪CX‬‬ ‫‪Count‬‬
‫‪DX‬‬ ‫‪Data‬‬

‫‪15‬‬ ‫‪0‬‬
‫‪SP‬‬
‫‪BP‬‬
‫‪SI‬‬
‫‪DI‬‬

‫‪SP‬‬ ‫‪Stack pointer‬‬


‫‪BP‬‬ ‫‪Base pointer‬‬
‫‪SI‬‬ ‫‪Source index‬‬
‫‪٢٩‬‬

‫‪DI‬‬ ‫‪Destination index‬‬

‫ﻣﻌﻤﻮﻻً از ﺛﺒﺎﺗﻬﺎي ‪ SP‬و ‪ BP‬در ﻣﻮرد ﻋﻤﻠﻴﺎت روي ﭘﺸﺘﻪﻫﺎ و از ﺛﺒﺎﺗﻬـﺎي ‪SI‬‬
‫و ‪ DI‬ﺑﻌﻨﻮان ﺷﺎﺧﺺ در ﺳـﺎﺧﺘﺎرﻫﺎي ﭘﻴﭽﻴـﺪهﺗـﺮ اﺳـﺘﻔﺎده ﻣـﻲ ﮔـﺮدد‪ .‬رﻳﺰﭘﺮدازﻧـﺪه‬
‫ﻫﻤﭽﻨﻴﻦ داراي ﭼﻬﺎر ﺛﺒﺎت ﺷﺎﻧﺰدهﺑﻴﺘﻲ ﻣﻌﺮوف ﺑـﻪ ﺛﺒﺎﺗﻬـﺎي ﺳـﮕﻤﻨﺖ ﻣـﻲﺑﺎﺷـﺪ ﻛـﻪ‬
‫ﺑﻤﻨﻈﻮر آدرس دﻫﻲ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﻳﺪ‪ .‬اﻳـﻦ ﺛﺒـﺎتﻫـﺎ ﺑﻨﺎﻣﻬـﺎي ‪،SS ، DS،CS‬‬
‫‪ ES‬ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬

‫‪15‬‬ ‫‪0‬‬
‫‪CS‬‬
‫‪DS‬‬
‫‪SS‬‬
‫‪ES‬‬

‫‪CS‬‬ ‫‪Code‬‬ ‫‪Segment‬‬


‫‪DS‬‬ ‫‪Data‬‬ ‫‪Segment‬‬
‫‪SS‬‬ ‫‪Stack‬‬ ‫‪Segment‬‬
‫‪ES‬‬ ‫‪Extra‬‬ ‫‪Segment‬‬

‫ﺳﮕﻤﻨﺖ ﻫﺎ ﻧﺎﺣﻴﻪﻫﺎي ﭘﻴﻮﺳـﺘﻪ در ﺣﺎﻓﻈـﻪ ﻣـﻲ ﺑﺎﺷـﻨﺪ‪ .‬اﻧـﺪازه ﻫـﺮ ﺳـﮕﻤﻨﺖ‬


‫ﻣﻲﺗﻮاﻧﺪ ﺗﺎ ‪ 64K‬ﺑﺎﻳﺖ ﺑﺎﺷﺪ‪.‬‬
‫ﺑﺎﻳـــﺴﺘﻲ ﺗﻮﺟـــﻪ داﺷـــﺖ ﻛـــﻪ در ﺛﺒـــﺎت ‪ CS‬آدرس ﺷـــﺮوع ﻧﺎﺣﻴـــﻪاي از‬
‫ﺣﺎﻓﻈــﻪ ﻛــﻪ ﻛــﺪﻫﺎي دﺳــﺘﻮراﻟﻌﻤﻞ در آن ﻗــﺮار دارد ﮔﺬاﺷــﺘﻪ ﻣﻴــﺸﻮد‪ .‬در ﺛﺒــﺎت‬
‫‪ DS‬آدرس ﺷﺮوع ﻧﺎﺣﻴﻪاي از ﺣﺎﻓﻈﻪ ﻛﻪ دادهﻫﺎ در آن ﻗـﺮار دارد ﮔﺬاﺷـﺘﻪ ﻣـﻲﺷـﻮد‪.‬‬
‫در ﺛﺒــﺎت ‪ SS‬آدرس ﺷــﺮوع ﻧﺎﺣﻴــﻪاي از ﺣﺎﻓﻈــﻪ ﻛــﻪ ﭘــﺸﺘﻪ در آن اﻳﺠــﺎد ﻣﻴــﺸﻮد‬
‫ﻗــﺮار داده ﻣﻴــﺸﻮد‪ .‬و در ﺻــﻮرﺗﻴﻜﻪ در ﺑﺮﻧﺎﻣــﻪﻫــﺎ از دﺳــﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘــﺮدازش‬
‫‪٣٠‬‬

‫رﺷﺘﻪﻫﺎ اﺳـﺘﻔﺎده ﺷـﻮد آدرس اﺑﺘـﺪاي آن ﻧﺎﺣﻴـﻪ در ﺣﺎﻓﻈـﻪ در ﺛﺒـﺎت ‪ ES‬ﻗـﺮار داده‬
‫ﻣﻲﺷﻮد‪.‬‬

‫‪ -2-1-1‬ﺛﺒﺎت ﻓﻠﮓ )‪(Flag register‬‬


‫رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬داراي ﻳﻚ ﺛﺒﺎت ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﺑﻨﺎم ﺛﺒﺎت ﻓﻠـﮓ ﻣـﻲﺑﺎﺷـﺪ‪.‬‬
‫دوازده ﺑﻴﺖ از اﻳﻦ ﺛﺒﺎت ﻓﻘﻂ ﻣﻲﺗﻮاﻧﺪ ﻣﻮرد اﺳﺘﻔﺎده ﺑﺮﻧﺎﻣﻪ ﻧـﻮﻳﺲ ﻗـﺮار ﺑﮕﻴـﺮد‪ .‬ﻫـﺮ‬
‫ﻛﺪام از اﻳﻦ ﺑﻴﺖﻫﺎ ﻧﺎم ﺧﺎﺻﻲ دارد و ﻣﺸﺨﺺ ﻛﻨﻨﺪه وﺿﻌﻴﺖ ﺧﺎﺻﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪15‬‬ ‫‪14‬‬ ‫‪13‬‬ ‫‪12‬‬ ‫‪11‬‬ ‫‪10‬‬ ‫‪9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪//‬‬ ‫‪NT‬‬ ‫‪IO‬‬ ‫‪PL‬‬ ‫‪OF‬‬ ‫‪DF‬‬ ‫‪IF‬‬ ‫‪TF‬‬ ‫‪SF‬‬ ‫‪ZF‬‬ ‫‪//‬‬ ‫‪AF‬‬ ‫‪//‬‬ ‫‪PF‬‬ ‫‪//‬‬ ‫‪CF‬‬

‫‪CF‬‬ ‫‪Carry Flag‬‬


‫‪PF‬‬ ‫‪Parity Flag‬‬
‫‪AF‬‬ ‫‪Auxiliary Flag‬‬
‫‪ZF‬‬ ‫‪Zero Flag‬‬
‫‪SF‬‬ ‫‪Sign Flag‬‬
‫‪OF‬‬ ‫‪Overflow Flag‬‬
‫‪TF‬‬ ‫‪Trap Flag‬‬
‫‪IF‬‬ ‫‪Interrupt Enable Flag‬‬
‫‪IOPL‬‬ ‫‪Input / output privilege Level Flag‬‬
‫‪NT‬‬ ‫‪Nested Task Flag‬‬

‫زﻣﺎﻧﻲ ﻛﻪ در ﻋﻤﻠﻴﺎت ﺟﻤﻊ و ﺗﻔﺮﻳﻖ )ﻫﺸﺖ ﻳﺎ ﺷـﺎﻧﺰدهﺑﻴﺘـﻲ( ﻳـﻚ ‪ carry‬ﻳـﺎ‬


‫‪ borrow‬اﻳﺠﺎد ﻣﻲﮔﺮدد ﻣﻘﺪار ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻴﺸﻮد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ﻓﻠﮓ‬
‫‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺷﻮد‪ .‬از ﻓﻠـﮓ ‪ CF‬در دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﺷـﻴﻔﺖ و ﭼـﺮﺧﺶ ﻧﻴـﺰ‬
‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫از ﻓﻠﮓ ‪ PF‬اﺳﺎﺳﺎً در ﻛﺎرﺑﺮدﻫﺎي ارﺗﺒﺎﻃﺎت دادهاي اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬زﻣﺎﻧﻴﻜـﻪ‬
‫ﺗﻮازن ﻓﺮد اﻳﺠﺎد ﺷﻮد ﻣﻘﺪار آن ﻳﻚ ﻣﻴﺸﻮد و در ﺻﻮرت اﻳﺠﺎد ﺗﻮازن زوج ﻣﻘـﺪار آن‬
‫‪٣١‬‬

‫ﺻﻔﺮ ﻣﻲﮔﺮدد‪ .‬ﺑﻌﺒﺎرت دﻳﮕﺮ اﮔﺮ ﺗﻌﺪاد ﺑﻴﺖﻫﺎي ﻳـﻚ در ﺑﺎﻳـﺖ ﻣﺮﺗﺒـﻪ ﭘـﺎﺋﻴﻦ ‪word‬‬
‫زوج ﺑﺎﺷﺪ ﻣﻘﺪار ‪ PF‬ﺑﺮاﺑﺮ ﻳﻚ ﻣﻲﮔﺮدد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ‪ PF‬ﺑﺮاﺑـﺮ ﺑـﺎ ﺻـﻔﺮ‬
‫ﻣﻲﮔﺮدد‪.‬‬
‫در ﻋﻤﻞ ﺟﻤﻊ دو ﻣﻘﺪار اﮔﺮ ﻛﻠﻴﻪ ﺑﻴﺖﻫﺎي ﻧﺘﻴﺠﻪ ﺻﻔﺮ ﮔﺮدد ﻣﻘـﺪار ‪ ZF‬ﺑﺮاﺑـﺮ‬
‫ﺑﺎ ﻳﻚ ﻣﻲﮔﺮدد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺷﻮد‪.‬‬
‫در ﻋﻤﻞ ﺟﻤﻊ دو ﻣﻘﺪار ﺑﺎﻳﻨﺮي اﮔﺮ از ‪ MSB‬ﻧﺘﻴﺠﻪ ﻳﻚ ‪ carry‬ﺧﺎرج ﮔـﺮدد‬
‫ﻣﻘﺪار ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺷﻮد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺷﻮد‪.‬‬
‫در ﻋﻤﻞ ﺟﻤﻊ دو ﻣﻘﺪار ﺑﺎﻳﻨﺮي اﮔﺮ ‪ MSB‬ﻧﺘﻴﺠﻪ ﺑﺮاﺑـﺮ ﺑـﺎ ﻳـﻚ ﺑﺎﺷـﺪ ﻣﻘـﺪار‬
‫ﻓﻠﮓ ‪ SF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻴﺸﻮد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ‪ SF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫در ﻋﻤﻞ ﺟﻤﻊ دو ﻣﻘﺪار ﺑﺎﻳﻨﺮي اﮔﺮ ﻳﻚ ‪ carry‬در ﺑﻴﺖ ﻗﺒـﻞ از ‪ MSB‬ﻧﺘﻴﺠـﻪ‬
‫داﺷﺘﻪ ﺑﺎﺷﻴﻢ وﻟﻲ در ﺑﻴﺖ ‪ carry MSB‬ﻧﺪاﺷﺘﻪ ﺑﺎﺷﻴﻢ و ﻳﺎ ﺑﺎﻟﻌﻜﺲ ﻣﻘﺪار ﻓﻠـﮓ ‪OF‬‬
‫‪ 1‬ﻣﻲﺷﻮد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ﻓﻠﮓ ‪ OF‬ﺻﻔﺮ ﻣﻲﮔﺮدد‪ .‬زﻣﺎﻧﻴﻜﻪ ‪ OF‬ﺑﺮاﺑﺮ ﺑـﺎ ‪1‬‬
‫ﻣﻲﺷﻮد ﻳﻌﻨﻲ ﻧﺘﻴﺠﻪ ﻣﺤﺎﺳﺒﻪ در ﻣﺤﻞ ﺗﻌﻴﻴﻦ ﺷﺪه در ﺣﺎﻓﻈﻪ ﺟـﺎ ﻧﻤـﻲﮔﻴـﺮد و ﺑﺎﻋـﺚ‬
‫ﻣﻲﺷﻮد ﻛﻪ ﺗﻌﺪادي از ﺑﻴﺖﻫﺎي ﻧﺘﻴﺠﻪ ﺣﺬف ﺷﻮد‪.‬‬
‫ﻓﻠﮓ ‪ AF‬در ﻣﻮرد ﻋﻤﻠﻴﺎت ‪ BCD‬ﻛﺎرﺑﺮد دارد ﻛﻪ در ﺑﺨﺸﻬﺎي ﺑﻌـﺪي ﺑﺤـﺚ‬
‫ﻣﻴﺸﻮد‪ .‬در ﻋﻤﻞ ﺟﻤﻊ دو ﻣﻘﺪار ﺑﺎﻳﻨﺮي ﻣﻘـﺪار ﻓﻠـﮓ ‪ AF‬ﻳـﻚ ﻣﻴـﺸﻮد اﮔـﺮ از ﺑﻴـﺖ‬
‫ﺷﻤﺎره ‪ 3‬ﻳﻚ ‪ carry‬ﺧﺎرج ﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪2-1‬‬
‫دو ﻣﻘﺪار ‪ 2345‬و ‪ 3219‬را در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ و ﺑﺎ ﻫﻢ‬
‫ﺟﻤﻊ ﻧﻤﺎﺋﻴﺪ و ﻣﻘﺪار ﻓﻠﮓﻫﺎ را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪00110010 00011001+‬‬
‫‪0010001101000101‬‬
‫‪0101010101011110‬‬
‫‪٣٢‬‬

‫‪SF=0‬‬ ‫‪ MSB‬ﺑﺮاﺑﺮ ﺑﺎ ‪ 0‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫‪ZF=0‬‬ ‫ﺗﻤﺎم ﺑﻴﺖﻫﺎ ‪ 0‬ﻧﻤﻲﺑﺎﺷﻨﺪ‪.‬‬
‫‪PF=0‬‬ ‫ﺗﻌﺪاد ﺑﻴﺖﻫﺎي ‪ 1‬در ﻫﺸﺖ ﺑﻴﺖ اول ﻓﺮد ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪CF=0‬‬ ‫در ﺑﻴﺖ ‪ carry ، 15‬ﻧﺪارﻳﻢ‪.‬‬
‫‪AF=0‬‬ ‫در ﺑﻴﺖ ﺷﻤﺎره ‪ carry ، 3‬ﻧﺪارﻳﻢ‪.‬‬
‫‪OF=0‬‬ ‫در ﺑﻴﺖﻫﺎي ‪ 14‬و ‪ carry ، 15‬ﻧﺪارﻳﻢ‪.‬‬

‫ﻣﺜﺎل ‪2-2‬‬
‫ﺣﺎل ﻣﺠﻤﻮع دو ﻣﻘﺪار ‪ 5439‬و ‪ 456A‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷـﺎﻧﺰده را ﻣﺤﺎﺳـﺒﻪ‬
‫ﻧﻤﻮده ﺳﭙﺲ ﻣﻘﺪار ﻓﻠﮓﻫﺎ را ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪(5439)16=(0101010000111001)2‬‬
‫‪(456A)16=(0100010101101010)2‬‬

‫‪0101010000111001 +‬‬
‫‪0100010101101010‬‬
‫‪1001100110100011‬‬
‫ﻛﻪ ﻓﻠﮓﻫﺎ ﺑﺼﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ ﻣﻲﻳﺎﺑﻨﺪ‪.‬‬

‫‪ZF=0‬‬ ‫ﺗﻤﺎم ﺑﻴﺖﻫﺎي ﻧﺘﻴﺠﻪ ‪ 0‬ﻧﻴﺴﺘﻨﺪ‪.‬‬


‫‪CF=0‬‬ ‫‪ carry‬در ﺑﻴﺖ ﺷﻤﺎره ‪ 15‬وﺟﻮد ﻧﺪارد‪.‬‬
‫‪SF=1‬‬ ‫‪ MSB‬ﻧﺘﻴﺠﻪ ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪OF=1‬‬ ‫در ﺑﻴﺖ ﺷﻤﺎره ‪ carry 14‬وﺟﻮد دارد وﻟﻲ در ﺑﻴﺖ ﺷﻤﺎره ‪ 15‬وﺟﻮد ﻧﺪارد‪.‬‬
‫‪AF=1‬‬ ‫در ﺑﻴﺖ ﺷﻤﺎره ‪ 3‬ﻳﻚ ‪ carry‬وﺟﻮد دارد‪.‬‬
‫‪PF=1‬‬ ‫ﺗﻌﺪاد ﺑﻴﺖﻫﺎي ﻳﻚ در ﺑﺎﻳﺖ ﻣﺮﺗﺒﻪ ﭘﺎﺋﻴﻦ ﻧﺘﻴﺠﻪ زوج اﺳﺖ‪.‬‬
‫‪٣٣‬‬

‫ﻧﻜﺘﻪاي ﻛﻪ ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ اﻳﻦ اﺳـﺖ ﻛـﻪ ﺗﻤـﺎم دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎ ﻣﺤﺘـﻮي‬
‫ﻓﻠﮓﻫﺎ را ﺗﻐﻴﻴﺮ ﻧﻤﻲدﻫﻨﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬ﻛـﻪ ﺑـﺮاي اﻧﺘﻘـﺎل دادهﻫـﺎ‬
‫اﺳﺘﻔﺎده ﻣﻲﺷﻮد روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫‪ -2-1-2‬ﺛﺒــﺎت ‪IP‬‬
‫ﺛﺒﺎت ‪ IP‬ﻳﻚ ﺛﺒﺎت ﺷﺎﻧﺰدهﺑﻴﺘﻲ ﻣﻲﺑﺎﺷـﺪ ﻛـﻪ آدرس دﺳـﺘﻮراﻟﻌﻤﻞ ﺑﻌـﺪي ﻛـﻪ‬
‫ﺑﺎﻳﺴﺘﻲ اﺟﺮا ﮔﺮدد در اﻳﻦ ﺛﺒﺎت ﻗﺮار داده ﻣﻴﺸﻮد‪ .‬رﻳﺰﭘﺮدازﻧﺪه ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ آدرس‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪي را ﻣﻮرد ﭘﺮدازش ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﻪ اﻳﻦ ﺛﺒﺎت دﺳﺘﺮﺳﻲ‬
‫ﻧﺪاﺷﺘﻪ و ﻣﺤﺘﻮي آﻧﺮا ﻧﻤﻲﺗﻮاﻧﺪ ﺗﻐﻴﻴﺮ دﻫﺪ‪.‬‬

‫‪ -2-1-3‬ﺻﻒ دﺳﺘﻮراﻟﻌﻤﻞ )‪(Instruction Queue‬‬


‫در رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬ﻳﻚ ﺻﻒ دﺳـﺘﻮراﻟﻌﻤﻞ وﺟـﻮد دارد ﻛـﻪ ﻃـﻮل آن ‪6‬‬
‫ﺑﺎﻳﺖ ﻣﻲﺑﺎﺷﺪ و از اﻳﻦ ﺻﻒ ﺑﺮاي ﻗﺮاردادن ﺗﻌﺪادي دﺳـﺘﻮراﻟﻌﻤﻞ ﻛـﻪ از ﺣﺎﻓﻈـﻪ ﺑـﻪ‬
‫رﻳﺰﭘﺮدازﻧﺪه ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬اﻳﻨﻜﺎر ﺳـﺮﻋﺖ اﺟـﺮاي دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎ را‬
‫ﺑﻴﺸﺘﺮ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬رﻳﺰﭘﺮدازﻧﺪه از ﻃﺮﻳﻖ ‪ BUS‬ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﺘﺼﻞ ﻣﻲﮔﺮدد‪ BUS .‬در ﻫـﺮ‬
‫ﻟﺤﻈﻪ ﺷﺎﻧﺰدهﺑﻴﺖ را از ﺣﺎﻓﻈﻪ ﺑﻪ رﻳﺰﭘﺮدازﻧﺪه و ﻳﺎ ﺑﺮﻋﻜﺲ ﻣﻨﺘﻘﻞ ﻣـﻲﻧﻤﺎﻳـﺪ‪ .‬دادهﻫـﺎ‪،‬‬
‫دادهﻫﺎي ﻛﻨﺘﺮﻟﻲ وآدرس ﻣﻲﺗﻮاﻧﻨﺪ ﺗﻮﺳﻂ ‪ BUS‬ﺑﻴﻦ ﺣﺎﻓﻈﻪ و رﻳﺰﭘﺮدازﻧـﺪه ﺟﺎﺑـﻪﺟـﺎ‬
‫ﮔﺮدﻧﺪ‪.‬‬
‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻴﺪاﻧﻴﺪ ﺑﺎﻳﺖ ﻫﺎي ﺣﺎﻓﻈﻪ ﺑﺼﻮرت ﻣﻨﺤﺼﺮ ﺑﻔـﺮد ﺷـﻤﺎره ﮔـﺬاري‬
‫ﺷﺪه و ﺑﻌﻨﻮان آدرس ﻣﻮرد اﺳﺘﻔﺎده ﻛﺎﻣﭙﻴﻮﺗﺮ ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟـﻪ داﺷـﺖ ﻛـﻪ‬
‫اﻧﺘﻘﺎل دادهﻫﺎ ﻓﻘﻂ ﺑﺼﻮرﺗﻬﺎي ذﻳﻞ ﻣﻴﺴﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪-1‬اﻧﺘﻘﺎل از ﻳﻚ ﺛﺒﺎت ﺑﻪ ﻣﺤﻠﻲ در ﺣﺎﻓﻈﻪ‪.‬‬
‫‪-2‬اﻧﺘﻘﺎل از ﻣﺤﻠﻲ از ﺣﺎﻓﻈﻪ ﺑﻪ ﻳﻚ ﺛﺒﺎت‪.‬‬
‫‪٣٤‬‬

‫‪-3‬اﻧﺘﻘﺎل ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﻪ ﻳﻚ ﺛﺒﺎت‪.‬‬


‫‪-4‬اﻧﺘﻘﺎل ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﻪ ﻳﻚ ﻣﺤﻞ در ﺣﺎﻓﻈﻪ‪.‬‬
‫‪-5‬اﻧﺘﻘﺎل از ﻳﻚ ﺛﺒﺎت ﺑﻪ ﺛﺒﺎت دﻳﮕﺮ‪.‬‬
‫اﻧﺘﻘﺎل دادهﻫﺎ ﺑﻮﺳﻴﻠﺔ دﺳﺘﻮر ‪ MOV‬اﻧﺠﺎم ﻣﻲﺷﻮد ﻛـﻪ در ﻓـﺼﻞﻫـﺎي ﺑﻌـﺪي‬
‫ﺗﺸﺮﻳﺢ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪٣٥‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬داراي وﻳﮋﮔﻴﻬﺎي ﺧﺎﺻﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه داراي‬


‫ﻫﺸﺖ ﺛﺒﺎت ﺷﺎﻧﺰدهﺑﻴﺘﻲ ﺑﻨﺎﻣﻬﺎ ‪ DI ،SI ،BP ، SP ،DX ،CX ، BX ،AX‬ﻣﻲﺑﺎﺷـﺪ‪.‬‬
‫ﭼﻬﺎر ﺛﺒﺎت ‪ DX ،CX ،BX ، AX‬ﻫﺮ ﻛﺪام ﺑﻌﻨﻮان دوﺛﺒﺎت ﻫـﺸﺖ ﺑﻴﺘـﻲ ﻣـﻲﺗﻮاﻧﻨـﺪ‬
‫ﻣﻮرد اﺳـﺘﻔﺎده ﻗـﺮار ﮔﻴﺮﻧـﺪ ﺑﻨﺎﻣﻬـﺎي ‪.DH ،DL ،CH ،CL ،BH ، BL ،AH ، AL‬‬
‫ﺛﺒﺎت ﻓﻠﮓ ﻧﻴﺰ ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﺑﻮده ﻛﻪ ﻫﺮ ﺑﻴﺖ ﻣﺸﺨﺺ ﻛﻨﻨﺪه وﺿﻌﻴﺖ ﺧﺎﺻﻲ ﻣﻲﺑﺎﺷـﺪ‬
‫ﻛﻪ ﺗﻮﺳﻂ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺗﻐﻴﻴﺮ ﻣﻲﻛﻨﻨﺪ‪ .‬ﺑﺮﺧﻲ از اﻳـﻦ ﻓﻠـﮓﻫـﺎ ﻋﺒﺎرﺗﻨـﺪ از ‪،PF ،OF‬‬
‫‪ DF ،ZF ،AF ،CF‬ﻛﻪ در ﺑﺮﻧﺎﻣﻪﻫﺎ ﻛﺎرﺑﺮد زﻳﺎدي دارﻧﺪ‪ .‬اﻧﺘﻘﺎل اﻃﻼﻋـﺎت از ﺣﺎﻓﻈـﻪ‬
‫ﺑﻪ ﺛﺒﺎت‪ ،‬از ﺛﺒﺎت ﺑﻪ ﺣﺎﻓﻈﻪ‪ ،‬ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﻪ ﺣﺎﻓﻈﻪ‪ ،‬ﻣﻘﺪار ﺛﺎﺑـﺖ ﺑـﻪ ﺛﺒـﺎت‪ ،‬ﺛﺒـﺎت ﺑـﻪ‬
‫ﺛﺒﺎت اﻣﻜﺎن ﭘﺬﻳﺮ ﻣﻲﺑﺎﺷﺪ‪ .‬وﻟـﻲ اﻣﻜـﺎن اﻧﺘﻘـﺎل اﻃﻼﻋـﺎت ﺑـﻴﻦ ﻗـﺴﻤﺘﻲ از ﺣﺎﻓﻈـﻪ و‬
‫ﻗﺴﻤﺖ دﻳﮕﺮي از ﺣﺎﻓﻈﻪ ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬
‫‪٣٦‬‬

‫ ﺗﻤﺮﻳﻦ‬
‫‪-1‬ﺗﻌﺪاد ﺛﺒﺎﺗﻬﺎي ﻫﺸﺖ ﺑﻴﺘﻲ را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-2‬ﻛﺎر ‪ Flag Register‬را ﺷﺮح دﻫﻴﺪ‪.‬‬
‫‪-3‬ﻣﻜﺎﻧﻴﺰﻣﻬﺎي اﻧﺘﻘﺎل دادهﻫﺎ را ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪-4‬دو ﻣﻘﺪار ‪ A2FB‬و ‪ CD1A‬را در ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻧﻤﻮده ﺳـﭙﺲ ﻣﻘـﺪار‬
‫ﻓﻠﮓﻫﺎي‪ F، PF، ZF، SF، OF،AF‬و را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-5‬دو ﻣﻘﺪار ‪ C2BF‬و ‪ A5B2‬را در ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻧﻤـﻮده ﺳـﭙﺲ ﻣﻘـﺪار‬
‫ﻓﻠﮓﻫﺎي ‪ CF ،ZF ،PF ،SF ،OF‬و ‪ AF‬را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪-6‬ﻣﻮرد اﺳﺘﻔﺎده ﺛﺒﺎﺗﻬﺎي‪ SS ، ES، DS ،CS‬را ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪-7‬ﺻﻒ دﺳﺘﻮراﻟﻌﻤﻞ و ﻣﻮرد اﺳﺘﻔﺎده آﻧﺮا ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪-8‬دو ﻣﻘﺪار ‪ 54C2‬و ‪ 3271‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷـﺎﻧﺰده را از ﻫـﻢ ﻛـﻢ ﻧﻤـﻮده ﺳـﭙﺲ‬
‫ﻣﻘﺪار ﻓﻠﮓﻫﺎي‪ CF ، PF ، ZF ، SF ، OF ، AF‬را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪ -9‬آﻳﺎ ﺗﻤﺎم دﺳﺘﻮر اﻟﻌﻤﻞﻫﺎ روي ﻓﻠﮓﻫﺎ اﺛﺮدارﻧﺪ؟‬
‫‪ -10‬ﻛﺎر ‪ BUS‬را ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪٣٧‬‬

‫ﻓﺼﻞ ﺳﻮم‬
‫ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫آﺷﻨﺎﺋﻲ ﺑﺎ ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮر اﻟﻌﻤﻠﻬﺎ و ﺗﻜﻨﻴﻜﻬﺎي اﻧﺘﻘﺎل داده ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ‪.‬‬
‫‪-1‬ﺑﺮﻧﺎﻣﻪ و ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ‪.‬‬
‫‪-2‬ﻧﺎﻣﮕﺬاري ﻓﻴﻠﺪﻫﺎ‪.‬‬
‫‪-3‬اﻧﻮاع ﻓﻴﻠﺪﻫﺎ و ﻛﺎرﺑﺮد آﻧﻬﺎ‪.‬‬
‫‪-4‬ﺗﻜﻨﻴﻜﻬﺎي آدرس دﻫﻲ‪.‬‬
‫‪٣٨‬‬

‫‪ -3-1‬ﺑﺮﻧﺎﻣﻪ و دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ‬
‫در زﺑﺎن اﺳﻤﺒﻠﻲ ﺑﺮﻧﺎﻣﻪ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ از ﺗﻌﺪادي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺟﺮاﺋـﻲ‬
‫ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﻋﻤﻠﻴﺎﺗﻲ اﺳﺖ ﻛﻪ ﺑﺎﻳﺴﺘﻲ اﻧﺠﺎم ﺷﻮد‪ .‬اﻳﻦ ﺳﺮي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻫﻤﺎﻧﻄﻮرﻳﻜـﻪ‬
‫ﻣﻴﺪاﻧﻴﻢ ‪ SOURCE CODE‬ﻳﺎ ﻛﺪ ﻣﻨﺒﻊ ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد‪ .‬ﻣﺎﻧﻨﺪ ﻫﺮ زﺑﺎن ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ‬
‫دﻳﮕﺮ زﺑﺎن اﺳﻤﺒﻠﻲ ﺷﻜﻞ و ﻗﺎﻟﺐ از ﭘﻴﺶ ﺗﻌﺮﻳﻒ ﺷـﺪهاي ﺑـﺮاي ﻛـﺪ ﻣﻨﺒـﻊ دارد‪ .‬ﻫـﺮ‬
‫دﺳﺘﻮراﻟﻤﻞ اﺳﻤﺒﻠﻲ ﺷﺎﻣﻞ ﭼﻬﺎر ﻓﻴﻠﺪ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ﻓﻴﻠﺪاﺳﻢ‬ ‫ﻓﻴﻠﺪﻋﻤﻠﻴﺎت‬ ‫ﻓﻴﻠﺪ ﻋﻤﻠﻮﻧﺪ‬ ‫ﻓﻴﻠﺪ ﻣﻼﺣﻈﺎت‬
‫اﻟﺒﺘﻪ ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟـﻪ داﺷـﺖ ﻛـﻪ در ﺑﻌـﻀﻲ از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎ از ﺗﻤـﺎم ﻓﻴﻠـﺪﻫﺎ‬
‫اﺳﺘﻔﺎده ﻧﻤﻲﮔﺮدد‪.‬‬

‫‪ -3-2‬ﻗﺎﻧﻮن ﻧﺎﻣﮕﺬاري‬
‫ﻧﺎم در زﺑﺎن اﺳﻤﺒﻠﻲ ﺣﺪاﻛﺜﺮ ﻣﻲﺗﻮاﻧـﺪ ﺷـﺎﻣﻞ ‪ 31‬ﻛـﺎراﻛﺘﺮ ﺑﺎﺷـﺪ‪ .‬ﻛﺎراﻛﺘﺮﻫـﺎ‬
‫ﺷﺎﻣﻞ ﺣﺮوف ‪ Z‬ﺗﺎ ‪ A‬و ارﻗﺎم ‪ 9‬ﺗﺎ ‪ 0‬و ﺳﻴﻤﺒﻠﻬﺎي ﻣﺨـﺼﻮص @ ؟ ‪ $ .‬ـ ﻣـﻲﺑﺎﺷـﺪ‪.‬‬
‫ﻣﻮارد ذﻳﻞ ﺑﺎﻳﺴﺘﻲ در ﻧﺎﻣﮕﺬاري رﻋﺎﻳﺖ ﮔﺮدد‪.‬‬
‫‪-1‬اﺳﻢ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎ ﻳﻚ رﻗﻢ ﺷﺮوع ﮔﺮدد‪.‬‬
‫‪-2‬اﺳﻢ ﻧﺒﺎﻳﺴﺘﻲ ﻳﻜﻲ از ﻛﻠﻤﺎت ذﺧﻴﺮه ﺷﺪه در اﺳﻤﺒﻠﻲ ﺑﺎﺷﺪ‪.‬‬
‫‪-3‬در ﺻﻮرﺗﻴﻜﻪ از ‪ 0‬در ﻧﺎم اﺳﺘﻔﺎده ﮔﺮدد‪ ،‬ﺑﺎﻳﺴﺘﻲ اوﻟﻴﻦ ﻛﺎراﻛﺘﺮ ﻧـﺎم ﺑﺎﺷـﺪ‪ .‬ﻛﻠﻤـﺎت‬
‫زﻳﺮ اﺳﺎﻣﻲ ﻣﺠﺎز در اﺳﻤﺒﻠﻲ ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬

‫‪LOOP1‬‬ ‫‪B@A2‬‬
‫‪X‬‬ ‫‪. XY2‬‬
‫‪Y2A‬‬ ‫‪SUM2‬‬
‫‪A_5B‬‬ ‫‪ADDX‬‬
‫‪COUNT‬‬
‫ﻛﻠﻤﺎت زﻳﺮ ﻣﺠﺎز ﻧﻤﻲﺑﺎﺷﻨﺪ‪.‬‬
‫‪٣٩‬‬

‫‪LOOP‬‬ ‫‪NEAR‬‬
‫‪LABEL‬‬ ‫‪ADD‬‬
‫‪2AB‬‬ ‫‪(5AX‬‬
‫‪FAR‬‬ ‫‪A2.B‬‬

‫‪ -3-3‬ﻣﺘﻐﻴﺮﻫﺎ )‪(Variables‬‬
‫ﻧﺎم ﻣﺘﻐﻴﺮ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺤﻠﻲ از ﺣﺎﻓﻈﻪ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ﺑﺮﻧﺎﻣـﻪ ﻗﺎﺑـﻞ‬
‫دﺳﺘﺮﺳﻲ ﻣﻲﺑﺎﺷﺪ و ﻣﺤﺘﻮي آﻧﺮا در ﺣﻴﻦ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣـﻲﺗـﻮان ﺗﻐﻴﻴـﺮ داد‪ .‬ﺗﻌﺮﻳـﻒ‬
‫ﻣﺘﻐﻴﺮ ﺷﺎﻣﻞ آدرس‪ ،‬ﻧﻮع داده و اﻧﺪازه آن ﻣﻲﺑﺎﺷﺪ‪ .‬از ﻣﺘﻐﻴﺮﻫﺎ ﻣﻲﺗﻮان ﺑﻌﻨﻮان ﻋﻤﻠﻮﻧـﺪ‬
‫در دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﺑﺮاي ﻣﺘﻐﻴﺮﻫﺎ از ﻧﻮع ﺑﺎﻳﺖ از ‪ ،DB‬ﻣﺘﻐﻴﺮﻫـﺎي از ﻧـﻮع‬
‫‪ word‬از ‪ DW‬و ﻣﺘﻐﻴﺮﻫﺎي از ﻧﻮع ‪ double word‬از ‪ DD‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫‪ -3-4‬ﺑﺮﭼﺴﺐﻫﺎ )‪(Labels‬‬
‫از ﺑﺮﭼﺴﺐﻫﺎ ﺑﻌﻨﻮان آدرس دﺳـﺘﻮراﻟﻌﻤﻞ در ﺑﺮﻧﺎﻣـﻪﻫـﺎي ﻛـﺎرﺑﺮدي اﺳـﺘﻔﺎده‬
‫ﻣﻲﺷﻮد‪ .‬از ﺑﺮﭼﺴﺐﻫﺎ ﺑﻪ دو ﺻـﻮرت اﺳـﺘﻔﺎده ﻣـﻲﮔـﺮدد‪ .‬اﮔـﺮ ﺑﺮﭼـﺴﺐ در ﻫﻤـﺎن‬
‫ﺳﮕﻤﻨﺖ ﻛﺪ ﺑﺎﺷﺪ ﻧﻮع آن ‪ NEAR‬در ﻏﻴﺮ اﻳﻨـﺼﻮرت از ﻧـﻮع ‪ FAR‬ﻣـﻲﺑﺎﺷـﺪ‪ .‬در‬
‫ﺻﻮرﺗﻴﻜﻪ ﻧﻮع آن ‪ NEAR‬ﺑﺎﺷﺪ ﻣﻲﺗﻮان ﺑﻌـﺪ از ﻧـﺎم ﺑﺮﭼـﺴﺐ از ‪ :‬اﺳـﺘﻔﺎده ﻧﻤـﻮد و‬
‫دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ ﻛﻠﻤﻪ ‪ NEAR‬ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬

‫‪LOOP1:‬‬ ‫ﻣﺜﺎل ‪3-1‬‬


‫ﻳﺎ‬
‫‪LOOP1‬‬ ‫‪LABEL‬‬ ‫‪NEAR‬‬
‫در ﺻﻮرﺗﻴﻜﻪ ﺑﺮﭼـﺴﺐ از ﻧـﻮع ‪ FAR‬ﺑﺎﺷـﺪ اﺳـﺘﻔﺎده از ﻛﻠﻤـﻪ ‪ FAR‬اﻟﺰاﻣـﻲ‬
‫ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪MYCODE‬‬ ‫‪LABEL‬‬ ‫‪FAR‬‬
‫‪٤٠‬‬

‫‪ -3-5‬ﺛﺎﺑﺖﻫﺎ )‪(Constants‬‬
‫ﺛﺎﺑﺖﻫﺎ ﻣﻘﺎدﻳﺮي ﻫﺴﺘﻨﺪ ﻛﻪ در دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﺮﻧﺎﻣﻪﻫـﺎ ﻣـﻮرد اﺳـﺘﻔﺎده ﻗـﺮار‬
‫ﻣﻲﮔﻴﺮﻧﺪ‪ .‬ﺛﺎﺑﺖﻫﺎ از اﻧﻮاع ذﻳﻞ ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫‪ : Binary -1‬ﺷﺎﻣﻞ ﻳﻚ ﺳﺮي ‪ 0‬و ‪ 1‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ در اﻧﺘﻬﺎي آﻧﻬـﺎ ﺣـﺮف ‪B‬‬
‫ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪3-2‬‬

‫‪110111 B‬‬
‫‪1000 B‬‬

‫‪ : Decimal -2‬ﺷﺎﻣﻞ ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬ﻣﻲﺑﺎﺷﺪ و ﺑﻄﻮر اﺧﺘﻴﺎري ﻣﻲﺗﻮان ﺣـﺮف‬


‫‪ D‬را ﺑﻪ آﺧﺮ آن اﺿﺎﻓﻪ ﻧﻤﻮد‪.‬‬

‫‪40‬‬
‫ﻳﺎ‬
‫‪40D‬‬

‫‪ : Hexadecimal -3‬ﺷﺎﻣﻞ ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬و ﺣﺮوف ‪ A‬ﺗﺎ ‪ F‬ﻣﻲﺑﺎﺷﺪ ﻛـﻪ در‬
‫اﻧﺘﻬﺎي آﻧﻬﺎ ﺣﺮف ‪ H‬اﺿﺎﻓﻪ ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪3-4‬‬
‫‪32H‬‬
‫‪0FFH‬‬

‫اﮔﺮ ﻣﻘﺪاري در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﺑﺎ ﻳﻜﻲ از ﺣﺮوف ‪ A‬ﺗﺎ ‪ F‬ﺷـﺮوع ﮔـﺮدد‬
‫ﺑﺎﻳﺴﺘﻲ ‪ 0‬ﺑﻪ اﺑﺘﺪاي آن اﺿﺎﻓﻪ ﮔﺮدد‪ .‬در اﻳﻦ ﺻﻮرت ﻛﺎﻣﭙﻴﻮﺗﺮ آﻧﺮا ﺑﺎ ﻧﺎم ﻳﻚ ﺑﺮﭼـﺴﺐ‬
‫ﻳﺎ ﻣﺘﻐﻴﺮ اﺷﺘﺒﺎه ﻧﻤﻲﮔﻴﺮد‪.‬‬
‫‪٤١‬‬

‫‪ :Octal -4‬ﺷﺎﻣﻞ ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 7‬ﻣﻲﺑﺎﺷﺪ ﻛـﻪ در اﻧﺘﻬـﺎي آﻧﻬـﺎ ﺣـﺮف ‪ O‬ﻗـﺮار‬
‫ﻣﻲﮔﻴﺮد‪ .‬ﻣﻲﺗﻮان ﺑﻪ ﺟﺎي ‪ O‬از ﺣﺮف ‪ Q‬ﻧﻴﺰ اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫ﻣﺜﺎل ‪3-5‬‬

‫‪6O‬‬
‫‪24O‬‬
‫‪12Q‬‬

‫‪ : Character -5‬ﺛﺎﺑﺖﻫﺎي ﻛﺎراﻛﺘﺮي ﺷﺎﻣﻞ ﻫﺮ ﻛﺎراﻛﺘﺮ از ﻛـﺪﻫﺎي ‪ASCII‬‬


‫ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺑﻴﻦ ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل ‪ ′‬ﻳﺎ ‪ ″‬ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪.‬‬

‫ﻣﺜﺎل ‪3-5‬‬
‫‪′B′‬‬
‫‪″JOHN″‬‬
‫‪′BOB′‬‬

‫‪ : Floating point -6‬اﻳﻦ ﻧـﻮع ‪ data‬ﻧﻤـﺎﻳﺶ ﻣﻘـﺎدﻳﺮ اﻋـﺸﺎري ﺑـﺼﻮرت‬


‫ﻧﻤﺎﺋﻲ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪3-6‬‬

‫‪SINE‬‬ ‫‪DD‬‬ ‫‪0.332E-1‬‬

‫ﻛﻪ ﺑﻮﺳﻴﻠﻪ اﻛﺜﺮ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺣﻤﺎﻳﺖ ﻧﻤﻲﮔﺮدد‪.‬‬


‫‪٤٢‬‬

‫‪ -3-6‬ﻓﻴﻠﺪ ﻋﻤﻠﻴﺎت‬
‫در ﻓﻴﻠﺪ ﻋﻤﻠﻴﺎت ﻧﺎم دﺳﺘﻮراﻟﻌﻤﻞ واﻗﻌﻲ رﻳﺰﭘﺮدازﻧـﺪه ﻳـﺎ ﻋﻤﻠـﻲ ﻛـﻪ ﺑﺎﻳـﺴﺘﻲ‬
‫اﻧﺠﺎم ﺷﻮد ذﻛﺮ ﻣﻲﮔﺮدد‪ .‬ﻧﺎم دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻴﻦ ‪ 2‬ﺗﺎ ‪ 6‬ﻛﺎراﻛﺘﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪3-8‬‬
‫‪MOV‬‬ ‫‪REP‬‬
‫‪CMP‬‬ ‫‪LOOP‬‬
‫‪REPNE‬‬
‫‪LEA‬‬

‫‪ -3-7‬ﻓﻴﻠﺪ ﻋﻤﻠﻮﻧﺪ‬
‫اﻳﻦ ﻓﻴﻠﺪ ﺷﺎﻣﻞ آدرس ‪data‬ﻫﺎﺋﻲ ﻛﻪ ﺑﺎﻳﺴﺘﻲ ﺑﻮﺳـﻴﻠﻪ ﻓﻴﻠـﺪ ﻋﻤﻠﻴـﺎت ﭘـﺮدازش‬
‫ﮔﺮدد ﻣﻲﺑﺎﺷﺪ‪ .‬ﻓﻴﻠﺪ ﻋﻤﻠﻮﻧﺪ ﺑﺎ ﺣﺪاﻗﻞ ﻳﻚ ﻓﺎﺻﻠﻪ از ﻓﻴﻠﺪ ﻋﻤﻠﻴﺎت ﺟﺪا ﻣﻴﺸﻮد‪ .‬ﺑﻌﻀﻲ‬
‫از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﻨﺪ‪ .‬ﺳﺎﻳﺮ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻳﻚ ﻳﺎ دو ﻋﻤﻠﻮﻧـﺪ دارﻧـﺪ‬
‫ﻛﻪ ﺑﺎ ﻛﺎﻣﺎ از ﻫﻢ ﺟﺪا ﻣﻲﺷﻮﻧﺪ‪ .‬ﻣﺎﻧﻨﺪ‬
‫‪CBW‬‬ ‫ﻋﻤﻠﻮﻧﺪ ﻧﺪارد‬
‫‪NOP‬‬ ‫ﻋﻤﻠﻮﻧﺪ ﻧﺪارد‬
‫‪CLC‬‬ ‫ﻋﻤﻠﻮﻧﺪ ﻧﺪارد‬
‫‪NOT AL‬‬ ‫ﻳﻚ ﻋﻤﻠﻮﻧﺪ دارد‬
‫‪MOV AX , Y‬‬ ‫دو ﻋﻤﻠﻮﻧﺪ دارد‬
‫‪٤٣‬‬

‫در ﻣﻮاردي ﻛﻪ ﻓﻴﻠﺪ ﻋﻤﻠﻮﻧﺪ داراي دو ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﺪ ﻋﻤﻠﻮﻧﺪ اول را ﻋﻤﻠﻮﻧﺪ‬
‫ﻣﻘﺼﺪ و ﻋﻤﻠﻮﻧﺪ دوم را ﻋﻤﻠﻮﻧﺪ ﻣﺒﺪاء ﻣﻲﻧﺎﻣﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪3-10‬‬
‫‪AND AX , X‬‬
‫ﻛﻪ ‪ AX‬را ﻋﻤﻠﻮﻧﺪ ﻣﻘﺼﺪ و ‪ X‬را ﻋﻤﻠﻮﻧﺪ ﻣﺒﺪاء ﻣﻲﻧﺎﻣﻨﺪ‪.‬‬

‫‪ -3-8‬ﻓﻴﻠﺪ ﻣﻼﺣﻈﺎت )‪(Comment‬‬


‫اﻳﻦ ﻓﻴﻠﺪ آﺧﺮﻳﻦ ﻓﻴﻠﺪ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺑﺎﺷـﺪ ﻛـﻪ ﺷـﺎﻣﻞ ﺗﻮﺿـﻴﺤﺎت در ﻣـﻮرد‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﻳﺎ ﺑﺮﻧﺎﻣﻪ ﻣﻲﺑﺎﺷﺪ‪ .‬اﻳﻦ ﻓﻴﻠﺪ از ﺳﺎﻳﺮ ﻓﻴﻠﺪﻫﺎ ﺗﻮﺳﻂ ; ﺟﺪا ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪3-11‬‬
‫‪MOV AH, 45H; Parameter for reading a character‬‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻣﻲﺗﻮاﻧﻨﺪ ﻓﻘﻂ ﺷﺎﻣﻞ ﻓﻴﻠـﺪ ‪ Comment‬ﺑﺎﺷـﻨﺪ‪ .‬در اﻳﻨـﺼﻮرت‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎ ; ﺷﺮوع ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪3-12‬‬
‫‪; This is an assembly Program‬‬
‫‪; For calculating the n factorial.‬‬

‫‪ -3-9‬ﺗﻜﻨﻴﻜﻬﺎي آدرسدﻫﻲ‬
‫رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬از ﻫﻔﺖ روش آدرسدﻫﻲ اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﻳﺪ ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از‬
‫‪ -1‬آدرسدﻫﻲ ﺑﺪون واﺳﻄﻪ‬
‫‪ -2‬آدرسدﻫﻲ ﺛﺒﺎت‬
‫‪ -3‬آدرسدﻫﻲ ﻣﺴﺘﻘﻴﻢ‬
‫‪ -4‬آدرسدﻫﻲ ﻏﻴﺮﻣﺴﺘﻘﻴﻢ ﺛﺒﺎت‬
‫‪٤٤‬‬

‫‪ -5‬آدرسدﻫﻲ ﻣﺒﻨﺎ‬
‫‪ -6‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺴﺘﻘﻴﻢ‬
‫‪ -7‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺒﻨﺎ‬
‫از اﻳﻦ اﻣﻜﺎﻧﺎت ﻣﺘﻨﻮع آدرسدﻫﻲ ﺑﺮاي ﻋﻤﻠﻮﻧﺪﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬

‫‪ -3-9-1‬آدرس دﻫﻲ ﺑﺪون واﺳﻄﻪ‬


‫در اﻳﻦ ﻣﺪ آدرسدﻫﻲ داده ﻣﻲﺗﻮاﻧﺪ ‪ 8‬ﺑﻴﺖ ﻳﺎ ‪ 16‬ﺑﻴﺖ ﻃـﻮل داﺷـﺘﻪ ﺑﺎﺷـﺪ و‬
‫ﺑﻌﻨﻮان ﻋﻤﻠﻮﻧﺪ در دﺳﺘﻮراﻟﻌﻤﻞ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪3-13‬‬
‫‪MOV BL , 10‬‬

‫داده‬

‫‪ -3-9-2‬آدرسدﻫﻲ ﻣﺴﺘﻘﻴﻢ‬
‫در اﻳﻦ روش آدرس داده ﻛﻪ ﺷﺎﻧﺰدهﺑﻴﺖ ﻣﻲﺑﺎﺷﺪ ﺟﺰء دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺑﺎﺷـﺪ‪.‬‬
‫ﻣﺜﺎل‬
‫‪MOV‬‬ ‫‪AX,TABLE‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ‬ ‫ﺣﺎﻓﻈﻪ‬
‫آدرس‬ ‫داده‬

‫‪ -3-9-3‬آدرسدﻫﻲ ﺛﺒﺎت‬
‫در اﻳﻦ ﻣـﺪ آدرسدﻫـﻲ داده در ﺛﺒـﺎﺗﻲ ﻗـﺮار دارد ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫ﻣﺸﺨﺺ ﻣﻲﺷﻮد‪.‬‬
‫‪٤٥‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‬ ‫ﺛﺒﺎت‬
‫ﺛﺒﺎت‬ ‫داده‬

‫ﺑــﺮاي ﻋﻤﻠﻮﻧــﺪ ﺷــﺎﻧﺰدهﺑﻴﺘــﻲ از ﺛﺒﺎﺗﻬــﺎي ‪DI ،SI ،BP ،DX ،CX ،BX ،AX‬‬
‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪3-15‬‬
‫‪MOV AX , CX‬‬

‫و در ﻣﻮرد ﻋﻤﻠﻮﻧﺪ ﻫﺸﺖ ﺑﻴﺘﻲ از ﺛﺒﺎﺗﻬـﺎي ‪،CH ،CL ،BH ،BL ،AL ، AH‬‬
‫‪ DH ، DL‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪3-16‬‬
‫‪MOV DL , AL‬‬

‫‪ -3-9-4‬آدرسدﻫﻲ ﻏﻴﺮﻣﺴﺘﻘﻴﻢ ﺛﺒﺎت‬


‫در اﻳﻦ روش آدرس داده در ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎي‪ SI ،DI ، BX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ‬ ‫ﺛﺒﺎت‬ ‫ﺣﺎﻓﻈﻪ‬
‫ﺛﺒﺎت‬ ‫آدرس‬ ‫داده‬

‫]‪MOV AX , [BX‬‬

‫‪ -3-9-5‬آدرسدﻫﻲ ﻣﺒﻨﺎ‬
‫در اﻳﻦ روش آدرس داده در ﻳﻜﻲ از ﺛﺒﺎﺗﻬـﺎي ‪ DI ، SI ،BP ،BX‬ﻗـﺮار داده‬
‫ﻣﻲﺷﻮد‪ .‬در اﻳﻦ روش ﻳﻚ ﺟﺎﺑﻪﺟﺎﺋﻲ ﺑﺎﻧﺪازه ‪ 8‬ﺑﻴﺖ ﻳﺎ ‪ 16‬ﺑﻴﺖ دارد‪.‬‬
‫‪٤٦‬‬

‫‪MOV AX,[BX]+4‬‬

‫ﻛﻪ ‪ ،4‬ﻣﻘﺪار ﺟﺎﺑﻪﺟﺎﺋﻲ و آدرس داده در ‪ BX‬ﻗﺮار داده ﺷﺪه اﺳﺖ‪ .‬دو دﺳﺘﻮر‬
‫ذﻳﻞ ﻣﻌﺎدل دﺳﺘﻮر ﻓﻮق ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫]‪MOV AX, 4[BX‬‬


‫]‪MOV AX, [BX+4‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‬
‫ﺛﺒﺎت‬ ‫ﺟﺎﺑﻪﺟﺎﺋﻲ‬
‫آدرس‬ ‫ﺣﺎﻓﻈﻪ‬
‫‪+‬‬ ‫داده‬
‫ﺛﺒﺎت‬
‫آدرس‬

‫‪ -3-9-6‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺴﺘﻘﻴﻢ‬


‫دراﻳﻦ روش آدرس داده در ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎي ‪ BX‬و ﻳﺎ ‪ BP‬ﻗﺮار داده ﻣﻲﺷـﻮد‪.‬‬
‫و از ﺛﺒﺎﺗﻬــﺎي ‪ SI‬و ﻳــﺎ ‪ DI‬ﺑﻌﻨــﻮان اﻧــﺪﻳﺲ اﺳــﺘﻔﺎده ﻣــﻲﮔــﺮدد‪ .‬در ﺣﻘﻴﻘــﺖ آدرس‬
‫ﻋﺒﺎرﺗﺴﺖ از ﻣﺠﻤﻮع ‪ BX‬و ﻳﺎ ‪ BP‬ﺑﺎ ‪ SI‬ﻳﺎ ‪. DI‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‬ ‫ﺛﺒﺎت‬
‫ﺛﺒﺎت ﭘﺎﻳﻪ‬ ‫ﺛﺒﺎت اﻧﺪﻳﺲ‬ ‫اﻧﺪﻳﺲ‬
‫آدرس‬ ‫ﺣﺎﻓﻈﻪ‬
‫‪+‬‬ ‫داده‬
‫ﺛﺒﺎت‬
‫آدرس ﭘﺎﻳﻪ‬
‫‪٤٧‬‬

‫ﻣﺜﺎل ‪3-17‬‬
‫]‪MOV AX,[BX][DI‬‬

‫‪ -3-9-7‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺒﻨﺎ‬


‫در اﻳﻦ روش آدرس داده ﺷﺒﻴﻪ ﻗﺒﻞ ﺑﻮده ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻳﻚ ﺟـﺎ ﺑـﻪ ﺟـﺎﺋﻲ‬
‫ﻫﺸﺖ ﺑﻴﺘﻲ ﻳﺎ ﺷﺎﻧﺰدهﺑﻴﺘﻲ ﻧﻴﺰ وﺟﻮد دارد‪.‬‬

‫ﻣﺜﺎل ‪3-18‬‬
‫]‪MOV AX, VALUE [BX][DI‬‬
‫]‪MOV AX, [BX+2][DI‬‬
‫]‪MOV AX,[BX] [DI+2‬‬

‫دﺳﺘﻮر اﻟﻌﻤﻞ‬
‫ﺛﺒﺎت‬ ‫ﺛﺒﺎت‬ ‫ﺟﺎﺑﻪﺟﺎﺋﻲ‬
‫ﭘﺎﻳﻪ‬ ‫اﻧﺪﻳﺲ‬
‫ﺛﺒﺎت‬ ‫آدرس‬ ‫ﺣﺎﻓﻈﻪ‬
‫اﻧﺪﻳﺲ‬ ‫‪+‬‬ ‫داده‬
‫ﺛﺒﺎت‬
‫آدرس ﭘﺎﻳﻪ‬
‫‪٤٨‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫ﻫـﺮ دﺳــﺘﻮراﻟﻌﻤﻞ ﻣــﻲﺗﻮاﻧــﺪ ﺷــﺎﻣﻞ ﭼﻬـﺎر ﻓﻴﻠــﺪ اﺳــﻢ‪ ،‬ﻋﻤﻠﻴــﺎت‪ ،‬ﻋﻤﻠﻮﻧــﺪ و‬


‫ﻣﻼﺣﻈﺎت ﺑﺎﺷﺪ‪ .‬ﻧﺎم ﻣﺸﺨـﺼﻪﻫـﺎ در زﺑـﺎن اﺳـﻤﺒﻠﻲ ﺷـﺎﻣﻞ ‪ 31‬ﻛـﺎراﻛﺘﺮ ﻣـﻲﺑﺎﺷـﺪ و‬
‫ﻣﻲﺑﺎﻳﺴﺘﻲ ﺑﺎ ﻳﻜﻲ از ﺣﺮوف ﺷﺮوع ﺷﺪ و ﻧﻤﻲﺗﻮاﻧـﺪ ﻳﻜـﻲ از ﻛﻠﻤـﺎت ذﺧﻴـﺮه ﺷـﺪه‬
‫ﺑﻮﺳﻴﻠﻪ زﺑﺎن اﺳـﻤﺒﻠﻲ ﺑﺎﺷـﺪ‪ .‬ﺛﺎﺑﺘﻬـﺎ را ﻣـﻲﺗـﻮان در ﻣﺒﻨـﺎي ‪ 16 ،10 ،8 ،2‬در ﺑﺮﻧﺎﻣـﻪ‬
‫اﺳﺘﻔﺎده ﻧﻤﻮد ﻛﻪ ﺑﺘﺮﺗﻴﺐ ﺑﺮاي آﻧﻬﺎ از ﭘـﺴﻮﻧﺪﻫﺎي ‪ H ،D ،O ،B‬اﺳـﺘﻔﺎده ﻣـﻲﻧﻤـﺎﺋﻴﻢ‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺪون ﻋﻤﻠﻮﻧﺪ‪ ،‬ﻳﻚ ﻋﻤﻠﻮﻧﺪ‪ ،‬ﻳـﺎ دو ﻋﻤﻠﻮﻧـﺪ ﻣـﻲﺑﺎﺷـﻨﺪ‪ .‬ﻓﻴﻠـﺪ‬
‫ﻣﻼﺣﻈﺎت ﺑﺎ ; ﺷﺮوع ﻣـﻲﺷـﻮد‪ .‬رﻳﺰﭘﺮدازﻧـﺪه ‪ 80286‬از ﻫﻔـﺖ ﺗﻜﻨﻴـﻚ آدرسدﻫـﻲ‬
‫اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﻳﺪ ﻛﻪ ﺑﺘﺮﺗﻴﺐ ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ -1‬آدرس دﻫﻲ ﺑﺪون واﺳﻄﻪ‬
‫‪ -2‬آدرسدﻫﻲ ﺛﺒﺎت‬
‫‪ -3‬آدرسدﻫﻲ ﻣﺴﺘﻘﻴﻢ‬
‫‪ -4‬آدرسدﻫﻲ ﻏﻴﺮﻣﺴﺘﻘﻴﻢ ﺛﺒﺎت‬
‫‪ -5‬آدرسدﻫﻲ ﻣﺒﻨﺎ‬
‫‪ -6‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺴﺘﻘﻴﻢ‬
‫‪ -7‬آدرسدﻫﻲ اﻧﺪﻳﺲ ﻣﺒﻨﺎ‬
‫ﻳﻚ دﺳﺘﻮر اﻟﻌﻤﻞ ﻣﻲﺗﻮاﻧﺪ ﺑﺎ ; ﺷﺮوع ﺷﺪه ﻛﻪ ﺟﻨﺒـﻪ ﻣﻼﺣﻈـﺎت و ﺗﻮﺿـﻴﺤﺎت ﺑـﺮاي‬
‫ﺑﺮﻧﺎﻣﻪ دارد‪.‬‬
‫‪٤٩‬‬

‫ ﺗﻤﺮﻳﻦ‬

‫‪-1‬ﻛﺪاﻣﻴﻚ از ﻛﻠﻤﺎت زﻳﺮ ﻧﺎم ﻣﺠﺎز در اﺳﻤﺒﻠﻲ ﻣﻲﺑﺎﺷﺪ؟‬

‫‪BOOK‬‬ ‫‪VARIABLE‬‬ ‫‪$ 5AC‬‬


‫‪2 NAME‬‬ ‫‪FOR‬‬ ‫‪. 2_A7‬‬
‫‪+ PLUS‬‬ ‫‪NAME3‬‬ ‫‪BOOK2‬‬

‫‪-2‬ﻓﻴﻠﺪﻫﺎي ﻳﻚ دﺳﺘﻮراﻟﻌﻤﻞ را ﻧﺎم ﺑﺒﺮﻳﺪ‪.‬‬

‫‪-3‬اﻧﻮاع ﺛﺎﺑﺖﻫﺎ را ﺑﻨﻮﻳﺴﻴﺪ و در ﻣﻮرد ﻫﺮ ﻳﻚ ﻣﺜﺎﻟﻲ ﺑﺪﻫﻴﺪ‪.‬‬

‫‪-4‬ﺗﻌﺪاد ﺣﺪاﻗﻞ و ﺣﺪاﻛﺜﺮ ﻋﻤﻠﻮﻧﺪﻫﺎ در ﻳﻚ دﺳﺘﻮراﻟﻌﻤﻞ را ﺑﺪﻫﻴﺪ‪.‬‬

‫‪-5‬ﻣﺪﻫﺎي آدرسدﻫﻲ را ﻧﺎم ﺑﺒﺮﻳﺪ‪ .‬و در ﻣﻮرد ﻫﺮ ﻛﺪام ﻣﺜﺎﻟﻲ ﺑﺪﻫﻴﺪ‪.‬‬

‫‪ -6‬ﻗﺎﻧﻮن ﻧﺎﻣﮕﺬاري ﻣﺸﺨﺼﻪﻫﺎ را ﺑﻴﺎن ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫‪ -7‬در ﻣﻮرد ﺛﺎﺑﺖﻫﺎ در ﻣﺒﻨﺎي ‪ 16‬از ﭼﻪ ﭘﺴﻮﻧﺪي اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫‪ -8‬آﻳﺎ اﺳﺘﻔﺎده از ﭘﺴﻮﻧﺪ در ﻣﻮرد ﺛﺎﺑﺘﻬﺎي ﻣﺒﻨﺎي ‪ 10‬اﺧﺘﻴﺎري اﺳﺖ؟‬


‫‪٥٠‬‬

‫ﻓﺼﻞ ﭼﻬﺎرم‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺳﺎﺳﻲ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻣﻌﺮﻓﻲ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺳﺎﺳﻲ در زﺑﺎن اﺳﻤﺒﻠﻲ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ‪.‬‬
‫‪-1‬اﻧﺘﻘﺎل دادهﻫﺎ در ﺣﺎﻓﻈﻪ‬
‫‪-2‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺟﻤﻊ و ﺗﻔﺮﻳﻖ‬
‫‪-3‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺟﻤﻊ و ﺗﻔﺮﻳﻖ ﻣﻘﺎدﻳﺮ ﺑﺰرگ‬
‫‪ -4‬ﺿﺮب و ﺗﻘﺴﻴﻢ‬
‫‪ -5‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺿﺮب ﻣﻘﺎدﻳﺮ ﺑﺰرگ‬
‫‪ -6‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻛﺎﻫﺶ و اﻓﺰاﻳﺶ‬
‫‪ -7‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺎﺳﺒﻪ ﻣﻜﻤﻞ ‪ 2‬ﻳﻚ ﻣﻘﺪار‪.‬‬
‫‪٥١‬‬

‫‪ -4-1‬اﻧﺘﻘﺎل دادهﻫﺎ در ﺣﺎﻓﻈﻪ‬


‫اﻧﺘﻘﺎل دادهﻫﺎ ﺑﻴﻦ ﻣﻜﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﺣﺎﻓﻈﻪ اﺻﻠﻲ و ﺛﺒﺎﺗﻬﺎ ﺑﻮﺳﻴﻠﻪ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫‪ MOV‬اﻧﺠﺎم ﻣﻲﺷﻮد‪ .‬ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪MOV‬‬ ‫‪dst , src‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ src‬را در ‪ dst‬ﻗﺮار داده و ﻣﺤﺘﻮي ‪ src‬ﺑﺪون ﺗﻐﻴﻴـﺮ‬


‫ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬

‫‪MOV‬‬ ‫‪CL, -30‬‬

‫‪ -30‬را در ﺛﺒﺎت ‪ CL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪MOV‬‬ ‫‪X, 25H‬‬

‫ﻣﻘﺪار ‪ 37‬را در ﻣﻜﺎن ‪ X‬در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AX, BX‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ BX‬را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ و ﻣﺤﺘﻮي ﺛﺒﺎت ‪ BX‬ﺑـﺪون ﺗﻐﻴﻴـﺮ‬


‫ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬

‫‪MOV‬‬ ‫‪DS, AX‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬را در ‪ DS‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AX, TABLE‬‬

‫ﻣﺤﺘﻮي ﺣﺎﻓﻈﻪ ‪ TABLE‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪MOV‬‬ ‫‪TABLE, AX‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬را در ﻣﻜﺎن ‪ TABLE‬از ﺣﺎﻓﻈﻪ اﺻﻠﻲ ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬


‫‪٥٢‬‬

‫درﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬ﺑﺎﻳﺴﺘﻲ در ﻧﻈﺮ داﺷﺖ ﻛﻪ ‪:‬‬


‫‪-1‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻳﻌﻨﻲ ‪ sdt‬و ‪ src‬ﺑﺎﻳـﺴﺘﻲ از ﻧـﻮع ﺑﺎﻳـﺖ ﻳـﺎ ﻫـﺮ دو از ﻧـﻮع ‪word‬‬
‫ﺑﺎﺷﻨﺪ‪.‬‬
‫‪-2‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪ .‬ﻳﻌﻨﻲ دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪MOV‬‬ ‫‪X, Y‬‬

‫‪-3‬ﻫﻴﭽﻜﺪام از ﻋﻤﻠﻮﻧﺪﻫﺎ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺛﺒﺎت ‪ IP‬ﺑﺎﺷﻨﺪ‪.‬‬


‫‪-4‬ﻫﻴﭽﻜﺪام از ﻋﻤﻠﻮﻧﺪﻫﺎ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺛﺒﺎت ﻓﻠﮓ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪-5‬ﻣﺤﺘﻮي ﻳﻚ ﺛﺒﺎت ﺳﮕﻤﻨﺖ را ﻧﻤﻲﺗﻮان ﻣﺴﺘﻘﻴﻤﺎً ﺑﻴﻚ ﺛﺒﺎت ﺳﮕﻤﻨﺖ دﻳﮕـﺮ ﻣﻨﺘﻘـﻞ‬
‫ﻧﻤﻮد‪ .‬اﻳﻦ ﻛﺎر را ﺑﺎﻳﺴﺘﻲ ﺑﺼﻮرت ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ اﻧﺠﺎم داد‪.‬‬

‫‪MOV‬‬ ‫‪AX , ES‬‬


‫‪MOV‬‬ ‫‪DS , AX‬‬

‫‪-6‬ﻋﻤﻮﻟﻨﺪ ‪ dst‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺒﺎت ‪ CS‬ﺑﺎﺷﺪ‪.‬‬


‫‪-7‬در دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬ﺑﺠﺰء در ﻣﻮاردﻳﻜﻪ ‪ src‬ﺛﺎﺑﺖ ﺑﺎﺷﺪ ﺣﺘﻤﺎًﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎ‬
‫ﺑﺎﻳﺴﺘﻲ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫‪-8‬ﻳﻚ ﺛﺎﺑﺖ را ﻧﻤﻲﺗﻮان ﻣﺴﺘﻘﻴﻤﺎً ﺑﻪ ﻳﻚ ﺛﺒﺎت ﺳﮕﻤﻨﺖ ﻣﻨﺘﻘﻞ ﻧﻤﻮد‪.‬‬
‫اﻳﻦ ﻛﺎر را ﺑﺎﻳﺴﺘﻲ ﺑﺼﻮرت زﻳﺮ اﻧﺠﺎم داد‪.‬‬

‫‪MOV‬‬ ‫‪AX, DATA_SEG‬‬


‫‪MOV‬‬ ‫‪DS , AX‬‬

‫‪-9‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬


‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ﻫﺮ ﻣﻜﺎن از ﺣﺎﻓﻈﻪ ﻳﺎ ﻣﺘﻐﻴﺮ داراي ﻣﺸﺨﺼﺎت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪-1‬ﻧﺎم‪ ،‬ﻛﻪ از ﻗﺎﻧﻮن ﻧﺎﻣﮕﺬاري ﺗﺒﻌﻴﺖ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪-2‬آدرس‪ ،‬ﻛﻪ ﻧﺸﺎن دﻫﻨﺪه ﻣﻜﺎن ﻣﺘﻐﻴﺮ در ﺣﺎﻓﻈﻪ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪-3‬ﻣﻘﺪار‪ ،‬ﻛﻪ ﻣﺤﺘﻮي آن ﻣﻜﺎن را ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬
‫‪٥٣‬‬

‫آدرس ﺣﺎﻓﻈﻪ‬
‫‪2401‬‬
‫‪2402‬‬
‫‪2403‬‬
‫‪2404‬‬ ‫‪65‬‬ ‫‪X‬‬
‫‪2405‬‬
‫‪2406‬‬
‫‪2407‬‬
‫‪2408‬‬
‫‪300‬‬ ‫‪Y‬‬
‫‪2409‬‬

‫‪2410‬‬
‫‪2411‬‬

‫در ﺑﺎﻻ ﺣﺎﻓﻈﻪ اﺻﻠﻲ را ﻧﺸﺎن ﻣﻲدﻫﺪ ﻛﻪ ‪ X‬ﻣﺘﻐﻴﺮي از ﻧﻮع ﺑﺎﻳﺖ ﺑـﺎ ﻣﺤﺘـﻮي‬
‫‪ 65‬و آدرس آن ‪ 2404‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ‪ Y‬ﻣﺘﻐﻴﺮي اﺳﺖ از ﻧﻮع ‪ word‬ﺑﺎ ﻣﺤﺘـﻮي‬
‫‪ 300‬ﻛﻪ آدرس آن ‪ 2408‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ آدرس ﻫـﺮ ‪ data‬آدرس‬
‫ﺑﺎﻳﺖ ﺷﺮوع آن ‪ data‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﻣﺘﻐﻴﺮ ‪ y‬ﭼﻮن ﺑﺎﻳﺘﻬـﺎي ‪ 2408‬و ‪ 2409‬را در ﺣﺎﻓﻈـﻪ‬
‫اﺷﻐﺎل ﻣﻲﻛﻨﺪ آدرس آن ‪ 2408‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺣﺎل ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ آدرس ﻣﺘﻐﻴـﺮي را در‬
‫ﺛﺒﺎت ‪ BX‬ﻗﺮار دﻫﻴﻢ از دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫‪MOV‬‬ ‫‪BX , OFFSET‬‬ ‫‪Y‬‬

‫ﺑﺎ اﺟﺮاي اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ آدرس ‪ 2408‬در ﺛﺒﺎت ‪ BX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬


‫‪٥٤‬‬

‫‪BX‬‬ ‫‪Y‬‬
‫‪2408‬‬ ‫‪300‬‬

‫ﺑﺎ اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ‬

‫‪MOV‬‬ ‫‪BX, Y‬‬

‫ﻣﺤﺘﻮي ‪ Y‬ﻳﻌﻨﻲ ‪ 300‬در ﺛﺒﺎت ‪ BX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬

‫‪BX‬‬ ‫‪Y‬‬
‫‪300‬‬ ‫‪300‬‬

‫ﻣﻌﻤﻮﻻً آدرس ﻣﺘﻐﻴﺮﻫـﺎ را در ﻳﻜـﻲ از ﺛﺒﺎﺗﻬـﺎي ‪ SI, DI, BP, BX‬ﻗـﺮار داده‬
‫ﻣﻲﺷﻮد‪ .‬ﺣﺎل ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪X‬‬ ‫‪DW 400‬‬


‫‪MOV‬‬ ‫‪BX, OFFSET‬‬ ‫‪X‬‬
‫‪MOV‬‬ ‫]‪AX, [BX‬‬

‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ زﻳﺮ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ‪ X .‬ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ اﺳﺖ ﻛﻪ‬
‫ﻳﻚ ‪ word‬را اﺷﻐﺎل ﻧﻤﻮده اﺳﺖ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم آدرس ﻣﺘﻐﻴﺮ ‪ X‬را در ﺛﺒﺎت ‪BX‬‬
‫ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ آﺧﺮ ﻣﺤﺘـﻮي ﻣﻜـﺎﻧﻲ از ﺣﺎﻓﻈـﻪ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ‪ BX‬اﺷـﺎره‬
‫ﻣﻲﺷﻮد را ﺑﻪ ﺛﺒﺎت ‪ AX‬ﻣﻨﺘﻘﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪٥٥‬‬

‫‪3600‬‬
‫‪3601‬‬
‫‪3602‬‬
‫‪400‬‬ ‫‪X‬‬
‫‪3603‬‬
‫‪3604‬‬

‫‪BX‬‬ ‫‪3605‬‬ ‫‪AX‬‬

‫‪3602‬‬ ‫‪3606‬‬ ‫‪400‬‬


‫‪3607‬‬

‫ﻣﺜﺎل ‪4-1‬‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪X DW 613,248,365,126‬‬
‫‪MOV BX, OFFSET X‬‬
‫‪MOV AX, [BX] +4‬‬
‫‪٥٦‬‬

‫آدرس‬
‫‪4000‬‬
‫‪4001‬‬
‫‪4002‬‬ ‫‪X‬‬
‫‪613‬‬
‫‪4003‬‬
‫‪4004‬‬
‫‪248‬‬
‫‪4005‬‬

‫‪BX‬‬ ‫‪4006‬‬ ‫‪AX‬‬


‫‪365‬‬
‫‪4002‬‬ ‫‪4007‬‬ ‫‪365‬‬
‫‪4008‬‬
‫‪126‬‬
‫‪4009‬‬
‫‪4010‬‬
‫‪4011‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ اﻳﺠﺎد ﻳﻚ آراﻳﻪ ﭼﻬﺎر ﻋﻨﺼﺮي از ﻧﻮع ‪ word‬ﻣﻲﻧﻤﺎﻳـﺪ ﺑـﺎ‬


‫ﻣﻘﺎدﻳﺮ ‪ 126 ، 365 ، 248 ، 613‬ﺑﺘﺮﺗﻴﺐ در آدرﺳﻬﺎي‪.4008 ،4006 ،4004 ،4002‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ دوم آدرس ﻣﺘﻐﻴﺮ ‪ X‬را در ﺛﺒﺎت ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫‪ 4‬واﺣﺪ ﺑﻪ آدرس درون ‪ BX‬اﺿﺎﻓﻪ ﻧﻤﻮده ﺑﻪ آدرس ‪ 4006‬ﻣﻲرﺳﺪ‪ ،‬ﺳﭙﺲ ﻣﻘـﺪاري‬
‫ﻛﻪ در آدرس ‪ 406‬ﺣﺎﻓﻈﻪ ﻗﺮار دارد ﻳﻌﻨﻲ ‪ 365‬ﺑﻪ ﺛﺒﺎت ‪ AX‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪ .‬ﺑﺎﻳﺴﺘﻲ‬
‫ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ BX‬ﭘـﺲ از اﺟـﺮاي دﺳـﺘﻮراﻟﻌﻤﻞﻫـﺎي ﻓـﻮق ‪4002‬‬
‫ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪٥٧‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﻣﻌﺎدﻟﻨﺪ‬

‫‪MOV‬‬ ‫‪AX, [BX]+4‬‬


‫‪MOV‬‬ ‫]‪AX, 4[BX‬‬
‫‪MOV‬‬ ‫]‪AX, [BX+4‬‬

‫ﻣﺜﺎل ‪4-2‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪X‬‬ ‫‪DW 126,248,613,1260‬‬


‫‪MOV‬‬ ‫‪DI, 4‬‬
‫‪MOV‬‬ ‫]‪AX, X[DI‬‬

‫آدرس‬
‫‪1A00‬‬ ‫‪X‬‬
‫‪126‬‬
‫‪1A01‬‬ ‫‪X+1‬‬
‫‪1A02‬‬ ‫‪X+2‬‬
‫‪248‬‬
‫‪1A03‬‬ ‫‪X+3‬‬
‫‪AX‬‬ ‫‪1A04‬‬ ‫‪X+4‬‬ ‫‪DI‬‬
‫‪613‬‬
‫‪613‬‬ ‫‪1A05‬‬ ‫‪X+5‬‬ ‫‪4‬‬
‫‪1A06‬‬ ‫‪X+6‬‬
‫‪1260‬‬
‫‪1A07‬‬ ‫‪X+7‬‬
‫‪1A08‬‬ ‫‪X+8‬‬
‫‪1A09‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول اﻳﺠﺎد ﻳﻚ آراﻳﻪ ﻣﻲﻧﻤﺎﻳﺪ ﺑﻨـﺎم ‪ X‬از ﻧـﻮع ‪ word‬ﺑـﺎ ﻣﻘـﺎدﻳﺮ‬
‫‪1260،613،248 ،126‬ﺑﺘﺮﺗﻴـــﺐ در آدرﺳـــﻬﺎي‪ 1A06 ،1A04 ،1A02 ،1A00‬از‬
‫‪٥٨‬‬

‫ﺣﺎﻓﻈﻪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪ 4‬را در ﺛﺒﺎت ‪ DI‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫ﻣﺤﺘﻮي ‪ X+4‬ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 613‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-3‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪MOV‬‬ ‫]‪AX, X[BX][DI‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي آدرﺳﻲ ﻛﻪ از ﻣﺠﻤﻮع ﻣﻘﺎدﻳﺮ‪ DI ، BX ، X‬ﺑﺪﺳـﺖ‬


‫ﻣﻲآﻳﺪ را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬در اﻳﻦ دﺳﺘﻮر ﻣﻲﺗﻮان ﺑﺠﺎي ‪ BX‬از ‪ BP‬و ﺑـﻪ‬
‫ﺟﺎي ‪ DI‬از ‪ SI‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫ﻣﺜﺎل ‪4-4‬‬
‫‪MOV‬‬ ‫]‪AX, X[BP][DI‬‬
‫‪MOV‬‬ ‫]‪AX, X[BX][SI‬‬
‫‪MOV‬‬ ‫]‪AX, X[BP][SI‬‬

‫ﻧﻬﺎﻳﺘﺎً دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬ﻧﻴﺰ ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ﻳﻜﻲ از ﺷﻜﻞ ذﻳﻞ ﺑﺎﺷﺪ‪.‬‬

‫‪MOV‬‬ ‫]‪AX, [BX][DI+2‬‬


‫‪MOV‬‬ ‫]‪AX, [BX+2][DI‬‬
‫‪MOV‬‬ ‫]‪AX,[BX][DI+2‬‬
‫‪MOV‬‬ ‫]‪AX,[BX+DI+2‬‬

‫از اﻳﻦ ﻓﺮمﻫﺎي ‪ MOV‬ﺑﺮاي اﺳﺘﺨﺮاج دادهﻫﺎ از ﻳﻚ آراﻳﻪ دو ﺑﻌـﺪي اﺳـﺘﻔﺎده‬


‫ﻣﻲﮔﺮدد‪.‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼً ﻣﺘـﺬﻛﺮ ﺷـﺪﻳﻢ در ﺑﺮﻧﺎﻣـﻪ از ﭼﻬـﺎر ﺳـﮕﻤﻨﺖ ﺑﻨﺎﻣﻬـﺎي زﻳـﺮ‬
‫ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫‪code‬‬ ‫‪segment‬‬ ‫‪CS‬‬
‫‪data‬‬ ‫‪segment‬‬ ‫‪DS‬‬
‫‪stack‬‬ ‫‪segment‬‬ ‫‪SS‬‬
‫‪extra‬‬ ‫‪segment‬‬ ‫‪ES‬‬
‫‪٥٩‬‬

‫ﻛﺎﻣﭙﻴﻮﺗﺮ آدرس ﺷﺮوع اﻳﻦ ﺳﮕﻤﻨﺖﻫﺎ را ﻃﻮري اﻧﺘﺨﺎب ﻣـﻲﻧﻤﺎﻳـﺪ ﻛـﻪ ﻗﺎﺑـﻞ‬
‫ﺗﻘﺴﻴﻢ ﺑﺮ ‪ 16‬ﺑﺎﺷﻨﺪ ﻳﻌﻨﻲ ﭼﻬﺎر ﺑﻴﺖ ﺳﻤﺖ راﺳﺖ آدرس ﺷﺮوع ﺳـﮕﻤﻨﺖﻫـﺎ ‪0000‬‬
‫ﺑﺎﺷﺪ‪ .‬در ﺣﻘﻴﻘﺖ آدرس ﺷﺮوع ﺳﮕﻤﻨﺖﻫﺎ ﺑﻴﺴﺖ ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﭼﻮن ﭼﻬـﺎر ﺑﻴـﺖ‬
‫ﺳـﻤﺖ راﺳـﺖ آﻧﻬـﺎ ‪ 0000‬ﻣـﻲﺑﺎﺷـﺪ ﺑــﻪ ﺷـﺎﻧﺰده ﺑﻴـﺖ ﺗﻘﻠﻴـﻞ ﻳﺎﻓﺘـﻪ و در ﺛﺒﺎﺗﻬــﺎي‬
‫‪ ES ،SS ،DS ،CS‬ﻗﺮار داده ﻣﻴﺸﻮﻧﺪ‪ .‬ﺑﺮا ﻳﺎﻓﺘﻦ آدرس واﻗﻌﻲ ﻳﺎ ﻓﻴﺰﻳﻜـﻲ ﺳـﮕﻤﻨﺖ‬
‫‪ data‬در ﺣﺎﻓﻈﻪ ﺑﺎﻳﺴﺘﻲ ﻣﺤﺘﻮي ‪ DS‬را در ‪ 16‬ﺿﺮب ﻧﻤﻮد‪ .‬ﻫﻤﺎﻧﻄﻮرﻳﻜـﻪ ﻧﻴـﺰ ﻗـﺒﻼً‬
‫ﺑﻴﺎن ﺷﺪ اﻧﺪازه ﺳﮕﻤﻨﺖﻫﺎ ﺗﺎ ‪ 64K‬ﺑﺎﻳﺖ ﻣﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪ .‬آدرس ﻫـﺮ ‪ data‬در ﺣﺎﻓﻈـﻪ‬
‫ﭼــﻮن اﻳــﻦ ‪ data‬در ‪ data segment‬ﻗــﺮار دارد ﻣــﻲﺗــﻮان ﻧــﺴﺒﺖ ﺑــﻪ اﺑﺘــﺪاي آن‬
‫‪ segment‬ﻣﺸﺨﺺ ﻧﻤﻮد ﻛﻪ ﺑﻪ اﻳﻦ آدرس ‪ offset‬ﮔﻔﺘﻪ ﻣﻴﺸﻮد‪.‬‬
‫آدرس در ﺣﺎﻓﻈﻪ‬

‫‪ 2A4B0‬ﺷﺮوع ﺳﮕﻤﻨﺖ‬
‫‪offset‬‬

‫‪data‬‬
‫‪64K‬‬

‫در ﺣﻘﻴﻘﺖ آدرس ﺳﮕﻤﻨﺖ ‪ 2A4B‬در ﺛﺒﺎت ‪ DS‬ﻗﺮار داده ﻣﻴﺸﻮد‪ .‬ﺣﺎل ﺑﺮاي‬
‫ﺑﺪﺳﺖ آوردن آدرس ﻓﻴﺰﻳﻜﻲ ﻳﺎ واﻗﻌﻲ ‪ data‬ﺑﻄﺮﻳﻖ ذﻳﻞ ﻋﻤﻞ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪ *16+offset‬ﻣﺤﺘﻮي ‪DS‬‬
‫‪٦٠‬‬

‫‪ -4-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪LEA‬‬
‫دﺳــــﺘﻮراﻟﻌﻤﻞ ‪ LEA‬ﻧﻴــــﺰ آدرس ﻣﺘﻐﻴــــﺮ را در ﻳﻜــــﻲ از ﺛﺒﺎﺗﻬــــﺎي‬
‫‪ BP ،BX ،DI ،SI‬ﻣﻲدﻫﺪ‪ .‬ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪LEA‬‬ ‫‪dst , src‬‬

‫‪ src -1‬ﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫‪ dst -2‬ﻳﻜﻲ از ﭼﻬﺎر ﺛﺒﺎت‪ DI ، SI ، BP ، BX‬ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪ -3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ LEA‬ﺑﺮ ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫ﻣﺜﺎل ‪4-5‬‬
‫‪X‬‬ ‫‪DW 613‬‬
‫‪LEA‬‬ ‫‪BX , X‬‬

‫آدرس ﺣﺎﻓﻈﻪ‬
‫‪4000‬‬
‫‪4001‬‬
‫‪4002‬‬ ‫‪X‬‬
‫‪613‬‬
‫‪4003‬‬

‫‪BX‬‬ ‫‪4004‬‬

‫‪4002‬‬ ‫‪4005‬‬

‫در ﺣﻘﻴﻘﺖ ﻋﻤﻠﻜﺮد اﻳﻦ دﺳﺘﻮر ﻣﻌﺎدل دﺳﺘﻮر ذﻳﻞ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪MOV‬‬ ‫‪BX,OFFSET‬‬ ‫‪X‬‬


‫‪٦١‬‬

‫ﻣﺜﺎل ‪4-6‬‬
‫‪LEA‬‬ ‫]‪SI, COL[BX‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ آدرس ﻣﺘﻐﻴﺮ ‪ COL‬را ﺑﺎ ﻣﺤﺘـﻮي ‪ BX‬ﺟﻤـﻊ ﻧﻤـﻮده آدرس‬


‫ﺑﺪﺳﺖ آﻣﺪه را در ‪ SI‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-7‬‬
‫‪X‬‬ ‫‪DB‬‬ ‫?‬
‫‪LEA‬‬ ‫‪BX,‬‬ ‫‪X‬‬

‫ﻣﺘﻐﻴﺮ ‪ X‬از ﻧﻮع ﺑﺎﻳﺖ ﺗﻌﺮﻳﻒ ﮔﺮدﻳـﺪه و آدرس آن در ﺛﺒـﺎت ‪ BX‬ﻗـﺮار داده‬
‫ﺷﺪه اﺳﺖ‪.‬‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ LEA‬ﺑﺮ ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫‪ -4-3‬ﻣﺒﺎدﻟﻪ دادهﻫﺎ‬
‫ﺑــﺮاي ﻣﺒﺎدﻟــﻪ ﻣﺤﺘــﻮي دو آدرس داده از دﺳــﺘﻮراﻟﻌﻤﻞ ‪ XCHG‬اﺳــﺘﻔﺎده‬
‫ﻣﻲﮔﺮدد‪ .‬ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪XCHG‬‬ ‫‪dst, src‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ src‬ﺑﺎ ‪ dst‬را ﻣﺒﺎدﻟﻪ ﻣﻲﻧﻤﺎﻳﺪ ﻳﻌﻨﻲ ﻣﺤﺘـﻮي ‪ src‬در‬
‫‪ dst‬ﻗﺮار ﻣﻲﮔﻴﺮد و ﻣﺤﺘﻮي ‪dst‬در ‪.src‬‬
‫در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ XCHG‬ﺑﺎﻳﺴﺘﻲ در ﻧﻈﺮ داﺷﺖ ﻛﻪ‪:‬‬
‫‪ dst , src -1‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ dst , src -2‬ﺑﺎﻳﺴﺘﻲ ﻫﺮ دو از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ﻫﺮ دو از ﻧﻮع ‪ word‬ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ dst , src -3‬ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ -4‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪٦٢‬‬

‫ﻣﺜﺎل ‪4-8‬‬
‫‪MOV‬‬ ‫‪AX, 1000‬‬
‫‪MOV‬‬ ‫‪X, 3000‬‬
‫‪XCHG‬‬ ‫‪X, AX‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪XCHG‬‬


‫‪AX‬‬ ‫‪X‬‬
‫‪1000‬‬ ‫‪3000‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪XCHG‬‬


‫‪AX‬‬ ‫‪X‬‬
‫‪3000‬‬ ‫‪1000‬‬

‫ﻣﺜﺎل ‪4-9‬‬
‫‪XCHG‬‬ ‫‪AX , BX‬‬

‫ﻣﺤﺘﻮي ‪ BX‬را در ‪ AX‬و ﻣﺤﺘﻮي ‪ AX‬را در ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬


‫‪X DB‬‬ ‫‪65‬‬
‫‪Y DB‬‬ ‫‪48‬‬
‫‪MOV‬‬ ‫‪AL , X‬‬
‫‪XCHG‬‬ ‫‪AL, Y‬‬
‫‪MOV‬‬ ‫‪X , AL‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻓﻮق ﺑﺎﻋﺚ ﻣﺒﺎدﻟﻪ ﻣﻘـﺎدﻳﺮ ‪ X‬و ‪ Y‬ﻛـﻪ ﻫـﺮ دو از ﻧـﻮع ﺑﺎﻳـﺖ‬
‫ﻣﻲﺑﺎﺷﻨﺪ ﻣﻲﺷﻮد‪ .‬ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﻓﻮق‬
‫‪X‬‬ ‫‪Y‬‬
‫‪65‬‬ ‫‪48‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻓﻮق‬


‫‪AL‬‬ ‫‪X‬‬ ‫‪Y‬‬
‫‪48‬‬ ‫‪48‬‬ ‫‪65‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ XCHG‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬


‫‪٦٣‬‬

‫‪ -4-4‬ﺟﻤﻊ و ﺗﻔﺮﻳﻖ‬
‫ﺟﻤﻊ دو ﻣﻘﺪار ﺑﻮﺳﻴﻠﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬اﻧﺠﺎم ﻣﻲﺷـﻮد‪ .‬ﺷـﻜﻞ ﻛﻠـﻲ اﻳـﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪ADD‬‬ ‫‪dst , src‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ src‬را ﺑﺎ ﻣﺤﺘﻮي ‪ dst‬ﺟﻤﻊ ﻧﻤﻮده ﻧﺘﻴﺠـﻪ را در ‪dst‬‬


‫ﻗﺮار ﻣﻲدﻫﺪ و ﻣﻘﺪار ‪ src‬ﺑﺪون ﺗﻐﻴﻴﺮ ﻣﻲﻣﺎﻧﺪ‪.‬‬
‫‪dst‬‬ ‫‪dst + src‬‬

‫ﻣﺜﺎل ‪4-10‬‬
‫‪MOV‬‬ ‫‪AX , 613‬‬
‫‪MOV‬‬ ‫‪BX, 248‬‬
‫‪ADD‬‬ ‫‪AX , BX‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 613‬را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار‬


‫‪ 248‬را در ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺳـﻮم ﻣﺠﻤـﻮع ‪ AX‬و ‪ BX‬را ﻣﺤﺎﺳـﺒﻪ و‬
‫ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﻛﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣـﻲﺷـﻮد ﻣﻘـﺪار ‪ BX‬ﺗﻐﻴﻴـﺮ‬
‫ﻧﻤﻲﻛﻨﺪ‪.‬‬
‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ﻓﻮق‬
‫‪AX‬‬ ‫‪BX‬‬
‫‪613‬‬ ‫‪248‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻓﻮق ﻣﻘﺎدﻳﺮ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬


‫‪AX‬‬ ‫‪BX‬‬
‫‪861‬‬ ‫‪248‬‬

‫در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬ﺑﺎﻳﺴﺘﻲ ﻣﻮارد زﻳﺮ را در ﻧﻈﺮ داﺷﺖ‪.‬‬


‫‪ -1‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ﻫﺮ دو از ﻧﻮع ‪ word‬ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ -2‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ از ﻧﻮع ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪٦٤‬‬

‫‪ -3‬ﺑﻪ ﺟـﺰء در ﻣﻮاردﻳﻜـﻪ ﻳﻜـﻲ از ﻋﻤﻠﻮﻧـﺪﻫﺎ ﺛﺎﺑـﺖ ﺑﺎﺷـﺪ ﺣﺘﻤـﺎً ﻳﻜـﻲ از‬
‫ﻋﻤﻠﻮﻧﺪﻫﺎ ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫‪ -4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬ﺑﺮ روي ﻓﻠﮓﻫﺎي ‪ AF, CF, OF, PF, SF, ZF‬اﺛﺮ‬
‫دارد‪.‬‬

‫ﻣﺜﺎل ‪4-11‬‬
‫‪X‬‬ ‫‪DB 13‬‬
‫‪MOV‬‬ ‫‪AL , 10‬‬
‫‪ADD‬‬ ‫‪X , AL‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ‪ X‬را از ﻧﻮع ﺑﺎﻳـﺖ ﺗﻌﺮﻳـﻒ ﻧﻤـﻮده و ﻣﻘـﺪار آﻧـﺮا ‪ 13‬ﻗـﺮار‬
‫ﻣﻲ دﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪ 10‬را در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺳﻮم‬
‫ﻣﻘﺪار ‪ AL‬را ﺑﺎ ﻣﺤﺘﻮي ‪ X‬ﺟﻤﻊ ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﻛﻪ ﻣﻲﺷﻮد ‪ 23‬را در ‪ X‬ﻗﺮار ﻣﻲدﻫـﺪ‪.‬‬
‫و ﻣﺤﺘﻮي ‪ AL‬ﻧﻴﺰ ‪ 10‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-12‬‬

‫‪X‬‬ ‫‪DW 613,248,126‬‬


‫‪MOV‬‬ ‫‪BX, OFFSET X‬‬
‫‪MOV‬‬ ‫‪AX, 1000‬‬
‫‪ADD‬‬ ‫]‪AX, [BX + 2‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ آراﻳﻪ ﺳـﻪ ﻋﻨـﺼﺮي از ﻧـﻮع ‪ word‬اﻳﺠـﺎد ﻣـﻲﻧﻤﺎﻳـﺪ‪.‬‬


‫ﻣﻘﺎدﻳﺮ ﻋﻨﺎﺻﺮ آراﻳﻪ ﺑﺘﺮﺗﻴﺐ ﻋﺒﺎرﺗﻨﺪ از‪128 ،248 ،613‬دﺳﺘﻮراﻟﻌﻤﻞ دوم آدرس ‪ X‬را‬
‫در ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ ﺳـﻮم ﻣﻘـﺪار ‪ 1000‬را در ‪ AX‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪.‬‬
‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي دوﻣﻴﻦ ﻋﻨﺼﺮ آراﻳﻪ را ﻳﻌﻨﻲ ‪ 248‬ﺑﺎ ﻣﺤﺘـﻮي ‪ AX‬ﺟﻤـﻊ‬
‫ﻧﻤﻮده و ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫‪٦٥‬‬

‫‪2000‬‬
‫‪2001‬‬
‫‪2002‬‬ ‫‪X‬‬
‫‪613‬‬
‫‪2003‬‬
‫‪2004‬‬ ‫‪BX‬‬
‫‪248‬‬
‫‪2005‬‬ ‫‪2002‬‬
‫‪2006‬‬
‫‪126‬‬
‫‪2007‬‬
‫‪2008‬‬ ‫‪AX‬‬
‫‪2009‬‬ ‫‪1248‬‬

‫ﻣﺜﺎل ‪4-13‬‬

‫‪X‬‬ ‫‪DB 18‬‬


‫‪MOV‬‬ ‫‪AL , -18‬‬
‫‪ADD‬‬ ‫‪AL , X‬‬

‫دﺳـــﺘﻮراﻟﻌﻤﻞ اول ﻣﻘـــﺪار ‪ 18‬را در ‪ X‬ﻗـــﺮار ﻣـــﻲدﻫـــﺪ‪ .‬دﺳـــﺘﻮراﻟﻌﻤﻞ‬


‫دوم ﻣﻘـــﺪار ‪ –18‬را در ‪ AL‬ﻗـــﺮار ﻣـــﻲدﻫـــﺪ‪ .‬آﺧـــﺮﻳﻦ دﺳـــﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘـــﻮي‬
‫‪ X‬را ﺑﺎ ﻣﺤﺘﻮي ‪ AL‬ﺟﻤﻊ ﻧﻤﻮده‪ ،‬ﻧﺘﻴﺠﻪ را ﻛﻪ ‪ 0‬ﻣـﻲﺷـﻮد در ‪ AL‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪.‬‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﭘﺲ از اﻧﺠﺎم ﻋﻤـﻞ ﺟﻤـﻊ ﻣﻘـﺪار ﻓﻠـﮓ ‪ ZF‬ﺑﺮاﺑـﺮ ﺑـﺎ ﻳـﻚ‬
‫ﻣﻲﺷﻮد‪.‬‬
‫‪٦٦‬‬

‫ﻣﺜﺎل ‪4-14‬‬
‫‪X‬‬ ‫‪DB 12,20,5,14,26,30‬‬
‫‪MOV‬‬ ‫‪DI , 5‬‬
‫‪MOV‬‬ ‫‪AL , 20‬‬
‫‪ADD‬‬ ‫‪X [DI] , AL‬‬

‫دﺳـــﺘﻮراﻟﻌﻤﻞ اول ﻳـــﻚ آراﻳـــﻪ ‪ 6‬ﻋﻨـــﺼﺮي از ﻧـــﻮع ﺑﺎﻳـــﺖ ﺑـــﺎ ﻣﻘـــﺎدﻳﺮ‬


‫ﺑﺘﺮﺗﻴــﺐ ‪ 30 ،26 ،14 ،5 ،20 ،12‬ﺗﻌﺮﻳ ـﻒ ﻣــﻲﻧﻤﺎﻳــﺪ‪ .‬دﺳــﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘــﺪار ‪5‬‬
‫را در ‪ DI‬ﻗﺮار ﻣـﻲدﻫـﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ ﺳـﻮم ﻣﻘـﺪار ‪ 20‬را در ‪ AL‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪.‬‬
‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ ﻛﻪ ﺑﻮﺳـﻴﻠﻪ ‪ X+5‬ﻣـﺸﺨﺺ ﻣـﻲﺷـﻮد‬
‫را ﺑﺎ ‪ AL‬ﺟﻤﻊ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 30‬را ﺑﺎ ‪ 20‬ﺟﻤﻊ ﻧﻤﻮده و ﻧﺘﻴﺠـﻪ را در ﻣﺤـﻞ‬
‫‪ X+5‬از ﺣﺎﻓﻈــﻪ ﻗــﺮار ﻣــﻲدﻫــﺪ‪ .‬و ﻣﻘــﺎدﻳﺮ ﺛﺒﺎﺗﻬــﺎي ‪ AL‬و ‪ DI‬ﺑــﺪون ﺗﻐﻴﻴــﺮ‬
‫ﺑﺎﻗﻲﻣﻲﻣﺎﻧﺪ‪.‬‬

‫آدرس ﺣﺎﻓﻈﻪ‬
‫‪A100‬‬
‫‪A101‬‬
‫‪A102‬‬ ‫‪12‬‬ ‫‪X‬‬
‫‪A103‬‬ ‫‪20‬‬ ‫‪X+1‬‬
‫‪A104‬‬ ‫‪5‬‬ ‫‪X+2‬‬
‫‪A105‬‬ ‫‪14‬‬ ‫‪X+3‬‬
‫‪A106‬‬ ‫‪26‬‬ ‫‪X+4‬‬
‫‪A107‬‬ ‫‪30‬‬ ‫‪X+5‬‬
‫‪A108‬‬
‫‪A109‬‬
‫‪AL‬‬ ‫‪DI‬‬

‫‪20‬‬ ‫‪4‬‬
‫‪٦٧‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻓﻮق ﺷﻜﻞ ﺣﺎﻓﻈﻪ ﺑﺼﻮرت زﻳﺮ در ﻣﻲآﻳﺪ‪.‬‬

‫‪A100‬‬
‫‪A101‬‬
‫‪A102‬‬ ‫‪12‬‬ ‫‪X‬‬
‫‪A103‬‬ ‫‪20‬‬ ‫‪X+1‬‬
‫‪A104‬‬ ‫‪5‬‬ ‫‪X+2‬‬
‫‪A105‬‬ ‫‪14‬‬ ‫‪X+3‬‬
‫‪A106‬‬ ‫‪26‬‬ ‫‪X+4‬‬
‫‪A107‬‬ ‫‪50‬‬ ‫‪X+5‬‬
‫‪A108‬‬
‫‪A109‬‬

‫از دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADC‬ﻧﻴﺰ ﺑﺮاي ﺟﻤﻊ ﻣﻘﺎدﻳﺮ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﻓﺮم ﻛﻠـﻲ‬
‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ اﺳﺖ‪.‬‬
‫‪ADC‬‬ ‫‪dst , src‬‬

‫ﻛﻪ ﻣﺤﺘﻮي ‪ src‬را ﺑﺎ ﻣﺤﺘﻮي ‪ dst‬ﺟﻤﻊ ﻧﻤﻮده ﻧﺘﻴﺠـﻪ را ﺑـﺎ ﻣﻘـﺪار ﻓﻠـﮓ ‪CF‬‬
‫ﺟﻤﻊ ﻧﻤﻮده و ﻧﻬﺎﻳﺘﺎً ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه را در ‪ dst‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪dst‬‬ ‫‪dst + src + CF‬‬

‫در ﻣﻮﻗﻊ اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ‪:‬‬


‫‪ -1‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ‪ src , dst‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ﻫﺮ دو از ﻧﻮع ‪ word‬ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ src , dst -2‬ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪٦٨‬‬

‫‪ -3‬ﺑﻪ ﺟﺰء در ﻣﻮاردﻳﻜﻪ ﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ src , dst‬ﺛﺎﺑﺖ ﺑﺎﺷﺪ ﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎ‬
‫ﺑﺎﻳﺴﺘﻲ ﺣﺘﻤﺎً از ﻧﻮع ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫‪ -4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADC‬روي ﻓﻠﮓﻫﺎي‪ CF ،OF ،PF ،AF ،SF ، ZF‬اﺛﺮ دارد‪.‬‬

‫ﻣﺜﺎل ‪4-15‬‬
‫‪X DW‬‬ ‫?‬
‫‪MOV‬‬ ‫‪AX , 1000‬‬
‫‪MOV‬‬ ‫‪X, 3000‬‬
‫‪ADC‬‬ ‫‪AX , X‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ‪ X‬را از ﻧـﻮع ‪ word‬ﺗﻌﺮﻳـﻒ ﻣـﻲﻧﻤﺎﻳـﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ دوم‬


‫ﻣﻘﺪار ‪ 1000‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫـﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ ﺳـﻮم ﻣﻘـﺪار ‪ 3000‬را در‬
‫ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ X‬را ﺑﺎ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬ﺟﻤـﻊ‬
‫ﻧﻤﻮده و ﭼﻨﺎﻧﭽﻪ ‪ CF=1‬ﺑﺎﺷﺪ ﻳﻚ واﺣﺪ ﺑﻪ ﺟﻤﻊ ﺑﺪﺳﺖ آﻣﺪه اﺿﺎﻓﻪ ﻧﻤﻮده ‪ 4001‬را‬
‫در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬و ﭼﻨﺎﻧﭽﻪ ﻣﻘﺪار ‪ CF=0‬ﺑﺎﺷﺪ ﻣﻘـﺪار ‪ 4000‬را در ﺛﺒـﺎت‬
‫‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ﻳﻜﻲ از ﻛﺎرﺑﺮدﻫﺎي ﻣﻬﻢ دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADC‬در ﻣﺤﺎﺳﺒﻪ ﻣﺠﻤﻮع دو ﻣﻘـﺪار از‬
‫ﻧﻮع ‪ double word‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﻓﺮض ﻛﻨﻴﺪ ﻣﻲﺧﻮاﻫﻴﻢ ﻣﺠﻤﻮع دو ﻣﺘﻐﻴﺮ‪ Y‬و ‪ X‬از ﻧﻮع‬
‫‪ double word‬را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده و ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ ‪ Z‬از ﻧﻮع ‪ double word‬ﻗﺮار‬
‫دﻫﻴﻢ‪.‬‬
‫‪٦٩‬‬

‫‪X‬‬

‫‪X+2‬‬

‫‪M‬‬
‫‪Y‬‬

‫‪Y+2‬‬

‫‪M‬‬
‫‪Z‬‬

‫‪Z+2‬‬

‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﻼﺣﻈﻪ ﻣﻲﮔﺮدد‪ ،‬ﻣﺘﻐﻴـﺮ ‪ X‬از ﻧـﻮع ‪ double word‬را‬


‫ﻣﻲﺗﻮان ﺑﺼﻮرت دو ﺗﺎ ‪ word‬ﺑﻨﺎﻣﻬﺎي ‪ X‬و ‪ X+2‬در ﻧﻈﺮ ﮔﺮﻓﺖ‪ .‬ﺑﻄﻮر ﻣﺸﺎﺑﻪ ﻫﻤـﻴﻦ‬
‫ﻋﻤــﻞ را در ﻣــﻮرد‪ Y‬و ‪ Z‬ﻣــﻲﺗــﻮان اﻧﺠــﺎم داد‪ .‬ﺑــﺮاي ﺟﻤــﻊ دو ﻣﺘﻐﻴــﺮ از ﻧــﻮع‬
‫‪ double word‬ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ اﺑﺘﺪا دو ﺗﺎ ‪ word‬ﺑﺎ ارزش ﻛﻢﺗﺮ را ﺟﻤـﻊ ﻧﻤـﻮده ﺑـﺎ‬
‫‪٧٠‬‬

‫اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬ﺳﭙﺲ دو ﺗﺎ ‪ word‬ﺑﺎ ارزش ﺑﻴـﺸﺘﺮ را ﺑـﺎ ﻫـﻢ ﺟﻤـﻊ‬


‫ﻧﻤﻮده ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪.ADC‬‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪0‬‬


‫‪X‬‬ ‫‪ word‬ﺑﺎ ارزش ﺑﻴﺸﺘﺮ‬ ‫‪ Word‬ﻛﻢ ارزش‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪ADD‬‬ ‫‪0‬‬


‫‪Y‬‬ ‫‪ word‬ﺑﺎ ارزش ﺑﻴﺸﺘﺮ‬ ‫‪ Word‬ﻛﻢ ارزش‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪0‬‬


‫‪Z‬‬ ‫‪ word‬ﺑﺎ ارزش ﺑﻴﺸﺘﺮ‬ ‫‪ Word‬ﻛﻢ ارزش‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﻛﻪ دو ﻣﺘﻐﻴﺮ‪ X‬و ‪ Y‬از ﻧـﻮع ‪ double word‬را ﺑـﺎ ﻫـﻢ ﺟﻤـﻊ‬
‫ﻧﻤﻮده و ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ ‪ Z‬از ﻧﻮع ‪ double word‬ﻗـﺮار ﻣـﻲدﻫـﺪ ﺑـﺼﻮرت ذﻳـﻞ‬
‫ﻣﻲﺑﺎﺷﺪ‪:‬‬
‫‪X‬‬ ‫‪DD‬‬ ‫‪60000‬‬
‫‪Y‬‬ ‫‪DD‬‬ ‫‪40000‬‬
‫‪Z‬‬ ‫‪DD‬‬ ‫?‬
‫‪MOV‬‬ ‫‪AX , X‬‬
‫‪ADD‬‬ ‫‪AX , Y‬‬
‫‪MOV‬‬ ‫‪Z , AX‬‬
‫‪MOV‬‬ ‫‪AX, X+2‬‬
‫‪ADC‬‬ ‫‪AX , Y+2‬‬
‫‪MOV‬‬ ‫‪Z +2, AX‬‬

‫ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﺘﻐﻴﺮﻫﺎي ‪ Z , Y, X‬را از ﻧﻮع ‪ double word‬ﺗﻌﺮﻳـﻒ‬


‫ﻧﻤﻮده و ﻣﻘﺪار ‪ X‬را ﺑﺮاﺑﺮ ﺑﺎ ‪ 60000‬و ﻣﻘﺪار ‪ Y‬را ﺑﺮاﺑﺮ ﺑﺎ ‪ 40000‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺳﻪ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪي دو ﺗﺎ ‪ word‬ﺑﺎ ارزش ﻛﻢ ‪ X‬و ‪ Y‬را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻧﻤـﻮده ﻧﺘﻴﺠـﻪ را‬
‫‪٧١‬‬

‫در ‪ word‬ﺑﺎ ارزش ﻛﻢ ‪ Z‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪي دو ﺗﺎ ‪ word‬ﺑﺎ ارزش‬
‫ﺑﻴﺸﺘﺮ‪ X‬و ‪ Y‬را ﺑﺎ ﻫﻢ ﺟﻤـﻊ ﻧﻤـﻮده ﺑـﺎ اﺳـﺘﻔﺎده از ‪ ADC‬و ﻧﺘﻴﺠـﻪ را در ‪ word‬ﺑـﺎ‬
‫ارزش ﺑﻴــﺸﺘﺮ ‪ Z‬ﻗــﺮار ﻣــﻲدﻫــﺪ‪ .‬ﺑﺎﻳــﺴﺘﻲ ﺗﻮﺟــﻪ داﺷــﺖ ﻛــﻪ در دﺳــﺘﻮراﻟﻌﻤﻠﻬﺎي‬
‫‪ ADC ،ADD ، MOV‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-16‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﻣﻘﺪار ‪ X‬از ﻧﻮع ‪ double word‬را ﺑﺎ ﻣﻘﺪار ﺛﺒﺎﺗﻬـﺎي ‪ DX‬و‬
‫‪ AX‬ﺟﻤﻊ ﻧﻤﻮده ﻧﺘﻴﺠﻪ را در ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪DX‬‬ ‫‪AX‬‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪0‬‬


‫‪X+2‬‬ ‫‪X‬‬

‫اﺑﺘﺪا ﻣﺤﺘﻮي ‪ X‬را ﺑﺎ ‪ AX‬ﺟﻤـﻊ ﻧﻤـﻮده ﺑـﺎ اﺳـﺘﻔﺎده از دﺳـﺘﻮراﻟﻌﻤﻞ ‪ADD‬‬


‫ﺳﭙﺲ ﻣﺤﺘﻮي ‪ X+2‬را ﺑﺎ ‪ DX‬ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADC‬ﺟﻤﻊ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪X‬‬ ‫‪DD 40000‬‬


‫‪MOV‬‬ ‫‪AX , 300‬‬
‫‪MOV‬‬ ‫‪DX, 400‬‬
‫‪ADD‬‬ ‫‪X , AX‬‬
‫‪ADC‬‬ ‫‪X+2 , DX‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ذﻳﻞ ﻣﺠﻤﻮع ﻣﺘﻐﻴﺮﻫـﺎي ‪ X‬و ‪ Y‬از ﻧـﻮع ‪ double word‬و ﻋـﺪد‬
‫‪ 24‬را ﻣﺤﺎﺳﺒﻪ و ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ ‪ W‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﻳﻌﻨﻲ ‪:‬‬

‫‪W‬‬ ‫‪X + Y + 24‬‬


‫‪٧٢‬‬

‫ﺑﺮاي اﻳﻨﻜـﺎر اﺑﺘـﺪا ‪ W ، Y ، X‬را ﺑـﺼﻮرت ‪ double word‬ﺗﻌﺮﻳـﻒ ﻧﻤـﻮده‬


‫ﺳﭙﺲ ﻣﺠﻤﻮع ﻣﻘﺎدﻳﺮ ‪ X‬و ‪ Y‬را ﺑﺪﺳﺖ ﻣﻲآورﻳﻢ‪ .‬آﻧﮕﺎه ﻋـﺪد ‪ 24‬را ﺑـﺼﻮرت ﻳـﻚ‬
‫ﻣﻘﺪار از ﻧﻮع ‪ double word‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺑﺎ ﻣﺠﻤﻮع ﻗﺒﻠﻲ ﺑﺪﺳﺖ آﻣﺪه ﺟﻤﻊ ﻧﻤﻮده‬
‫و ﻧﻬﺎﻳﺘﺎًﻧﺘﻴﺠﻪ ﻧﻬﺎﺋﻲ را در ‪ W‬ﻗﺮار ﻣﻲدﻫﻴﻢ‪.‬‬

‫‪X‬‬ ‫‪DD‬‬ ‫?‬


‫‪Y‬‬ ‫‪DD‬‬ ‫?‬
‫‪Z‬‬ ‫‪DD‬‬ ‫?‬
‫‪MOV‬‬ ‫‪AX , X‬‬
‫‪MOV‬‬ ‫‪DX,X+2‬‬
‫‪ADD‬‬ ‫‪AX,Y‬‬
‫‪ADC‬‬ ‫‪DX,Y+2‬‬
‫‪ADD‬‬ ‫‪AX,24‬‬
‫‪ADC‬‬ ‫‪DX ,0‬‬
‫‪MOV‬‬ ‫‪W, AX‬‬
‫‪MOV‬‬ ‫‪W+2 , DX‬‬

‫ﺑﺮاي اﻧﺠﺎم ﻋﻤﻞ ﺗﻔﺮﻳﻖ از دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬اﺳـﺘﻔﺎده ﻣـﻲﮔـﺮدد‪ .‬ﻓـﺮم ﻛﻠـﻲ‬


‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﺒﺎرﺗﺴﺖ از‬

‫‪SUB‬‬ ‫‪dst , src‬‬


‫‪dst‬‬ ‫‪dst – src‬‬

‫ﻣﻘﺪار ‪ src‬از ‪ dst‬ﻛﻢ ﻣﻲﺷﻮد ﻧﺘﻴﺠﻪ در ‪ dst‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬در ﺑﻜـﺎرﮔﻴﺮي اﻳـﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻳﺴﺘﻲ ﻣﻮارد زﻳﺮ را در ﻧﻈﺮ داﺷﺖ‪.‬‬
‫‪ -1‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ از ﻳﻚ ﻧﻮع ﺑﺎﺷﻨﺪ ﻫﺮ دو از ﻧﻮع ﺑﺎﻳـﺖ ﻳـﺎ ﻫـﺮ دو از ﻧـﻮع‬
‫‪ word‬ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ -2‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﺒﺎﻳﺴﺘﻲ از ﻧﻮع ﻣﺘﻐﻴﻴﺮ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ -3‬ﺑﻪ ﺟـﺰء در ﻣﻮاردﻳﻜـﻪ ﻳﻜـﻲ از ﻋﻤﻠﻮﻧـﺪﻫﺎ ﺛﺎﺑـﺖ ﺑﺎﺷـﺪ ﺣﺘﻤـﺎً ﺑﺎﻳـﺴﺘﻲ ﻳﻜـﻲ از‬
‫ﻋﻤﻠﻮﻧﺪﻫﺎ از ﻧﻮع ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫‪٧٣‬‬

‫‪ -4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﺑﺮ روي ﻓﻠﮓﻫﺎي‪ SF ،AF ،PF ،OF ،CF ، ZF‬اﺛﺮ دارد‪.‬‬
‫‪ -5‬ﻣﺤﺘﻮي ﻋﻤﻠﻮﻧﺪ ‪ dst‬در ﻋﻤﻞ ‪ SUB‬ﺗﻐﻴﻴﺮ ﻧﻤﻲﻛﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-17‬‬
‫‪MOV‬‬ ‫‪AL , 10‬‬
‫‪MOV‬‬ ‫‪BL , 6‬‬
‫‪SUB‬‬ ‫‪AL , BL‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 10‬را در ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪6‬‬
‫را در ‪ BL‬ﻗﺮار ﻣﻲدﻫﺪ و دﺳﺘﻮراﻟﻌﻤﻞ ﺳﻮم ﻣﺤﺘﻮي ‪ BL‬را از ﻣﺤﺘﻮي ‪ AL‬ﻛﻢ ﻧﻤﻮده‬
‫ﻧﺘﻴﺠﻪ را در ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ و ﻣﻘﺪار ‪ BL‬ﺗﻐﻴﻴﺮ ﻧﻤﻲﻛﻨﺪ‪.‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SUB‬‬


‫‪AL‬‬ ‫‪BL‬‬
‫‪10‬‬ ‫‪6‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SUB‬‬


‫‪AL‬‬ ‫‪BL‬‬
‫‪4‬‬ ‫‪6‬‬

‫ﻣﺜﺎل ‪4-18‬‬
‫‪X‬‬ ‫‪DW‬‬ ‫‪300‬‬
‫‪Y‬‬ ‫‪DW‬‬ ‫‪613‬‬
‫‪Z‬‬ ‫‪DW‬‬ ‫?‬
‫‪MOV‬‬ ‫‪AX, X‬‬
‫‪SUB‬‬ ‫‪AX , Y‬‬
‫‪MOV‬‬ ‫‪Z , AX‬‬

‫ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ اول ﺳﻪ ﻣﺘﻐﻴﺮ ‪ X‬ﺑﺎ ﻣﻘـﺪار ‪ 300‬و ‪ Y‬ﺑـﺎ ﻣﻘـﺪار ‪ 613‬و ‪ Z‬از‬
‫ﻧﻮع ‪ word‬ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﭼﻬﺎرم ﻣﺤﺘﻮي ﻣﺘﻐﻴﺮ ‪ X‬را ﺑﻪ ‪ AX‬ﻣﻨﺘﻘـﻞ‬
‫ﻣﻲﻧﻤﺎﻳﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪي ﻣﺤﺘﻮي ﻣﺘﻐﻴﺮ ‪ Y‬را از ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ AX‬ﻛـﻢ ﻧﻤـﻮده‬
‫ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬را ﺑﻪ ﻣﺘﻐﻴﺮ ‪Z‬‬
‫‪٧٤‬‬

‫ﻣﻨﺘﻘﻞ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬در ﻧﺘﻴﺠﻪ اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻣﻘـﺪار ﻓﻠـﮓ ‪ SF=1‬ﻣـﻲﺷـﻮد‪،‬‬


‫زﻳﺮا ﻧﺘﻴﺠﻪ ﺗﻔﺮﻳﻖ ﻣﻘﺪاري ﻣﻨﻔﻲ اﺳﺖ‪.‬‬

‫‪X‬‬
‫‪300‬‬

‫‪AX‬‬
‫‪-313‬‬

‫‪M‬‬
‫‪Y‬‬
‫‪613‬‬

‫‪M‬‬
‫‪Z‬‬
‫‪-313‬‬

‫ﻣﺜﺎل ‪4-19‬‬
‫‪ARR‬‬ ‫‪DB 26,126,64,13,40,60‬‬
‫‪MOV‬‬ ‫‪SI, 4‬‬
‫‪MOV‬‬ ‫‪AL, 20‬‬
‫‪SUB‬‬ ‫]‪AL, ARR [SI‬‬

‫اوﻟــﻴﻦ دﺳــﺘﻮراﻟﻌﻤﻞ ﻳــﻚ آراﻳــﻪ ﺷــﺶ ﻋﻨــﺼﺮي از ﻧــﻮع ﺑﺎﻳــﺖ ﺑــﺎ ﻣﻘــﺎدﻳﺮ‬
‫‪ 6,126,64,13,40,60‬ﺗﻌﺮﻳﻒ ﻣﻲ ﻧﻤﺎﻳﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘـﺪار ‪ 4‬را در ﺛﺒـﺎت ‪SI‬‬
‫‪٧٥‬‬

‫ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺳﻮم ﻣﻘﺪار ‪ 20‬را در ﺛﺒـﺎت ‪ AL‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪ .‬آﺧـﺮﻳﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ‪ ،‬ﻣﺤﺘﻮي ‪ ARR+4‬را از ‪ AL‬ﻛﻢ ﻧﻤﻮده ﻧﺘﻴﺠﻪ را ﻛـﻪ ﻣـﻲﺷـﻮد ‪ –20‬در‬
‫‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬و ﻣﻘﺪار ﻓﻠﮓ ‪ SF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺷﻮد‪.‬‬

‫‪26‬‬ ‫‪X‬‬
‫‪SI‬‬ ‫‪126‬‬ ‫‪X+1‬‬
‫‪4‬‬ ‫‪64‬‬ ‫‪X+2‬‬
‫‪AL‬‬ ‫‪13‬‬ ‫‪X+3‬‬
‫‪-20‬‬ ‫‪40‬‬ ‫‪X+4‬‬
‫‪60‬‬

‫ﻣﺜﺎل ‪4-20‬‬
‫‪X‬‬ ‫‪DW‬‬ ‫‪613‬‬
‫‪MOV‬‬ ‫‪AX , 248‬‬
‫‪SUB‬‬ ‫‪AX, 48‬‬
‫‪SUB‬‬ ‫‪X , AX‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺘﻐﻴﺮ ‪ X‬را از ﻧﻮع ‪ word‬ﺑﺎ ﻣﻘـﺪار ‪ 613‬ﺗﻌﺮﻳـﻒ ﻧﻤـﻮده‪،‬‬


‫دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪ 248‬را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺳﻮم ﻣﻘﺪار ‪ 48‬را‬
‫از ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬ﻛﻢ ﻧﻤﻮده و ﻧﺘﻴﺠﻪ را ﻛﻪ ﻣﻲﺷﻮد ‪ 200‬در ‪ AX‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪.‬‬
‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ AX‬از ﻣﺤﺘﻮي ﻣﺘﻐﻴﺮ ‪ X‬ﻛﻢ ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﻛـﻪ ﻣـﻲﺷـﻮد‬
‫‪ 400‬را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫‪٧٦‬‬

‫‪AX‬‬
‫‪240‬‬ ‫‪400‬‬ ‫‪X‬‬

‫از دﺳﺘﻮراﻟﻌﻤﻞ ‪ SBB‬ﻧﻴﺰ ﺑﺮاي ﻋﻤﻞ ﺗﻔﺮﻳﻖ اﺳﺘﻔﺎده ﻣﻴﮕﺮدد‪ .‬ﺷﻜﻞ ﻛﻠـﻲ اﻳـﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪SBB dst , src‬‬
‫‪dst‬‬ ‫‪dst – src – CF‬‬
‫ﻣﺤﺘﻮي ‪ src‬از ﻣﺤﺘﻮي ‪ dst‬ﻛﻢ ﻣﻲﺷـﻮد ﺳـﭙﺲ ﻣﻘـﺪار ‪ CF‬را از ﻧﺘﻴﺠـﻪ ﻛـﻢ‬
‫ﻧﻤﻮده آﻧﮕﺎه ﻧﺘﻴﺠﻪ را در ‪ dst‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-21‬‬
‫‪MOV‬‬ ‫‪AX , 1000‬‬
‫‪SBB‬‬ ‫‪AX , 800‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 1000‬را در ‪ AX‬ﻗـﺮار ﻣـﻲ دﻫـﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ دوم‬


‫‪ 800‬را از ﻣﺤﺘﻮي ‪ AX‬ﻛﻢ ﻧﻤﻮده ﭼﻨﺎﻧﭽﻪ ﻣﻘﺪار ﻓﻠﮓ ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷـﺪ ﻧﺘﻴﺠـﻪ‬
‫ﻣﻲﺷﻮد ‪ 199‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ‪.200‬‬
‫ﻣﻮاردﻳﻜﻪ ﺑﺎﻳﺴﺘﻲ در اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ SBB‬رﻋﺎﻳﺖ ﮔﺮدﻧﺪ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪ -1‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ از ﻧﻮع ‪ word‬ﺑﺎﺷﻨﺪ‪.‬‬
‫‪ -2‬ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﻨﺪ از ﻧﻮع ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪٧٧‬‬

‫‪ -3‬ﺑﺠﺰ در ﻣﻮاردﻳﻜﻪ ﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎ ﺛﺎﺑﺖ ﺑﺎﺷﺪ ﺣﺘﻤﺎًﺑﺎﻳﺴﺘﻲ ﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎ از‬
‫ﻧﻮع ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫‪ -4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ SBB‬روي ﻓﻠﮓﻫﺎي‪ CF ،OF ،SF ،ZF ،PF ،AF‬اﺛﺮ دارد‪.‬‬

‫ﻣﺜﺎل ‪4-22‬‬
‫ﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﻣﻘﺪار ﻓﻠﮓ ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ‬
‫را اﺟﺮا ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪MOV‬‬ ‫‪AL , 100‬‬
‫‪SBB‬‬ ‫‪AL , 60‬‬

‫دﺳــﺘﻮراﻟﻌﻤﻞ اول ﻣﻘــﺪار ‪ 100‬را در ﺛﺒــﺎت ‪ AL‬ﻗــﺮار ﻣــﻲدﻫــﺪ و ﭼــﻮن‬


‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOV‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪ ،‬ﻣﻘﺪار ﻓﻠﮓ ‪ CF‬ﺑـﺪون ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار‬
‫ﺻﻔﺮ ﻣﻲﻣﺎﻧﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ دوم در اﻳﻨﺠﺎ ﭼﻮن ﻣﻘﺪار ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻـﻔﺮ اﺳـﺖ دﻗﻴﻘـﺎً‬
‫ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﻤﻞ ﻧﻤﻮده ﻣﻘﺪار ‪ 60‬را از ﻣﺤﺘﻮي ‪ AL‬ﻛﻢ ﻧﻤﻮده و ﻧﺘﻴﺠﻪ‬
‫را ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ‪ 40‬ﻣﻲﺑﺎﺷﺪ در ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮر ‪SBB‬‬


‫‪CF‬‬ ‫‪AL‬‬
‫‪0‬‬ ‫‪100‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ‪SBB‬‬


‫‪CF‬‬ ‫‪AL‬‬
‫‪0‬‬ ‫‪40‬‬

‫از ﻛﺎرﺑﺮدﻫـــﺎي ﻣﻬـــﻢ دﺳـــﺘﻮراﻟﻌﻤﻞ ‪ SBB‬در ﺗﻔﺮﻳـــﻖ دو ﻣﻘـــﺪار از ﻧـــﻮع‬


‫‪ double word‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل دو ﻣﺘﻐﻴﺮ‪ Y‬و ‪ X‬را از ﻧﻮع ‪ double word‬در‬
‫ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪزﻳﺮ ﺗﻔﺎﺿﻞ آﻧﻬﺎ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﻴﺮ ‪ Z‬ﻛـﻪ از‬
‫ﻧﻮع ‪ double word‬ﻣﻲﺑﺎﺷﺪ ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
٧٨

X DD 300000
Y DD 250000
Z DD ?
MOV AX, X
SUB AX, Y
MOV Z , AX
MOV AX , X+2
SBB AX, Y+2
MOV Z+2, AX

X
300000
X+2

M
Y
250000
Y+2

M
Z

Z+2
‫‪٧٩‬‬

‫ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﺘﻐﻴﺮﻫﺎي ‪ X , Y, Z‬را از ﻧﻮع ‪ double word‬ﺗﻌﺮﻳـﻒ‬

‫ﻣﻲﻧﻤﺎﻳﺪ ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪي ﺗﻔﺎﺿﻞ دو ‪ Word‬ﺑﻨﺎﻣﻬﺎي ‪ Y‬و ‪ X‬را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده‬

‫و ﻧﺘﻴﺠﻪ را در دو ﺑﺎﻳﺖ اول ‪ Z‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ آﺧﺮ ﺗﻔﺎﺿـﻞ دو ﺑﺎﻳـﺖ‬

‫آﺧﺮ ‪ X‬و دو ﺑﺎﻳﺖ آﺧﺮ ‪ Y‬را ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ SBB‬ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده و ﻧﺘﻴﺠﻪ‬

‫را در دو ﺑﺎﻳﺖ آﺧﺮ ‪ Z‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-23‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪرﻳﺰ ﺗﻔﺎﺿﻞ ﻣﻘـﺪار ﻣﺘﻐﻴـﺮ ‪ X‬از ﻧـﻮع ‪ double word‬ﺑـﺎ ﻣﺤﺘـﻮي‬

‫ﺛﺒﺎﺗﻬﺎي ‪ AX:DX‬ﻣﺤﺎﺳﺒﻪ ﻣﻲﻧﻤﺎﻳﺪ و ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ ‪ Y‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪X‬‬ ‫‪DD‬‬ ‫‪40000‬‬


‫‪Y‬‬ ‫‪DD‬‬ ‫?‬
‫‪MOV‬‬ ‫‪AX,200‬‬
‫‪MOV‬‬ ‫‪DX, 12‬‬
‫‪SUB‬‬ ‫‪DX, X‬‬
‫‪SBB‬‬ ‫‪AX, X+2‬‬
‫‪MOV‬‬ ‫‪Y, DX‬‬
‫‪MOV‬‬ ‫‪Y+2, AX‬‬
‫‪٨٠‬‬

‫‪AX‬‬ ‫‪DX‬‬

‫‪200‬‬ ‫‪12‬‬ ‫‪X‬‬


‫‪40000‬‬

‫‪Y‬‬

‫‪ -4-5‬ﺿﺮب دو ﻣﻘﺪار‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬و ‪ IMUL‬ﺑﺮاي ﺿﺮب دو ﻣﻘﺪار اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﮔـﺮدد ﻛـﻪ ﻋﻤﻠﻮﻧـﺪﻫﺎ ﺑـﺼﻮرت ﺑـﺪون‬
‫ﻋﻼﻣﺖ ) ‪ (unsigned‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮﻧﺪ‪ .‬از دﺳﺘﻮر ‪ IMUL‬وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‬
‫‪٨١‬‬

‫ﻛﻪ ﻋﻤﻠﻮﻧﺪﻫﺎ ﺑﺼﻮرت ﻋﻼﻣﺖ دار) ‪ (signed‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮﻧﺪ‪ .‬ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮر‬
‫‪ MUL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪MUL‬‬ ‫‪Opr‬‬

‫در ﻣﻮرد ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﻧﻜﺎت زﻳﺮ را ﺑﺎﻳﺴﺘﻲ رﻋﺎﻳﺖ ﻧﻤﻮد‪.‬‬


‫اﻟﻒ( ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫ب( ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﻣﻲﺗﻮاﻧﺪ ﻣﺘﻐﻴﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫ج( ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫د( دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬روي ﻓﻠﮓﻫﺎي‪ CF‬و ‪ OF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( در اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎدﻳﺮ ﻓﻠﮓﻫﺎي‪ PF ،ZF ،AF ،SF‬ﺗﻌﺮﻳﻒ ﻧﺸﺪهاﻧﺪ‪.‬‬
‫و( ﭼﻨﺎﻧﭽﻪ ﻋﻤﻠﻮﻧﺪ ‪ opr‬از ﻧـﻮع ﺑﺎﻳـﺖ ﺑﺎﺷـﺪ‪ .‬ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ AL‬در ﻣﺤﺘـﻮي ‪opr‬‬
‫ﺿﺮب ﺷﺪه ﻧﺘﻴﺠﻪ در ‪ AX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫ز( ﭼﻨﺎﻧﭽﻪ ﻋﻤﻠﻮﻧﺪ ‪ opr‬از ﻧـﻮع ‪ word‬ﺑﺎﺷـﺪ ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ AX‬در ﻣﺤﺘـﻮي ‪opr‬‬
‫ﺿﺮب ﮔﺮدﻳﺪه ﻧﺘﻴﺠﻪ در ‪ DX:AX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫ﻣﺜﺎل ‪4-24‬‬
‫‪MOV‬‬ ‫‪BL, 11H‬‬
‫‪MOV‬‬ ‫‪AL, 0B4H‬‬
‫‪MUL‬‬ ‫‪BL‬‬

‫دﺳﺘﻮر اﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 11H‬ﻳﻌﻨﻲ ‪ 17‬را در ﺛﺒﺎت ‪ BL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬


‫‪BL‬‬
‫‪00010001‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪ 0B4H‬را در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲ دﻫـﺪ‪ .‬ﻫﻤﺎﻧﻄﻮرﻳﻜـﻪ‬


‫ﻣﻴﺪاﻧﻴﻢ ‪ B4‬در ﻣﺒﻨﺎي ﺷﺎﻧﺰده ﻣﻌﺎدل ‪ 180‬در ﻣﺒﻨﺎي ده ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪AL‬‬
‫‪10110100‬‬
‫‪٨٢‬‬

‫در اﻳﻨﺠﺎ ﮔﺮﭼﻪ ‪ MSB‬ﺛﺒﺎت ‪ AL‬ﻳﻚ ﻣـﻲﺑﺎﺷـﺪ وﻟـﻲ ﭼـﻮن از دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫‪ MUL‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻣﺤﺘﻮي ‪ AL‬را ﺑﺼﻮرت ﻣﻨﻔﻲ در ﻧﻈﺮ ﻧﻤﻲﮔﻴﺮﻳﻢ‪.‬‬
‫‪17 * 180 = 3060‬‬
‫ﻣﻘﺪار ‪ 3060‬در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫‪AX‬‬
‫‪3060‬‬

‫ﻣﺜﺎل ‪4-25‬‬
‫‪X‬‬ ‫‪DB‬‬ ‫?‬
‫‪MOV‬‬ ‫‪X, 0A5H‬‬
‫‪MOV‬‬ ‫‪AL, 62O‬‬
‫‪MUL‬‬ ‫‪X‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺘﻐﻴﺮ ‪ X‬را از ﻧﻮع ﺑﺎﻳﺖ ﺗﻌﺮﻳﻒ ﻧﻤﻮده‪،‬دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ‬


‫‪ 0A5H‬ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 165‬را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار داده و دﺳﺘﻮراﻟﻌﻤﻞ ﺳﻮم ‪ 62‬در ﻣﺒﻨـﺎي‬
‫ﻫﺸﺖ ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 50‬را در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪AL‬‬
‫‪00110010‬‬
‫‪165 * 50 = 8250‬‬

‫‪165‬‬ ‫‪X‬‬

‫‪AX‬‬
‫‪8250‬‬
‫‪٨٣‬‬

‫ﻣﺜﺎل ‪4-26‬‬
‫‪MOV‬‬ ‫‪AL , 5‬‬
‫‪MOV‬‬ ‫‪DL , 21‬‬
‫‪MUL‬‬ ‫‪DL‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 5‬را در ﺛﺒﺎت ‪ AL‬ﻗﺮار داده‪ .‬دوﻣـﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫ﻣﻘﺪار ‪ 21‬را در ﺛﺒﺎت ‪ DL‬ﻗﺮار داده‪ .‬ﺳﻮﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ AL‬را در‬
‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ DL‬ﺿﺮب ﻧﻤﻮده ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫‪AL‬‬
‫‪00000101‬‬
‫‪DL‬‬
‫‪00010101‬‬
‫‪AH‬‬ ‫‪AL‬‬
‫‪00000000‬‬ ‫‪01101001‬‬

‫در اﻳﻨﺠﺎ ﻣﻘﺪار ‪ OF‬و ‪ CF‬ﻫﺮ دو ﺻﻔﺮ ﻣﻲﺷﻮد ﻛﻪ ﻧﺸﺎن دﻫﻨـﺪه اﻳﻨـﺴﺖ ﻛـﻪ‬
‫ﻧﺘﻴﺠﻪ ﺣﺎﺻﻠﻀﺮب دو ﺑﺎﻳﺖ در ﻳﻚ ﺑﺎﻳﺖ ﺟﺎي ﻣﻲﺷﻮد و ﻧﺘﻴﺠﻪ در ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‬
‫و ﻣﻘﺪار ﺛﺒﺎت ‪ AH‬ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬ﻧﻴﺰ ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﺣﺎﺻﻠـﻀﺮب دو ﻣﻘـﺪار از ﻧـﻮع ‪word‬‬
‫ﻧﻴﺰ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر ﻳﻜﻲ از ﻋﻤﻠﻮﻧﺪﻫﺎ ﺑﺎﻳﺴﺘﻲ ﺣﺘﻤﺎًدر ﺛﺒﺎت ‪AX‬‬
‫ﻗﺮار ﮔﻴﺮد‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻧﺘﻴﺠـﻪ ﺣﺎﺻﻠـﻀﺮب در ﺛﺒﺎﺗﻬـﺎي ‪ DX:AX‬ﻗـﺮار‬
‫ﻣﻲﮔﻴﺮد‪.‬‬

‫ﻣﺜﺎل ‪4-27‬‬
‫‪MOV‬‬ ‫‪AX, 2000‬‬
‫‪MOV‬‬ ‫‪BX, 15‬‬
‫‪MUL‬‬ ‫‪BX‬‬
‫‪٨٤‬‬

‫اوﻟﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪ 2000‬را در ﺛﺒـﺎت ‪ AX‬ﻗـﺮار ﻣـﻲ دﻫـﺪ‪ .‬دوﻣـﻴﻦ‬


‫دﺳــﺘﻮراﻟﻌﻤﻞ ﻣﻘــﺪار ‪ 15‬را در ﺛﺒــﺎت ‪ BX‬ﻗــﺮار ﻣــﻲدﻫــﺪ‪ .‬ﺳــﻮﻣﻴﻦ دﺳــﺘﻮراﻟﻌﻤﻞ‬
‫ﺣﺎﺻﻠﻀﺮب ﻣﺤﺘﻮي ﺛﺒﺎﺗﻬﺎي ‪ AX‬و ‪ BX‬را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﺣﺎﺻﻠـﻀﺮب را در‬
‫ﺛﺒﺎﺗﻬﺎي ‪ DX:AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪15 * 2000 = 30000‬‬

‫ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 30000‬را در ﺛﺒﺎﺗﻬﺎي ‪ DX:AX‬ﻗﺮار ﻣـﻲدﻫـﺪ‪ .‬در اﻳﻨﺠـﺎ ﭼـﻮن‬


‫ﻧﺘﻴﺠــﻪ در ﻳــﻚ ‪ Word‬ﺟــﺎ ﻣــﻲﺷــﻮد ﻣﻘــﺪار ﻓﻠــﮓﻫــﺎي ‪ OF, CF‬ﺑﺮاﺑــﺮ ﺑــﺎ ﺻــﻔﺮ‬
‫ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪4-28‬‬

‫‪X‬‬ ‫‪DW‬‬ ‫‪5000‬‬


‫‪MOV‬‬ ‫‪AX, 3000‬‬
‫‪LEA‬‬ ‫‪BX , X‬‬
‫‪MUL‬‬ ‫]‪[BX‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺘﻐﻴﺮ ‪ X‬را از ﻧﻮع ‪ Word‬ﺑﺎ ﻣﻘﺪار ‪ 5000‬ﺗﻌﺮﻳـﻒ ﻧﻤـﻮده‬


‫دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 3000‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﺳﻮﻣﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫آدرس ‪ X‬را در ﺛﺒﺎت ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪاري ﻛﻪ ﺗﻮﺳﻂ ﺛﺒﺎت‬
‫‪ BX‬اﺷﺎره ﻣﻲﺷﻮد ﻳﻌﻨﻲ ‪ 5000‬را در ﻣﺤﺘﻮي ‪ AX‬ﻳﻌﻨﻲ ‪ 3000‬ﺿﺮب ﻧﻤﻮده ﻧﺘﻴﺠـﻪ‬
‫در ﺛﺒﺎﺗﻬﺎي ‪ DX:AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫‪٨٥‬‬

‫‪2000‬‬
‫‪BX‬‬ ‫‪2001‬‬
‫‪2002‬‬ ‫‪2002‬‬ ‫‪X‬‬
‫‪5000‬‬
‫‪2003‬‬
‫‪AX‬‬ ‫‪2004‬‬
‫‪3000‬‬ ‫‪2005‬‬

‫‪DX‬‬ ‫‪AX‬‬
‫‪15000000‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ IMUL‬ﻧﻴﺰ ﺑﺮاي ﺣﺎﺻﻠﻀﺮب دو ﻣﻘﺪار اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬ﺑﺎ اﻳﻦ‬


‫ﺗﻔﺎوت ﻛﻪ ﻋﻤﻠﻮﻧﺪﻫﺎ را ﺑﺼﻮرت ﻋﻼﻣﺘﺪار )‪ (Signed‬در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪ .‬ﻣﺜﺎل‬

‫‪MOV‬‬ ‫‪AL, 11H‬‬


‫‪MOV‬‬ ‫‪BL, 0B4H‬‬
‫‪MUL‬‬ ‫‪BL‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 11 H‬ﻳﻌﻨﻲ ‪ 17‬را در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪AL‬‬
‫‪00010001‬‬

‫دﺳــﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘــﺪار ‪ B4H‬ﻳﻌﻨــﻲ ‪ 10110100‬را در ﺛﺒــﺎت ‪ BL‬ﻗــﺮار‬


‫ﻣﻲدﻫﺪ‪.‬‬
‫‪٨٦‬‬

‫‪BL‬‬
‫‪10110100‬‬

‫ﭼﻮن ‪ MSB‬ﻣﺤﺘﻮي ‪ BL‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺑﺎﺷﺪ ﻣﺤﺘﻮي ‪ BL‬را ﺑﺼﻮرت ﻣﻨﻔﻲ‬


‫در ﻧﻈﺮ ﻣﻲﮔﻴﺮﻳﻢ‪.‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬


‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪128 + 32 + 16 + 4 = 180‬‬
‫‪180 – 28 = 180-256 = -76‬‬

‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ –76‬را در ‪ 17‬ﺿﺮب ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﻳﻌﻨـﻲ ‪–1292‬‬


‫در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪IMUL opr‬‬
‫در ﻣﻮرد ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﻧﻜﺎت زﻳﺮ را ﺑﺎﻳﺴﺘﻲ رﻋﺎﻳﺖ ﻧﻤﻮد‪.‬‬
‫اﻟﻒ( ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫ب( ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﻣﺘﻐﻴﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫ج( ﻋﻤﻠﻮﻧﺪ ﻧﺒﺎﻳﺴﺘﻲ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫د( دﺳﺘﻮراﻟﻌﻤﻞ ‪ IMUL‬روي ﻓﻠﮓﻫﺎي ‪ OF, CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( در ﻣﻮرداﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎدﻳﺮ ﻓﻠﮓﻫـﺎي‪ ZF،AF ،SF‬و ‪ PF‬ﺗﻌﺮﻳـﻒ ﻧـﺸﺪه‬
‫ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫و( ﭼﻨﺎﻧﭽﻪ ﻋﻤﻠﻮﻧﺪ ‪ opr‬از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AL‬در ﻣﺤﺘﻮي ‪ opr‬ﺿﺮب‬
‫ﺷﺪه ﻧﺘﻴﺠﻪ ﺣﺎﺻﻠﻀﺮب در ‪ AX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬
‫ز(ﭼﻨﺎﻧﭽﻪ ﻋﻤﻠﻮﻧـﺪ ‪ opr‬از ﻧـﻮع ‪ word‬ﺑﺎﺷـﺪ ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ AX‬در ﻣﺤﺘـﻮي ‪opr‬‬
‫ﺿﺮب ﺷﺪه ﻧﺘﻴﺠﻪ در ‪ DX:AX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬
‫‪٨٧‬‬

‫ﻣﺜﺎل ‪4-29‬‬
‫‪X‬‬ ‫? ‪DW‬‬
‫‪MOV‬‬ ‫‪X, -300‬‬
‫‪MOV‬‬ ‫‪AX, 20‬‬
‫‪IMUL‬‬ ‫‪X‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ‪ X‬را از ﻧﻮع ‪ word‬ﺗﻌﺮﻳﻒ ﻧﻤـﻮده‪ ،‬دوﻣـﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫ﻣﻘﺪار ‪ –300‬را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار داده‪ ،‬ﺳـﻮﻣﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪ 20‬را در ﺛﺒـﺎت‬
‫‪ AX‬ﻗﺮار داده ﺣﺎﺻﻠﻀﺮب ﻳﻌﻨﻲ ‪ -6000‬را در ﺛﺒﺎﺗﻬﺎي ‪ DX:AX‬ﻗﺮار ﻣﻲدﻫـﺪ‪ .‬در‬
‫اﻳﻨﺠﺎ ﻣﻘﺪار ﻓﻠﮓﻫﺎي ‪ CF‬و ‪ OF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺷﻮد ﻛﻪ ﻧﺘﻴﺠﻪ ﻣﻲﺷﻮد ﻣﻘـﺪار ‪DX‬‬
‫ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ و ﻣﻘﺪار ‪ AX‬ﺑﺮاﺑﺮ ﺑﺎ ‪ –6000‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪X‬‬ ‫‪DB 10110110B‬‬


‫‪MOV‬‬ ‫‪AL, 10010001B‬‬
‫‪IMUL‬‬ ‫‪X‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ X‬را از ﻧﻮع ﺑﺎﻳﺖ ﺑﺼﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫ﻣﺘﻐﻴﺮ ‪X‬‬
‫‪10110110‬‬

‫دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ AL‬را ﺑﺼﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬


‫‪AL‬‬
‫‪10010001‬‬

‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AL‬را در ﻣﻘﺪار ﻣﺘﻐﻴـﺮ ‪ X‬ﺿـﺮب ﻧﻤـﻮده‬


‫ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫـﺪ‪ .‬ﭼـﻮن از دﺳـﺘﻮراﻟﻌﻤﻞ ‪ IMUL‬اﺳـﺘﻔﺎده ﮔﺮدﻳـﺪه و‬
‫‪ MSB‬ﻣﺘﻐﻴﺮ ‪ X‬و ﺛﺒﺎت ‪ AL‬ﺑﺮاﺑﺮ ﺑﺎ ﻳـﻚ ﻣـﻲﺑﺎﺷـﺪ ﻣﻘـﺎدﻳﺮ ﻣﺘﻐﻴـﺮ ‪ X‬و ﺛﺒـﺎت ‪AL‬‬
‫ﺑﺼﻮرت ﻣﻨﻔﻲ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد‪.‬‬
‫‪٨٨‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬


‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪128 + 32 + 16 + 4 + 2 = 192‬‬
‫‪192 – 256 = -64‬‬

‫ﺣﺎل‬
‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪128 + 16 + 1 = 145‬‬
‫‪145 – 256 = -91‬‬

‫‪ -4-6‬ﺿﺮب دو ﻣﻘﺪار ‪ 32‬ﺑﻴﺘﻲ ﺑﺪون ﻋﻼﻣﺖ‬


‫از دﺳﺘﻮر ‪ MUL‬وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ ﻋﻤﻠﻮﻧﺪﻫﺎ ﻫﺸﺖ ﻳـﺎ ﺷـﺎﻧﺰده ﺑﻴﺘـﻲ‬
‫ﺑﺎﺷﻨﺪ‪ .‬اﻣﺎ ﺑﺮاي ﺿﺮب دو ﻣﻘﺪار ﺑـﺪون ﻋﻼﻣـﺖ ‪ 32‬ﺑﻴﺘـﻲ ﺑﺎﻳـﺴﺘﻲ از اﻟﮕـﻮرﻳﺘﻢ زﻳـﺮ‬
‫اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ وﻗﺘﻲ دو ﻣﻘﺪار را روي ﻛﺎﻏﺬ ﻣﻲﺧـﻮاﻫﻴﻢ ﺿـﺮب ﻧﻤـﺎﺋﻴﻢ‬
‫ﺑﺮاي ﺟﻤﻊ ﺣﺎﺻﻠﻀﺮبﻫﺎي ﺟﺰﺋﻲ‪ ،‬آﻧﻬﺎ را ﻳﻚ ﺳﺘﻮن ﺑﻄﺮف ﭼﭗ ﺷﻴﻔﺖ ﻣﻲدﻫﻴﻢ از‬
‫اﻳﻦ روش ﺑﺎﻳﺴﺘﻲ اﺳﺘﻔﺎده ﻧﻤﻮد ﺑﺮاي ﺿﺮب ﻣﻘﺎدﻳﺮ ﺑـﺰرگ‪ .‬ﺑﻌﻨـﻮان ﻣﺜـﺎل دو ﻣﻘـﺪار‬
‫‪ 124‬و ‪ 103‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-30‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫*‬
‫‪1‬‬ ‫‪0‬‬ ‫‪3‬‬
‫‪3‬‬ ‫‪7‬‬ ‫‪2‬‬ ‫ﺣﺎﺻﻠﻀﺮب ﺟﺰﺋﻲ ‪1‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫ﺣﺎﺻﻠﻀﺮب ﺟﺰﺋﻲ ‪2‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫ﺣﺎﺻﻠﻀﺮب ﺟﺰﺋﻲ ‪3‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪7‬‬ ‫‪7‬‬ ‫‪2‬‬ ‫ﺣﺎﺻﻠﻀﺮب ﻧﻬﺎﺋﻲ‬
‫‪٨٩‬‬

‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ دﻗﺖ ﻣﻲﻛﻨﻴﺪ‬

‫)‪103*124 = (3*124) + (0*124) + (100*124‬‬


‫ﻳﺎ‬
‫)‪103*124 = (3*1*124) + (0*10*124) + (1*100*124‬‬

‫ﺑﺎ اﻳﻦ ﻃﺮﻳﻖ ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر ‪ MUL‬دو ﻣﻘﺪار ‪ 32‬ﺑﻴﺘـﻲ را ﺑـﺪون‬
‫ﻋﻼﻣﺖ را در ﻫﻢ ﺿﺮب و ﺑﻪ ﻳﻚ ﻧﺘﻴﺠﻪ ‪ 64‬ﺑﻴﺘﻲ رﺳﻴﺪ‪ .‬در ﺷﻜﻞ زﻳـﺮ ‪ B ، C ، D‬و‬
‫‪ ،A‬ﻫﺮ ﻛﺪام ﺑﺼﻮرت ‪ 2‬ﺑﺎﻳﺖ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ‪.‬‬

‫ﻣﻀﺮوب‬ ‫‪C‬‬ ‫‪D‬‬ ‫*‬

‫ﻣﻀﺮوب ﻓﻴﻪ‬ ‫‪A‬‬ ‫‪B‬‬

‫‪B*D‬‬ ‫ﺣﺎﺻﻠﻀﺮب ‪1‬‬


‫‪1‬‬
‫‪B*C‬‬ ‫ﺣﺎﺻﻠﻀﺮب ‪2‬‬
‫‪3‬‬ ‫‪2‬‬
‫‪A*D‬‬ ‫ﺣﺎﺻﻠﻀﺮب ‪3‬‬
‫‪4‬‬
‫‪A*C‬‬ ‫ﺣﺎﺻﻠﻀﺮب ‪4‬‬

‫ﺣﺎﺻﻠﻀﺮب ﻧﻬﺎﺋﻲ )‪ 64‬ﺑﻴﺘﻲ ( = ﻣﺠﻤﻮع‬

‫ﺑﺮﻧﺎﻣﻪ اﻳﻦ اﻟﮕﻮرﻳﺘﻢ در ﻓﺼﻞ ﻧﻬﻢ ﻛﺘﺎب داده ﺷﺪه اﺳﺖ‪.‬‬


‫‪٩٠‬‬

‫‪ -4-7‬ﺗﻘﺴﻴﻢ دو ﻣﻘﺪار‬
‫ﺑﺎاﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ DIV‬ﻣﻲﺗﻮان دو ﻣﻘﺪار را ﺑﺮ ﻫﻢ ﺗﻘﺴﻴﻢ ﻧﻤﻮد‪ .‬ﺷﻜﻞ‬
‫ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ DIV‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪:‬‬
‫‪DIV‬‬ ‫‪Opr‬‬

‫در ﻣﻮرد ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﺑﺎﻳﺴﺘﻲ ﻧﻜﺎت زﻳﺮ را رﻋﺎﻳﺖ ﻧﻤﻮد‪:‬‬


‫اﻟﻒ( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫ب( ‪ opr‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬
‫د( ﭼﻨﺎﻧﭽﻪ ‪ opr‬از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ ﻣﺤﺘﻮي ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬ﺑﺮ ‪ opr‬ﺗﻘـﺴﻴﻢ ﺷـﺪه‪،‬‬
‫ﺧﺎرج ﻗﺴﻤﺖ را در ﺛﺒﺎت ‪ AL‬و ﺑﺎﻗﻴﻤﺎﻧﺪه را در ﺛﺒﺎت ‪ AH‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ﻫـ ( ﭼﻨﺎﻧﭽﻪ ‪ opr‬از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ ﻣﺤﺘﻮي ﺛﺒﺎﺗﻬﺎي ‪ DX:AX‬را ﺑـﺮ ‪ opr‬ﺗﻘـﺴﻴﻢ‬
‫ﻧﻤﻮده‪ ،‬ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ را در ‪ AX‬و ﺑﺎﻗﻲ ﻣﺎﻧﺪه را در ‪ DX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ز( دﺳـــﺘﻮراﻟﻌﻤﻞ ‪ DIV‬ﻫـــﺮ دو ﻋﻤﻠﻮﻧـــﺪ را ﺑـــﺼﻮرت ﺑـــﺎﻗﻲ ﻣﺎﻧـــﺪه ‪unsigned‬‬
‫)ﺑﺪون ﻋﻼﻣﺖ( در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪.‬‬

‫ﻣﺜﺎل ‪4-31‬‬
‫‪MOV‬‬ ‫‪AX , 130‬‬
‫‪MOV‬‬ ‫‪BL , 5‬‬
‫‪DIV‬‬ ‫‪BL‬‬

‫در اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ AX‬ﻣﻲﺷﻮد ‪ ،130‬دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار‬


‫‪ 5‬را در ﺛﺒﺎت ‪ BL‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ AX‬را ﺑﺮ ﻣﺤﺘﻮي ‪BL‬‬
‫ﺗﻘﺴﻴﻢ ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ را در ‪ AL‬و ﺑﺎﻗﻴﻤﺎﻧﺪه را در ‪ AH‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪AX‬‬
‫‪0000000010000010‬‬
‫‪٩١‬‬

‫‪BL‬‬
‫‪00000101‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ﺗﻘﺴﻴﻢ دارﻳﻢ ﻛﻪ‬

‫‪AL‬‬ ‫ﺧﺎرج ﻗﺴﻤﺖ‬


‫‪00011010‬‬

‫‪AH‬‬ ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬
‫‪00000000‬‬

‫‪BL‬‬
‫‪00000101‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ DIV‬ﺑﺮ روي ﻫﻴﭻ ﻓﻠﮕـﻲ اﺛـﺮ ﻧـﺪارد و‬
‫ﻣﻘﺪار ﻓﻠﮓﻫﺎي‪ CF ،ZF ،SF ،PF ،OF ،AF‬ﺗﻌﺮﻳـﻒ ﻧـﺸﺪه ﻣـﻲﺑﺎﺷـﻨﺪ‪ .‬در ﺿـﻤﻦ‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻣﻘﺪار ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﺑﺪون ﺗﻐﻴﻴﺮ ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-32‬‬
‫‪X‬‬ ‫‪DB 10110100B‬‬
‫‪MOV‬‬ ‫‪AX, 0400H‬‬
‫‪DIV‬‬ ‫‪X‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 10110100B‬را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪X‬‬
‫‪10110100‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬


‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪128 + 32 + 16 + 4 = 180‬‬
‫‪٩٢‬‬

‫دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 0400H‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪AX‬‬
‫‪0000010000000000‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬ﺑﺮاﺑﺮ ﺑﺎ ‪ 1024‬ﻣﻲﺑﺎﺷﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪1024‬‬


‫را ﺑﺮ ‪ 180‬ﺗﻘﺴﻴﻢ ﻧﻤﻮده ﻣﻘﺪار ﺧﺎرج ﻗـﺴﻤﺖ ﻳﻌﻨـﻲ ‪ 5‬را در ﺛﺒـﺎت ‪ AL‬و ﺑﺎﻗﻴﻤﺎﻧـﺪه‬
‫ﻳﻌﻨﻲ ‪ 124‬را در ﺛﺒﺎت ‪ AH‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﭘﺲ از اﻧﺠﺎم ﻋﻤﻞ ﺗﻘﺴﻴﻢ دارﻳﻢ ﻛﻪ‬
‫‪AL‬‬
‫‪00000101‬‬

‫‪AH‬‬
‫‪01111100‬‬

‫ﻣﺘﻐﻴﺮ ‪X‬‬
‫‪10110100‬‬

‫ﻣﺜﺎل ‪4-33‬‬
‫‪X‬‬ ‫‪DW 2600‬‬
‫‪MOV‬‬ ‫‪AX, 00A2H‬‬
‫‪MOV‬‬ ‫‪DX, 0B1CH‬‬
‫‪DIV‬‬ ‫‪X‬‬

‫‪DX‬‬ ‫‪AX‬‬
‫‪0000101100001100‬‬ ‫‪0000000010100010‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺘﻐﻴﺮ ‪ X‬را از ﻧﻮع ‪ Word‬ﺑﺎ ﻣﻘﺪار ‪ 2600‬ﺗﻌﺮﻳﻒ ﻧﻤـﻮده‪،‬‬


‫دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 00A2H‬را در ﺛﺒﺎت ‪ AX‬ﻗـﺮار داده و دﺳـﺘﻮراﻟﻌﻤﻞﺳـﻮم‬
‫ﻣﻘــﺪار ‪ BlC‬در ﺳﻴــﺴﺘﻢ ‪ 16‬ﺗــﺎﺋﻲ را در ﺛﺒــﺎت ‪ AX‬ﻗــﺮار داده و ﻧﻬﺎﻳﺘــﺎً آﺧــﺮﻳﻦ‬
‫دﺳـﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘـﻮي ‪ DX: AX‬ﻳﻌﻨـﻲ ‪ 0B1C00A2‬در ﺳﻴـﺴﺘﻢ ‪ 16‬ﺗـﺎﺋﻲ را ﺑـﺮ‬
‫‪٩٣‬‬

‫‪ 2600‬ﺗﻘﺴﻴﻢ ﻧﻤﻮده ﺧﺎرج ﻗﺴﻤﺖ را در ‪ AX‬و ﺑﺎﻗﻴﻤﺎﻧﺪه در ﺛﺒﺎت ‪ DX‬ﻗﺮار ﻣﻲدﻫﺪ‬


‫و ﻣﻘﺪار ‪ X‬ﺑﺪون ﺗﻐﻴﻴﺮ ﻳﻌﻨﻲ ﻣﻘﺪار ‪ 2600‬ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ IDIV‬ﻣﺸﺎﺑﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ DIV‬ﻣـﻲﺑﺎﺷـﺪ ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ‬
‫ﻋﻤﻠﻮﻧﺪﻫﺎ را ﺑﺼﻮرت ﻋﻼﻣﺘﺪار در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪ .‬ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت‬
‫زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪IDIV‬‬ ‫‪Opr‬‬

‫در ﻣﻮرد اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ IDIV‬ﺑﺎﻳﺴﺘﻲ ﻧﻜﺎت زﻳﺮ را در ﻧﻈﺮ داﺷﺖ‪.‬‬


‫اﻟﻒ( ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫ب( ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫ج( ﻋﻤﻠﻮﻧﺪ ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬
‫د( ﭼﻨﺎﻧﭽﻪ ‪ opr‬از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AX‬ﺑـﺮ ﻣﻘـﺪار ‪ opr‬ﺗﻘـﺴﻴﻢ ﻧﻤـﻮده‬
‫ﺧﺎرج ﻗﺴﻤﺖ را در ﺛﺒﺎت ‪ AL‬و ﺑﺎﻗﻴﻤﺎﻧﺪه را در ﺛﺒﺎت ‪ AH‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ﻫـ ( ﭼﻨﺎﻧﭽﻪ ‪ opr‬از ﻧﻮع ‪ word‬ﺑﺎﺷـﺪ ﻣﺤﺘـﻮي ﺛﺒـﺎت ‪ DX:AX‬را ﺑـﺮ ‪ opr‬ﺗﻘـﺴﻴﻢ‬
‫ﻧﻤﻮده و ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ را در ‪ AX‬و ﺑﺎﻗﻴﻤﺎﻧﺪه را در ﺛﺒﺎت ‪ DX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ز( دﺳﺘﻮراﻟﻌﻤﻞ ‪ ،IDIV‬ﻫـﺮ دو ﻋﻤﻠﻮﻧـﺪ را ﺑـﺼﻮرت ‪) Signed‬ﻋﻼﻣﺘـﺪار( در ﻧﻈـﺮ‬
‫ﻣﻲﮔﻴﺮد‪.‬‬

‫ﻣﺜﺎل ‪4-34‬‬
‫‪MOV‬‬ ‫‪BL, 0B4H‬‬
‫‪MOV‬‬ ‫‪AX, 0400H‬‬
‫‪IDIV‬‬ ‫‪BL‬‬

‫‪BL‬‬
‫‪10110100‬‬

‫‪AX‬‬
‫‪0000010000000000‬‬
‫‪٩٤‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪ B4‬در ﺳﻴـﺴﺘﻢ ﻣﺒﻨـﺎي ‪ 16‬را در ﺛﺒـﺎت ‪ BL‬ﻗـﺮار‬


‫ﻣﻲدﻫﺪ ﭼـﻮن از دﺳـﺘﻮراﻟﻌﻤﻞ ‪ IDIV‬اﺳـﺘﻔﺎده ﺷـﺪه اﺳـﺖ ﻋﻤﻠﻮﻧـﺪﻫﺎ را ﺑـﺼﻮرت‬
‫ﻋﻼﻣﺖ دار در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪ .‬ﻳﻌﻨﻲ اﮔﺮ ‪ MSB‬ﻋﻤﻠﻮﻧﺪ ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷـﺪ آن را ﻣﻨﻔـﻲ‬
‫ﺗﻠﻘﻲ ﻣﻲﻧﻤﺎﻳﺪ ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻘﺪار ﺛﺒﺎت ‪ BL‬را ﺑﺼﻮرت زﻳﺮ در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪.‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬


‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪128 + 32 + 16 + 4 = 180‬‬
‫‪180 – 256 = -76‬‬

‫دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 400H‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪ ،‬ﻛﻪ ﻣﻘﺪار آن‬
‫ﺑﺮاﺑﺮ ﺑﺎ ‪ 1024‬ﻣﻲﺑﺎﺷﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 1024‬را ﺑﺮ ‪ –76‬ﺗﻘـﺴﻴﻢ ﻧﻤـﻮده‪،‬‬
‫ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ ﺑﺮاﺑﺮ ﺑﺎ ‪ –13‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ در ﺛﺒﺎت ‪ AL‬ﻗـﺮار داده ﻣـﻲﺷـﻮد و ﺑﺎﻗﻴﻤﺎﻧـﺪه‬
‫راﻛــﻪ ﺑﺮاﺑــﺮ ﺑــﺎ ‪ 36‬ﻣــﻲﺑﺎﺷــﺪ در ﺛﺒــﺎت ‪ AH‬ﻗــﺮار ﻣــﻲدﻫــﺪ و ﻣﻘــﺪار ‪BL‬‬
‫ﺑــﺪون ﺗﻐﻴﻴــﺮ ﺑــﺎﻗﻲ ﻣــﻲﻣﺎﻧــﺪ‪ .‬ﻣﻘــﺎدﻳﺮ ﺛﺒﺎﺗﻬــﺎ ﭘــﺲ از اﺟــﺮاي دﺳــﺘﻮراﻟﻌﻤﻠﻬﺎ‬
‫ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫‪AL‬‬
‫‪11110011‬‬
‫‪AH‬‬
‫‪00100100‬‬
‫‪BL‬‬
‫‪10110100‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳـﺘﻮراﻟﻌﻤﻞ ‪ IDIV‬روي ﻫـﻴﭻ ﻓﻠﮕـﻲ اﺛـﺮ ﻧـﺪارد و‬


‫ﻣﻘﺎدﻳﺮ ﻓﻠﮓﻫﺎي‪ SF ،ZF ،PF ،OF ،CF ،AF‬ﺗﻌﺮﻳﻒ ﻧﺸﺪه ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫‪٩٥‬‬

‫ﻣﺜﺎل ‪4-35‬‬
‫‪MOV‬‬ ‫‪AX, 2ACH‬‬
‫‪MOV‬‬ ‫‪DX, 0B2H‬‬
‫‪MOV‬‬ ‫‪BX, 004AH‬‬
‫‪IDIV‬‬ ‫‪BX‬‬

‫اوﻟﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪ 2AC‬در ﺳﻴـﺴﺘﻢ ﻣﺒﻨـﺎي ‪ 16‬را در ﺛﺒـﺎت ‪ AX‬و‬


‫ﻣﻘﺪار ‪ B2‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨﺎي ‪ 16‬را در ﺛﺒﺎت ‪ DX‬ﻗﺮار داده ﻣﺤﺘﻮي ﺛﺒﺎﺗﻬﺎي ‪DX:AX‬‬
‫ﻳﻌﻨﻲ ‪ 00B202AC‬در ﺳﻴﺴﺘﻢ ‪ 16‬ﻣﺒﻨﺎي را ﺑﺮ ‪ 004A‬در ﺳﻴﺴﺘﻢ ﻣﺒﻨـﺎي ‪ 16‬ﺗﻘـﺴﻴﻢ‬
‫ﻧﻤﻮده ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ را در ‪ AX‬و ﺧﺎرج ﻗﺴﻤﺖ را در ‪ DX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-36‬‬
‫‪X‬‬ ‫‪DB 0A2H‬‬
‫‪MOV‬‬ ‫‪AX, 0502H‬‬
‫‪IDIV‬‬ ‫‪X‬‬

‫اوﻟﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ ﻣﻘـﺪار ‪ A2‬در ﺳﻴـﺴﺘﻢ ‪ 16‬ﺗـﺎﺋﻲ ﻳﻌﻨـﻲ ‪ 10100010‬در‬


‫ﺳﻴﺴﺘﻢ دودوﻳﻲ را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺘﻐﻴﺮ ‪X‬‬
‫‪10100010‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬


‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪128 + 32 + 2 = 162‬‬
‫‪162 – 256 = -94‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ دو‪‬م ﻣﻘﺪار ‪ 0502H‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬


‫‪AX‬‬
‫‪0000010100000010‬‬
‫‪٩٦‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1024‬‬ ‫‪512‬‬ ‫‪256‬‬ ‫‪128‬‬ ‫‪64‬‬ ‫‪32‬‬ ‫‪16‬‬ ‫‪8‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪1024 + 256 + 2 = 1282‬‬


‫آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 1282‬را ﺑﺮ ‪ –94‬ﺗﻘﺴﻴﻢ ﻧﻤﻮده ﺧﺎرج ﻗﺴﻤﺖ ﻛـﻪ‬
‫ﺑﺮاﺑﺮ ﺑﺎ ‪ –13‬ﻣﻲﺑﺎﺷﺪ را در ﺛﺒﺎت ‪ AL‬و ﺑﺎﻗﻴﻤﺎﻧﺪه را ﻛﻪ ﻣﻌﺎدل ‪ 60‬ﻣﻲﺑﺎﺷﺪ در ﺛﺒـﺎت‬
‫‪ AH‬ﻗﺮار ﻣﻲدﻫﺪ و ﻣﻘﺪار ‪ X‬ﻫﻤﺎن ﻣﻘﺪار ﻗﺒﻠﻲ ﻳﻌﻨﻲ ‪ A2H‬را دارد‪.‬‬

‫ﻣﺘﻐﻴﺮ ‪X‬‬
‫‪10100010‬‬
‫‪AL‬‬
‫‪11110011‬‬
‫‪AH‬‬
‫‪00111100‬‬

‫‪ -4-8‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻛﺎﻫﺶ و اﻓﺰاﻳﺶ‬


‫ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ DEC‬ﻣﻲﺗﻮان ﻳﻚ واﺣـﺪ از ﻣﻘـﺪار ﻋﻤﻠﻮﻧـﺪ ﻛـﻢ‬
‫ﻧﻤﻮد‪ .‬ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪DEC‬‬ ‫‪opr‬‬

‫ﻧﻜﺎت ذﻳﻞ را ﺑﺎﻳﺴﺘﻲ در ﻣﻮﻗﻊ اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ در ﻧﻈﺮ داﺷﺖ‪.‬‬


‫اﻟﻒ( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ‪ word‬ﻳﺎ ﺑﺎﻳﺖ ﺑﺎﺷﺪ‪.‬‬
‫ب(‪ opr‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫ج(اﻳﻦ دﺳﺘﻮر اﻟﻌﻤﻞ ﻓﻘﻂ روي ﻓﻠﮓﻫﺎي ‪ PF ، AF ، ZF ،OF ، SF‬اﺛﺮ دارد‪.‬‬

‫ﻣﺜﺎل‪4-37‬‬
‫‪MOV‬‬ ‫‪AX, 3000‬‬
‫‪DEC‬‬ ‫‪AX‬‬
‫‪٩٧‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ اول ﻣﻘﺪار ‪ 3000‬را در ﺛﺒﺎت ‪ AX‬ﻗﺮار ﻣـﻲ دﻫـﺪ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫دوم ﻳﻚ واﺣﺪ از ﻣﺤﺘﻮي ‪ AX‬ﻛﻢ ﻧﻤﻮده ﻧﺘﻴﺠﻪ را در ‪ AX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻗﺒﻞ از اﺟﺮاي ‪DEC‬‬


‫‪AX‬‬
‫‪3000‬‬

‫ﺑﻌﺪ از اﺟﺮاي ‪DEC‬‬


‫‪AX‬‬
‫‪2999‬‬

‫ﻣﺜﺎل ‪4-38‬‬
‫‪X‬‬ ‫‪DB 130‬‬
‫‪LEA‬‬ ‫‪BX , X‬‬
‫‪DEC‬‬ ‫]‪[BX‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪار ‪ 130‬را در ﻣﺘﻐﻴﺮ ‪ X‬ﻗﺮار داده‪ ،‬دوﻣﻴﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫آدرس ﻣﺘﻐﻴﺮ ‪ X‬را در ﺛﺒﺎت ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﻧﮕﺎه ﻣﺤﺘﻮي ﻣﺤﻠﻲ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ‪BX‬‬
‫اﺷﺎره ﻣﻲﺷﻮد را ﻳﻜﻲ ﻛﺎﻫﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪BX‬‬ ‫‪2000‬‬
‫‪2002‬‬ ‫‪2001‬‬
‫‪2002‬‬ ‫‪130‬‬ ‫‪X‬‬
‫‪2003‬‬
‫‪2004‬‬
‫‪٩٨‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪DEC‬‬

‫‪BX‬‬ ‫‪2000‬‬
‫‪2002‬‬ ‫‪2001‬‬
‫‪2002‬‬ ‫‪129‬‬
‫‪2003‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ INC‬ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻳﻚ واﺣﺪ ﺑﻪ ﻋﻤﻠﻮﻧﺪ اﺿﺎﻓﻪ ﮔﺮدد‪ .‬ﺷﻜﻞ‬


‫ﻛﻞ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻋﺒﺎرﺗﺴﺖ از‬
‫‪INC‬‬ ‫‪Opr‬‬

‫در ﻣﻮرد اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻳﺴﺘﻲ ﻧﻜﺎت ذﻳﻞ را رﻋﺎﻳﺖ ﻧﻤﻮد‪.‬‬
‫اﻟﻒ( ‪ opr‬ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫ب( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫د( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ روي ﻓﻠﮓﻫﺎي ‪ AF ، ZF ،OF ، SF‬و ‪ PF‬اﺛﺮ دارد‪.‬‬
‫ﻣﺜﺎل ‪4-39‬‬
‫‪MOV‬‬ ‫‪AL, 100‬‬
‫‪INC‬‬ ‫‪AL‬‬
‫ﻣﻘﺪار ‪ AL‬را ﺑﻪ ‪ 101‬اﻓﺰاﻳﺶ ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪4-40‬‬
‫‪X‬‬ ‫‪DB 10,20,26,44,6‬‬
‫‪MOV‬‬ ‫‪SI , 2‬‬
‫‪MOV‬‬ ‫‪BX, OFFSET X‬‬
‫‪INC‬‬ ‫]‪[BX] [SI‬‬
‫‪٩٩‬‬

‫اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ آراﻳﻪ ‪ 5‬ﻋﻨﺼﺮي از ﻧﻮع ﺑﺎﻳﺖ ﺑﻨﺎم ‪ X‬اﻳﺠﺎد ﻣﻲﻧﻤﺎﻳـﺪ‪.‬‬


‫ﻣﻘﺎدﻳﺮ ﻋﻨﺎﺻﺮ آراﻳﻪ ﻋﺒﺎرﺗﻨﺪ از ﺑﺘﺮﺗﻴﺐ‪ .10 ،20 ،26 ،40 ،6‬دﺳﺘﻮراﻟﻌﻤﻞ دوم ﻣﻘﺪار ‪2‬‬
‫را در رﺟﻴﺴﺮ ‪ SI‬ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ﺳـﻮم آدرس ﻣﺘﻐﻴـﺮ ‪ X‬را در ﺛﺒـﺎت ‪BX‬‬
‫ﻗﺮار ﻣﻲدﻫﺪ‪ .‬آﺧﺮﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ واﺣﺪ ﺑﻪ ﻣﺤﺘﻮي ﺧﺎﻧﻪاي از ﺣﺎﻓﻈﻪ ﻛﻪ ﺑﻮﺳـﻴﻠﻪ‬
‫ﻣﺤﺘﻮي ‪ BX+2‬اﺷﺎره ﻣﻲﻛﻨﺪ اﺿﺎﻓﻪ ﻣﻲﮔﺮداﻧﺪ‪.‬‬

‫‪2999‬‬
‫‪3000‬‬ ‫‪10‬‬ ‫‪X‬‬
‫‪3001‬‬ ‫‪20‬‬
‫‪BX‬‬ ‫‪3002‬‬ ‫‪26‬‬
‫‪3000‬‬ ‫‪3003‬‬ ‫‪41‬‬
‫‪3004‬‬ ‫‪6‬‬
‫‪SI‬‬
‫‪2‬‬

‫در ﺣﻘﻴﻘﺖ ﻣﻘﺪار ﺧﺎﻧﻪ ﺣﺎﻓﻈﻪ ﺑﺎ آدرس ‪ 3002‬از ‪ 26‬ﺑﻪ ‪ 27‬اﻓﺰاﻳﺶ ﻣﻲﻳﺎﺑﺪ‪.‬‬

‫‪ -4-9‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺎﺳﺒﻪ ﻣﻜﻤﻞ ‪2‬‬


‫ﺑﺮاي ﭘﻴﺪا ﻧﻤﻮدن ﻣﻜﻤﻞ ‪ 2‬ﻳﻚ ﻣﻘﺪار‪ ،‬از دﺳﺘﻮراﻟﻌﻤﻞ ‪ NEG‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫ﺷﻜﻞ ﻛﻠﻲ آن ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪NEG‬‬ ‫‪Opr‬‬
‫اﻟﻒ( ﻣﻘﺪار ﻣﻜﻤﻞ ‪ 2‬ﻋﻤﻠﻮﻧﺪ ‪ opr‬را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده در ‪ opr‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ب( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫‪١٠٠‬‬

‫ج( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬


‫د( ‪ opr‬ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ﻫـ( روي ﻓﻠﮓﻫﺎي ‪ AF ، ZF ،CF ،OF ، SF‬و ‪ PF‬اﺛﺮ دارد‪.‬‬

‫ﻣﺜﺎل ‪4-41‬‬
‫‪MOV‬‬ ‫‪AX, -100‬‬
‫‪NEG‬‬ ‫‪AX‬‬

‫ﻣﻘﺪار ‪ AX‬را ﺑﻪ ‪ 100‬ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‪.‬‬

‫‪X‬‬ ‫‪DB‬‬ ‫?‬


‫‪MOV‬‬ ‫‪X, 26‬‬
‫‪NEG‬‬ ‫‪X‬‬

‫ﻣﻘﺪار ‪ X‬ﻛﻪ از ﻧﻮع ﺑﺎﻳﺖ ﻣﻲﺑﺎﺷﺪ ﻧﻬﺎﻳﺘﺎً ﺑﺮاﺑﺮ ﺑﺎ ‪ –26‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫در ﻓﺼﻞ ﻧﻬﻢ ﻧﺤﻮه ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ و اﺟﺰاي آن ﺑﻴﺎن ﮔﺮدﻳﺪه اﺳﺖ‪.‬‬
‫‪١٠١‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬ﺑﺮاي ﺟﻤﻊ ﻧﻤﻮدن دو ﻣﻘﺪار از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ‬
‫‪ word‬و دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﺑﺮاي ﺗﻔﺮﻳﻖ ﻛﺮدن دو ﻣﻘﺪار از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬داده‬
‫ﺷﺪ‪ .‬ﺷﻜﻞ ﻛﻠﻲ آﻧﻬﺎ ﺑﺼﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬

‫‪ADD‬‬ ‫‪dst , src‬‬


‫‪SUB‬‬ ‫‪dst , src‬‬

‫ﻻزم ﺑﻪ ذﻛﺮ اﺳﺖ ﻛﻪ اﻳـﻦ دو دﺳـﺘﻮراﻟﻌﻤﻞ روي ﻓﻠـﮓﻫـﺎي ﻣﺤﺎﺳـﺒﺎﺗﻲ اﺛـﺮ‬


‫ﻣﻲﮔﺬارﻧﺪ و ﻫﺮ دو ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪ .‬از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ADC‬‬
‫و ‪ SBB‬ﺑﺘﺮﺗﻴﺐ ﺑـﺮاي ﺟﻤـﻊ و ﺗﻔﺮﻳـﻖ دو ﻣﻘـﺪار از ﺗـﻮع ‪ double word‬اﺳـﺘﻔﺎده‬
‫ﻣﻲﮔﺮدد‪ .‬ﻓﺮق اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑﺎ دو دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻻ ﻓﻘﻂ در اﺳﺘﻔﺎده از ﻣﻘﺪار ‪CF‬‬
‫ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﺿﺮب دو ﻣﻘﺪار ﺑﺪون ﻋﻼﻣﺖ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬از دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫‪ MUL‬و ﺑﺮاي ﺿﺮب دو ﻣﻘﺪار ﺑﺎ ﻋﻼﻣﺖ از ﻧـﻮع ﺑﺎﻳـﺖ ﻳـﺎ ‪ word‬از دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫‪ IMUL‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺿﺮب ﻳـﻚ ﻋﻤﻠﻮﻧـﺪي ﻣـﻲﺑﺎﺷـﻨﺪ و اﻳـﻦ‬
‫ﻋﻤﻠﻮﻧﺪ ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧـﺪ ﺑﺎﺷـﺪ‪ .‬ﻋﻤﻠﻮﻧـﺪ دﻳﮕـﺮ از ﺛﺒـﺎتﻫـﺎي ‪ AL‬ﻳـﺎ ‪ AX‬اﺳـﺘﻔﺎده‬
‫ﻣﻲﮔﺮدد‪ .‬ﺷﻜﻞ ﻛﻠﻲ ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫‪MUL‬‬ ‫‪Opr‬‬
‫‪IMUL‬‬ ‫‪Opr‬‬

‫ﺑﻬﻤﻴﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي ﺗﻘﺴﻴﻢ دو ﻣﻘﺪار از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي‬


‫‪ DIV‬و ‪ IDIV‬ﺑﺮ ﺣﺴﺐ آﻧﻜﻪ ﻋﻤﻠﻮﻧﺪﻫﺎ ﺑﺪون ﻋﻼﻣﺖ ﻳﺎ ﺑﺎ ﻋﻼﻣﺖ در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ‬
‫ﺷﺪﻧﺪ اﺳـﺘﻔﺎده ﻣـﻲﮔـﺮدد‪ .‬دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ DEC‬و ‪ INC‬ﻳـﻚ ﻋﻤﻠﻮﻧـﺪي ﺑـﻮده و‬
‫ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺗﻮاﻧﺪ ﺛﺎﺑﺖ ﺑﺎﺷﺪ و ﺑﺎﻋﺚ ﺑﺘﺮﺗﻴﺐ ﻛﺎﻫﺶ ﻳﺎ اﻓﺰاﻳﺶ ﻳﻚ واﺣﺪ ﺑﻪ ﻋﻤﻠﻮﻧﺪ‬
‫ﻣﻲﺑﺎﺷﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ NEG‬ﻧﻴﺰ ﻳﻚ ﻋﻤﻠﻮﻧﺪي ﺑﻮده ﺑﺎﻋـﺚ ﺗﻐﻴﻴـﺮ ﻋﻼﻣـﺖ ﻋﻤﻠﻮﻧـﺪ‬
‫ﻣﻲﮔﺮدد‪.‬‬
‫‪١٠٢‬‬

‫‪ a‬ﺗﻤﺮﻳﻦ‬
‫‪-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD‬روي ﻛﺪام ﻓﻠﮓ اﺛﺮ دارد؟‬
‫‪-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ DEC‬روي ﻛﺪام ﻓﻠﮓ اﺛﺮ ﻧﺪارد؟‬
‫‪-3‬در دﺳﺘﻮراﻟﻌﻤﻞ ‪ IDIV‬ﻣﻘﺎدﻳﺮ ﻛﺪام ﻓﻠﮓ ﺗﻌﺮﻳﻒ ﻧﺸﺪه ﻣﻲﺑﺎﺷﺪ؟‬
‫‪-4‬اﻟﮕﻮرﻳﺘﻤﻲ را اراﻳﻪ دﻫﻴﺪ ﻛﻪ دو ﻣﻘﺪار از ﻧـﻮع ‪ double word‬را در ﻫـﻢ ﺿـﺮب‬
‫ﻧﻤﺎﻳﺪ‪.‬‬
‫‪-5‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﺮاي اﻟﮕﻮرﻳﺘﻢ ﺗﻤﺮﻳﻦ ‪ 4‬اراﻳﻪ ﻛﻨﻴﺪ‪.‬‬
‫‪-6‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻻزم ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﻣﺠﻤﻮع ﺛﺒﺎﺗﻬﺎي ‪ CX ،BX ،AX‬و ‪ DX‬اراﻳﻪ‬
‫ﻛﻨﻴﺪ‪.‬‬
‫‪-7‬ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮان ﻣﻘﺪار ﺛﺒـﺎت ‪ AX‬را ﺻـﻔﺮ ﻧﻤـﻮد؟ دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﻻزم را‬
‫اراﻳﻪ ﻛﻨﻴﺪ‪.‬‬
‫‪-8‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ‪ MUL‬ﺑﺮ ﭼﻪ ﻓﻠﮓﻫﺎﺋﻲ اﺛﺮ ﻧﺪارد؟‬
‫‪-9‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺠﻤﻮع ﻋﻨﺎﺻﺮ آراﻳـﻪ ‪ 5‬ﻋﻨـﺼﺮي ‪ X‬از ﻧـﻮع ‪ word‬را‬
‫ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪-10‬ﻗﻄﻌــﻪ ﺑﺮﻧﺎﻣــﻪاي ﺑﻨﻮﻳــﺴﻴﺪ ﻛــﻪ ﻣﺠﻤــﻮع ﻋﻨﺎﺻــﺮ آراﻳــﻪ ‪ 5‬ﻋﻨــﺼﺮي ‪ X‬از ﻧــﻮع‬
‫‪ double word‬را ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪-11‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻌﺎدل ‪ LEA‬ﻣﺸﺨﺺ ﻛﻨﻴﺪ‪.‬‬
‫‪-12‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻌﺎدل ‪ INC BX‬ﻣﺸﺨﺺ ﻛﻨﻴﺪ‪.‬‬
‫‪-13‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ را ﺑﻪ اﺳﻤﺒﻠﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫;‪long int x,y,z,w‬‬
‫;‪w=x+y-z+30‬‬
‫‪-14‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺣﺎﺻﻠﻀﺮب ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي ‪ CL ،BL ،AL‬و ‪ DL‬را‬
‫ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪-15‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ را ﺑﻪ اﺳﻤﺒﻠﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪١٠٣‬‬

‫‪VAR‬‬
‫; ‪X, Y, Z, W : 1 ..20‬‬
‫;‪W : = X + Y * Z-W + 100‬‬
‫‪-16‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺣﺎﺻﻠﻀﺮب ﻋﻨﺎﺻﺮ آراﻳﻪ ﭼﻬﺎر ﻋﻨـﺼﺮي ‪ X‬از ﻧـﻮع‬
‫ﺑﺎﻳﺖ را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ؟ در ﺻﻮرﺗﻴﻜﻪ ﺑﺎ ﻣﺸﻜﻠﻲ روﺑﺮو ﺷﺪﻳﺪ ذﻛﺮ ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫‪ -17‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻌﺎدل زﻳﺮ ﺑﻪ اﺳﻤﺒﻠﻲ ﺑﺪﻫﻴﺪ‪.‬‬
‫;‪int x, y, z, w‬‬
‫;‪w = x –y + z – 200‬‬
‫‪-18‬ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﺤﺘﻮي ‪ AL‬را ﺑﻴﻚ ‪ word‬ﺗﺒﺪﻳﻞ ﻧﻤـﻮده و ﻧﺘﻴﺠـﻪ را در ‪AX‬‬
‫ﻗﺮار دﻫﻴﻢ ﻣﺤﺘﻮي ‪ AH‬ﭼﻴﺴﺖ؟‬
‫‪-19‬در ﻣﻮرد ﺗﻤﺮﻳﻦ ‪ 18‬ﭼﻨﺎﻧﭽﻪ ‪ MSB‬ﺛﺒـﺎت ‪ AL‬ﺑﺮاﺑـﺮ ﻳـﻚ ﺑﺎﺷـﺪ ﻣﺤﺘـﻮي ‪AH‬‬
‫ﭼﻴﺴﺖ؟‬
‫‪-20‬دﺳﺘﻮراﻟﻌﻤﻞ ﻻزم ﺑﺮاي اﻧﺠﺎم ﻣﺤﺎﺳﺒﻪ زﻳﺮ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ‪.‬‬
‫;‪int x,y,z,w‬‬
‫;‪w = x/y * z-10‬‬
‫‪١٠٤‬‬

‫ﻓﺼﻞ ﭘﻨﺠﻢ‬
‫اﻧﺸﻌﺎب و ﺗﻜﺮار‬

‫ﻫﺪف ﻛﻠﻲ‬
‫آﺷﻨﺎﺋﻲ ﺑﺎ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﻧﺸﻌﺎب و ﺗﻜﺮار در زﺑﺎن اﺳﻤﺒﻠﻲ‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻔﺎﻫﻴﻢ و ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬
‫‪ -1‬ﭘﺮش ﻏﻴﺮ ﺷﺮﻃﻲ‬
‫‪ -2‬ﭘﺮﺷﻬﺎي ﺷﺮﻃﻲ‬
‫‪ -3‬ﻣﻘﺎﻳﺴﻪ‬
‫‪ -4‬اﻧﻮاع دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺗﻜﺮار‬

‫‪ -5-1‬دﺳﺘﻮراﻟﻌﻤﻞ ﭘﺮش ﻏﻴﺮ ﺷﺮﻃﻲ‬


‫دﺳــﺘﻮراﻟﻌﻤﻞ ﭘــﺮش ﻏﻴــﺮ ﺷــﺮﻃﻲ در زﺑــﺎن اﺳــﻤﺒﻠﻲ ‪ JMP‬ﻣــﻲﺑﺎﺷــﺪ‪ .‬اﻳــﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻌﺎدل دﺳﺘﻮراﻟﻌﻤﻞ ‪ GOTO‬در ﺳﺎﻳﺮ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪﻧﻮﻳـﺴﻲ ﻣـﻲﺑﺎﺷـﺪ‪.‬‬
‫‪١٠٥‬‬

‫ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪ .‬اﻳﻦ دﺳﺘﻮر روي ﻫـﻴﭻ ﻓﻠﮕـﻲ اﺛـﺮ‬
‫ﻧﺪارد‪.‬‬
‫‪JMP‬‬ ‫آدرس‬
‫ﻣﺜﺎل ‪5-1‬‬

‫‪JMP‬‬ ‫‪LAB2‬‬

‫ﺑﺎ اﺟﺮاي اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻛﻨﺘﺮل ﺑﻪ ‪ LAB2‬ﻣﻨﺘﻘﻞ ﻣﻲﮔـﺮدد‪ .‬ﺑﺎﻳـﺴﺘﻲ ﺗﻮﺟـﻪ‬


‫داﺷﺖ ﻛﻪ ﻛﻨﺘﺮل ﺑﺪون ﻫﻴﭻ ﮔﻮﻧﻪ ﻗﻴﺪ و ﺷﺮﻃﻲ ﺑﻪ ‪ LAB2‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪5-2‬‬
‫‪MOV AL, 5‬‬
‫‪ADD AL, BL‬‬
‫‪JMP LAB1‬‬
‫‪MUL BL‬‬
‫‪INC BL‬‬
‫‪LAB1: SUB CX , 2‬‬
‫‪M‬‬
‫در ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق اﺑﺘﺪا ﻣﻘﺪار ‪ 5‬در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ ،‬ﺳـﭙﺲ ﻣﻘـﺪار‬
‫‪ BL‬ﺑﻪ آن اﺿﺎﻓﻪ ﮔﺮدﻳﺪ‪ .‬آﻧﮕﺎه ﻛﻨﺘـﺮل ﺑـﻪ ‪ LAB1‬ﻣﻨﺘﻘـﻞ ﻣـﻲﮔـﺮدد و دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫‪ SUB‬ﺑﻪ ﺑﻌﺪ اﺟﺮا ﻣﻲﮔﺮدد‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دو دﺳﺘﻮر ‪ MUL‬و ‪ INC‬اﺟﺮا‬
‫ﻧﻤﻲﺷﻮﻧﺪ‪.‬‬

‫‪ -5-2‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش ﺷﺮﻃﻲ‬


‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش ﺷﺮﻃﻲ وﻗﺘﻲ اﺟﺮا ﻣﻲﮔﺮدد ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﺷﺮﻃﻲ ﺑﺮﻗـﺮار‬
‫ﮔﺮدد‪ .‬ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪١٠٦‬‬

‫‪JX‬‬ ‫آدرس‬

‫ﻛﻪ ‪ X‬ﻳﻚ رﺷﺘﻪ ﻳﻚ ﺗﺎ ﺳﻪ ﻛﺎرﻛﺘﺮي ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪5-3‬‬
‫‪JZ‬‬ ‫‪LAB2‬‬

‫در ﺻﻮرﺗﻴﻜﻪ ﻣﻘﺪار ‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ ﻛﻨﺘﺮل ﺑﻪ ‪ LAB2‬در ﺑﺮﻧﺎﻣـﻪ ﻣﻨﺘﻘـﻞ‬


‫ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪5-4‬‬
‫‪JS‬‬ ‫‪LAB5‬‬

‫در ﺻﻮرﺗﻴﻜﻪ ﻣﻘﺪار ‪ SF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ ﻛﻨﺘﺮل ﺑﻪ ‪ LAB5‬در ﺑﺮﻧﺎﻣـﻪ ﻣﻨﺘﻘـﻞ‬


‫ﻣﻲﮔﺮدد‪.‬‬
‫ﻣﺜﺎل ‪5-5‬‬
‫‪JNO‬‬ ‫‪LAB20‬‬

‫ﭼﻨﺎﻧﭽﻪ ﻣﻘﺪار ‪ OF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺑﺎﺷﺪ ﻛﻨﺘـﺮل ﺑـﻪ ‪ LAB20‬در ﺑﺮﻧﺎﻣـﻪ ﻣﻨﺘﻘـﻞ‬
‫ﻣﻲﮔﺮدد‪ .‬از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻌﻤﻮﻻً ﭘﺲ از اﺟﺮاي ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫ﻣﺜﺎل ‪5-6‬‬
‫‪MOV‬‬ ‫‪AX, -100‬‬
‫‪ADD‬‬ ‫‪AX, BX‬‬
‫‪SUB‬‬ ‫‪AX, CX‬‬
‫‪JNZ‬‬ ‫‪LABNEXT‬‬
‫‪M‬‬
‫‪LABNEXT: MOV CX,10‬‬
‫‪M‬‬
‫‪١٠٧‬‬

‫در ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ اﺑﺘﺪا ﻣﻘـﺪار ‪ –100‬در ﺛﺒـﺎت ‪ AX‬ﻗـﺮار داده ﻣـﻲﺷـﻮد و‬
‫ﺳﭙﺲ ﻣﻘﺪار ‪ BX‬ﺑﻪ آن اﻓﺰوده ﻣﻲﮔﺮدد و ﺳﭙﺲ ﻣﻘـﺪار ‪ CX‬از آن ﻛـﺴﺮ ﻣـﻲﮔـﺮدد‪.‬‬
‫ﺣﺎل ﭼﻨﺎﻧﭽﻪ ﻧﺘﻴﺠﻪ ﻣﺤﺎﺳﺒﻪ ﻳﻌﻨﻲ ﻣﻘﺪار ‪ AX‬ﻣﺨﺎﻟﻒ ﺻـﻔﺮ ﺑﺎﺷـﺪ ﻛﻨﺘـﺮل ﺑـﻪ آدرس‬
‫‪ LABNEXT‬در ﺑﺮﻧﺎﻣﻪ ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬
‫ﺟﺪول ذﻳﻞ اﻧﻮاع دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﭘﺮش ﺷﺮﻃﻲ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪.‬‬

‫ﺟﺪول ‪5-1‬‬

‫ﻧﺎم دﻳﮕﺮ‬
‫ﻋﻤﻞ‬ ‫ﻧﺎم دﺳﺘﻮراﻟﻌﻤﻞ‬ ‫ﺷﺮط ﺗﺴﺖ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ‬
‫اﻧﺸﻌﺎب روي ﺻﻔﺮ‬ ‫‪JZ‬‬ ‫‪JE‬‬ ‫‪ZF=1‬‬
‫اﻧﺸﻌﺎب روي ﻣﺨﺎﻟﻒ ﺻﻔﺮ‬ ‫‪JNZ‬‬ ‫‪JNE‬‬ ‫‪ZF=0‬‬
‫اﻧﺸﻌﺎب روي ﻋﻼﻣﺖ ﻣﻨﻔﻲ‬ ‫‪JS‬‬ ‫‪SF=1‬‬
‫اﻧﺸﻌﺎب روي ﻋﻼﻣﺖ ﻏﻴﺮ ﻣﻨﻔﻲ‬ ‫‪JNS‬‬ ‫‪SF=0‬‬
‫اﻧﺸﻌﺎب روي ﺳﺮرﻳﺰي‬ ‫‪JO‬‬ ‫‪OF=1‬‬
‫اﻧﺸﻌﺎب روي ﻋﺪم ﺳﺮرﻳﺰي‬ ‫‪JNO‬‬ ‫‪OF=0‬‬
‫اﻧﺸﻌﺎب روي اﻳﺠﺎد ﺑﻴﺖ ﺗﻮازن‬ ‫‪JP‬‬ ‫‪JPE‬‬ ‫‪PF=1‬‬
‫اﻧﺸﻌﺎب روي ﻋﺪم اﻳﺠﺎد ﺑﻴﺖ ﺗﻮازن‬ ‫‪JNP‬‬ ‫‪JPO‬‬ ‫‪PF=0‬‬
‫اﻧﺸﻌﺎب روي اﻳﺠﺎد ﺑﻴﺖ ﻧﻘﻠﻲ‬ ‫‪JC‬‬ ‫‪CF=1‬‬
‫اﻧﺸﻌﺎب روي ﻋﺪم اﻳﺠﺎد ﺑﻴﺖ ﻧﻘﻠﻲ‬ ‫‪JNC‬‬ ‫‪CF=0‬‬

‫در ﺟﺪول ﺑﺎﻻ ﺣﺮوف ﻣﺨﻔﻒ ﻛﻠﻤﺎت زﻳﺮ ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬


‫‪١٠٨‬‬

‫‪Z‬‬ ‫‪ZERO‬‬
‫‪S‬‬ ‫‪SIGN‬‬
‫‪N‬‬ ‫‪NOT‬‬
‫‪P‬‬ ‫‪PARITY‬‬
‫‪O‬‬ ‫‪OVERFLOW‬‬
‫‪O‬‬ ‫‪ODD‬‬ ‫در ‪JPO‬‬
‫‪E‬‬ ‫‪EQUAL‬‬
‫‪J‬‬ ‫‪JUMP‬‬
‫‪E‬‬ ‫‪EVEN‬‬ ‫در ‪JPE‬‬
‫‪C‬‬ ‫‪CARRY‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش در ﺣﻘﻴﻘﺖ ﻧﻘﺶ دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫‪ IF‬در ﺳﺎﻳﺮ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ را دارد‪.‬‬

‫ﻣﺜﺎل ‪5-7‬‬
‫‪TOT‬‬ ‫? ‪DW‬‬
‫‪MOV‬‬ ‫‪TOT, 0‬‬
‫‪MOV‬‬ ‫‪CX, 10‬‬
‫‪BEGIN:‬‬ ‫‪ADD TOT, CX‬‬
‫‪DEC‬‬ ‫‪CX‬‬
‫‪JNZ‬‬ ‫‪BEGIN‬‬

‫در ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ﻣﺘﻐﻴﺮ ‪ TOT‬از ﻧﻮع ‪ word‬ﺗﻌﺮﻳـﻒ ﮔﺮدﻳـﺪه و ﻣﻘـﺪار آن‬
‫ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻗﺮار داده ﺷﺪه اﺳﺖ‪ .‬ﻣﻘﺪار اوﻟﻴﻪ ‪ CX‬ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ ‪ 10‬ﻣـﻲﺑﺎﺷـﺪ‪ .‬ﻗﻄﻌـﻪ‬
‫ﺑﺮﻧﺎﻣﻪ ﻧﻘﺶ ﻳﻚ ﺣﻠﻘﻪ ﺗﻜﺮار دارد ﻛﻪ ﻣﻘﺎدﻳﺮ ‪ 1‬ﺗﺎ ‪ 10‬را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣـﻲﻧﻤﺎﻳـﺪ ﻳﻌﻨـﻲ‬
‫ﺗﺎ ﻣﺎداﻣﻴﻜﻪ ﻣﻘﺪار ‪ CX‬ﻣﺨﺎﻟﻒ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ‪ ،‬ﻣﻘﺪار ‪ CX‬ﺑﺎ ‪ TOT‬ﺟﻤﻊ ﻣـﻲﮔـﺮدد و‬
‫ﻳﻚ واﺣﺪ از ‪ CX‬ﻛﻢ ﻣﻲﮔﺮدد‪.‬‬
‫‪١٠٩‬‬

‫ﻣﺜﺎل ‪5-8‬‬
‫‪X‬‬ ‫? ‪DW‬‬
‫‪MOV‬‬ ‫‪AX ,X‬‬
‫‪SUB‬‬ ‫‪AX, 100‬‬
‫‪NEG‬‬ ‫‪AX‬‬
‫‪JNS‬‬ ‫‪ACT2‬‬
‫‪M‬‬
‫‪ACT2 : ADD BX , AX‬‬
‫‪M‬‬
‫ﻣﻘﺪار ‪ X‬در ﺛﺒﺎت ‪ AX‬ﻗﺮار داده ﺷﺪه آﻧﮕﺎه ‪ 100‬واﺣـﺪ ﻛـﺎﻫﺶ داده ﺷـﺪه‬
‫ﺳﭙﺲ ﻣﻘﺪار ‪ AX‬در ﻣﻨﻔﻲ ﻳﻚ ﺿﺮب ﺷﺪه ﺣﺎل ﭼﻨﺎﻧﭽـﻪ ﻣﻘـﺪار ‪ AX‬ﻣﻨﻔـﻲ ﻧﺒﺎﺷـﺪ‬
‫ﻛﻨﺘﺮل ﺑﻪ ‪ ACT2‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪ .‬در ﻏﻴﺮ اﻳﻨﺼﻮرت اﺟـﺮاي دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﻌـﺪي‬
‫اداﻣﻪ ﻣﻲﻳﺎﺑﺪ‪.‬‬

‫‪ -5-3‬دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎﻳﺴﻪ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎﻳﺴﻪ در زﺑﺎن اﺳﻤﺒﻠﻲ ‪ CMP‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ‬

‫ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪CMP opr1 , opr2‬‬

‫اﻟﻒ( ‪ opr1‬و ‪ opr2‬ﻫﺮ دو از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﻨﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎدﻳﺮ‬


‫ﻋﻤﻠﻮﻧﺪﻫﺎ را ﺗﻐﻴﻴﺮ ﻧﻤﻲدﻫﺪ‪.‬‬
‫ب( ‪ opr1‬و ‪ opr2‬ﻣﻲﺗﻮاﻧﻨﺪ ﻫﺮ دو ﺛﺒﺎت ﺑﺎﺷﻨﺪ‪.‬‬
‫ج( ‪ opr1‬و ‪ opr2‬ﻫﺮ دو ﻧﻤﻲﺗﻮاﻧﻨﺪ ﻣﺘﻐﻴﺮ ﺑﺎﺷﻨﺪ‪.‬‬
‫د( ‪ opr1‬و ‪ opr2‬ﻫﺮ دو ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺛﺎﺑﺖ ﺑﺎﺷﻨﺪ‪.‬‬
‫ﻫـ (دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﻤﻞ ﻣﻲﻛﻨﺪ‪ ،‬ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ‬
‫ﻧﺘﻴﺠﻪ درﺟﺎﺋﻲ ذﺧﻴﺮه ﻧﻤﻲﮔﺮدد ﺑﻠﻜﻪ ﻣﻘﺎدﻳﺮ ﻓﻠﮓﻫﺎ را ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‪.‬‬
‫ز( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ روي ﻓﻠﮓﻫﺎي‪ SF ،ZF ،PF ،SF ،OF ، AF‬اﺛﺮ دارد‪.‬‬
‫‪١١٠‬‬

‫ﻣﺜﺎل ‪5-9‬‬
‫‪CMP‬‬ ‫‪AX , BX‬‬

‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ دو ﻣﻘﺪار ‪ BX , AX‬را ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬در ﺣﻘﻴﻘـﺖ‬


‫ﻣﻘﺪار ‪ BX‬را از ‪ AX‬ﻛﻢ ﻧﻤﻮده و ﺑﺮﺣﺴﺐ ﻧﺘﻴﺠـﻪ ﺑﺪﺳـﺖ آﻣـﺪه ﻣﻘـﺎدﻳﺮ ﻓﻠﮕﻬـﺎ را‬
‫ﺗﻌﻴﻴﻦ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫ﻣﺜﺎل ‪5-10‬‬
‫‪CMP‬‬ ‫‪AL , 10‬‬
‫‪JZ‬‬ ‫‪LAB2‬‬
‫ﻣﻘﺪار ‪ AL‬را ﺑﺎ ‪ 10‬ﻣﻘﺎﻳﺴﻪ ﻧﻤﻮده در ﺻﻮرﺗﻴﻜﻪ ﺑﺮاﺑﺮ ﺑﺎﺷﻨﺪ ﻛﻨﺘﺮل ﺑﻪ ‪LAB2‬‬
‫ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬
‫ﺗﻌﺪادي دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﭘﺮش ﺷﺮﻃﻲ وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﺎ دﺳﺘﻮراﻟﻌﻤﻞ ‪CMP‬‬
‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدﻧﺪ‪ .‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش زﻳﺮ وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﮔﺮدﻧـﺪ ﻛـﻪ ﻋﻤﻠﻮﻧـﺪﻫﺎ‬
‫ﺑﺼﻮرت ﺑﺪون ﻋﻼﻣﺖ )‪ (Unsigned‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮﻧﺪ‪.‬‬
‫ﺟﺪول ‪5-2‬‬
‫ﻧﺎم‬ ‫ﻧﺎﻣﻬﺎي دﻳﮕﺮ‬ ‫ﺷﺮط‬ ‫ﻓﻠﮓﻫﺎ‬
‫‪JB‬‬ ‫‪JNAE , JC‬‬ ‫‪Opr 1 < Opr2‬‬ ‫‪CF = 1‬‬
‫‪JNB‬‬ ‫‪JAE, JNC‬‬ ‫‪Opr 1 > = Opr2‬‬ ‫‪CF = 0‬‬
‫‪JBE‬‬ ‫‪JNA‬‬ ‫‪Opr 1 < = Opr2‬‬ ‫‪CF V ZF = 1‬‬
‫‪JNBE‬‬ ‫‪JA‬‬ ‫‪Opr 1 > Opr2‬‬ ‫‪CF V ZF = 0‬‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮش زﻳﺮ وﻗﺘﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮﻧﺪ ﻛـﻪ ﻋﻤﻠﻮﻧـﺪﻫﺎ ﺑـﺼﻮرت ﻋﻼﻣﺘـﺪار‬
‫)‪ ( Signed‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮﻧﺪ‪.‬‬
‫ﺟﺪول ‪5-3‬‬
‫ﻧﺎم‬ ‫ﻧﺎﻣﻬﺎي دﻳﮕﺮ‬ ‫ﺷﺮط‬ ‫ﻓﻠﮓﻫﺎ‬
‫‪JL‬‬ ‫‪JNGE‬‬ ‫‪Opr1 < Opr 2‬‬ ‫‪SF ⊕ OF =1‬‬
‫‪JNL‬‬ ‫‪JGE‬‬ ‫‪Opr 1 > = Opr2‬‬ ‫‪SF ⊕ OF =0‬‬
‫‪JLE‬‬ ‫‪JNG‬‬ ‫‪Opr1 < = Opr2‬‬ ‫‪(SF ⊕ OF) V ZF=1‬‬
‫‪JNLE‬‬ ‫‪JG‬‬ ‫‪Opr1 > Opr2‬‬ ‫‪(SF⊕OF) V ZF=0‬‬
‫‪١١١‬‬

‫ﺣﺮوف ﻣﺨﻔﻒ ﻛﻠﻤﺎت ذﻳﻞ ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬

‫‪B‬‬ ‫‪Below‬‬
‫‪A‬‬ ‫‪Above‬‬
‫‪G‬‬ ‫‪Greater than‬‬
‫‪E‬‬ ‫‪Equal to‬‬
‫‪L‬‬ ‫‪Less than‬‬
‫‪C‬‬ ‫‪Carry‬‬
‫‪N‬‬ ‫‪Not‬‬

‫ﻣﻘــﺼﻮد از ﻋﻼﻣــﺖ ‪ V‬ﻋﻤﻠﮕــﺮ ‪ OR‬و ﻣﻘــﺼﻮد از ﻋﻼﻣــﺖ ⊕ ﻋﻤﻠﮕــﺮ‬


‫‪ Exclusive OR‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫]‪MOV AX, [BX‬‬

‫ﻣﻘﺪار اول در ‪ AX‬ﺑﺎ ﻣﻘﺪار دوم ﻣﻘﺎﻳﺴﻪ ﻣﻲﺷﻮد ; ]‪CMP AX, [DI‬‬

‫آﻳﺎ ﻣﻘﺪار اول ﻛﻤﺘﺮ ﻳﺎ ﻣﺴﺎوي ﻣﻘﺪار دوم ﻣﻲﺑﺎﺷﺪ؟ ; ‪JBE DONE‬‬
‫; ]‪XCHG AX , [DI‬‬ ‫در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺒﺎدﻟﺔ ﻣﻘﺎدﻳﺮ‬
‫‪MOV [BX] , AX‬‬
‫‪DONE:‬‬

‫‪M‬‬

‫در ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣـﻪ ﺑـﺎﻻ دو ﻣﻘـﺪار از ﺣﺎﻓﻈـﻪ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ﺛﺒﺎﺗﻬـﺎي ‪ DI‬و ‪BX‬‬
‫ﻣﺸﺨﺺ ﻣﻲﺷﻮﻧﺪ را ﺑﺘﺮﺗﻴﺐ ﺻﻌﻮدي ﻣﺮﺗﺐ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪١١٢‬‬

‫ﻣﺜﺎل ‪5-11‬‬

‫‪CMP‬‬ ‫; ‪AL , 10‬‬


‫‪JAE‬‬ ‫‪LABI‬‬
‫‪M‬‬
‫‪LAB1: JA‬‬ ‫‪LAB 2‬‬
‫‪M‬‬
‫‪LAB2:‬‬

‫‪M‬‬

‫اﮔﺮ ﻣﺤﺘﻮي ‪ AL‬ﺑﺰرﮔﺘﺮ از ‪ 10‬ﺑﺎﺷﺪ ﻛﻨﺘـﺮل ﺑـﻪ ‪ ، LAB2‬اﮔـﺮ ﻣﺤﺘـﻮي ‪AL‬‬


‫ﻣﺴﺎوي ‪ 10‬ﺑﺎﺷﺪ ﻛﻨﺘﺮل ﺑﻪ ‪ LAB1‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻛﻨﺘﺮل ﺑﻪ دﺳـﺘﻮراﻟﻌﻤﻞ ﺑﻌـﺪ از‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ JAE‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬

‫‪CMP AL , BL‬‬
‫‪JE ZERO‬‬

‫ﻛﻨﺘﺮل ﺑﻪ آدرس ‪ ZERO‬ﻣﻨﺘﻘﻞ ﻣـﻲﮔـﺮدد اﮔـﺮ ﻣﻘـﺎدﻳﺮ ‪ BL‬و ‪ AL‬ﻣـﺴﺎوي‬


‫ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪5-12‬‬
‫‪MOV AX , -100‬‬
‫‪CMP BX , AX‬‬
‫‪JG LAB2‬‬

‫ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ CMP‬ﻋﻼﻣﺖ دار در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮﻧﺪ‪.‬‬


‫‪١١٣‬‬

‫ﻣﺜﺎل ‪5-13‬‬
‫‪MOV‬‬ ‫‪AX , 100‬‬
‫‪CMP‬‬ ‫‪BX, AX‬‬
‫‪JA‬‬ ‫‪LAB2‬‬
‫ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ CMP‬ﺑﺪون ﻋﻼﻣﺖ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪ -5-4‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺗﻜﺮار‬
‫ﻫـﺮ وﻗــﺖ ﺑﺨـﻮاﻫﻴﻢ ﺗﻌــﺪادي دﺳـﺘﻮراﻟﻌﻤﻞ ﺑــﺼﻮرت ﻣﻜـﺮر اﺟــﺮا ﮔــﺮدد از‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺗﻜﺮار ﺑﺎﻳﺴﺘﻲ اﺳﺘﻔﺎده ﻧﻤﺎﺋﻴﻢ‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ ﺗﻜـﺮار در زﺑـﺎن اﺳـﻤﺒﻠﻲ‬
‫‪ LOOP‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺷﻜﻞ ﻛﻠﻲ آن ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪LOOP‬‬ ‫آدرس‬

‫ﻫﺮ وﻗﺖ ﻛﻨﺘﺮل ﺑﺪﺳﺘﻮر ‪ LOOP‬ﻣﻴﺮﺳﺪ اﺑﺘﺪا ﻣﻘـﺪار ﺛﺒـﺎت ‪ CX‬ﻳـﻚ واﺣـﺪ‬
‫ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ ﺳﭙﺲ ﻣﺤﺘﻮي ﺛﺒـﺎت ‪ CX‬ﺑـﺎ ﺻـﻔﺮ ﻣﻘﺎﻳـﺴﻪ ﻣـﻲﮔـﺮدد و در ﺻـﻮرﺗﻴﻜﻪ‬
‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ CX‬ﻣﺨﺎﻟﻒ ﺻﻔﺮ ﺑﺎﺷﺪ ﻛﻨﺘﺮل ﺑـﻪ آدرس داده ﺷـﺪه ﻣﻨﺘﻘـﻞ ﻣـﻲﮔـﺮدد‪.‬‬
‫ﺗﻌﺪاد دﻓﻌﺎت ﺗﻜﺮار ﻋﻤﻼً ﺑﺎﻳﺴﺘﻲ در ﺛﺒﺎت ‪ CX‬ﻗﺮار داد‪ .‬دﺳـﺘﻮراﻟﻌﻤﻞ ‪ LOOP‬روي‬
‫ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫ﻣﺜﺎل ‪5-14‬‬
‫‪MOV‬‬ ‫‪CX , 10‬‬
‫‪LABI:‬‬

‫‪M‬‬
‫‪LOOP‬‬ ‫‪LABI‬‬

‫اﻳﻦ ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻌﺎدل ﺑﺮﻧﺎﻣﻪ ﭘﺎﺳﻜﺎل زﻳﺮ ﻣﻲﺑﺎﺷﺪ ﻳﻌﻨﻲ داﻣﻨـﻪ ﺗﻜـﺮار ده ﺑـﺎر‬
‫اﺟﺮا ﻣﻲﮔﺮدد‪.‬‬
‫‪١١٤‬‬

‫‪FOR I: =1 TO 10 DO‬‬
‫‪BEGIN‬‬

‫‪M‬‬
‫; ‪END‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﻣﺠﻤﻮع ﻋﻨﺎﺻﺮ آراﻳـﻪ ‪ X‬ﻛـﻪ از ﻧـﻮع ‪ Word‬و ‪ N‬ﻋﻨـﺼﺮي‬
‫ﻣﻲﺑﺎﺷﺪ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ ‪ TOTAL‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪N‬‬ ‫‪DW‬‬ ‫?‬


‫‪TOTAL‬‬ ‫‪DW‬‬ ‫?‬
‫‪X‬‬ ‫‪DW‬‬ ‫ﻣﻘﺎدﻳﺮ ﻋﻨﺎﺻﺮ آراﻳﻪ‬
‫‪MOV‬‬ ‫‪CX , N‬‬
‫‪MOV‬‬ ‫; ‪AX, 0‬‬ ‫ﻣﺠﻤﻮع ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ‬
‫‪MOV‬‬ ‫; ‪SI , AX‬‬ ‫‪ SI‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ‬
‫‪START_LOOP:‬‬ ‫;]‪ADD AX,X [SI‬‬ ‫ﺟﻤﻊ ﻋﻨﺎﺻﺮ‬
‫‪ADD SI, 2‬‬
‫‪LOOP START _ LOOP‬‬
‫‪MOV‬‬ ‫‪TOTAL, AX‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ آراﻳـﻪ ‪ N‬ﻋﻨـﺼﺮي ‪ A‬از ﻧـﻮع ‪ word‬را ﺑـﺼﻮرت ﺻـﻌﻮدي‬

‫ﺑﺮوش ﺣﺒﺎﺑﻲ ﻣﺮﺗﺐ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬


‫‪١١٥‬‬

‫‪Bubble ; Sort‬‬
‫‪N‬‬ ‫‪DW‬‬ ‫?‬
‫‪MOV‬‬ ‫‪CX , N‬‬
‫‪DEC‬‬ ‫‪CX‬‬
‫‪LOOP 1:‬‬ ‫‪MOV‬‬ ‫‪DI , CX‬‬
‫‪MOV‬‬ ‫‪BX , 0‬‬
‫‪LOOP2:‬‬ ‫‪MOV‬‬ ‫]‪AX , A[BX‬‬
‫‪CMP‬‬ ‫]‪AX, A[BX+2‬‬
‫‪JGE‬‬ ‫‪CONTINUE‬‬
‫‪XCHG‬‬ ‫]‪AX, A[BX+2‬‬
‫‪MOV‬‬ ‫‪A [BX] , AX‬‬
‫‪CONTINUE:‬‬ ‫‪ADD‬‬ ‫‪BX,2‬‬
‫‪LOOP‬‬ ‫‪LOOP2‬‬
‫‪MOV‬‬ ‫‪CX , DI‬‬
‫‪LOOP‬‬ ‫‪LOOP1‬‬

‫ﺷﻜﻞ دﻳﮕﺮ دﺳﺘﻮر ﺗﻜﺮار ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫‪LOOPNE‬‬ ‫آدرس‬
‫ﻳﺎ‬
‫‪LOOPNZ‬‬ ‫آدرس‬

‫ﻛﺎر دﺳـﺘﻮراﻟﻌﻤﻞ ‪ LOOPNE‬ﻳـﺎ ‪ LOOPNZ‬ﻣﺎﻧﻨـﺪ دﺳـﺘﻮراﻟﻌﻤﻞ ‪LOOP‬‬


‫ﻣﻲﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺷﺮط ﺗﻜﺮار آن اﺳﺖ ﻛﻪ ﻣﻘﺪار ‪ CX‬ﻣﺨﺎﻟﻒ ﺻﻔﺮ و ﻣﻘـﺪار‬
‫‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺑﺎﺷﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪١١٦‬‬

‫ﻣﺜﺎل‪5-15‬‬
‫‪ARR‬‬ ‫‪DB‬‬
‫‪N‬‬ ‫‪DW‬‬
‫‪MOV‬‬ ‫‪CX , N‬‬
‫‪MOV‬‬ ‫‪SI , -1‬‬
‫‪MOV‬‬ ‫‪AL, 20H; ASCII code for blank‬‬
‫‪NEXT:‬‬ ‫‪INC‬‬ ‫‪SI‬‬
‫‪CMP‬‬ ‫‪AL, ARR[SI]; test for blank‬‬
‫‪LOOPNE‬‬ ‫‪NEXT‬‬
‫‪JNZ‬‬ ‫‪NOT_FOUND‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ رﺷﺘﺔ داده ﺷﺪه ‪ N‬ﻋﻨﺼﺮي ‪ ARR‬از ﻧﻮع ﺑﺎﻳـﺖ را ﺟـﺴﺘﺠﻮ‬
‫ﻣﻲﻧﻤﺎﻳﺪ ﻛﻪ آﻳﺎ ﻛﺎرﻛﺘﺮ ‪ blank‬ﻳﺎ ﻓﺎﺻﻠﻪ در رﺷﺘﻪ وﺟﻮد دارد ﻳﺎ ﺧﻴﺮ؟‬
‫ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ دﺳﺘﻮر ﺗﻜﺮار ﺑﺎﻻ وﻗﺘﻲ ﻣﺘﻮﻗﻒ ﻣﻲﺷﻮد ﻛﻪ ﻋﻨﺎﺻﺮ رﺷﺘﻪ‬
‫ﻫﻤﻪ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﺎﺷﻨﺪ ﻳﺎ ﺑﻪ ﻛﺎرﻛﺘﺮ ﻓﺎﺻﻠﻪ رﺳﻴﺪه ﺑﺎﺷـﻴﻢ‪ .‬ﺷـﻜﻞ دﻳﮕـﺮ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﺗﻜﺮار ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪LOOPE‬‬ ‫آدرس‬
‫ﻳﺎ‬
‫‪LOOPZ‬‬ ‫آدرس‬

‫دﺳــﺘﻮراﻟﻌﻤﻞ ‪ LOOPE‬ﻳــﺎ ‪ LOOPZ‬ﻣﺎﻧﻨــﺪ دﺳــﺘﻮراﻟﻌﻤﻞ ‪ LOOP‬ﻋﻤــﻞ‬


‫ﻣﻲﻧﻤﺎﻳﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺷﺮط ﺗﻜﺮار آن اﺳﺖ ﻛﻪ ﻣﻘﺪار ‪ CX‬ﻣﺨﺎﻟﻒ ﺻﻔﺮ و ﻣﻘﺪار‬
‫‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫‪; BX = offset of the starting address‬‬


‫‪; DX = offset of the ending address‬‬
‫)‪; BX = offset of nonzero (if found‬‬
‫)‪; BX = DI (if not found‬‬
‫‪١١٧‬‬

‫‪SUB‬‬ ‫‪DI , BX‬‬


‫‪INC‬‬ ‫‪ = (DI)-(BX)+1‬ﺗﻌﺪاد ﺑﺎﻳﺖ ; ‪DI‬‬
‫‪MOV‬‬ ‫‪CX , DI‬‬
‫‪DEC‬‬ ‫‪BX‬‬
‫‪NEXT:‬‬ ‫‪INC‬‬ ‫‪BX ; point to next location‬‬
‫‪CMP‬‬ ‫‪BYTE PTR [BX], 0 ; Compare it to zero‬‬
‫‪LOOPE‬‬ ‫‪NEXT ; go compare next byte‬‬
‫‪JNZ‬‬ ‫?‪NZ _ FOUND; Nonzero byte found‬‬
‫‪M‬‬ ‫‪; NO.‬‬
‫‪NZ_FOUND:‬‬
‫‪M‬‬ ‫‪; Yes.‬‬

‫ﺑﺮﻧﺎﻣﻪ ﻓﻮق ﻳﻚ ﺑﻠﻮك از ﺣﺎﻓﻈـﻪ ﻛـﻪ آدرس ﺷـﺮوع ان ﺗﻮﺳـﻂ ﺛﺒـﺎت ‪ BX‬و‬
‫آدرس اﻧﺘﻬﺎي آن ﺗﻮﺳﻂ ﺛﺒﺎت ‪ DI‬ﻣﺸﺨﺺ ﺷﺪه را ﺑﺎﻳﺖ ﺑـﻪ ﺑﺎﻳـﺖ ﺟـﺴﺘﺠﻮ ﻧﻤـﻮده‬
‫ﺑﺮاي ﻳﺎﻓﺘﻦ ﻋﻨﺼﺮي ﻛﻪ ﻣﺨﺎﻟﻒ ﺻﻔﺮ ﺑﺎﺷﺪ‪.‬‬
‫ﺷﻜﻞ دﻳﮕﺮ دﺳﺘﻮر ﺗﻜﺮار ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪JCXZ‬‬ ‫آدرس‬
‫در ﺣﻘﻴﻘﺖ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ ﻧﻮع دﺳﺘﻮراﻟﻌﻤﻞ ﭘﺮش ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺑﺮاﺳﺎس‬
‫ﻓﻠﮕﻬﺎ ﻋﻤﻞ ﻧﻤﻲﻛﻨﺪ ﺑﻠﻜﻪ ﺑﺮاﺳﺎس ﻣﺤﺘﻮي ﺛﺒﺎت ‪ CX‬ﻋﻤﻞ ﻣﻲﻛﻨﺪ‪ .‬ﭼﻨﺎﻧﭽـﻪ ﻣﺤﺘـﻮي‬
‫‪ CX‬ﻣﺴﺎوي ﺻﻔﺮ ﺑﺎﺷﺪ ﻛﻨﺘﺮل ﺑﻪ آدرس داده ﺷﺪه ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد‪ .‬اﻳـﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪ .‬ﻧﻬﺎﻳﺘﺎً ﺟﺪول ذﻳﻞ را دارﻳﻢ‪.‬‬
‫ﺟﺪول ‪5-4‬‬
‫ﻋﻤﻞ‬ ‫ﻧﺎم‬ ‫ﻧﺎم دﻳﮕﺮ‬ ‫ﺷﺮط ﺗﻜﺮار‬
‫‪LOOP‬‬ ‫‪LOOP‬‬ ‫‪CX < > 0‬‬
‫‪LOOP While equal‬‬
‫‪LOOPE‬‬ ‫‪LOOPZ‬‬ ‫‪CX < > 0 and ZF=1‬‬
‫‪or zero‬‬
‫‪LOOP while not‬‬
‫‪LOOPNE‬‬ ‫‪LOOPNZ‬‬ ‫‪CX < > 0 and ZF=0‬‬
‫‪equal or nonzero‬‬
‫‪Branch on CX‬‬ ‫‪JCXZ‬‬ ‫‪CX=0‬‬
‫‪١١٨‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮﺳﺶ ﺗﺸﺮﻳﺢ ﮔﺮدﻳـﺪه اﻳـﻦ دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑـﺮ‬
‫اﺳﺎس ﻓﻠﮓﻫﺎ ﻋﻤﻞ ﻣﻲﻧﻤﺎﻳﻨﺪ‪ .‬ﺿﻤﻨﺎً دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﺗﻜﺮار ﻧﻴﺰ ﻣﻄﺮح ﮔﺮدﻳﺪه اﺳـﺖ‬
‫ﻛـﻪ در دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎ ﺗﻜـﺮار ﺗﻌـﺪاد دﻓﻌـﺎت ﺗﻜـﺮار در ﺛﺒـﺎت ‪ CX‬ﻗـﺮار ﻣـﻲﮔﻴـﺮد‪.‬‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺎﻳﺴﻪ ‪ CMP‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﻤـﻞ ﻧﻤـﻮده وﻟـﻲ‬
‫ﻧﺘﻴﺠﻪ در ﺟﺎﺋﻲ ذﺧﻴﺮه ﻧﻤﻲﮔﺮدد ﺑﻠﻜﻪ روي ﻓﻠﮕﻬﺎ اﺛﺮ ﻣﻲﮔﺬارد‪.‬‬
‫‪١١٩‬‬

‫‪ a‬ﺗﻤﺮﻳﻦ‬

‫‪-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬ﻣﺸﺎﺑﻪ ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺑﺎﺷﺪ؟‬

‫‪-2‬آﻳﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP X , Y‬ﻣﺠﺎز ﻣﻲﺑﺎﺷﺪ؟‬

‫‪-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ JNA‬ﭼﻪ ﻣﻮﻗﻌﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮد؟‬

‫‪-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ JLE‬ﭼﻪ ﻣﻮﻗﻌﻲ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮد؟‬

‫‪-5‬ﺗﻔﺎوت دﺳﺘﻮراﻟﻌﻤﻞ ‪ LOOP‬ﺑﺎ ‪ LOOPZ‬ﭼﻴﺴﺖ؟‬

‫‪-6‬اﮔﺮ در اﺑﺘﺪا ﻣﺤﺘﻮي ‪ CX‬را ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻗﺮار دﻫﻴﻢ‪ .‬ﺣﻠﻘﻪ ﺗﻜﺮار ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻣﻲ‬
‫ﮔﺮدد؟‬

‫‪-7‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺳﻤﺒﻠﻲ ﻣﻌﺎدل ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﭘﺎﺳﻜﺎل زﻳﺮ ﺑﺪﻫﻴﺪ‪.‬‬

‫;‪S:=0‬‬
‫‪FOR I:=1 TO N DO‬‬
‫; ‪S : = S+I‬‬

‫‪-8‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻪ زﺑﺎن اﺳﻤﺒﻠﻲ ﻣﻌﺎدل ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺑﺪﻫﻴﺪ‪.‬‬


‫‪١٢٠‬‬

‫]‪X: ARRAY [1..10‬‬ ‫;‪OF INTEGER‬‬


‫;‪S, I: I NTEGER‬‬
‫; ‪S:= 0‬‬
‫; ‪I := 1‬‬
‫‪WHILE‬‬ ‫‪I < = 10 DO‬‬
‫‪BEGIN‬‬
‫;]‪S:=S +X [I‬‬
‫; ‪I :=I + 1‬‬
‫; ‪END‬‬

‫‪-9‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻳﻚ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮي از ﻧﻮع ﺑﺎﻳـﺖ را در ﻧﻈـﺮ ﺑﮕﻴـﺮد‪،‬‬


‫ﺗﻌﺪاد ﻋﻨﺎﺻﺮ ﻣﺜﺒﺖ آﻧﺮا ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ در ﻣﺘﻐﻴﺮ ‪ TED‬ﻗﺮار دﻫﺪ‪.‬‬

‫‪-10‬آﻳﺎ ﻣﻲﺗﻮان ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﻧﻮﺷﺖ ﻛﻪ ‪ N‬ﻣﻘﺪار را ﺑﺮوش ﻣﺮﺗـﺐ ﺳـﺎزي درﺟـﻲ‬
‫ﺑﺼﻮرت ﺻﻌﻮدي ﻣﺮﺗﺐ ﻧﻤﺎﻳﺪ؟‬

‫‪-11‬ﻳﻚ ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺪﻫﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮي ‪ X‬از ﻧـﻮع ﺑﺎﻳـﺖ را از ﻧﻈـﺮ ﻣﻜـﺎﻧﻲ‬
‫وارون ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-12‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﺪﻫﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨـﺼﺮي ‪ X‬از ﻧـﻮع ‪ word‬را در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ‬
‫ﻋﻨﺎﺻﺮ ﻣﺨﺎﻟﻒ ﺻﻔﺮ آﻧﺮا در آراﻳﻪ دﻳﮕﺮي ﺑﻨﺎم ‪ Y‬ﻗﺮار دﻫﺪ )در ﺻﻮرت ﻟﺰوم اﻧﺘﻬـﺎي‬
‫آراﻳﻪ ‪ Y‬ﺧﺎﻟﻲ ﺑﻤﺎﻧﺪ‪(.‬‬

‫‪-13‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﻘﺪار ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪ N‬را در ﻧﻈﺮ ﮔﺮﻓﺘـﻪ ﻓﺎﻛﺘﻮرﻳـﻞ‬
‫آﻧﺮا ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪١٢١‬‬

‫‪-14‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮي ‪ X‬از ﻧﻮع ‪ word‬را در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ‬
‫ﻛﻮﭼﻜﺘﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-15‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ آراﻳـﻪ ‪ N‬ﻋﻨـﺼﺮي ‪ X‬از ﻧـﻮع ‪ double word‬را در‬
‫ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻛﻮﭼﻜﺘﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-16‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮي ‪ X‬از ﻧﻮع ‪ word‬را در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ‬
‫اﻧﺪﻳﺲ ﺑﺰرﮔﺘﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-17‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺠﻤﻮع زﻳﺮ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪1+ 22+32+42+. . . + N2‬‬

‫‪-18‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ آﻳﺎ ﻋﺪد ‪ N‬اول ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟‬

‫‪-19‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ آﻳﺎ ﻋﺪد ‪ N‬ﻛﺎﻣﻞ ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟‬

‫‪-20‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛـﻪ ﻣﻘـﺪار ‪ N‬از ﻧـﻮع ﺑﺎﻳـﺖ را ﮔﺮﻓﺘـﻪ ‪ NX‬را ﻣﺤﺎﺳـﺒﻪ‬
‫ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-21‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮي ‪ X‬از ﻧﻮع ‪ word‬را ﮔﺮﻓﺘﻪ ﻣﻴﺎﻧﻪ آﻧﺮا‬
‫ﻣﺸﺨﺺ ﻧﻤﻮد در ‪ MID‬ﻗﺮار دﻫﺪ‪.‬‬
‫‪١٢٢‬‬

‫ﻓﺼﻞ ﺷﺸﻢ‬
‫ﻋﻤﻠﻴﺎت ﺑﻴﺘﻲ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫آﺷﻨﺎﺋﻲ ﺑﺎ ﻋﻤﻠﻴﺎت روي ﺑﻴﺖﻫﺎ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ‪.‬‬
‫‪ -1‬ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ و ﻋﻤﻠﮕﺮﻫﺎي واﺑﺴﺘﻪ‬
‫‪ -2‬ﻋﻤﻠﻴﺎت ﺷﻴﻔﺖ ﺑﻴﺖﻫﺎ‬
‫‪ -3‬ﻋﻤﻠﻴﺎت ﭼﺮﺧﺶ ﺑﻴﺖﻫﺎ‬
‫‪ -4‬ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻓﻠﮓﻫﺎ‬
‫‪ -5‬ﺗﺒﺪﻳﻞ ﺣﺮوف ﻛﻮﭼﻚ ﺑﻪ ﺑﺰرگ و ﺑﺎﻟﻌﻜﺲ‪.‬‬
‫‪١٢٣‬‬

‫‪ -6-1‬ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ‬
‫از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﻨﻄﻘﻲ ﺑﺮاي اﻧﺠﺎم ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ اﺳﺘﻔﺎده ﻣـﻲﺷـﻮد‪ .‬اﻳـﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑﺼﻮرت ﺑﻴﺘﻲ روي ﻋﻤﻠﻮﻧﺪﻫﺎ ﻋﻤﻞ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘـﻲ ﻋﺒﺎرﺗﻨـﺪ‬
‫از ‪ XOR ،OR ،AND ،NOT‬و ‪. TEST‬‬

‫‪ -6-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪NOT‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ NOT‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪NOT opr‬‬

‫اﻟﻒ( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ‪word‬ﻳﺎ ﺑﺎﻳﺖ ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫ج( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻴﺖﻫﺎي ‪ opr‬را از ‪ 0‬ﺑﻪ ‪ 1‬و از ‪ 1‬ﺑﻪ ‪ 0‬ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﺑﻌﺒﺎرت‬
‫دﻳﮕﺮ ﻣﻜﻤﻞ ‪ 1‬ﻋﻤﻠﻮﻧﺪ را ﻣﻲدﻫﺪ‪.‬‬
‫د( دﺳﺘﻮراﻟﻌﻤﻞ ‪ NOT‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬

‫ﻣﺜﺎل ‪6-1‬‬
‫‪MOV‬‬ ‫‪DL , 8AH‬‬
‫‪NOT‬‬ ‫‪DL‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮر ‪NOT‬‬


‫‪DL‬‬
‫‪10001010‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ‪NOT‬‬


‫‪DL‬‬
‫‪01110101‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺤﺘﻮي ﺛﺒﺎت ‪ DL‬ﺑﻪ ‪ 75H‬ﺗﻐﻴﻴﺮ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬


‫‪١٢٤‬‬

‫‪ -6-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪AND‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ AND‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪AND dst , src‬‬

‫اﻟﻒ( ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ src‬و ‪ dst‬ﻫﺮ دو از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬


‫ب( ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ src‬و ‪ dst‬ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻳﺎﻫﺮ دو ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫ج( وﻗﺘﻲ ﻋﻤﻠﻮﻧﺪ ‪ src‬ﺛﺎﺑﺖ ﺑﺎﺷﺪ ﻋﻤﻠﻮﻧﺪ ‪ dst‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬
‫د( ﺑﻴﺖﻫﺎي ‪ dst‬و ‪ src‬ﻧﻈﻴﺮ ﺑﻪ ﻧﻈﻴﺮ ﻣﻄﺎﺑﻖ ﺟﺪول ذﻳﻞ ‪ and‬ﻣـﻲﺷـﻮﻧﺪ و ﻧﺘﻴﺠـﻪ در‬
‫‪ dst‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫ﺟﺪول ‪6-1‬‬
‫ﺑﻴﺖ اول‬ ‫ﺑﻴﺖ دوم‬ ‫ﺑﻴﺖ دوم ‪ and‬ﺑﻴﺖ اول‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫ﻣﺜﺎل ‪6-2‬‬
‫‪MOV‬‬ ‫‪AL , 5BH‬‬
‫‪MOV‬‬ ‫‪DH, 4DH‬‬
‫‪AND‬‬ ‫‪AL, DH‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ AND‬ﻋﺒﺎرﺗﺴﺖ از‪:‬‬

‫‪AL‬‬ ‫‪01011011‬‬

‫‪DH‬‬ ‫‪01001101‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ AND‬ﻋﺒﺎرﺗﻨﺪ از‪:‬‬


‫‪١٢٥‬‬

‫‪DH‬‬ ‫‪01001101‬‬ ‫ﺑﺪون ﺗﻐﻴﻴﺮ‬

‫‪AL‬‬ ‫‪01001001‬‬ ‫ﻧﺘﻴﺠﻪ‬

‫‪ -6-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪OR‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ‪ OR‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪OR‬‬ ‫‪dst , src‬‬

‫اﻟﻒ( ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ dst‬و ‪ src‬از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬


‫ب( ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ dst‬و ‪ src‬ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻳﺎ ﻫﺮ دو ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫ج( وﻗﺘﻲ ﻋﻤﻠﻮﻧﺪ ‪ src‬ﺛﺎﺑﺖ ﺑﺎﺷﺪ ﻋﻤﻠﻮﻧﺪ ‪ dst‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫د( ﺑﻴﺖﻫﺎي ‪ dst‬و ‪ src‬ﻧﻈﻴﺮ ﺑﻪ ﻧﻈﻴﺮ ﻣﻄﺎﺑﻖ ﺟﺪول ذﻳﻞ ‪ or‬ﻣـﻲﺷـﻮد وﻧﺘﻴﺠـﻪ در ‪dst‬‬
‫ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫ﺟﺪول ‪6-2‬‬
‫ﺑﻴﺖ اول‬ ‫ﺑﻴﺖ دوم‬ ‫ﺑﻴﺖ دوم ‪ or‬ﺑﻴﺖ اول‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫ﻣﺜﺎل‪6-3‬‬
‫‪MOV‬‬ ‫‪BL , 0A5H‬‬
‫‪MOV‬‬ ‫‪AL, 2AH‬‬
‫‪OR‬‬ ‫‪AL , BL‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎت ﻫﺎ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪OR‬‬


‫‪١٢٦‬‬

‫‪BL‬‬ ‫‪10100101‬‬

‫‪AL‬‬ ‫‪00101010‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪OR‬‬

‫‪BL‬‬ ‫‪10100101‬‬

‫‪AL‬‬ ‫‪10101111‬‬

‫‪ -6-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪XOR‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ XOR‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪XOR dst , src‬‬

‫اﻟﻒ(‪ src‬و ‪ dst‬ﻫﺮ دو از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬


‫ب( ‪ src‬و ‪ dst‬ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫ج( ﺑﻴﺖﻫﺎي ‪ src‬و ‪ dst‬ﻧﻈﻴﺮ ﺑﻪ ﻧﻈﻴﺮ ﺑﺎ اﺳﺘﻔﺎده از ﺟﺪول ذﻳﻞ ‪ xor‬ﮔﺮدﻳﺪه ﻧﺘﻴﺠﻪ در‬
‫‪ dst‬ﻗﺮار ﻣﻲﮔﻴﺮد و ﻣﻘﺪار ‪ src‬ﺑﺪون ﺗﻐﻴﻴﺮ ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬

‫ﺟﺪول ‪6-3‬‬

‫ﺑﻴﺖ اول‬ ‫ﺑﻴﺖ دوم‬ ‫ﺑﻴﺖ دوم ‪ xor‬ﺑﻴﺖ اول‬


‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪١٢٧‬‬

‫ﻣﺜﺎل‪6-4‬‬
‫‪MOV‬‬ ‫‪CL, 2DH‬‬
‫‪MOV‬‬ ‫‪AL , 0C2H‬‬
‫‪XOR‬‬ ‫‪AL , CL‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪XOR‬‬

‫‪AL‬‬ ‫‪11000010‬‬

‫‪CL‬‬ ‫‪00111101‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪XOR‬‬

‫‪CL‬‬ ‫‪0011 1101‬‬

‫‪AL‬‬ ‫‪1111 1111‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‪TEST‬‬ ‫‪-6-1-5‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ TEST‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪:‬‬
‫‪TEST‬‬ ‫‪opr1, opr2‬‬

‫اﻟﻒ( ‪ opr1‬و ‪ opr2‬ﻫﺮ دو از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr1‬و ‪ opr2‬ﻫﺮ دو ﺛﺎﺑﺖ ﻳﺎ ﻫﺮ دو ﻣﺘﻐﻴﺮ ﻧﻤﻲﺗﻮاﻧﻨﺪ ﺑﺎﺷﻨﺪ‪.‬‬
‫ج( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ AND‬ﻋﻤﻞ ﻣﻲﻧﻤﺎﻳﺪ وﻟﻲ ﻧﺘﻴﺠﻪ را در ﺟﺎﺋﻲ‬
‫ذﺧﻴﺮه ﻧﻤﻲﻛﻨﺪ ﻳﻌﻨﻲ دو ﻋﻤﻠﻮﻧﺪ ﺑﺪون ﺗﻐﻴﻴﺮ ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﻨﺪ و ﻓﻘﻂ ﻣﻘﺎدﻳﺮ ﻓﻠـﮓﻫـﺎ را‬
‫ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‪.‬‬
‫‪١٢٨‬‬

‫ﻣﺜﺎل ‪6-5‬‬
‫‪MOV‬‬ ‫‪AL , 25‬‬
‫‪MOV‬‬ ‫‪DH , 0E4H‬‬
‫‪TEST‬‬ ‫‪AL , DH‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪TEST‬‬

‫‪AL‬‬ ‫‪00011001‬‬

‫‪DH‬‬ ‫‪11100100‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪TEST‬‬

‫‪AL‬‬ ‫‪00011001‬‬

‫‪DH‬‬ ‫‪11100100‬‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ ﻛﺮد ﻛﻪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ TEST‬ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻣﻘﺪار ‪ ZF‬ﺑﺮاﺑـﺮ‬
‫ﺑﺎ ﻳﻚ ﮔﺮدد‪.‬‬
‫ﻣﺜﺎل ‪6-6‬‬
‫‪MOV‬‬ ‫‪AL , 0ABH‬‬
‫‪NOT‬‬ ‫‪AL‬‬
‫‪TEST‬‬ ‫‪AL, 10100101B‬‬
‫‪JZ‬‬ ‫‪YES‬‬
‫‪M‬‬
‫‪YES:‬‬
‫‪M‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﻳﺪ ﻛﻪ آﻳﺎ ﻣﻘﺎدﻳﺮ ﺑﻴﺖﻫﺎي‪ 2 ،5 ،7‬و ‪ 0‬ﺛﺒـﺎت‬
‫‪ AL‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟ ﻣﻘﺪار ‪ 10100101B‬ﻋﻤﻼً ‪ MASK‬ﻣﻲﺑﺎﺷـﺪ ﻛـﻪ‬
‫‪١٢٩‬‬

‫در ﺑﻴﺖﻫﺎﺋﻲ ﻛﻪ ﻣﻲﺧﻮاﻫﻴﻢ ﺑﺮاي ﻳﻚ ﺑﻮدن ﺗﺴﺖ ﺷﻮد ﻣﻘﺪار ﻳﻚ و در ﺳﺎﻳﺮ ﺑﻴﺖﻫـﺎ‬
‫ﻣﻘﺪار ﺻﻔﺮ را ﻗﺮار ﻣﻲدﻫﻴﻢ‪.‬‬
‫‪AL‬‬ ‫‪10101011‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮر ‪NOT‬‬

‫‪AL‬‬ ‫‪01010100‬‬

‫‪MASK‬‬ ‫‪10100101‬‬

‫در اﻳﻦ ﻣﺜﺎل ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ TEST‬ﻣﻘﺪار ﺛﺒﺎت ‪ AL‬ﺑﺪون ﺗﻐﻴﻴـﺮ‬


‫ﺑﺎﻗﻲ ﻣﺎﻧﺪ و ﻓﻘﻂ ﻣﻘﺪار ﻓﻠﮓ ‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪6-7‬‬
‫‪OR‬‬ ‫‪DL, 00000101B‬‬
‫‪XOR‬‬ ‫‪DL, 01000010B‬‬
‫‪AND‬‬ ‫‪DL, 11100111B‬‬
‫‪MOV‬‬ ‫‪AL, DL‬‬
‫‪NOT‬‬ ‫‪AL‬‬
‫‪TEST‬‬ ‫‪AL, 10000010B‬‬
‫‪JZ‬‬ ‫‪EXIT‬‬
‫‪M‬‬
‫‪EXIT:‬‬
‫‪M‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق اﺑﺘﺪا ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 0‬و‪ 2‬ﺛﺒﺎت ‪ DL‬را ﻳﻚ ﻣﻲﻛﻨﺪ و ﺑﻴـﺖ‬
‫ﻫﺎي ﺷﻤﺎره ‪ 4‬و ‪ 3‬را ﺑﻪ ﺻﻔﺮ ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ و ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 1‬و‪ 6‬را ﻣﻜﻤـﻞ ﻣـﻲ‪-‬‬
‫ﻧﻤﺎﻳﺪ در ﺿﻤﻦ ﭼﻨﺎﻧﭽﻪ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪7‬و‪ 1‬ﺑﺮاﺑﺮ ﺑﺎ ﻳـﻚ ﺑﺎﺷـﻨﺪ ﻛﻨﺘـﺮل ﺑـﻪ ‪EXIT‬‬
‫ﻣﻨﺘﻘﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪١٣٠‬‬

‫ﻣﺜﺎل ‪6-8‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ﻓﺮد ﺛﺒﺎت ‪ AL‬را ﻣﻜﻤﻞ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻳﻌﻨﻲ ‪ 1‬ﺑﻪ‬
‫‪ 0‬و ‪ 0‬ﺑﻪ ‪ 1‬ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪MOV‬‬ ‫‪AL, 0C7H‬‬
‫‪MOV‬‬ ‫‪MASK, 10101010B‬‬
‫‪XOR‬‬ ‫‪AL, MASK‬‬

‫‪AL‬‬ ‫‪11000111‬‬

‫‪MASK‬‬ ‫‪10101010‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ XOR‬ﻣﻘﺎدﻳﺮ ‪ AL‬و ‪ MASK‬ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪AL‬‬ ‫‪01101101‬‬

‫‪MASK‬‬ ‫‪10101010‬‬

‫ﻣﺜﺎل ‪6-9‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺑﻴﺖﻫﺎي ﺷﻤﺎره زوج ﺛﺒﺎت ‪ AL‬را ﺑﻪ ﻳﻚ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AL, 0A6H‬‬


‫‪MOV‬‬ ‫‪MASK, 55H‬‬
‫‪OR‬‬ ‫‪AL, MASK‬‬

‫‪AL‬‬ ‫‪10100110‬‬

‫‪MASK‬‬ ‫‪01010101‬‬
‫‪١٣١‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪OR‬‬

‫‪AL‬‬ ‫‪11110111‬‬

‫‪MASK‬‬ ‫‪01010101‬‬

‫ﻣﺜﺎل ‪6-10‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ﻓﺮد ‪ AL‬را ﺑﻪ ﺻﻔﺮ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AL, 0C7H‬‬


‫‪MOV‬‬ ‫‪MASK, 55H‬‬
‫‪AND‬‬ ‫‪AL, MASK‬‬

‫‪AL‬‬ ‫‪11000111‬‬

‫‪MASK‬‬ ‫‪01010101‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪AND‬‬

‫‪AL‬‬ ‫‪01000101‬‬

‫‪MASK‬‬ ‫‪01010101‬‬

‫در ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ اﮔﺮ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 1‬و ‪ 14‬ﻳﺎ ﺑﻴـﺖﻫـﺎي ﺷـﻤﺎره ‪ 9‬و ‪7‬‬
‫ﺛﺒﺎت ‪ AX‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﻨﺪ ﻛﻨﺘﺮل ﺑﻪ ‪ TASK 1‬و اﮔﺮ ﺑﻴﺖ ‪ 3‬ﻳـﺎ ‪ 4‬ﺑﺮاﺑـﺮ ﺑـﺎ ﻳـﻚ‬
‫ﺑﺎﺷﻨﺪ ﻛﻨﺘﺮل ﺑﻪ ‪ TASK2‬در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻛﻨﺘﺮل ﺑﻪ ‪ TASK3‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬
‫‪١٣٢‬‬

‫‪NOT‬‬ ‫‪AX‬‬
‫‪TEST‬‬ ‫‪AX, 4002H‬‬
‫‪JZ‬‬ ‫‪TASK1‬‬
‫‪TEST‬‬ ‫‪AX, 280H‬‬
‫‪JZ‬‬ ‫‪TASK1‬‬
‫‪NOT‬‬ ‫‪AX‬‬
‫‪TEST‬‬ ‫‪AX, 18H‬‬
‫‪JNZ‬‬ ‫‪TASK2‬‬
‫‪TASK3:‬‬
‫‪M‬‬
‫‪TASK1:‬‬
‫‪M‬‬
‫‪TASK2:‬‬
‫‪M‬‬

‫‪ -6-2‬ﻋﻤﻠﻴﺎت ﺷﻴﻔﺖ‬
‫ﻋﻤﻠﻴﺎت ﺷﻴﻔﺖ ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ ﻣﻜﺎن ﺑﻴﺖﻫﺎي ﻳﻚ ﺑﺎﻳﺖ ﻳﺎ ﻳـﻚ ‪ word‬ﺑﻄـﺮف‬
‫ﭼﭗ ﻳﺎ راﺳﺖ ﻣﻲﺷﻮد‪ .‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﺘﻌﺪدي ﺑﺮاي اﻳﻦ ﻛـﺎر ﻣـﻮرد اﺳـﺘﻔﺎده ﻗـﺮار‬
‫ﻣﻲﮔﻴﺮﻧﺪ ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Shift‬‬ ‫‪Logical Left‬‬ ‫‪SHL‬‬


‫‪Shift‬‬ ‫‪Logical Right‬‬ ‫‪SHR‬‬
‫‪Shift‬‬ ‫‪Arithmetic Left SAL‬‬
‫‪Shift‬‬ ‫‪Arithmetic Right SAR‬‬

‫‪ -6-2-1‬دﺳﺘﻮراﻟﻌﻤﻞ‪SHL‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ‪ SHL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪SHL‬‬ ‫‪opr , cnt‬‬

‫اﻟﻒ( ‪ cnt‬ﺗﻌﺪاد ﺑﻴﺖﻫﺎﺋﻲ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺑﻄﺮف ﭼﭗ ﺷﻴﻔﺖ داده ﻣﻲﺷﻮد‪ .‬در ﺻﻮرﺗﻴﻜﻪ‬
‫‪ cnt‬ﻣﺨﺎﻟﻒ ﻳﻚ ﺑﺎﺷﺪ از ﺛﺒﺎت ‪ CL‬اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪١٣٣‬‬

‫ب( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ج( ‪opr‬ﻣﻲﺗﻮاﻧﺪ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫د( ‪ opr‬ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ﻫـ ( روي ﻓﻠﮕﻬﺎي‪ PF ،ZF، SF ، OF‬و ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ز( ﺑﻴﺖﻫﺎي ‪opr‬را ﺑﺎ اﻧﺪازه ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف ﭼﭗ ﺷﻴﻔﺖ ﻣﻲدﻫﺪ و از ﻃـﺮف راﺳـﺖ‬
‫ﺑﺎ ﺻﻔﺮ ﭘﺮ ﻣﻲﺷﻮد‪.‬‬

‫‪0‬‬
‫‪CF‬‬ ‫‪opr‬‬

‫ﻣﺜﺎل ‪6-11‬‬
‫‪SHL AX, CL‬‬
‫‪SHL BL, CL‬‬
‫‪SHL AL, 1‬‬

‫‪STC‬‬ ‫‪1‬‬
‫‪MOV CL, 3‬‬
‫‪MOV DL, 8DH‬‬
‫‪SHL DL , CL‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ STC‬ﻣﻘﺪار ﻓﻠﮓ ‪ CF‬را ﺑﻪ ﻳﻚ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SHL‬‬

‫‪CL‬‬ ‫‪00000011‬‬ ‫‪CF‬‬ ‫‪1‬‬

‫‪DL‬‬ ‫‪10001101‬‬
‫‪١٣٤‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SHL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪01101000‬‬

‫‪CF‬‬ ‫‪0‬‬

‫‪ -6-2-2‬دﺳﺘﻮراﻟﻌﻤﻞ‪SHR‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SHR‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪SHR opr, cnt‬‬

‫اﻟﻒ( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪ .‬وﻟﻲ ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ج( روي ﻓﻠﮕﻬﺎي ‪ PF ،ZF، CF‬اﺛﺮ دارد‪.‬‬
‫د( اﮔﺮ ﻣﻘﺪار ‪ cnt‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ ﺧﻮدش را ﻣﻲﻧﻮﻳﺴﻢ در ﻏﻴﺮ اﻳﻨـﺼﻮرت از ﺛﺒـﺎت‬
‫‪ CL‬اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫ﻫـ ( ﺑﻴﺖﻫﺎي ‪ opr‬را ﺑﺎ اﻧﺪازه ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف راﺳﺖ ﺷﻴﻔﺖ داده و از ﻃـﺮف ﭼـﭗ‬
‫ﺑﺎ ﺻﻔﺮ ﭘﺮ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪0‬‬
‫‪opr‬‬ ‫‪CF‬‬

‫ﻣﺜﺎل ‪6-12‬‬
‫‪SHR DL, 1‬‬
‫‪SHR AL, CL‬‬
‫‪١٣٥‬‬

‫ﻣﺜﺎل ‪6-13‬‬
‫‪STC‬‬ ‫‪1‬‬
‫‪MOV‬‬ ‫‪CL , 3‬‬
‫‪MOV‬‬ ‫‪DL, 8DH‬‬
‫‪SHR‬‬ ‫‪DL, CL‬‬

‫ﻣﺤﺘﻮي ﺛﺒﺎت ‪ DL‬را ﺳﻪ ﺑﻴﺖ ﺑﻄﺮف راﺳﺖ ﺷﻴﻔﺖ ﻣﻲدﻫﺪ‪.‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CF‬‬ ‫‪1‬‬

‫ﻣﻘﺎدﻳﺮ ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ SHR‬ﻋﺒﺎرﺗﻨﺪ از‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪00010001‬‬

‫‪CF‬‬ ‫‪1‬‬

‫‪ -6-2-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪SAL‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SAL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪SAL opr , cnt‬‬

‫اﻟﻒ( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ cnt‬اﮔﺮ ﻳﻚ ﺑﺎﺷﺪ ﻣﻘﺪار ﻳـﻚ را ﻣـﻲﻧﻮﻳـﺴﻢ در ﻏﻴـﺮ اﻳﻨـﺼﻮرت از ﺛﺒـﺎت ‪CL‬‬
‫اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪١٣٦‬‬

‫ج( ‪ opr‬ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬


‫د( روي ﻓﻠﮕﻬﺎي‪ PF ، ZF، SF ، OF‬و ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( ﺑﻴﺖﻫﺎي ‪ opr‬را ﺑﺎﻧﺪازه ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف ﭼﭗ ﺷﻴﻔﺖ ﻣﻲدﻫﺪ و از ﻃﺮف راﺳﺖ‬
‫ﺑﺎ ﺻﻔﺮ ﭘﺮ ﻣﻲﺷﻮد‪.‬‬

‫‪0‬‬
‫‪CF‬‬ ‫‪opr‬‬
‫ﻣﺜﺎل ‪6-14‬‬
‫‪SAL‬‬ ‫‪DL, 1‬‬
‫‪SAL‬‬ ‫‪AL, CL‬‬
‫‪SAL‬‬ ‫‪[BX] , CL‬‬
‫‪SAL‬‬ ‫‪ARR [SI], CL‬‬
‫ﻣﺜﺎل ‪6-15‬‬
‫‪STC‬‬
‫‪MOV CL , 3‬‬
‫‪MOV DL, 8DH‬‬
‫‪SAL DL, CL‬‬

‫ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SAL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CF‬‬ ‫‪1‬‬

‫ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SAL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪01101000‬‬

‫‪CF‬‬ ‫‪0‬‬
‫‪١٣٧‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‪SAR‬‬ ‫‪-6-2-4‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SAR‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪SAR opr , cnt‬‬

‫اﻟﻒ( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﻧﻤﻲ ﺗﻮاﻧﺪﺛﺎﺑﺖ ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫د( ‪ cnt‬اﮔﺮ ﻣﻌـﺎدل ﻳـﻚ ﺑﺎﺷـﺪ ﻣﻘـﺪار ‪ 1‬در ﻏﻴـﺮ اﻳﻨـﺼﻮرت از ﺛﺒـﺎت ‪ CL‬اﺳـﺘﻔﺎده‬
‫ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫ﻫـ ( ﺑﻴﺖﻫﺎي ‪ opr‬را ﺑﺎﻧﺪازة ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف راﺳﺖ ﺷﻴﻔﺖ داده و از ﺳﻤﺖ ﭼﭗ ﺑـﺎ‬
‫‪ MSB‬ﭘﺮ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪opr‬‬ ‫‪CF‬‬

‫ﻣﺜﺎل ‪6-16‬‬
‫‪SAR DL, 1‬‬
‫‪SAR AX , CL‬‬
‫‪SAR [BX], CL‬‬

‫ﻣﺜﺎل ‪6-17‬‬
‫‪MOV CL,3‬‬
‫‪STC‬‬
‫‪MOV DL, 8DH‬‬
‫‪SAR DL, CL‬‬
‫‪١٣٨‬‬

‫ﻣﻘﺎدﻳﺮ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SAR‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CF‬‬ ‫‪1‬‬

‫ﻣﻘﺎدﻳﺮ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪SAR‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪11110001‬‬

‫‪CF‬‬ ‫‪1‬‬

‫‪ -6-3‬ﻋﻤﻠﻴﺎت ﭼﺮﺧﺶ )‪( Rotate‬‬


‫ﻋﻤﻠﻴﺎت ﭼﺮﺧﺶ ﺑﺎﻋﺚ دور زدن ﺑﻴﺖﻫﺎي ﻳـﻚ ﺑﺎﻳـﺖ ﻳـﺎ ‪ word‬ﻣـﻲﺷـﻮﻧﺪ‪.‬‬
‫ﺑﻌﺒﺎرت دﻳﮕﺮ ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﺷﻴﻔﺖ ﺑﺎﻋﺚ ﺧﺎرج ﺷﺪن ﺑﻴـﺖﻫـﺎ از ﺑﺎﻳـﺖ ﻳـﺎ‬
‫‪ word‬ﻧﻤﻲﺷﻮد‪ .‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭼﺮﺧﺶ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Rotate‬‬ ‫‪Left‬‬ ‫‪ROL‬‬


‫‪Rotate‬‬ ‫‪Right‬‬ ‫‪ROR‬‬
‫‪Rotate‬‬ ‫‪Left through Carry‬‬ ‫‪RCL‬‬
‫‪Rotate‬‬ ‫‪Right through Carry‬‬ ‫‪RCR‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ‪ROL‬‬ ‫‪-6-3-1‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ‪ ROL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ROL opr , cnt‬‬


‫‪١٣٩‬‬

‫اﻟﻒ( ‪ opr‬ﻣﻲﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﻣﻲﺑﺎﻳﺴﺘﻲ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫ج( اﮔﺮ ﻣﻘـﺪار ‪ cnt‬ﺑﺮاﺑـﺮ ﺑـﺎ ﻳـﻚ ﺑﺎﺷـﺪ ﻋـﺪد ‪ 1‬را ﻣـﻲﻧﻮﻳـﺴﻢ در ﻏﻴـﺮ اﻳﻨـﺼﻮرت‬
‫از ﺛﺒﺎت ‪ CL‬اﺳﺘﻔﺎده ﻣﻲﻛﻨﻴﻢ‪.‬‬
‫د( روي ﻓﻠﮓ ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻧﺪازه ‪ cnt‬ﺑﻴﺖ از ﺳﻤﺖ ﭼﭗ ﭼﺮﺧﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪CF‬‬
‫‪opr‬‬

‫ﻣﺜﺎل ‪6-18‬‬
‫‪ROL DL, CL‬‬
‫‪ROL BX , 1‬‬
‫‪ROL [BX] , CL‬‬
‫ﻣﺜﺎل ‪6-19‬‬
‫‪MOV‬‬ ‫‪CL,3‬‬
‫‪MOV‬‬ ‫‪DL, 8DH‬‬
‫‪STC‬‬ ‫‪1‬‬
‫‪ROL‬‬ ‫‪DL, CL‬‬

‫ﻣﻘﺎدﻳﺮ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ROL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CF‬‬ ‫‪1‬‬
‫‪١٤٠‬‬

‫ﻣﻘﺎدﻳﺮ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ROL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪01101100‬‬

‫‪CF‬‬ ‫‪0‬‬

‫‪ -6-3-2‬دﺳﺘﻮراﻟﻌﻤﻞ‪ROR‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ ROR‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪:‬‬

‫‪ROR opr , cnt‬‬

‫اﻟﻒ( ‪ opr‬از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﻣﻲﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪ opr .‬ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ cnt‬اﮔﺮ ﻣﻌﺎدل ﻳﻚ ﺑﺎﺷﺪ ﻋﺪد ‪ 1‬را ﻣﻲﻧﻮﻳﺴﻢ در ﻏﻴـﺮ اﻳﻨـﺼﻮرت از ﺛﺒـﺎت ‪CL‬‬
‫اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫د( روي ﻓﻠﮓ ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( ﺑﺎﻧﺪازة ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف راﺳﺖ ﭼﺮﺧﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪CF‬‬
‫‪opr‬‬
‫‪١٤١‬‬

‫ﻣﺜﺎل ‪6-20‬‬
‫‪ROR‬‬ ‫‪DL, 1‬‬
‫‪ROR‬‬ ‫‪BX, CL‬‬
‫‪ROR‬‬ ‫‪AL, CL‬‬
‫‪ROR‬‬ ‫‪X[DI],CL‬‬
‫ﻣﺜﺎل ‪6-21‬‬
‫‪MOV CL, 3‬‬
‫‪STC‬‬
‫‪MOV DL, 8DH‬‬
‫‪ROR DL, CL‬‬

‫ﻣﻘﺎدﻳﺮ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ROR‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CF‬‬ ‫‪1‬‬

‫ﻣﻘﺎدﻳﺮ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ROR‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪10110001‬‬

‫‪CF‬‬ ‫‪1‬‬

‫‪ -6-3-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪RCL‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ RCL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪RCL opr , cnt‬‬


‫‪١٤٢‬‬

‫اﻟﻒ( ﭼﻨﺎﻧﭽﻪ ﻣﻘﺪار ‪ cnt‬ﻳـﻚ ﺑﺎﺷـﺪ ﻣﻘـﺪار ‪ 1‬ﻧﻮﺷـﺘﻪ ﻣـﻲﺷـﻮد در ﻏﻴـﺮ اﻳﻨـﺼﻮرت‬
‫از ﺛﺒﺎت ‪ CL‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫ب( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ﺑﺎﻳﺖ ﻳﺎ ‪ word‬ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ opr‬ﺑﺎﻳﺴﺘﻲ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪ opr .‬ﻣﻘﺪار ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫د( روي ﻓﻠﮓ ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( دﺳﺘﻮراﻟﻌﻤﻞ ‪ RCL‬ﺑﺎﻧﺪازه ‪ cnt‬ﺑﻴﺖ از ﺑﻴـﺖﻫـﺎي ‪ opr‬را از ﻃـﺮف ﭼـﭗ و از‬
‫ﻃﺮﻳﻖ ﺑﻴﺖ ‪ CF‬ﭼﺮﺧﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪CF‬‬ ‫‪opr‬‬

‫ﻣﺜﺎل ‪6-22‬‬
‫‪RCL‬‬ ‫‪DL, 1‬‬
‫‪RCL‬‬ ‫‪BX, CL‬‬
‫‪RCL‬‬ ‫‪AL, CL‬‬
‫‪RCL‬‬ ‫‪BL, 1‬‬
‫‪RCL‬‬ ‫‪[BX],CL‬‬
‫ﻣﺜﺎل ‪6-23‬‬
‫‪MOV CL, 3‬‬
‫‪MOV DL, 8DH‬‬
‫‪STC‬‬
‫‪RCL DL, CL‬‬
‫ﻣﻘﺎدﻳﺮ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪RCL‬‬

‫‪DL‬‬ ‫‪10001101‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪CF‬‬ ‫‪1‬‬
‫‪١٤٣‬‬

‫ﻣﻘﺎدﻳﺮ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪RCL‬‬

‫‪CL‬‬ ‫‪00000011‬‬

‫‪DL‬‬ ‫‪01101110‬‬

‫‪CF‬‬ ‫‪0‬‬

‫‪ -6-3-4‬دﺳﺘﻮراﻟﻌﻤﻞ‪RCR‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ‪ RCR‬ﺑﺼﻮرت ذﻳﻞ ﻣﻲﺑﺎﺷﺪ‪:‬‬

‫‪RCR opr , cnt‬‬

‫اﻟﻒ( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ‪ word‬ﻳﺎ ﺑﺎﻳﺖ ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﺑﺎﻳﺴﺘﻲ ﺛﺒﺎت ﻳﺎ ﻣﺘﻐﻴﺮ ﺑﺎﺷﺪ و ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ج( اﮔﺮ ﻣﻘﺪار ‪ cnt‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ ﺑﺎﻳﺴﺘﻲ ﻣﻘـﺪار ‪ 1‬را ﻧﻮﺷـﺖ در ﻏﻴـﺮ اﻳﻨـﺼﻮرت‬
‫از ﺛﺒﺎت ‪ CL‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫د( روي ﻓﻠﮓ ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ﻫـ ( دﺳﺘﻮراﻟﻌﻤﻞ ‪ RCR‬ﺑﺎﻧﺪازه ‪ cnt‬ﺑﻴﺖ ﺑﻄﺮف راﺳﺖ از ﻃﺮﻳﻖ ﻓﻠﮓ ‪ CF‬ﭼـﺮﺧﺶ‬
‫ﻣﻲدﻫﺪ‪.‬‬

‫‪opr‬‬ ‫‪CF‬‬
١٤٤

6-24 ‫ﻣﺜﺎل‬
RCR DL, 1
RCR [BX], CL
RCR AL, CL
RCR X[BX][DI],CL
RCR [BX], 1
6-25 ‫ﻣﺜﺎل‬

MOV CL, 3
MOV DL, 8DH
STC
RCR DL, CL

RCR ‫ﻣﻘﺎدﻳﺮ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ‬

CL 00000011

DL 10001101

CF 1

RCR ‫ﻣﻘﺎدﻳﺮ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ‬

CL 00000011

DL 01110001

CF 1
‫‪١٤٥‬‬

‫‪ -6-4‬ﻋﻤﻠﻴﺎت ﻓﻠﮓﻫﺎ‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﺮﺑﻮط ﺑﻪ ﻋﻤﻠﻴﺎت روي ﻓﻠﮕﻬﺎ در ذﻳـﻞ داده ﺷـﺪه اﻧـﺪ‪ .‬اﻳـﻦ‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫ﺟﺪول ‪6-4‬‬
‫‪Clear Carry‬‬ ‫‪CLC‬‬ ‫‪ CF‬ﺻﻔﺮ ﻣﻲﺷﻮد‬
‫‪Complement Carry‬‬ ‫‪CMC‬‬ ‫‪ CF‬ﻣﻜﻤﻞ ﻣﻲﺷﻮد‬
‫‪Set Carry‬‬ ‫‪STC‬‬ ‫‪ CF‬ﻳﻚ ﻣﻲﺷﻮد‬
‫‪Clear Direction‬‬ ‫‪CLD‬‬ ‫‪ DF‬ﺻﻔﺮ ﻣﻲﺷﻮد‬
‫‪Set Direction‬‬ ‫‪STD‬‬ ‫‪ DF‬ﻳﻚ ﻣﻲﺷﻮد‬
‫‪Clear Interrupt‬‬ ‫‪CLI‬‬ ‫‪ IF‬ﺻﻔﺮ ﻣﻲﺷﻮد‬
‫‪Set Interrupt‬‬ ‫‪STI‬‬ ‫‪ IF‬ﻳﻚ ﻣﻲﺷﻮد‬

‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻼﺣﻈﻪ ﻣﻲﺷﻮد اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷـﻨﺪ‪ .‬اﻳـﻦ‬


‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ ﻓﻘﻂ روي ﻓﻠﮓ ﻣﺮﺑﻮﻃﻪ اﺛﺮ دارﻧـﺪ‪ .‬ﺑﻌﻨـﻮان ﻣﺜـﺎل ‪ CLC‬ﻓﻘـﻂ روي‬
‫ﻓﻠﮓ ‪ CF‬اﺛﺮ ﻣﻲﻛﻨﺪ و ﻣﻘﺪار ﻗﺒﻠﻲ آﻧﺮا ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‪.‬‬
‫از ﻃﺮف دﻳﮕﺮ دو دﺳﺘﻮراﻟﻌﻤﻞ ‪ LAHF‬و ‪ SAHF‬ﻧﻴـﺰ ﻣﺮﺑـﻮط ﺑـﻪ ﻋﻤﻠﻴـﺎت‬
‫ﻓﻠﮓﻫﺎ ﻣﻲﺑﺎﺷﻨﺪ ﻛﻪ در ذﻳﻞ ﺗﻮﺻﻴﻒ ﻣﻲﮔﺮدﻧﺪ‪.‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ LAHF‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪LAHF‬‬

‫اﻟﻒ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( ﺑﺎﻳﺖ ﻛﻢ ارزش )ﺑﻴﺖﻫﺎي ‪ 0‬ﺗﺎ ‪ (7‬ﺛﺒﺎت ﻓﻠﮓ را ﺑﻪ ‪ AH‬ﻣﻨﺘﻘﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫ج( روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫د( ﻓﻘﻂ ﻣﻘﺎدﻳﺮ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 0 ،2 ،4 ،6 ،7‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪.‬‬
‫‪١٤٦‬‬

‫‪15‬‬ ‫‪8 7‬‬ ‫‪0‬‬ ‫‪7‬‬ ‫‪0‬‬

‫⎯‬
‫→⎯‬
‫‪Flag register‬‬ ‫‪AH‬‬

‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SAHF‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪SAHF‬‬

‫اﻟﻒ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج( ﻣﺤﺘﻮي ﺛﺒﺎت ‪ AH‬را ﺑﻪ ﺑﺎﻳﺖ ﻛﻢ ارزش )ﺑﻴﺖﻫـﺎي‪ 0‬ﺗـﺎ‪ ( 7‬ﺛﺒـﺎت ﻓﻠـﮓ ﻣﻨﺘﻘـﻞ‬

‫ﻣﻲﻛﻨﺪ‪.‬‬

‫‪15‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪0‬‬ ‫‪7‬‬ ‫‪AH‬‬ ‫‪0‬‬


‫←‬
‫⎯⎯‬
‫‪Flag register‬‬

‫‪ -6-5‬ﺗﺒﺪﻳﻞ ﺣﺮوف‬
‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻴﺪاﻧﻴﺪ ﺑﻪ ﻫﺮ ﻛﺎرﻛﺘﺮ ﻳﻚ ﻛﺪ اﺳﻜﻲ ﺑـﻴﻦ ‪ 0‬ﺗـﺎ ‪ 255‬ﺗﺨـﺼﻴﺺ‬
‫ﻣﻲﻳﺎﺑﺪ‪ .‬ﻛﺪاﺳﻜﻲ ﺑﺮاي ﺣﺮوف ﺑﺰرگ ‪ A‬ﺗﺎ ‪ Z‬ﺑﺘﺮﺗﻴـﺐ از ‪ 65‬ﺗـﺎ ‪ 90‬ﻳـﺎ از ‪ 41H‬ﺗـﺎ‬
‫‪ 5AH‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺣﺮوف ﻛﻮﭼﻚ ﻧﻴﺰ داراي ﻛﺪ اﺳـﻜﻲ ﺑـﻴﻦ ‪ 97‬ﺗـﺎ ‪ 122‬ﻳـﺎ ‪ 61H‬ﺗـﺎ‬
‫‪ 7AH‬ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫‪A‬‬ ‫‪65‬‬ ‫‪01000001‬‬
‫‪A‬‬ ‫‪97‬‬ ‫‪01100001‬‬
‫‪Z‬‬ ‫‪90‬‬ ‫‪01011010‬‬
‫‪Z‬‬ ‫‪122‬‬ ‫‪01111010‬‬
‫‪١٤٧‬‬

‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻼﺣﻈﻪ ﻣﻲﻛﻨﻴﺪ ﺗﻔﺎوت ﻧﻤﺎﻳﺶ ﺑـﻴﻦ ‪ A‬و ‪ a‬ﻳـﺎ ‪ Z‬و ‪ z‬در ﺑﻴـﺖ‬
‫ﺷﻤﺎره ‪ 5‬آﻧﻬﺎ ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ ﻧﺘﻴﺠﻪ ﻣﻲﮔﻴﺮﻳﻢ ﺑﺮاي ﺗﺒﺪﻳﻞ ﺣﺮوف ﻛﻮﭼﻚ ﺑﻪ ﺑﺰرگ‬
‫ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺼﻮرت زﻳﺮ ﻋﻤﻞ ﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪ ,‬ﺣﺮف ﻛﻮﭼﻚ ‪AND‬‬ ‫‪00100000B‬‬

‫و ﺑﺮاي ﺗﺒﺪﻳﻞ ﺣﺮوف ﺑﺰرگ ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺼﻮرت زﻳـﺮ‬
‫ﻋﻤﻞ ﺷﻮد‬
‫‪OR‬‬ ‫‪,‬ﺣﺮف ﺑﺰرگ‬ ‫‪00100000B‬‬

‫ﻣﺜﺎل ‪6-26‬‬
‫در رﺷﺘﺔ ‪ STR‬ﺣﺮوف ﻛﻮﭼﻚ را ﺑﻪ ﺑﺰرگ ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪ .‬ﺑﺎﻳﺴﺘﻲ ﻛﻨﺘﺮل ﺷﻮد‬
‫ﻛﻪ ﻛﺎرﻛﺘﺮ از ﻧﻮع ﺣﺮوف ﻛﻮﭼﻚ ﻣﻲﺑﺎﺷﺪ ﺳﭙﺲ ﺑـﻪ ﺣـﺮوف ﺑـﺰرگ ﻣﺘﻨـﺎﻇﺮ ﺗﺒـﺪﻳﻞ‬
‫ﮔﺮدد‪.‬‬

‫‪STR‬‬ ‫‪DB ′Change to uppercase letters′‬‬


‫‪LEA‬‬ ‫‪BX , STR+1‬‬
‫‪MOV‬‬ ‫‪CX, 26‬‬
‫‪LAB1:‬‬ ‫‪MOV‬‬ ‫]‪AX, [BX‬‬
‫‪CMP‬‬ ‫‪AH, 61H‬‬
‫‪JB‬‬ ‫‪LAB2‬‬
‫‪CMP‬‬ ‫‪AH, 7AH‬‬
‫‪JA‬‬ ‫‪LB2‬‬
‫‪AND‬‬ ‫‪AH, 0DFH‬‬
‫‪MOV‬‬ ‫‪[BX], AH‬‬
‫‪LAB2:‬‬ ‫‪INC‬‬ ‫‪BX‬‬
‫‪LOOP‬‬ ‫‪LAB1‬‬
‫‪١٤٨‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ ﻋﻤﻠﻴﺎت ﺑﻴﺘﻲ ﻣﻮرد ﺑﺤﺚ ﻗﺮار ﮔﺮﻓﺖ‪ .‬اﺑﺘﺪا ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ ﻣﺎﻧﻨﺪ‬
‫‪ TEST ، XOR ، NOT ،OR ،AND‬ﺑﺤﺚ ﮔﺮدﻳﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ روي ﺑﻴﺖﻫﺎ‬
‫ﻋﻤــﻞ ﻣــﻲﻧﻤﺎﻳﻨــﺪ و ﻫﻤﺎﻧﻄﻮرﻳﻜــﻪ ﮔﻔﺘــﻪ ﺷــﺪ ﺑ ـﻪ ﺟــﺰء دﺳــﺘﻮراﻟﻌﻤﻞ‪ NOT‬ﺳــﺎﻳﺮ‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ داراي دو ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﻨﺪ‪ TEST .‬ﺷﺒﻴﻪ ‪ AND‬ﻣﻲﺑﺎﺷﺪ وﻟـﻲ ﻧﺘﻴﺠـﻪ‬
‫در ﺟﺎﺋﻲ ذﺧﻴﺮه ﻧﻤﻲﮔـﺮدد‪ .‬ﻋﻤﻠﻴـﺎت ﺑﻌـﺪي دﺳـﺘﻮراﻟﻌﻤﻞﻫـﺎي ﺷـﻴﻔﺖ و ﭼـﺮﺧﺶ‬
‫ﻣﻲﺑﺎﺷﻨﺪ ﻛﻪ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻧﻴـﺰ روي ﺑﻴـﺖﻫـﺎ ﻋﻤـﻞ ﻣـﻲﻛﻨﻨـﺪ و ﭼﻨﺎﻧﭽـﻪ ﺗﻌـﺪاد‬
‫ﺑﻴﺖﻫﺎي ﻣﻮرد ﻋﻤﻞ ﺑﻴﺶ از ﻳﻚ ﺑﺎﺷﺪ ﺑﺎﻳﺴﺘﻲ ﺗﻌﺪاد ﺑﻴـﺖﻫـﺎ را در ﺛﺒـﺎت ‪ CL‬ﻗـﺮار‬
‫دﻫــــﻴﻢ‪ .‬دﺳــــﺘﻮراﻟﻌﻤﻠﻬﺎي ﺷــــﻴﻔﺖ ﻋﺒﺎرﺗﻨــــﺪ از ‪ SAR ،SAL ،SHR ،SHL‬و‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭼﺮﺧﺶ ﻋﺒﺎرﺗﻨﺪ از ‪ .RCR ،RCL ،ROR ،ROL‬در اﻧﺘﻬـﺎي ﻓـﺼﻞ‬
‫ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﺗﻐﻴﻴﺮ ﻓﻠﮓﻫﺎ ﻣﻮرد ﺑﺤﺚ ﻗﺮار ﮔﺮﻓﺘـﻪ و در ﻧﻬﺎﻳـﺖ ﺑـﺎ اﺳـﺘﻔﺎده از‬
‫ﭼﻨﺪﻳﻦ ﻣﺜﺎل ﻛﺎرﺑﺮد ﻣﻄﺎﻟﺐ ﻓﻮق ﻧﺸﺎن داده ﺷﺪه اﺳﺖ ﻛـﻪ از ﺟﻤﻠـﻪ ﺗﺒـﺪﻳﻞ ﺣـﺮوف‬
‫ﻛﻮﭼﻚ در ﻳﻚ ﻣﺘﻦ ﺑﻪ ﺣﺮوف ﺑﺰرگ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪١٤٩‬‬

‫‪ a‬ﺗﻤﺮﻳﻦ‬

‫‪-1‬اﺷﻜﺎل دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳﺮ را ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫‪ROL DL, 2‬‬


‫‪SHL BX , CX‬‬
‫]‪MOV X , [BX‬‬

‫‪-2‬ﻣﻘﺪار ‪ CF‬و ‪ BL‬ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﭼﻴﺴﺖ؟‬


‫‪MOV‬‬ ‫‪CL, 4‬‬
‫‪MOV‬‬ ‫‪BL, 0BBH‬‬
‫‪CLC‬‬
‫‪SAL‬‬ ‫‪BL, CL‬‬
‫‪XOR‬‬ ‫‪BL, CL‬‬
‫‪SAR‬‬ ‫‪BL, CL‬‬

‫‪-3‬ﻣﻘﺪار ‪ CF‬و ‪ BX‬ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﭼﻴﺴﺖ؟‬


‫‪MOV‬‬ ‫‪CL, 3‬‬
‫‪MOV‬‬ ‫‪BX, 2ACH‬‬
‫‪STC‬‬
‫‪ROL‬‬ ‫‪BX, CL‬‬
‫‪INC‬‬ ‫‪CL‬‬
‫‪RCL‬‬ ‫‪BX, CL‬‬

‫‪-4‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ﭼﻪ ﻓﻠﮓﻫﺎﺋﻲ اﺛﺮ دارﻧﺪ؟‬

‫‪RCR , SHL, MOV, TEST, AND, XOR‬‬

‫‪-5‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻳﻚ رﺷﺘﻪ را ﮔﺮﻓﺘﻪ ﺗﻌﺪاد ﺣـﺮوف ﻛﻮﭼـﻚ آﻧـﺮا ﻣـﺸﺨﺺ‬


‫ﻧﻤﺎﻳﺪ‪.‬‬
‫‪١٥٠‬‬

‫‪-6‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ﻓﺮد ﺛﺒﺎت ‪ AX‬را ﺑﻪ ﻳـﻚ و ﺑﻴـﺖﻫـﺎي زوج‬
‫ﺛﺒﺎت ‪ AX‬را ﺑﻪ ﺻﻔﺮ ﺗﺒﺪﻳﻞ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-7‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ آﻳﺎ ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 2 ، 5 ، 7‬ﺛﺒﺎت ‪ BL‬ﺑﺮاﺑﺮ‬


‫ﺑﺎ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟‬

‫‪-8‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ آﻳﺎ ﺑﻴﺖﻫﺎي ﺷﻤﺎره زوج ﺛﺒﺎت ‪ AX‬ﺑﺮاﺑﺮ ﺑـﺎ‬
‫ﻳﻚ ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟‬

‫‪ -9‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﻴﺖﻫﺎي ﺛﺒﺎت ‪ AX‬را آﻧﻘﺪر ﺑﻄﺮف ﭼـﭗ ﺷـﻴﻔﺖ دﻫـﺪ ﺗـﺎ‬
‫‪ MSB‬آن ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﮔﺮدد‪ .‬در ﺻﻮرﺗﻴﻜﻪ در اﺑﺘﺪا ‪ MSB‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺑﺎﺷﺪ ﻛﻨﺘﺮل‬
‫ﺑﻪ ‪ EXIT‬ﻣﻨﺘﻘﻞ ﮔﺮدد‪.‬‬

‫‪-10‬ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ ﭼﻴﺴﺖ؟‬

‫‪MOV‬‬ ‫‪AX, 4BCH‬‬


‫‪MOV‬‬ ‫‪DX, 0F2BCH‬‬
‫‪XOR‬‬ ‫‪AX, DX‬‬
‫‪SUB‬‬ ‫‪DX, 8‬‬
‫‪NOT‬‬ ‫‪DX‬‬
‫‪ADD‬‬ ‫‪AX, 16‬‬
‫‪AND‬‬ ‫‪DX, AX‬‬

‫‪-11‬ﺑﺎ ﭼﻪ دﺳﺘﻮري ﻣﻘﺎدﻳﺮ ‪ IF, DF, CF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﻣﻲﺷﻮد‪.‬‬

‫‪-12‬ﺑﻪ ﭼﻨﺪ ﻃﺮﻳﻖ ﻣﻲﺗﻮان ﻣﻘﺪار ﺛﺒﺎت ‪ AX‬را ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻗﺮار داد؟‬

‫‪-13‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﻘﺪار ﺑﻴﺖ ﺷﻤﺎره ‪ n‬ام ﺛﺒﺎت ‪ AX‬را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪١٥١‬‬

‫ﻓﺼﻞ ﻫﻔﺘﻢ‬
‫ﻣﺎﻛﺮوﻫﺎ و روالﻫﺎ و وﻗﻔﻪﻫﺎ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻣﻌﺮﻓﻲ ﭘﺸﺘﻪ‪ ،‬ﻣﻜﺮو‪ ،‬روال‪ ،‬وﻗﻔﻪﻫﺎ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬
‫‪-1‬ﺗﻌﺮﻳﻒ ﭘﺸﺘﻪ‪ ،‬ﻛﺎرﺑﺮد و دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﺮﺑﻮﻃﻪ‪.‬‬
‫‪-2‬ﺗﻌﺮﻳﻒ روال‪ ،‬ﻛﺎرﺑﺮد‪ ،‬ﻧﺤﻮه اﻳﺠﺎد و ﻓﺮاﺧﻮاﻧﻲ آﻧﻬﺎ‪.‬‬
‫‪-3‬ﺗﻌﺮﻳﻒ ﻣﺎﻛﺮو‪ ،‬ﻧﺤﻮه اﻳﺠﺎد‪ ،‬ﻛﺎرﺑﺮد و ﻓﺮاﺧﻮاﻧﻲ آﻧﻬﺎ‪.‬‬
‫‪-4‬ﻋﻤﻠﮕﺮﻫﺎي ﻣﺎﻛﺮو‪.‬‬
‫‪-5‬وﻗﻔﻪﻫﺎ و دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﺮﺑﻮﻃﻪ‪.‬‬
‫‪-6‬رواﻟﻬﺎي ﺗﺒﺪﻳﻞ ﺑﺎﻳﻨﺮي ﺑﻪ اﺳﻜﻲ و ﺑﺎﻟﻌﻜﺲ‪.‬‬
‫‪ -7‬اﻧﺪازهﮔﻴﺮي زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ‪.‬‬
‫‪١٥٢‬‬

‫‪ -8‬اﻳﺠﺎد ﺗﺄﺧﻴﺮ‪.‬‬
‫‪ -7-1‬ﭘﺸﺘﻪ ) ‪( Stack‬‬
‫ﭘﺸﺘﻪ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ اﺻﻠﻲ ﻳﺎ ‪ RAM‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﭘﺸﺘﻪ ﺧﺎﺻﻴﺖ ‪ LIFO‬دارد‬
‫ﻳﻌﻨﻲ ﻋﻨﺼﺮي ﻛﻪ آﺧﺮ وارد ﭘﺸﺘﻪ ﻣﻲﺷﻮد اوﻟﻴﻦ ﻋﻨـﺼﺮي اﺳـﺖ ﻛـﻪ از ﭘـﺸﺘﻪ ﺧـﺎرج‬
‫ﻣﻲﺷﻮد‪ .‬ﻣﻘﺎدﻳﺮي ﻛﻪ ﭘﺸﺘﻪ در ﺧﻮد ذﺧﻴﺮه ﻣﻲﻧﻤﺎﻳﺪ از ﻧﻮع ‪ word‬ﻣﻲﺑﺎﺷﺪ‪ .‬ﺛﺒﺎت ‪SP‬‬
‫ﺑﻪ ﻋﻨﺼﺮ ‪ top‬ﭘﺸﺘﻪ اﺷﺎره ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪STACK‬‬
‫‪SS:01F6‬‬
‫‪SS:01F8‬‬
‫‪SS:01FA‬‬
‫‪SS:01FC‬‬

‫‪SS:01FE‬‬
‫‪SP‬‬

‫ﺛﺒﺎت ‪ SP‬ﻫﻤﻴﺸﻪ ﺑﻪ آﺧﺮﻳﻦ ‪ word‬اي ﻛﻪ وارد ﭘﺸﺘﻪ ﺷـﺪه اﺷـﺎره ﻣـﻲﻧﻤﺎﻳـﺪ‪.‬‬


‫ﻋﻤﻠﻴﺎﺗﻲ ﻛﻪ روي ﭘـﺸﺘﻪ اﻧﺠـﺎم ﻣـﻲﺷـﻮﻧﺪ ﻋﺒﺎرﺗﻨـﺪ از ‪ PUSH‬و ‪ POP‬ﻛـﻪ در ذﻳـﻞ‬
‫ﺗﺸﺮﻳﺢ ﻣﻲﮔﺮدد‪ .‬ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻗﺒﻼً ﮔﻔﺘﻪ ﺷﺪ ﺛﺒﺎت ‪ SS‬ﺑﻪ اﺑﺘﺪاي ﺳﮕﻤﻨﺖ ﭘﺸﺘﻪ اﺷﺎره‬
‫ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪ -7-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪PUSH‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ PUSH‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪PUSH‬‬ ‫‪opr‬‬
‫‪١٥٣‬‬

‫اﻟﻒ( ‪ opr‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ opr‬ﺑﺎﻳﺴﺘﻲ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪ .‬ﺛﺎﺑﺖ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ opr‬ﻣﻲﺗﻮاﻧﺪ ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎي ‪ ES، SS ،DS‬ﺑﺎﺷﺪ‪.‬‬
‫د( دﺳﺘﻮراﻟﻌﻤﻞ ‪ PUSH‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ه(اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ‪ opr‬را در ﭘﺸﺘﻪ ﻗﺮار ﻣـﻲدﻫـﺪ و ﺛﺒـﺎت ‪ SP‬را ﺑﺎﻧـﺪازه دو واﺣـﺪ‬
‫ﻛﺎﻫﺶ ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-1‬‬

‫‪PUSH AX‬‬

‫‪SS:01F6‬‬
‫‪SS:01F8‬‬
‫‪SS:01FA‬‬
‫‪SP‬‬ ‫)‪(AX‬‬ ‫‪SS:01FC‬‬
‫‪SS:01FE‬‬

‫‪ -7-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪POP‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ POP‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪POP‬‬ ‫‪dst‬‬

‫اﻟﻒ( ‪ dst‬ﺑﺎﻳﺴﺘﻲ از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ dst‬ﺑﺎﻳﺴﺘﻲ ﻣﺘﻐﻴﺮ ﻳﺎ ﺛﺒﺎت ﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ dst‬ﻣﻲﺗﻮاﻧﺪ ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎ ‪ ES، SS ،DS‬ﺑﺎﺷﺪ‪.‬‬
‫‪١٥٤‬‬

‫د( دﺳﺘﻮراﻟﻌﻤﻞ ‪ POP‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬


‫ه( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻋﻨﺼﺮي را ﻛﻪ ﺑﻮﺳﻴﻠﻪ ‪ SP‬ﻣﺸﺨﺺ ﻣﻲﺷﻮد در ‪ dst‬ﻗـﺮار داده و‬
‫ﺛﺒﺎت ‪ SP‬را ﺑﺎﻧﺪازه دو واﺣﺪ اﻓﺰاﻳﺶ ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-2‬‬
‫‪POP‬‬ ‫‪AX‬‬

‫‪SS:01F6‬‬
‫‪SS:01F8‬‬
‫‪SS:01FA‬‬
‫)‪(AX‬‬ ‫‪SS:01FC‬‬

‫‪SS:01FE‬‬
‫‪SP‬‬

‫ﻣﺜﺎل ‪7-3‬‬
‫‪PUSH‬‬ ‫‪AX‬‬
‫‪PUSH‬‬ ‫‪BX‬‬
‫‪PUSH‬‬ ‫‪ES‬‬
‫‪PUSH‬‬ ‫‪DI‬‬
‫‪M‬‬
‫‪POP‬‬ ‫‪DI‬‬
‫‪POP‬‬ ‫‪ES‬‬
‫‪POP‬‬ ‫‪BX‬‬
‫‪POP‬‬ ‫‪AX‬‬

‫‪ -7-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ‪PUSHF‬‬
‫‪١٥٥‬‬

‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ PUSHF‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪PUSHF‬‬

‫اﻟﻒ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ﺛﺒﺎت ﻓﻠﮓ را در ﭘﺸﺘﻪ ﻗﺮار ﻣﻲدﻫﺪ‪ .‬و ﺛﺒـﺎت ‪ SP‬را ﺑـﻪ‬
‫اﻧﺪازه دو واﺣﺪ ﻛﺎﻫﺶ ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-4‬‬
‫‪PUSHF‬‬

‫‪ -7-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ‪POPF‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ POPF‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪POPF‬‬
‫اﻟﻒ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻓﺎﻗﺪ ﻋﻤﻠﻮﻧﺪ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ب( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻘﺪاري ﻛﻪ در ﭘﺸﺘﻪ ﺑﻮﺳﻴﻠﻪ ﺛﺒﺎت ‪ SP‬اﺷﺎره ﻣﻲﺷﻮد را ﺑﻪ ﺛﺒﺎت‬
‫ﻓﻠﮓ ﻣﻨﺘﻘﻞ ﻧﻤﻮده و ﻣﺤﺘﻮي ﺛﺒﺎت ‪ SP‬را دو واﺣﺪ اﻓﺰاﻳﺶ ﻣﻲدﻫﺪ‪.‬‬
‫ج( روي ﻛﻠﻴﻪ ﻓﻠﮓﻫﺎ اﺛﺮ دارد‪.‬‬

‫ﻣﺜﺎل ‪7-5‬‬
‫‪POPF‬‬

‫‪ -7-2‬روال )‪(Procedures‬‬
‫‪١٥٦‬‬

‫ﺑﺮاي راﺣﺘﻲ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ‪ ،‬ﺑﺮﻧﺎﻣﻪﻫﺎ را ﻣﻲﺗﻮان ﺑﻪ ﺗﻌﺪادي روال ﺗﻘﺴﻴﻢ ﻧﻤﻮد‬
‫و ﻧﻮﺷﺘﻦ ﻫﺮ روال را ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ واﮔﺬار ﻛﺮد‪ .‬ﺷﻜﻞ ﻛﻠـﻲ روالﻫـﺎ ﺑـﺼﻮرت‬
‫زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪name‬‬ ‫‪PROC‬‬ ‫‪NEAR‬‬
‫‪M‬‬
‫‪1‬‬ ‫‪RET‬‬ ‫‪1‬‬
‫‪name‬‬ ‫‪ENDP‬‬

‫اﻟﻒ( ‪ PROC‬ﻣﺨﻔﻒ ﻛﻠﻤﻪ ‪ Procedure‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( ‪ name‬ﻧﺎم روال ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ج( ‪ RET‬ﻣﺨﻔﻒ ﻛﻠﻤﻪ ‪ return‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﻛﻨﺘﺮل را ﺑﻪ ﺑﺮﻧﺎﻣـﻪ ﻓﺮاﺧـﻮان اﻳـﻦ روال‬
‫ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬
‫د( ‪ ENDP‬ﻣﺨﻔـﻒ ‪ end of procedure‬ﻣـﻲﺑﺎﺷـﺪ ﻛـﻪ اﻧﺘﻬـﺎي روال را ﻣـﺸﺨﺺ‬
‫ﻣﻲﻛﻨﺪ‪.‬‬
‫ه( دﺳﺘﻮراﻟﻌﻤﻞ ‪ RET‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ز( ‪ NEAR‬ﻣﺸﺨــﺼﻪ روال ﻣــﻲﺑﺎﺷــﺪ‪ .‬ﻛﻠﻴــﻪ روالﻫــﺎي ﻳــﻚ ﺑﺮﻧﺎﻣــﻪ ﺑﺎﻳــﺴﺘﻲ داراي‬
‫ﻣﺸﺨﺼﻪ ‪ NEAR‬ﺑﺎﺷﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-6‬‬
‫‪١٥٧‬‬

‫‪SAVEREG PROC‬‬ ‫‪NEAR‬‬


‫‪PUSH‬‬ ‫‪AX‬‬
‫‪PUSH‬‬ ‫‪BX‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪PUSH‬‬ ‫‪DX‬‬
‫‪PUSH‬‬ ‫‪SI‬‬
‫‪PUSH‬‬ ‫‪DI‬‬
‫‪RET‬‬
‫‪SAVEREG‬‬ ‫‪ENDP‬‬

‫روال ﻓﻮق ﺑﺮاي ذﺧﻴﺮه ﻛﺮدن ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي ﻣﺸﺨﺺ ﺷﺪه اﺳﺘﻔﺎده ﻣـﻲﺷـﻮد‪.‬‬
‫ﺑﻤﻨﻈﻮر ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ روال از دﺳﺘﻮر ‪ CALL‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬ﺷﻜﻞ ﻛﻠـﻲ دﺳـﺘﻮر‬
‫‪ CALL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪CALL‬‬ ‫‪Name‬‬

‫اﻟﻒ( دﺳﺘﻮر ‪ CALL‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬


‫ب( ‪ name‬اﺳﻢ رواﻟﻲ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ دﺳﺘﻮراﻟﻌﻤﻞ ‪ CALL‬ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷـﻮد‪.‬‬
‫ﭘﺲ از ﻓﺮاﺧﻮاﻧﻲ روال ﺑﻪ ﻣﺤﺾ رﺳﻴﺪن ﺑﻪ دﺳﺘﻮر ‪ RET‬ﻛﻨﺘﺮل ﺑﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌـﺪ‬
‫از دﺳﺘﻮر ‪ CALL‬ﺑﺮﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪7-7‬‬
‫‪CALL‬‬ ‫‪SAVEREG‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ زﺑﺎن اﺳﻤﺒﻠﻲ ﺑﺮﻧﺎﻣـﻪ اﺻـﻠﻲ را ﺑﻌﻨـﻮان ﻳـﻚ روال ﺑـﺎ‬
‫ﻣﺸﺨﺼﻪ ‪ FAR‬در ﻧﻈﺮ ﻣﻲﮔﻴﺮد ﻛﻪ ﺑﻪ ﻣﺤﺾ رﺳﻴﺪن ﺑﻪ ‪ RET‬ﺑﺮﻧﺎﻣﻪ اﺻـﻠﻲ‪ ،‬ﻛﻨﺘـﺮل‬
‫ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺮ ﻣﻴﮕﺮدد‪.‬‬
‫‪١٥٨‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ ﻳﻚ روال اﺻﻠﻲ ﺑﺎ ﻣﺸﺨﺼﻪ ‪ FAR‬وﺟﻮد دارد و‬


‫ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﺗﻌﺪادي روال ﺑﺎ ﻣﺸﺨـﺼﻪ ‪ NEAR‬ﺑﺎﺷـﺪ ﻛـﻪ در روال اﺻـﻠﻲ‬
‫ﺗﻮﺳﻂ دﺳﺘﻮرﻫﺎي ‪ CALL‬ﻓﺮاﺧﻮاﻧﻲ ﮔﺮدﻧﺪ‪ .‬ﻣﺘﺬﻛﺮ ﻣﻴﺸﻮﻳﻢ ﻛـﻪ آدرﺳـﻬﺎي ﺑﺮﮔـﺸﺖ‬
‫روالﻫﺎ در ﭘﺸﺘﻪ ذﺧﻴﺮه ﻣﻲﮔﺮدﻧﺪ‪ .‬ﻳﻚ روال را ﻣﻲﺗـﻮان ﺑﺎرﻫـﺎ ﻓﺮاﺧـﻮاﻧﻲ ﻧﻤـﻮد‪ .‬در‬
‫ﻓﺼﻞ دﻫﻢ اﺳﺘﻔﺎده از روالﻫﺎ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ‪ .‬ﻳﻚ روال را ﻣـﻲﺗـﻮان ﺑـﺼﻮرت‬
‫ﺑﺎزﮔﺸﺘﻲ ﻳﺎ ‪ Recursive‬ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪.‬‬

‫‪ -7-3‬ﻣﺎﻛﺮوﻫﺎ )‪(Macros‬‬
‫ﻣﺎﻛﺮوﻫﺎ ﻋﻤﻼً ﻗﺴﻤﺖﻫﺎﺋﻲ از ﺑﺮﻧﺎﻣﻪ ﻣﺒﺪاء )‪ (source program‬ﻣﻲﺑﺎﺷﻨﺪ ﻛـﻪ‬
‫ﺑﺎ اﺳﺘﻔﺎده از ﻧﺎم آﻧﻬﺎ ﻣﻲﺗﻮان در ﻫﺮ ﺟﺎي ﺑﺮﻧﺎﻣﻪ ﻣﺒﺪاء درج ﻧﻤﻮد‪ .‬در ﺣﻘﻴﻘﺖ ﻣﺎﻛﺮوﻫﺎ‬
‫دﻧﺒﺎﻟﻪاي از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي اﺳﻤﺒﻠﻲ ﻣﻲﺑﺎﺷﻨﺪ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﭼﻨـﺪﻳﻦ ﺑـﺎر در ﺑﺮﻧﺎﻣـﻪ‬
‫ﻇﺎﻫﺮ ﺷﻮﻧﺪ‪ .‬ﺑﻪ ﺟﺎي ﭼﻨﺪﻳﻦ ﺑﺎر ﺗﺎﻳﭗ ﻧﻤﻮدن اﻳﻦ دﻧﺒﺎﻟﻪ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﻣﻲﺗﻮان ﻓﻘﻂ‬
‫ﻧﺎم آﻧﻬﺎ را در ﺑﺮﻧﺎﻣﻪ درج ﻧﻤﻮد‪ .‬ﺷﻜﻞ ﻛﻠﻲ ﻣﺎﻛﺮوﻫﺎ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪name‬‬ ‫‪MACRO‬‬
‫‪M‬‬
‫‪ENDM‬‬

‫اﻟﻒ( ‪ name‬ﻋﺒﺎرﺗﺴﺖ از ﻧﺎم ‪macro‬‬


‫ب( ‪ ENDM‬اﻧﺘﻬﺎي ‪ macro‬را ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫ج( ﺑــﻴﻦ ‪ MACRO‬و ‪ ENDM‬دﻧﺒﺎﻟــﻪاي از دﺳــﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﺮﻧﺎﻣــﻪ ﻣﺒــﺪاء ﻗــﺮار‬
‫ﻣﻲﮔﻴﺮد‪.‬‬
‫د( در زﻣﺎن ﺗﺮﺟﻤﻪ ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ زﺑـﺎن ﻣﺎﺷـﻴﻦ اﺑﺘـﺪا در ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﺟـﺎي ‪ macro‬ﻫـﺎ‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي واﺑﺴﺘﻪ ﺑﻪ ﻣﺎﻛﺮوﻫﺎ ﻗﺮار داده ﻣﻲﺷﻮﻧﺪ ﺳﭙﺲ ﺑﻪ زﺑﺎن ﻣﺎﺷـﻴﻦ ﺗﺮﺟﻤـﻪ‬
‫ﻣﻲﺷﻮﻧﺪ‪.‬‬
‫‪١٥٩‬‬

‫ه( ﺗﻔﺎوت ﺑﻴﻦ روال و ﻣﺎﻛﺮو در اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺎﻛﺮو در ﺑﺮﻧﺎﻣﻪ در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣـﻪ‬
‫وﺟﻮد ﺧﺎرﺟﻲ ﻧﺪارد ﺑﻠﻜﻪ روال در زﻣﺎن اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ وﺟـﻮد داﺷـﺘﻪ و ﻓﺮاﺧـﻮاﻧﻲ‬
‫ﻣﻲﮔﺮدد‪.‬‬
‫ز( ‪ macro‬ﻫﺎ ﺑﺎﻳﺴﺘﻲ در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳﻒ ﺷﻮﻧﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-8‬‬
‫‪TOT‬‬ ‫‪MACRO‬‬
‫‪MOV AX,X‬‬
‫‪ADD AX,Y‬‬
‫‪ENDM‬‬

‫ﻣﺎﻛﺮو ‪ TOT‬ﻣﺠﻤﻮع ﻣﺤﺘﻮي دو ﻣﺘﻐﻴـﺮ ‪ Y‬و ‪ X‬را ﻣﺤﺎﺳـﺒﻪ و در ﺛﺒـﺎت ‪AX‬‬


‫ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ﺣﺎل ﺑﺮﻧﺎﻣﻪ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ از اﻳﻦ ﻣﺎﻛﺮو اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪X‬‬ ‫? ‪DW‬‬
‫‪Y‬‬ ‫‪DW‬‬ ‫?‬
‫‪S‬‬ ‫‪DW‬‬ ‫?‬
‫‪MOV‬‬ ‫‪X, 1000‬‬
‫‪MOV‬‬ ‫‪Y, 3000‬‬
‫‪TOT‬‬ ‫‪1‬‬
‫‪MOV‬‬ ‫‪S , AX‬‬
‫‪SUB‬‬ ‫‪X, 10‬‬
‫‪TOT‬‬ ‫‪1‬‬
‫‪ADD‬‬ ‫‪S, AX‬‬
‫‪M‬‬

‫اﺑﺘﺪا اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ از اﺟﺮا ﻳﻌﻨﻲ دز زﻣﺎن ﺗﺮﺟﻤﻪ ﺑﺼﻮرت زﻳﺮ در ﻣﻲآﻳﺪ‪.‬‬
‫‪١٦٠‬‬

‫‪X‬‬ ‫? ‪DW‬‬
‫‪Y‬‬ ‫‪DW‬‬ ‫?‬
‫‪S‬‬ ‫‪DW‬‬ ‫?‬
‫‪MOV X, 1000‬‬
‫‪MOV Y, 3000‬‬
‫ﺟﺎﻳﮕﺰﻳﻦ ‪; macro‬‬
‫‪MOV AX, X‬‬
‫‪ADD‬‬ ‫‪AX, Y‬‬
‫‪MOV S, AX‬‬
‫‪SUB‬‬ ‫‪X, 10‬‬
‫ﺟﺎﻳﮕﺰﻳﻦ ‪; macro‬‬
‫‪MOV‬‬ ‫‪AX, X‬‬
‫‪ADD‬‬ ‫‪AX, Y‬‬
‫;‬ ‫‪1‬‬
‫‪ADD‬‬ ‫‪S, AX‬‬
‫‪M‬‬

‫ﻣﺎﻛﺮوﻫﺎ ﻣﻲﺗﻮاﻧﻨﺪ داراي ﭘﺎراﻣﺘﺮ ﺑﺎﺷﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-9‬‬
‫‪ADD_W‬‬ ‫‪MACRO‬‬ ‫‪T1, T2, SUM‬‬
‫‪1‬‬ ‫‪MOV‬‬ ‫‪AX , T1‬‬
‫‪1‬‬ ‫‪ADD‬‬ ‫‪AX, T2‬‬
‫‪11‬‬ ‫‪MOV‬‬ ‫‪SUM, AX‬‬
‫‪1‬‬ ‫‪ENDM‬‬

‫ﻣﺎﻛﺮو داده ﺷﺪه داراي ﺳﻪ ﭘﺎراﻣﺘﺮ ﺑﻨﺎﻣﻬﺎي ‪ T1, T2, SUM‬ﻣﻲﺑﺎﺷﺪ‪ .‬در ﻣﻮﻗﻊ‬
‫اﺳﺘﻔﺎده از اﻳﻦ ﻣﺎﻛﺮو ﺑﺎﻳﺴﺘﻲ ﺳﻪ ﻣﻘﺪار را ﺑﻌﻨﻮان ﺟـﺎﻳﮕﺰﻳﻨﻲ اﻳـﻦ ﭘﺎراﻣﺘﺮﻫـﺎ ﺑـﺪﻫﻴﻢ‪.‬‬
‫اﮔﺮ ﺑﻨﻮﻳﺴﻴﻢ‬
‫‪ADD_W‬‬ ‫‪PRICE, TAX, COST‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﻪ ﺟﺎي اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬


‫‪١٦١‬‬

‫‪MOV‬‬ ‫‪AX, PRICE‬‬


‫‪ADD‬‬ ‫‪AX, TAX‬‬
‫‪MOV‬‬ ‫‪COST, AX‬‬

‫ﭼﻨﺎﻧﭽﻪ ﺗﻌﺪاد ﭘﺎراﻣﺘﺮﻫﺎ در ﻓﺮاﺧﻮاﻧﻲ ﻣﺎﻛﺮو ﻛﻤﺘﺮ از ﺗﻌﺪاد ﭘﺎراﻣﺘﺮﻫـﺎي ﻣـﺎﻛﺮو‬


‫ﺑﺎﺷﺪ اﻳﺠﺎد ﺧﻄﺎ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫ﻣﺜﺎل‪7-10‬‬
‫ﻣﺎﻛﺮو ‪ EXCHG‬داده ﺷـﺪه در ذﻳـﻞ دو ﻣﻘـﺪار از ﻧـﻮع ‪ word‬را ﺟﺎﺑـﻪﺟـﺎ‬
‫ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻻزم ﺑﻪ ﺗﻮﺿﻴﺢ اﺳﺖ ﻛﻪ ﺑﻪ ﻣﻨﻈﻮر ﺟﻠﻮﮔﻴﺮي از ﭘﺎك ﺷﺪن ﻣﻘﺪار ﻗﺒﻠﻲ ﺛﺒﺎت‬
‫‪ AX‬از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ PUSH‬و ‪ POP‬اﺳﺘﻔﺎده ﮔﺮدﻳﺪه اﺳﺖ‪.‬‬

‫‪EXCHG‬‬ ‫‪MACRO‬‬ ‫‪W1, W2‬‬


‫‪PUSH‬‬ ‫‪AX‬‬
‫‪MOV‬‬ ‫‪AX, W1‬‬
‫‪XCHG‬‬ ‫‪AX, W2‬‬
‫‪MOV‬‬ ‫‪W1, AX‬‬
‫‪POP‬‬ ‫‪AX‬‬
‫‪ENDM‬‬

‫ﺣﺎل اﮔﺮ ﻣﺎﻛﺮو را ﺑﺼﻮرت زﻳﺮ ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪EXCHG‬‬ ‫‪X,Y‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﻪ ﺟﺎي آن در ‪ source‬ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬


١٦٢

PUSH AX
MOV AX, X
XCHG AX, Y
MOV X, AX
PUSH AX

Macro directives ‫ دﻳﺮﻛﺘﻴﻮﻫﺎ‬-7-3-1


‫ ﻫﺎي ﻣﺘﻌـﺪدي در ﻣﺎﻛﺮوﻫـﺎ‬directive ‫ ﻣﻲﺗﻮان از‬Macro Assembfer ‫در‬
.‫اﺳﺘﻔﺎده ﻧﻤﻮد ﻛﻪ ﺑﺸﺮح زﻳﺮ ﻣﻲﺑﺎﺷﻨﺪ‬
LOCAL directive
EXITM directive
IFB directive
IFNB directive
IRP directive
IRPC directive
REPT directive

.‫در ذﻳﻞ ﻫﺮ ﻳﻚ از ﻣﻮارد ﺑﺎﻻ ﻣﻮرد ﺑﺤﺚ ﻗﺮار ﻣﻲﮔﻴﺮد‬

.‫ ﻣﻲﺑﺎﺷﺪ‬IF BLANK ‫ ﻣﺨﻔﻒ‬IFB .‫ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‬IFB ‫ﺷﻜﻞ ﻛﻠﻲ‬

IFB < argument >


M
ENDIF
‫ﻳﺎ‬
IFB < argument >
M
ELSE
M
ENDIF
‫‪١٦٣‬‬

‫‪ ، IFB‬درﺳﺖ اﺳـﺖ اﮔـﺮ‪ ،‬ﻣﻘـﺪار ‪ argument‬در ﻣﻮﻗـﻊ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﺎﻛﺮو‬


‫‪ blank‬ﻳﺎ ﺧﺎﻟﻲ ﺑﺎﺷﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-11‬‬
‫‪ADD_B‬‬ ‫‪MACRO‬‬ ‫‪N1, N2, N3, N4‬‬
‫‪MOV‬‬ ‫‪AL, N1‬‬
‫‪IFB‬‬ ‫>‪<N2‬‬
‫‪ADD‬‬ ‫‪AL, 20‬‬
‫‪ELSE‬‬ ‫‪1‬‬
١٦٤

ADD AL, N2
ENDIF 1
IFB < N3 >
ADD AL , 30
ELSE 1
ADD AL, N3
ENDIF
IFB < N4 >
ADD AL ,5
ELSE 1
ADD AL, N4
ENDIF
ENDM

.‫ﺣﺎل اﮔﺮ ﻣﺎﻛﺮو ﻓﻮق را ﺑﺼﻮرت زﻳﺮ ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﺎﺋﻴﻢ‬

ADD_B NUM1, , , NUM4

.‫دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲﮔﺮدد‬

MOV AL, NUM1


ADD AL, 20
ADD AL, 30
ADD AL, NUM4

‫ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳـﻞ‬ADD _ B NUM1, NUM2 ‫ﺑﻪ ﺟﺎي دﺳﺘﻮراﻟﻌﻤﻞ‬


.‫ﻗﺮار ﻣﻲﮔﻴﺮد‬

MOV AL, NUM1


ADD AL, NUM2
ADD AL, 30
ADD AL, 5
١٦٥

‫ درﺳــﺖ اﺳــﺖ‬IFNB .‫ ﺑــﺼﻮرت زﻳــﺮ ﻣــﻲﺑﺎﺷــﺪ‬IFNB ‫ﺷــﻜﻞ ﻛﻠــﻲ‬


‫ ﺑـﻪ ﻣﻌﻨـﻲ‬IFNB .‫ ﻧﺒﺎﺷـﺪ‬blank ‫ در ﻣﻮﻗـﻊ ﻓﺮاواﻧـﻲ ﻣـﺎﻛﺮو‬argument ‫ ﻣﻘﺪار‬،‫اﮔﺮ‬
.‫ ﻣﻲﺑﺎﺷﺪ‬IF NOT BLANK
IFNB < argument >
M
ELSE
M
ENDIF
‫ﻳﺎ‬
IFNB < argument >
M
ENDIF

7-12 ‫ﻣﺜﺎل‬
ADD_B MACRO X1, X2, X3, X4
PUSH AX
MOV AX, X1
IFNB < X2 >
ADD AX, X2
ENDIF 1
IFNB < X3 >
ADD AX, X3
ENDIF
IFNB < X4 >
ADD AX , X4
ENDIF
ENDM

.‫ﺣﺎل اﮔﺮ دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ را ﺑﻨﻮﻳﺴﻴﻢ‬


‫‪١٦٦‬‬

‫‪ADD_B‬‬ ‫‪N1, , N3, N4‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲﮔﺮدد‪.‬‬

‫‪PUSH‬‬ ‫‪AX‬‬
‫‪MOV‬‬ ‫‪AX, N1‬‬
‫‪ADD‬‬ ‫‪AX, N3‬‬
‫‪ADD‬‬ ‫‪AX, N4‬‬

‫‪ -7-3-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪EXITM‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮر اﻟﻌﻤﻞ ‪ EXITM‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪:‬‬

‫‪EXITM‬‬

‫از ‪ EXITM‬ﻓﻘﻂ در ﻣﺎﻛﺮوﻫﺎ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ EXITM .‬ﺑﺎﻋﺚ ﺗﻮﻗﻒ ﺑﺴﻂ‬


‫ﻣﺎﻛﺮو ﻣﻲﺷﻮد ﺑﺴﺘﻪ ﺑﻪ ﻧﺘﺎﻳﺠﻲ ﻛﻪ ﺑﻮﺳﻴﻠﻪ ‪ directive‬ﻫﺎي ﺷﺮﻃﻲ )‪ (IF‬ﺑﻮﺟﻮد ﻣـﻲ‪-‬‬
‫آﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-13‬‬
‫‪IFB‬‬ ‫> ‪< NUM1‬‬
‫‪EXITM‬‬ ‫‪1‬‬
‫‪ENDIF‬‬

‫ﭼﻨﺎﻧﭽﻪ در ﻣﻮﻗﻊ ﻓﺮاﺧﻮاﻧﻲ ﻣـﺎﻛﺮو ﻣﻘـﺪار ‪ NUM1‬داده ﻧـﺸﻮد ﺑـﺴﻂ ﻣـﺎﻛﺮو‬


‫ﻣﺘﻮﻗﻒ ﻣﻲﺷﻮد‪ .‬و از ﻛﻠﻴﻪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎﺋﻲ ﻛﻪ در ﻣﺎﻛﺮو ﺑﻌﺪ از ‪ EXITM‬داده ﺷـﺪه‬
‫ﺻﺮﻓﻨﻈﺮ ﻣﻲﮔﺮدد‪.‬‬
‫‪١٦٧‬‬

‫‪ -7-3-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪IRP‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ IRP‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪IRP‬‬ ‫> ‪dummy, < argument-list‬‬


‫‪M‬‬
‫‪ENDM‬‬

‫ﺑــﻪ ﺗﻌــﺪاد آرﮔﻮﻣﺎﻧﻬــﺎﺋﻲ ﻛــﻪ در > ‪ < argument –list‬وﺟــﻮد دارد‬


‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﻴﻦ ‪ IRP‬و ‪ ENDM‬ﺗﻜﺮار ﺧﻮاﻫﺪ ﺷﺪ‪ .‬در ﻫﺮ ﺑـﺎر ﺗﻜـﺮار ﺑﺘﺮﺗﻴـﺐ‬
‫ﺑﻪ ﺟﺎي ‪ dummy‬ﻣﻘﺎدﻳﺮ داﺧﻞ > ‪ < argument-list‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪7-14‬‬

‫‪IRP‬‬ ‫>‪VALUE, <1,2,3,5,11,13,17,19,23‬‬


‫‪DW‬‬ ‫‪VALU*VALUE*VALUE‬‬
‫‪ENDM‬‬

‫اﻳﺠﺎد ﻳﻚ آراﻳﻪ ‪ 9‬ﻋﻨﺼﺮي از ﻧـﻮع ‪ word‬ﺑـﺎ ﻣﻘـﺎدﻳﺮ ﻣﻜﻌـﺐ ﻧـﻪ ﻋـﺪد اول‬
‫ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻳﻌﻨﻲ ﺑﺎ ﻣﻘﺎدﻳﺮ ‪. 1, 8, 27, 125, 1331, …, 12167‬‬

‫‪1‬‬
‫‪8‬‬
‫‪27‬‬
‫‪125‬‬
‫‪1331‬‬
‫‪2197‬‬
‫‪4913‬‬
‫‪6859‬‬
‫‪12167‬‬
‫‪١٦٨‬‬

‫در ﺣﻘﻴﻘﺖ اﻳﺠﺎد دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪DW‬‬ ‫‪1*1*1‬‬
‫‪DW‬‬ ‫‪2*2*2‬‬
‫‪DW‬‬ ‫‪3*3*3‬‬
‫‪DW‬‬ ‫‪5*5*5‬‬
‫‪DW‬‬ ‫‪11 * 11 * 11‬‬
‫‪DW‬‬ ‫‪13 * 13 * 13‬‬
‫‪DW‬‬ ‫‪17 * 17 * 17‬‬
‫‪DW‬‬ ‫‪19 * 19 * 19‬‬
‫‪DW‬‬ ‫‪23 * 23 * 23‬‬

‫‪ -7-3-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪IRPC‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ IRPC‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪IRPC‬‬ ‫‪dummy , string‬‬


‫‪M‬‬
‫‪ENDM‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﻴﻦ ‪ IRPC‬و ‪ ENDM‬ﺑﻪ ﺗﻌﺪاد ﻛﺎرﻛﺘﺮﻫﺎي رﺷـﺘﻪ ‪string‬‬


‫ﺗﻜﺮار ﻣﻲﮔﺮدد‪ .‬در ﻫﺮ دﻓﻌﻪ ﺗﻜﺮار دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑﻪ ﺟﺎي ‪ dummy‬ﺑﺘﺮﺗﻴﺐ ﻳﻜـﻲ از‬
‫ﻛﺎرﻛﺘﺮﻫﺎي رﺷﺘﻪ ‪ string‬ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲﮔﺮدد‪ .‬ﺷﺒﻴﻪ ‪ IRP‬ﻣﻲﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔـﺎوت ﻛـﻪ‬
‫آرﮔﻮﻣﺎﻧﻬﺎﻳﺶ ﺑﺠﺎي اﻋﺪاد‪ ،‬ﻣﺘﻐﻴﺮﻫﺎي رﺷﺘﻪاي ﻫﺴﺘﻨﺪ‪.‬‬
‫ﻣﺜﺎل ‪17-5‬‬
‫‪IRPC CHAR, 0123456789‬‬
‫‪DB‬‬ ‫‪CHAR 1‬‬
‫‪ENDM‬‬

‫اﻳﺠﺎد ﻳﻚ رﺷﺘﻪ دهﺑﺎﻳﺘﻲ ﻣﻲﻧﻤﺎﻳﺪ ﺑﺎ ﻣﻘﺎدﻳﺮ ﻛﺪ اﺳﻜﻲ ﺑﺮاي ارﻗﺎم ‪ 0‬ﺗﺎ ‪.9‬‬
‫‪١٦٩‬‬

‫‪48‬‬
‫‪49‬‬
‫‪50‬‬
‫‪51‬‬
‫‪52‬‬
‫‪53‬‬
‫‪54‬‬
‫‪55‬‬
‫‪56‬‬
‫‪57‬‬

‫در ﺣﻘﻴﻘﺖ اﻳﺠﺎد دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳﺮ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬


‫‪DB‬‬ ‫‪′0′‬‬
‫‪DB‬‬ ‫‪′1′‬‬
‫‪DB‬‬ ‫‪′2′‬‬
‫‪DB‬‬ ‫‪′3′‬‬
‫‪DB‬‬ ‫‪′4′‬‬
‫‪DB‬‬ ‫‪′5′‬‬
‫‪DB‬‬ ‫‪′6′‬‬
‫‪DB‬‬ ‫‪′7′‬‬
‫‪DB‬‬ ‫‪′8′‬‬
‫‪DB‬‬ ‫‪′9′‬‬

‫‪ -7-3-5‬دﺳﺘﻮراﻟﻌﻤﻞ ‪REPT‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ REPT‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪REPT‬‬ ‫‪expression‬‬
‫‪M‬‬
‫‪ENDM‬‬
‫‪١٧٠‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑـﻴﻦ ‪ REPT‬و ‪ ENDM‬را ﺑـﻪ ﺗﻌـﺪاد دﻓﻌـﺎﺗﻲ ﻛـﻪ ﺗﻮﺳـﻂ‬


‫‪ expression‬ﻣﺸﺨﺺ ﻣﻲﮔﺮدد ﺗﻜﺮار ﻣﻲﻛﻨﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-16‬‬
‫‪ALLOCATE‬‬ ‫‪MACRO TLABEL , LNGTH‬‬
‫‪TLABEL‬‬ ‫‪EQU THIS BYTE‬‬
‫‪VALU‬‬ ‫‪=0‬‬
‫‪REPT‬‬ ‫‪LNGTH VALUE = VALUE + 1‬‬
‫‪DB‬‬ ‫‪VALUE‬‬
‫‪ENDM‬‬
‫‪ENDM‬‬

‫دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻨﺠﺎ دو ﺗﺎ ‪ ENDM‬وﺟـﻮد دارد‪ .‬ﻳﻜـﻲ اﻧﺘﻬـﺎي ‪ REPT‬و‬


‫دﻳﮕﺮي اﻧﺘﻬﺎي ‪ MACRO‬را ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬اﻳﻦ ﻣﺎﻛﺮو ‪ LNGTH‬ﺑﺎﻳﺖ ﺣﺎﻓﻈـﻪ‬
‫را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ و ﻣﻘﺎدﻳﺮ آﻧﺮا ﺑﺘﺮﺗﻴـﺐ ‪ 1‬ﺗـﺎ ‪ LNGTH‬ﻗـﺮار ﻣـﻲدﻫـﺪ‪ .‬ﭘـﺲ از‬
‫ﺗﻌﺮﻳــﻒ ﻧﻤــﻮدن ﻣــﺎﻛﺮو ‪ ،ALLOCATE‬ﻣــﻲﺗــﻮان از اﻳــﻦ ﻣــﺎﻛﺮو ﺑــﺎ اﺳــﺘﻔﺎده از‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳﺮ ﻳﻚ آراﻳﻪ ‪ 40‬ﺑﺎﻳﺘﻲ ﺑﻨﺎم ‪ TABLE 1‬اﻳﺠﺎد ﻧﻤﻮد‪.‬‬

‫‪DATA_SEG‬‬ ‫‪GSEGMENT‬‬ ‫‪PARA DATA ′DATA′‬‬


‫‪ALLOCATE‬‬ ‫‪TABLE1 , 40‬‬
‫‪DATA_SEG‬‬ ‫‪ENDS‬‬

‫از دﻳﺮﻛﺘﻴﻮ ‪ EQU‬ﺑﺮاي ﺗﺨﺼﻴﺺ ﺳﺎده اﺳﺎﻣﻲ ﺑـﻪ اﻋـﺪاد‪ ،‬آدرﺳـﻬﺎي ﺗﺮﻛﻴﺒـﻲ‬
‫ﭘﻴﭽﻴﺪه و … اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪7-17‬‬
‫‪K‬‬ ‫‪EQU‬‬ ‫‪1024‬‬
‫‪١٧١‬‬

‫در ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺟﺎ از ﻧﺎم ‪ K‬اﺳـﺘﻔﺎده ﻣـﻲﮔـﺮدد ﺑـﻪ ﺟـﺎي آن ‪ 1024‬ﻗـﺮار داده‬


‫ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪7-18‬‬
‫‪SPEED‬‬ ‫‪EQU‬‬ ‫‪RATE‬‬

‫در ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺟﺎ از ﻛﻠﻤﻪ ‪ SPEED‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﺑﻪ ﺟﺎي آن ‪ RATE‬ﻗـﺮار‬


‫داده ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪7-19‬‬
‫‪TABLE‬‬ ‫]‪EQU DS:[BP] [SI‬‬

‫در ﺑﺮﻧﺎﻣــﻪ ﻫــﺮ ﺟــﺎ از ﻧــﺎم ‪ TABLE‬اﺳــﺘﻔﺎده ﮔﺮدﻳــﺪه ﺑﺎﺷــﺪ ﺑــﻪ ﺟــﺎي آن‬
‫]‪ DS:[BP][SI‬ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪7-20‬‬
‫‪COUNT‬‬ ‫‪EQU CX‬‬

‫ﻫﺮ ﺟﺎ از ﻧﺎم ‪ COUNT‬در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﺷﺪه ﺑﺎﺷﺪ ﺑﻪ ﺟـﺎي آن ﺛﺒـﺎت ‪CX‬‬
‫ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-21‬‬
‫‪DBL_SPEED‬‬ ‫‪EQU 2*SPEED‬‬

‫در ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺟﺎ از ﻧـﺎم ‪ DBL_SPEED‬اﺳـﺘﻔﺎده ﺷـﺪه ﺑﺎﺷـﺪ ﺑـﻪ ﺟـﺎي آن‬


‫ﻋﺒﺎرت ‪ 2 * SPEED‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫‪١٧٢‬‬

‫ﻣﺜﺎل ‪7-22‬‬
‫‪MINS_DAY‬‬ ‫‪EQU 60*24‬‬

‫در ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺟـﺎ از ﻧـﺎم ‪ MINS_DAY‬اﺳـﺘﻔﺎده ﺷـﺪه ﺑﺎﺷـﺪ ﺑـﻪ ﺟـﺎي آن‬
‫‪ 60 * 24‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫دﻳﺮﻛﺘﻴﻮ= ﻣﺎﻧﻨﺪ ‪ EQU‬ﻣﻲﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻣﻲﺗﻮان آﻧﺮا ﻣﺠـﺪداً ﺗﻌﺮﻳـﻒ‬
‫ﻧﻤﻮد ﻳﺎ ﺑﻪ ﻣﻘﺪار ﻗﺒﻠﻲ آن ارﺟﺎع ﻧﻤﻮد‪.‬‬

‫ﻣﺜﺎل ‪7-23‬‬
‫‪CONST=56‬‬ ‫ﻣﻌﺎدل ‪ EQU‬ﻣﻲﺑﺎﺷﺪ ;‬
‫‪CONST=75‬‬ ‫ﻣﻘﺪار آﻧﺮا ﻣﺠﺪداً ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﻳﺪ ;‬
‫‪CONST=CONST‬‬ ‫ﺑﻪ ﻣﻘﺪار ﻗﺒﻠﻲ ﻣﺮاﺟﻌﻪ ﻣﻲﻧﻤﺎﻳﺪ ;‬
‫‪+1‬‬

‫‪ -7-3-6‬دﻳﺮﻛﺘﻴﻮ ‪LOCAL‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﻳﺮﻛﺘﻴﻮ ‪ LOCAL‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪LOCAL‬‬ ‫‪dummy-list‬‬

‫اﻳﻦ دﻳﺮﻛﺘﻴﻮ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛـﻪ اﺳـﻤﺒﻠﺮ ﺑـﺮاي ﻫـﺮ ﻋﻨـﺼﺮ در ‪dummy-list‬‬
‫اﻳﺠﺎد ﻳﻚ ﺳﻴﻤﺒﻞ ﻣﻨﺤﺼﺮ ﺑﻔﺮد ﺑﻨﻤﺎﻳﺪ‪.‬‬
‫در ﺣﻘﻴﻘﺖ در ﻣﺎﻛﺮوﻫﺎ وﻗﺘﻲ از ‪ label‬ﻳﺎ ﺑﺮﭼﺴﺐ اﺳﺘﻔﺎده ﻣﻲﻧﻤﺎﺋﻴﻢ ﺑﺴﻂ آﻧﻬﺎ‬
‫دﭼﺎر اﺷﻜﺎل ﻣﻲﮔﺮدد‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﻣﺎﻛﺮو زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬
١٧٣

WAIT MACRO COUNT


PUSH CX
MOV CX , COUNT
NEXT : LOOP NEXT
POP CX
ENDM

.‫ اﺳﺘﻔﺎده ﮔﺮدد‬macro ‫ﺣﺎل اﮔﺮ در ﺑﺮﻧﺎﻣﻪ ﺳﻪ ﺑﺎر از اﻳﻦ‬


M
WAIT COUNT1
M1
WAIT COUNT2
M1
WAIT COUNT3
M
.‫و ﻣﺎﻛﺮوﻫﺎ را ﺑﺴﻂ دﻫﻴﻢ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻤﺎﻳﺎن ﻣﻲﮔﺮدد‬
M
PUSH CX
MOV CX, COUNT 1
NEXT : LOOP NEXT
POP CX
M
PUSH CX
MOV CX, COUNT 2
ENXT : LOOP NEXT
POP CX
M
PUSH CX
MOV CX , COUNT 3
NEXT : LOOP NEXT
POP CX
M
‫‪١٧٤‬‬

‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﺸﺎﻫﺪه ﻣﻲﻧﻤﺎﺋﻴﺪ داراي ﺳﻪ‪ label‬ﻳـﺎ آدرس ‪ NEXT‬ﻣـﻲﺑﺎﺷـﺪ‬


‫ﻛﻪ اﻳﺠﺎد اﺑﻬﺎم ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﺑﺮاي رﻓﻊ اﻳﻦ اﺷﻜﺎل از دﻳﺮﻛﺘﻴﻮ ‪ LOCAL‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫‪WAIT‬‬ ‫‪MACRO‬‬ ‫‪COUNT‬‬


‫‪LOCAL‬‬ ‫‪NEXT‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪MOV‬‬ ‫‪CX , COUNT‬‬
‫‪NEXT :‬‬ ‫‪LOOP‬‬ ‫‪NEXT‬‬
‫‪POP‬‬ ‫‪CX‬‬
‫‪ENDM‬‬

‫ﺣﺎل اﮔﺮ در ﺑﺮﻧﺎﻣﻪ داده ﺷﺪه ﻣﺎﻛﺮو ‪ WAIT‬را ﺑﺴﻂ دﻫﻴﻢ ﺑﺮﻧﺎﻣﻪ ﺑﺼﻮرت زﻳﺮ‬
‫در ﻣﻲآﻳﺪ‪.‬‬

‫‪M‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪MOV‬‬ ‫‪CX , COUNT‬‬
‫‪NEXT00 :‬‬ ‫‪LOOP NEXT00‬‬
‫‪POP‬‬ ‫‪CX‬‬
‫‪M‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪MOV‬‬ ‫‪CX , COUNT‬‬
‫‪NEXT01:‬‬ ‫‪LOOP NEXT01‬‬
‫‪POP‬‬ ‫‪CX‬‬
‫‪M‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪MOV‬‬ ‫‪CX, COUNT‬‬
‫‪NEXT02:‬‬ ‫‪LOOP NEXT02‬‬
‫‪POP‬‬ ‫‪CX‬‬
‫‪M‬‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ در ﺗﻌﺮﻳﻒ ﻳﻚ ﻣﺎﻛﺮو ﻣﻲﺗﻮان ﻣﺎﻛﺮوﻫﺎي ﻣﺨﺘﻠﻔـﻲ را‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﻮد‪ .‬در ﺻﻮرﺗﻴﻜﻪ در ﺗﻌﺮﻳﻒ ﻳـﻚ ﻣـﺎﻛﺮو ﺧـﻮد آن ﻣـﺎﻛﺮو را ﻓﺮاﺧـﻮاﻧﻲ‬
‫ﻧﻤﺎﺋﻴﻢ ﻣﺎﻛﺮو را ﺑﺎزﮔﺸﺘﻲ ﻳﺎ ‪ recursive macro‬ﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد‪.‬‬
‫‪١٧٥‬‬

‫ﻣﺜﺎل ‪7-24‬‬
‫‪ADD_W‬‬ ‫‪MACRO N1, N2, N3, N4, N5‬‬
‫‪IFB‬‬ ‫> ‪< N1‬‬
‫‪MOV‬‬ ‫‪AX, 0 ;; initialize sum‬‬
‫‪ELSE‬‬ ‫‪1‬‬
‫‪ADD_W‬‬ ‫‪N2, N3, N4, N5‬‬
‫‪ADD‬‬ ‫‪AX , N1‬‬
‫‪ENDIF‬‬ ‫‪1‬‬
‫‪ENDM‬‬

‫در ﺗﻌﺮﻳﻒ ﺑﺎﻻ ﭼﻨﺎﻧﭽﻪ آرﮔﻮﻣﺎﻧﻲ وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ‪ ،‬ﻣﺠﻤﻮع ﺑﺮاﺑﺮ ﺻﻔﺮ و در‬
‫ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺠﻤﻮع ﺗﻤﺎم آرﮔﻮﻣﺎﻧﻬﺎ ﺑﻪ ﺟﺰء آرﮔﻮﻣـﺎن اوﻟـﻲ را ﻣﺤﺎﺳـﺒﻪ ﻧﻤـﻮده و‬
‫ﺳﭙﺲ اوﻟﻴﻦ آرﮔﻮﻣﺎن ﺑﻪ آن اﺿﺎﻓﻪ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬
‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻗﺒﻼ ﻣﺘﺬﻛﺮ ﺷﺪﻳﻢ ﻣﺎﻛﺮوﻫﺎﺋﻲ ﻛﻪ در ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ ﻣـﻮرد اﺳـﺘﻔﺎده‬
‫ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ ﺑﺎﻳﺴﺘﻲ در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳﻒ ﻧﻤﻮد‪ .‬از ﻃﺮف دﻳﮕـﺮ ﻣـﻲﺗـﻮان ﻳـﻚ‬
‫‪ macro library‬اﻳﺠﺎد ﻧﻤﻮد‪ macro library .‬ﻳﻚ ﻓﺎﻳﻞ روي دﻳﺴﻚ ﻣﻲﺑﺎﺷﺪ ﺑﻨـﺎم‬
‫‪ MACRO.LIB‬ﻛﻪ ﺷﺎﻣﻞ ﺗﻤﺎم ﺗﻌﺎرﻳﻒ ﻣﺎﻛﺮوﻫﺎي ﻣـﻮرد اﺳـﺘﻔﺎده در ﺑﺮﻧﺎﻣـﻪﻫـﺎي‬
‫ﻣﺨﺘﻠﻔﻪ ﻣﻲﺑﺎﺷﺪ‪ .‬ﭼﻨﺎﻧﭽﻪ از ‪ macro library‬ﺑﺨﻮاﻫﻴﻢ اﺳﺘﻔﺎده ﻧﻤﺎﺋﻴﻢ ﻛﺎﻓﻲ اﺳﺖ ﻛـﻪ‬
‫دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮا ﺑﻪ ﻋﻨﻮان اوﻟﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮﻧﺎﻣﻪ ﻗـﺮار دﻫـﻴﻢ و دﻳﮕـﺮ ﻧﻴـﺎزي ﺑـﻪ‬
‫ﺗﻌﺮﻳﻒ ﻣﺎﻛﺮوﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬

‫‪INCLUDE‬‬ ‫‪MACRO.LIB‬‬

‫ﭼﻮن ﻓﺎﻳﻞ ‪ MACRO.LIB‬ﻣﻤﻜﻦ اﺳﺖ داراي ﻣﺎﻛﺮوﻫﺎﺋﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﻣـﻮرد‬


‫ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪاي ﻛﻪ ﻣﻲﺧﻮاﻫﺪ اﺟﺮا ﺷﻮد ﻧﺒﺎﺷﺪ ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از اﺗﻼف ﻓﻀﺎي ﺣﺎﻓﻈـﻪ‬
‫ﻣﻲﺗﻮان ﻣﺎﻛﺮوﻫﺎي ﻏﻴﺮ ﺿﺮوري ﺑﺮاي ﺑﺮﻧﺎﻣﻪ را در دﺳﺘﻮر ‪ PURGE‬ﻗﺮار داد ﺗﺎ آﻧﻬـﺎ‬
‫را ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﻨﺘﻘﻞ ﻧﻜﻨﺪ‪.‬‬
‫‪١٧٦‬‬

‫ﻣﺜﺎل ‪7-25‬‬
‫‪INCLUDE‬‬ ‫‪MACRO.LIB‬‬
‫‪PURGE‬‬ ‫‪SHOW, CLS, LOCATE‬‬

‫ﻣﺎﻛﺮوﻫﺎي ‪ SHOW, CLS, LOCATE‬ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﻨﺘﻘﻞ ﻧﻤﻲﮔﺮدﻧـﺪ ﭼـﻮن‬


‫در ﺑﺮﻧﺎﻣﻪ اﻳﻦ ﻣﺎﻛﺮوﻫﺎ ﻓﺮاﺧﻮاﻧﻲ ﻧﺸﺪهاﻧﺪ‪.‬‬

‫‪ -7-3-7‬ﻋﻤﻠﮕﺮﻫﺎي ﻣﺎﻛﺮو‬
‫دو ﻋﻤﻠﮕﺮ ﻣﺎﻛﺮو در ‪ Macro Assembler‬ﻋﺒﺎرﺗﻨﺪ از‬
‫&‬
‫;;‬
‫ﺷﻜﻞ ﻛﻠﻲ ﻋﻤﻠﮕﺮ ;; ﻋﺒﺎرﺗﺴﺖ از‬
‫‪;; comment‬‬
‫ﻋﻤﻠﮕﺮ ;; ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ اﺳﻤﺒﻠﺮ ‪ comments‬ﻫﺎ را در ﻣﻮﻗﻊ ﺑـﺴﻂ ﻣـﺎﻛﺮو‬
‫ﺣﺬف ﻧﻤﺎﻳﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي ﺑﺪون ‪ comments‬ﻓﻀﺎي ﻛﻤﺘﺮي را اﺷﻐﺎل ﻧﻤﻮده و ﺳﺮﻳﻌﺘﺮ اﺟـﺮا‬
‫ﻣﻲﺷﻮﻧﺪ‪ .‬ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﺪ ‪ comment‬اي را در ﻣﻮﻗـﻊ ﺑـﺴﻂ ﻣـﺎﻛﺮو ﺣـﺬف ﻧﻜﻨﻴـﺪ‬
‫ﺑﺎﻳﺴﺘﻲ از ; اﺳﺘﻔﺎده ﮔﺮدد‪.‬‬
‫‪; comment‬‬

‫‪ -7-3-8‬ﻋﻤﻠﮕﺮ &‬
‫ﺷﻜﻞ ﻛﻠﻲ ﻋﻤﻠﮕﺮ & ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪text & text‬‬
‫اﻳﻦ ﻋﻤﻠﮕﺮ دو ‪ text‬ﻳﺎ ﺳﻴﻤﺒﻞ را ﺑﻬـﻢ وﺻـﻞ ﻧﻤـﻮده در ﻛﻨـﺎر ﻳﻜـﺪﻳﮕﺮ ﻗـﺮار‬
‫ﻣﻲدﻫﺪ‪.‬‬
١٧٧

7-26 ‫ﻣﺜﺎل‬
DEF_TABLE MACRO SUFFIX, LNGTH
TABLE & SUFFIX DB LNGTH DUP (?)
ENDM

.‫ﺣﺎل اﮔﺮ ﻣﺎﻛﺮو ﻓﻮق را ﺑﻪ ﺻﻮرت زﻳﺮ ﻓﺮاﺧﻮاﻧﻲ ﻧﻤﺎﺋﻴﻢ‬

DEF_TABLE A,5

.‫ ﺗﺒﺪﻳﻞ ﻣﻲﻧﻤﺎﻳﺪ‬TABLEA DB 5 DUP(2) ‫آﻧﮕﺎه اﺳﻤﺒﻠﺮ آﻧﺮا ﺑﻪ‬

.‫ﻣﺎﻛﺮو زﻳﺮ ﺑﺎﻋﺚ ﻧﻤﺎﻳﺶ ﻳﻚ ﻛﺎراﻛﺘﺮ روي ﺻﻔﺤﻪ ﻣﺎﻧﺘﻮر ﻣﻲﺷﻮد‬

SHOW MACRO character


;; Display the specified character.
PUSH AX

PUSH DX
MOV AH,2 ;; select, display option
MOV DL, ′character′
INT 21H ;; call type 21 interrupt
POP DX
POP AX
ENDM
‫ﺑﻪ ﻣﻨﻈﻮر ﻧﻤـﺎﻳﺶ ﻛـﺎرﻛﺘﺮ * روي ﺻـﻔﺤﻪ ﻣـﺎﻧﻴﺘﻮر از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳـﻞ‬
:‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‬
‫‪١٧٨‬‬

‫‪MOV‬‬ ‫‪AH , 2‬‬


‫‪MOV‬‬ ‫‪DL , ′*′‬‬
‫‪INT‬‬ ‫‪21H‬‬

‫‪ -7-4‬وﻗﻔﻪﻫﺎ )‪(Interrupts‬‬
‫رﻳﺰﭘﺮدازﻧﺪه در ﻳﻚ ﻛﺎﻣﻴﭙﻮﺗﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ را ﺑﺴﺎدﮔﻲ اﺟﺮا ﻧﻤﻲﻛﻨﺪ‪ .‬ﺑﻠﻜـﻪ ﺑﻌﻨـﻮان‬
‫ﺗﻨﻈﻴﻢ ﻛﻨﻨﺪه ﺳﻴﺴﺘﻢ درﮔﻴﺮ ﭼﻴﺰﻫﺎﺋﻲ ﻣﻴﺸﻮد ﻛﻪ اﺗﻔﺎق ﻣﻲاﻓﺘﻨﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل وﻗﺘـﻲ ﻛـﻪ‬
‫ﻛﻠﻴﺪي روي ﺻﻔﺤﻪ ﻛﻠﻴـﺪ ﻓـﺸﺎر ﻣـﻲدﻫﻴـﺪ رﻳﺰﭘﺮدازﻧـﺪه ﺑﺎﻳـﺴﺘﻲ درﻳﺎﺑـﺪ ﻛـﻪ ﻛـﺪام‬
‫ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﺪه و ﻋﻤﻞ ﻣﻨﺎﺳﺐ آن ﻛﻠﻴﺪ را اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜـﺎل وﻗﺘـﻲ ﻛﻠﻴـﺪ‬
‫‪ Ctrl-Break‬را ﻓﺸﺎر ﻣﻲدﻫﻴﺪ ﻋﻤﻠﻲ ﻛﻪ ﺑﺎﻳﺴﺘﻲ اﻧﺠﺎم ﺷﻮد ﻛﺎﻣﻼً ﻣﺘﻔﺎوت اﺳـﺖ ﺑـﺎ‬
‫وﻗﺘﻲ ﻛﻪ ﻛﻠﻴﺪ ‪ T‬را ﻓﺸﺎر ﻣﻲدﻫﻴﺪ‪ .‬وﻗﺘﻲ ﻛﻪ ‪ data‬از ‪ disk‬ﺑـﻪ ﺣﺎﻓﻈـﻪ ﻳـﺎ ﺑـﺎﻟﻌﻜﺲ‬
‫ﻣﻨﺘﻘﻞ ﻣﻲ ﮔﺮدد اﻳﻦ ﻣﺴﺌﻮﻟﻴﺖ رﻳﺰﭘﺮدازﻧﺪه اﺳﺖ ﻛـﻪ دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﻣﻨﺎﺳـﺐ ﺑـﺮاي‬
‫اﻳﻨﻜﺎر را اﺟﺮا ﻧﻤﺎﻳﺪ‪ .‬ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﮔﻔﺘﻪ ﺷﺪ رﻳﺰﭘﺮدازﻧﺪه در ﻛﻠﻴـﻪ ﻛﺎرﻫـﺎي ﻛـﺎﻣﭙﻴﻮﺗﺮ‬
‫ﻧﻘﺸﻲ اﻳﻔﺎء ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﺣﺎل ﺳﻮاﻟﻲ ﻛﻪ ﻣﻄﺮح ﻣﻲﺷﻮد اﻳﻨﺴﺖ ﻛﻪ رﻳﺰﭘﺮدازﻧـﺪه ﭼﮕﻮﻧـﻪ‬
‫ﺑﺎ وﺳﺎﺋﻞ ﺟﺎﻧﺒﻲ درﮔﻴﺮ ﻣﻲﮔﺮدد؟ ﺣﻘﻴﻘﺖ اﻣﺮ اﻳﻦ اﺳﺖ ﻛﻪ رﻳﺰﭘﺮدازﻧﺪهﻫـﺎ و وﺳـﺎﺋﻞ‬
‫ﺟﺎﻧﺒﻲ ﺑﻄﺮق ﻣﺨﺘﻠﻒ ﺑﺎ ﻫﻢ ارﺗﺒﺎط ﺑﺮﻗﺮار ﻣﻲﻛﻨﻨﺪ‪ .‬ﻛﺎري ﻛـﻪ اﻧﺠـﺎم ﻣـﻲﺷـﻮد ﺑـﺪﻳﻦ‬
‫ﺻﻮرت اﺳﺖ ﻛﻪ رﻳﺰﭘﺮدازﻧﺪه ﺷﺮوع ﺑﻪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﻲﻧﻤﺎﻳـﺪ و ﺑـﻪ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ‬
‫اداﻣﻪ ﻣﻲدﻫﺪ ﺗﺎ زﻣﺎﻧﻴﻜﻪ ﻳﻚ وﺳﻴﻠﻪ ﺟﺎﻧﺒﻲ ﻣﺎﻧﻨﺪ ﺻﻔﺤﻪ ﻛﻠﻴﺪ‪ ،‬دﻳﺴﻚ‪ ،‬ﻳـﺎ ﻣـﺎﻧﻴﺘﻮر ﺑـﻪ‬
‫رﻳﺰﭘﺮدازﻧﺪه اﻋﻼم ﻧﻤﺎﻳﺪ ﻛﻪ ﺑﻪ ﻛﻤﻚ رﻳﺰﭘﺮدازﻧﺪه ﻧﻴﺎز دارد‪ .‬اﻟﺒﺘـﻪ وﺳـﺎﺋﻞ ﺟـﺎﻧﺒﻲ در‬
‫ﺣﻘﻴﻘﺖ ﺑﺎ رﻳﺰﭘﺮدازﻧﺪه ﺻﺤﺒﺖ ﻧﻤﻲﻛﻨﻨﺪ ﺑﻠﻜﻪ آﻧﻬﺎ ﺳﻴﮕﻨﺎل ﻧﻴﺎز ﺑـﻪ ﻛﻤـﻚ ﺧـﻮد را از‬
‫ﻃﺮﻳﻖ وﻗﻔﻪ ﻳﺎ ‪ Interrupt‬ارﺳﺎل ﻣﻲﻧﻤﺎﻳﻨﺪ‪.‬‬

‫‪ -7-4-1‬ﻧﺤﻮه ﻛﺎر وﻗﻔﻪﻫﺎ‬


‫وﻗﺘﻲ ﻛﻪ ﻳﻚ وﺳﺎﺋﻞ ﺟﺎﻧﺒﻲ اﻗﺪام ﺑﻪ ارﺳﺎل ﺳـﻴﮕﻨﺎل وﻗﻔـﻪ ﻣـﻲﻧﻤﺎﻳـﺪ ﺷـﻤﺎره‬
‫ﺷﻨﺎﺳﺎﺋﻲ ﺧﻮد را ﻛﻪ ‪ type code‬ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد ﻧﻴﺰ ارﺳﺎل ﻣﻲﻛﻨﺪ‪ .‬ﻫﺮ وﺳﻴﻠﻪ ﺟـﺎﻧﺒﻲ‬
‫‪١٧٩‬‬

‫از ﻗﺒﻴــﻞ‪ floppy drive ، disk drive ، keyboard‬و … داراي ‪type code‬‬
‫ﻣﺨﺘﻠﻔﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬در ﺣﻘﻴﻘﺖ ‪ 256‬ﻧﻮع ﻣﺨﺘﻠﻒ ‪ type code‬وﺟـﻮد دارد‪ .‬ﻫـﺮ وﻗـﺖ‬
‫درﺧﻮاﺳﺖ ﻛﻤﻜﻲ از ﻃﺮف ﻳﻚ وﺳﻴﻠﻪ ﺟﺎﻧﺒﻲ ﺷـﻮد )‪ (Interrupt‬رﻳﺰﭘﺮدازﻧـﺪه اﮔـﺮ‬
‫ﻛﺎري ﻛﻪ در ﺣﺎل اﻧﺠﺎم آن ﻣﻲﺑﺎﺷﺪ ﺑﺘﻮاﻧﺪ ﻣﻮﻗﺘﺎً رﻫﺎ ﻧﻤﺎﻳﺪ‪ ،‬اﻳﻨﻜﺎر را اﻧﺠﺎم داده و ﺑـﻪ‬
‫ﻛﻤﻚ وﺳﻴﻠﻪ ﺟﺎﻧﺒﻲ ﻣﻲرود )اﻟﺒﺘﻪ ﺑﺎ ﺣﻔﻆ ﻣﻮﻗﻌﻴﺖ ﻓﻌﻠﻲ(‪ .‬ﭘﺲ از ﺗﻜﻤﻴﻞ ﻛﺎر وﺳـﻴﻠﻪ‬
‫ﺟﺎﻧﺒﻲ ﻣﺠﺪداً ﻛﺎر ﻗﺒﻠﻲ ﺧﻮد را از ﺳﺮ ﻣﻲﮔﻴﺮد‪ .‬در ﺻﻮرﺗﻴﻜﻪ رﻳﺰﭘﺮدازﻧﺪه ﻧﺘﻮاﻧـﺪ ﻛـﺎر‬
‫ﻓﻌﻠﻲ ﺧﻮد را رﻫﺎ ﻧﻤﺎﻳﺪ ﭘﺲ از ﺗﻜﻤﻴﻞ اﻳﻦ ﻛﺎر ﺑﻪ ﻛﻤﻚ وﺳﻴﻠﻪ ﺟﺎﻧﺒﻲ ﻣﻲرود‪.‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺘﺬﻛﺮ ﺷﺪﻳﻢ ‪ 256‬ﺗﺎ ‪ type code‬وﺟﻮد دارد ﺑﻪ ﺷﻤﺎرهﻫﺎي ‪255‬‬
‫ﺗﺎ ‪ .0‬رﻳﺰﭘﺮدازﻧﺪه از اﻳﻦ ‪ type code‬اﺳـﺘﻔﺎده ﻧﻤـﻮده آدرﺳـﻲ را در اﺑﺘـﺪاي ﺣﺎﻓﻈـﻪ‬
‫ﻣﺤﺎﺳﺒﻪ ﻧﻤﻮده و از آدرس ﻣﺤﺎﺳﺒﻪ ﺷـﺪه آدرس دﻳﮕـﺮي را ﻣـﻲﺧﻮاﻧـﺪ‪ .‬اﻳـﻦ آدرس‬
‫ﺟﺪﻳﺪ ‪ Interrupt Vector‬ﻧﺎم دارد ﻛﻪ در ﺣﻘﻴﻘﺖ آدرس ﺑﺮﻧﺎﻣﻪاي اﺳﺖ ﻛﻪ ﻛـﺎر آن‬
‫وﻗﻔﻪ را ﻋﻬﺪهدار ﻣﻲﺑﺎﺷﺪ‪ .‬در ﻣﻮرد وﺳﻴﻠﻪ ﺟﺎﻧﺒﻲ اﺳـﺘﺎﻧﺪارد‪ ،‬ﺑﺮﻧﺎﻣـﻪﻫـﺎي ﺳـﺮوﻳﺲ‬
‫دﻫﻨــﺪه وﻗﻔــﻪﻫــﺎ )‪ (Interrupt servicing programs‬در ﺗﺮاﺷ ـﻪ ‪ ROM‬ذﺧﻴــﺮه‬
‫ﻣﻲﮔﺮدد‪ .‬در ﺑﺴﻴﺎري از ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ اﻳﻦ ‪ ROM‬ﺑـﻪ ‪Basic Input/Output system‬‬
‫ﻳﺎ ‪ BIOS‬ﻣﻌﺮوﻓﺴﺖ‪.‬‬
‫ﺣﺎل ﻛﻪ رﻳﺰﭘﺮدازﻧﺪه ﻣﻲداﻧﺪ ﻛﺪام ﺑﺮﻧﺎﻣﻪ را ﺑﺎﻳﺴﺘﻲ اﺟﺮا ﻛﻨﺪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم‬
‫داده ﻳﻌﻨﻲ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻧﻤﻮده و ﭘﺲ از اﺗﻤـﺎم اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﻛـﺎر ﻗﺒﻠـﻲ ﺧـﻮد‬
‫ﺑﺮﮔﺸﺘﻪ و اﺟﺮاي آن را دﻧﺒﺎل ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ -7-4-2‬ﻣﻨﺎﺑﻊ وﻗﻔﻪﻫﺎ‬
‫وﻗﻔـــﻪﻫـــﺎﺋﻲ ﻛـــﻪ ﺗـــﺎﻛﻨﻮن ﺑﻴـــﺎن ﺷـــﺪه اﺳـــﺖ وﻗﻔـــﻪﻫـــﺎي ﺧـــﺎرﺟﻲ‬
‫)‪ ( External Interrupt‬ﻣﻲﺑﺎﺷـﺪ ﻛـﻪ ﺗﻮﺳـﻂ وﺳـﺎﺋﻞ ﻳـﺎ ﺗﺠﻬﻴـﺰات ﺟـﺎﻧﺒﻲ ﻓﻌـﺎل‬
‫ﻣﻲﮔﺮدﻧﺪ‪ .‬اﻳﻦ ﻧﻮع وﻗﻔﻪﻫﺎ ﻗﺴﻤﺘﻲ از ‪ 256‬ﻧﻮع وﻗﻔـﻪ را ﭘﻮﺷـﺶ ﻣـﻲدﻫـﺪ‪ .‬ﺳـﺎﻳﺮﻳﻦ‬
‫ﻣﻲﺗﻮاﻧﻨﺪ ﻳﻜﻲ از دو ﻧﻮع وﻗﻔﻪ ذﻳﻞ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪١٨٠‬‬

‫‪-1‬ﺑﺮﻧﺎﻣﻪﻫﺎ ﻫﻤﭽﻨﻴﻦ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺎ اﺳﺘﻔﺎده از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﺧـﺎص اﻳﺠـﺎد وﻗﻔـﻪ در‬


‫ﺑﺮﻧﺎﻣﻪ‪ ،‬وﻗﻔﻪﻫﺎ را ﻓﻌﺎل ﻧﻤﺎﻳﻨﺪ‪.‬‬
‫‪-2‬درﻣﻮارد ﺧﺎص رﻳﺰﭘﺮدازﻧﺪه ﺣﺘﻲ ﻣﻲﺗﻮاﻧﺪ ﺑﻪ ﺧﻮدش وﻗﻔـﻪ ﺑﺪﻫـﺪ‪ .‬ﺑﻌﻨـﻮان ﻣﺜـﺎل‬
‫وﻗﺘﻲ ﻛﻪ ﺷﻤﺎ ﺳﻌﻲ در ﺗﻘﺴﻴﻢ ﺑﺮ ﺻﻔﺮ دارﻳﺪ‪.‬‬

‫‪ -7-4-3‬وﻗﻔﻪﻫﺎي رزرو ﺷﺪه )‪( Reserved Interrupts‬‬


‫از ‪ 256‬وﻗﻔﻪ‪ 32 ،‬ﺗﺎي اول ﻳﻌﻨﻲ ﺷﻤﺎره ‪ 0‬ﺗﺎ ‪ 31‬ﺑﻮﺳﻴﻠﻪ ‪ Intel‬رزرو ﮔﺮدﻳﺪه‬
‫اﺳﺖ‪ .‬وﻗﻔﻪﻫﺎي ﻧﻮع ‪ 255‬ﺗﺎ ‪ 32‬ﺑﺮاي ﻣﻮارد دﻳﮕـﺮ اﺳـﺘﻔﺎده ﻣـﻲﮔﺮدﻧـﺪ‪ .‬ﻧﻤﻮﻧـﻪاي از‬
‫وﻗﻔﻪﻫﺎي رزرو ﺷﺪه در ذﻳﻞ داده ﺷﺪه اﺳﺖ‪:‬‬

‫‪Type 0,‬‬ ‫‪Divide Error‬‬


‫‪Type 1,‬‬ ‫‪Single – Step‬‬
‫‪Type 2,‬‬ ‫‪Nonmaskable Interrupts‬‬
‫‪Type 3,‬‬ ‫‪Breakpoint‬‬
‫‪Type 4,‬‬ ‫‪Overflow‬‬
‫‪Type 5,‬‬ ‫‪Bound Range Exceeded‬‬
‫‪Type 6,‬‬ ‫‪Invalid Table Limit Too Small‬‬
‫‪Type 7,‬‬ ‫‪Processor Extension Not Available‬‬
‫‪Type 8,‬‬ ‫‪Interrupt Table Limit Too Small‬‬
‫‪Type 9,‬‬ ‫‪Processor Extension Segment Overrun‬‬
‫‪Type 13,‬‬ ‫‪Segment Overrun‬‬
‫‪Type 16‬‬ ‫‪Processor Extension Error‬‬

‫‪ -7-4-4‬وﻗﻔﻪﻫﺎي ﺳﻴﺴﺘﻢ‬
‫در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ‪ 1024 ،‬ﺑﺎﻳﺖ اول ﺣﺎﻓﻈﻪ ﻳﻌﻨﻲ ﻣﺤﻠﻬﺎي ﺣﺎﻓﻈـﻪ ﺑـﺎآدرس ‪ 0‬ﺗـﺎ‬
‫‪ 3FF‬ﺗﺨﺼﻴﺺ ﺑـﻪ ﺟـﺪوﻟﻲ دارد ﻛـﻪ اﻳـﻦ ﺟـﺪول ﺑﻨـﺎم ‪interrupt vector table‬‬
‫ﻣﻌﺮوﻓﺴﺖ‪ .‬اﻳﻦ ﺟﺪوﻟﻲ اﺳﺖ ﺑـﺎ آدرﺳـﻬﺎي ‪ 32‬ﺑﻴﺘـﻲ ﻛـﻪ ﺑـﻪ ‪interrupt service‬‬
‫‪ routines‬در ﻛﺎﻣﭙﻴﻮﺗﺮ اﺷﺎره ﻣﻲﻛﻨﻨﺪ‪ 256 .‬وﻗﻔﻪ ﻣﺨﺘﻠﻒ ﺑﻪ ﺷﻤﺎرهﻫﺎي ‪ 0‬ﺗﺎ ‪ 255‬ﻳـﺎ‬
‫‪ FF‬ﺗﺎ ‪ 0‬در ﻣﺒﻨـﺎي ﺷـﺎﻧﺰده وﺟـﻮد دارد‪ .‬رﻳﺰﭘﺮدازﻧـﺪه ‪ 32 ، Intel‬وﻗﻔـﻪ اول ﻳﻌﻨـﻲ‬
‫‪١٨١‬‬

‫وﻗﻔﻪﻫﺎي ﺷﻤﺎره ‪ 1FH‬ﺗﺎ ‪ 0‬را ﺑﺮاي اﺳﺘﻔﺎده ﺧﻮدش در ﻧﻈﺮ ﻣﻲﮔﻴﺮد‪ 32 .‬وﻗﻔﻪ ﺑﻌﺪي‬
‫ﻳﻌﻨﻲ ﺷﻤﺎرهﻫﺎي ‪ 3FH‬ﺗﺎ ‪ 20H‬ﺑﺮاي اﺳﺘﻔﺎده ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ DOS‬در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه‬
‫اﺳﺖ‪.‬‬
‫وﻗﻔــﻪ از ﻃﺮﻳــﻖ دﺳــﺘﻮراﻟﻌﻤﻞﻫــﺎي وﻗﻔــﻪ در ﺑﺮﻧﺎﻣــﻪ ﻳــﺎ ﺗﺠﻬﻴــﺰات ﺧــﺎرﺟﻲ‬
‫)‪ ( external devices‬در ﺳﻴﺴﺘﻢ ﻓﻌﺎل ﻣﻲﮔﺮدد‪.‬‬
‫وﻗﺘﻲ ﻛﻪ رﻳﺰﭘﺮدازﻧﺪه ﻳﻚ وﻗﻔﻪ درﻳﺎﻓﺖ ﻣﻲﻧﻤﺎﻳﺪ ﺷﻤﺎره وﻗﻔﻪ را در ‪ 4‬ﺿـﺮب‬
‫ﻧﻤـﻮده ﺗـﺎ آدرس ‪ interrupt vector‬در ﺟـﺪول را ﺑﺪﺳـﺖ آورده ﺳـﭙﺲ ﻣﺤﺘـﻮي‬
‫آدرس ﺑﺪﺳﺖ آﻣﺪه را در ﺛﺒﺎت ‪ IP‬و ﺛﺒﺎت ‪ CS‬ﻗﺮار ﻣـﻲدﻫـﺪ و ﺷـﺮوع ﺑـﻪ اﺟـﺮاي‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ در آن آدرس ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل اﮔﺮ وﻗﻔﻪ از ﻧﻮع ‪ 4AH‬ﺑﺎﺷﺪ‪.‬‬

‫‪4AH * 4 = 128H‬‬

‫ﻣﺤﻠﻲ از ﺣﺎﻓﻈـﻪ ﻛـﻪ آدرس آن ‪ 128H‬ﻣـﻲﺑﺎﺷـﺪ ﺷـﺎﻣﻞ آدرس ‪Interrupt‬‬


‫‪ service routine‬وﻗﻔﻪ ﻧﻮع ‪ 4AH‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ -7-4-5‬وﻗﻔﻪﻫﺎي ‪DOS‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼً ﻣﺘﺬﻛﺮ ﺷﺪﻳﻢ وﻗﻔﻪﻫـﺎي ﻧـﻮع ‪ 3FH‬ﺗـﺎ ‪ 20H‬ﺑـﺮاي ﺳﻴـﺴﺘﻢ‬
‫ﻋﺎﻣﻞ ‪ DOS‬رزرو ﮔﺮدﻳﺪه اﺳﺖ‪ .‬اﻛﺜﺮ اﻳﻦ وﻗﻔﻪﻫـﺎ در ﺳﻴـﺴﺘﻢ ﻋﺎﻣـﻞ ‪ DOS‬ﻛـﺎرﺑﺮد‬
‫دارﻧﺪ ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻨﺠﺎ آﻧﻬﺎ را ﻣﻮرد ﺑﺤﺚ ﻗﺮار ﻧﻤﻲدﻫﻴﻢ‪ .‬ﻓﻘﻂ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛـﻪ‬
‫ﻧﻮع ‪ 21‬داراي ﮔﺰﻳﻨﻪﻫﺎﺋﻲ ﺑﺮاي ﺑﺮﻗﺮاري ارﺗﺒﺎط ﺑﺎ‪،printer ، display ، keyboard‬‬
‫‪disk‬و وﺳﺎﺋﻞ ارﺗﺒﺎﻃﻲ ﻏﻴﺮ ﻫﻤﺰﻣﺎن )‪(asynchronous communicationsdevice‬‬
‫ﻣﻲﺑﺎﺷﺪ ﻛﻪ در ﺑﺨﺶ ﺑﻌﺪي اﻳﻦ ﻓﺼﻞ ﻣﻮرد ﺑﺤﺚ ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫‪١٨٢‬‬

‫ﺷﻤﺎره وﻗﻔﻪ‬ ‫ﻧﺎم‬


‫‪20‬‬ ‫‪Terminate Program‬‬
‫‪21‬‬ ‫‪Function Calls‬‬
‫‪22‬‬ ‫‪Terminate‬‬
‫‪23‬‬ ‫‪Ctrl-Break Exit Address‬‬
‫‪24‬‬ ‫‪Critical Error Handler‬‬
‫‪25‬‬ ‫‪Absolute Disk Read‬‬
‫‪26‬‬ ‫‪Absolute Disk Write‬‬
‫‪27‬‬ ‫‪Terminate, But Stay Resident‬‬
‫‪28‬‬ ‫‪Reserved for Dos‬‬

‫‪ -7-4-6‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي وﻗﻔﻪ‬
‫در زﺑﺎن اﺳﻤﺒﻠﻲ در ﻣﻮرد وﻗﻔﻪﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻣﻲﺗـﻮان از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳـﻞ‬
‫اﺳﺘﻔﺎده ﻧﻤﻮد‪:‬‬
‫‪INT‬‬
‫‪INTO‬‬
‫‪IRET‬‬

‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ INT‬ﺑﺼﻮرت زﻳﺮ اﺳﺖ‪:‬‬


‫‪INT‬‬ ‫‪Interrupt-type‬‬

‫اﻟﻒ(‪ interrupt – type‬ﻳﻜﻲ از ﻧﻮعﻫﺎي وﻗﻔﻪ ‪ 0‬ﺗﺎ ‪ 255‬ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫ب( ﻣﻘﺪار ﻓﻠﮕﻬﺎي ‪ IF‬و ‪ TF‬را ﺻﻔﺮ ﻗﺮار ﻣﻲدﻫﺪ‪ .‬و روي ﺳﺎﻳﺰ ﻓﻠﮕﻬﺎ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج( ﻣﺤﺘﻮي ﺛﺒﺎت ﻓﻠﮓ )‪ (flag register‬را وارد ‪ stack‬ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫د( ﻣﺤﺘﻮي ﺛﺒﺎت ‪ CS‬را وارد ‪ stack‬ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫ه( آدرس ‪ interrupt vector‬را ﻣﺤﺎﺳﺒﻪ ﻣـﻲﻧﻤﺎﻳـﺪ )ﺷـﻤﺎره وﻗﻔـﻪ را در ‪ 4‬ﺿـﺮب‬
‫ﻣﻲﻛﻨﺪ‪(.‬‬
‫و( ﻣﺤﺘﻮي ﺛﺒﺎت ‪ IP‬را وارد ‪ stack‬ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪١٨٣‬‬

‫ز( ﻣﺤﺘﻮي ‪ word‬اول ‪ interrupt vector‬را در ﺛﺒﺎت ‪ IP‬و ﻣﺤﺘﻮي ‪ word‬دوم آﻧﺮا‬
‫در ﺛﺒﺎت ‪ CS‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-27‬‬
‫‪INT‬‬ ‫‪1 AH‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ و ﭘﺸﺘﻪ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮر ﻓﻮق‪:‬‬

‫‪CS‬‬ ‫‪049E‬‬ ‫‪STACK‬‬


‫‪SS:01F8‬‬
‫‪IP‬‬ ‫‪0002‬‬ ‫‪SS:01FA‬‬
‫‪SS:01FC‬‬
‫‪SP‬‬ ‫‪01FE‬‬ ‫‪SS:01FE‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ و ﭘﺸﺘﻪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ﻓﻮق‪:‬‬

‫‪CS‬‬ ‫‪F000‬‬
‫‪0004‬‬ ‫‪SS:01F8‬‬
‫‪IP‬‬ ‫‪FE6E‬‬ ‫‪049E‬‬ ‫‪SS:01FA‬‬
‫)‪(Flags‬‬ ‫‪SS:01FC‬‬
‫‪SP‬‬ ‫‪01F8‬‬ ‫‪SS:01FE‬‬
‫‪١٨٤‬‬

‫‪Interrupt‬‬
‫‪Vectors‬‬
‫‪19‬‬ ‫‪0064‬‬
‫‪0066‬‬
‫‪1A‬‬ ‫‪0068‬‬ ‫‪FE6E‬‬
‫‪006A‬‬ ‫‪F000‬‬
‫‪1B‬‬ ‫‪006C‬‬
‫‪006E‬‬

‫ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ‪ INTO‬ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳـﻚ‬


‫دﺳـﺘﻮراﻟﻌﻤﻞ وﻗﻔـﻪ ﺷـﺮﻃﻲ اﺳـﺖ و ﻣﺨﻔـﻒ ﻛﻠﻤـﺎت ‪Interrupt If Overflow‬‬
‫ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪INTO‬‬
‫اﻟﻒ( داراي ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬
‫ب( ﻣﻘﺎدﻳﺮ ﻓﻠﮕﻬﺎي ‪ TF‬و ‪ IF‬را ﺻﻔﺮ ﻣﻲﻛﻨﺪ‪.‬‬
‫ج( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ اﻳﺠﺎد وﻗﻔﻪ ﻣﻲﻧﻤﺎﻳﺪ اﮔﺮ ﻣﻘﺪار ﻓﻠﮓ ‪ OF‬ﺑﺮاﺑﺮ ﻳﻚ ﺑﺎﺷﺪ‪.‬‬
‫د( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ وﻗﻔﻪ ﻧﻮع ‪ 4‬را ﻓﻌﺎل ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫ﺷﻜﻞ ﻛﻠﻲ دﺳـﺘﻮراﻟﻌﻤﻞ ‪ IRET‬ﺑـﺼﻮرت زﻳـﺮ ﻣـﻲﺑﺎﺷـﺪ‪ IRET .‬ﻣﺨﻔـﻒ‬
‫‪Interrupt Return‬ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪IRET‬‬
‫اﻟﻒ( روي ﺗﻤﺎم ﻓﻠﮕﻬﺎ اﺛﺮ دارد‪.‬‬
‫ب( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ داراي ﻋﻤﻠﻮﻧﺪ ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬
‫ج( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮاي وﻗﻔﻪﻫﺎ ﻫﻤﺎن ﻛـﺎري را اﻧﺠـﺎم ﻣـﻲدﻫـﺪ ﻛـﻪ ‪ RET‬ﺑـﺮاي‬
‫‪procedure call‬ﻫــﺎ‪ .‬ﻳﻌﻨــﻲ ﺑﺎﻋــﺚ ﺑﺮﮔــﺸﺖ ﻛﻨﺘــﺮل ﺑــﻪ ﺑﺮﻧﺎﻣــﻪ اﺻــﻠﻲ ﻣــﻲﺷــﻮد‪.‬‬
‫‪١٨٥‬‬

‫ﺑﻬﻤﻴﻦ دﻟﻴﻞ ‪ IRET‬ﺑﺎﻳـﺴﺘﻲ آﺧـﺮﻳﻦ دﺳـﺘﻮراﻟﻌﻤﻠﻲ ﺑﺎﺷـﺪ ﻛـﻪ رﻳﺰﭘﺮدازﻧـﺪه در ﻳـﻚ‬


‫‪ Interrupt Service Routine‬اﺟﺮا ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫د( ‪ IRET‬ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﺳﻪ ﻣﻘﺪار ‪ 16‬ﺑﻴﺘﻲ از ﭘـﺸﺘﻪ ﺧـﺎرج ﺷـﺪه و ﺑﺘﺮﺗﻴـﺐ در‬
‫ﺛﺒﺎﺗﻬﺎي ‪ Flag register, CS, IP‬ﻗﺮار ﮔﻴﺮد‪.‬‬
‫ه( ﻣﻘــــﺎدﻳﺮ ﺳــــﺎﻳﺮ ﺛﺒﺎﺗﻬــــﺎ ﻣﻤﻜــــﻦ اﺳــــﺖ از ﺑــــﻴﻦ ﺑــــﺮود ﻣﮕــــﺮ اﻳﻨﻜــــﻪ‬
‫‪ Interrupt service routine‬ﺻﺮﻳﺤﺎً آﻧﻬﺎ را ذﺧﻴﺮه ﻧﻤﺎﻳﺪ‪.‬‬

‫‪ -7-4-7‬ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ وﻗﻔﻪ ﻧﻮع ‪21‬‬


‫در ﺻــﻔﺤﻪ ﺑﻌــﺪ ﻗــﺴﻤﺘﻲ از ﻓﺮاﺧــﻮاﻧﻲﻫــﺎي ﺗــﺎﺑﻊ وﻗﻔــﻪ ﻧــﻮع ‪ 21H‬ﻳﻌﻨــﻲ‬
‫‪ Type 21H function calls‬ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ‪ DOS‬داده ﺷﺪه اﺳﺖ‪.‬‬
١٨٦

7-1 ‫ﺟﺪول‬

Function calls with the Type 21 interrupt.

AH Operation Input Values Results*

Asynchronous Communications Functions

3 Wait for None AL=Character


Asynchronous
Input character

4 Output a character to DL = Character None


asynchronous device

File Management Functions

D Reset default disk drive None None

E Select default disk drive DL=Drive AL=Number of disk drive


Number (2 for single drive)
(0=A,1=
B, 2 = C)
19 Get default drive code None AL=Default drive code
( 0 = A, 1 = B, 2=C)

2E Set verify state DL=0 None


(See also function 54) AL=0 to turn
verify off
=1 t turn
verify on

30 Get DOS version number None AL=Version number (3 or 2)


(Version 1.x returns 0)
AH= Revision number
BX,CX=0
١٨٧

Function calls with the Type 21 interrupt (continued).

AH Operation Input Values Results*

Interrupt Vector Functions

25 Set interrupt vector DS:DX=Vector address None


AL =Interrupt number
35 Read interrupt vector AL =Interrupt number ES:BX= Vector
address address

Directofy Functions

39 Create a directory DS:DX=Address None **


(MKDIR) Of
ASCIIZ
String
for
directory

3A Remove a directory DS:DX=Address None **


(RMDIR) Of
ASCIIZ
String
for
directory

3B Change the directory DS:DX=Address None **


(CHDIR) Of
ASCIIZ
String
for new
directory

47 Get current directory DL=Drive DS:SI = Address


Number of ASCIIZ
(0 = default, 1=A, etc.) string **
DS:SI=Address
Of 64-byte buffer
١٨٨

Function calls with the Type 21 interrupt (continued).

AH Operation Input Values Results*

Extended File Management Functions


36 Get free disk space DL=Drive number AX=0FFFFH if invalid
(0=default, 1=A, etc.)
=Sectors per cluster
BX=No. of free clusters
DX=Total no. of
clusters
CX=Bytes per sector

3C Create a file DS:DX=Address AX=File


Of handle **
ASCIIZ string
CX=Attribute of file

3D Open a file DS:DX=Address of AX=File


ASCIIZ string handle **
AL=0 to open for reading
= 1 to open for writing
= 2 to open for reading and
writing

3E Close a file handle BX=File handle None **

3F Read from file or BX=File handle AX=No. of bytes read**


device
CX=No. of bytes to read = 0 if read from end of
file
DS:DX=Buffer address

40 Write to a file or BX=File handle AX=No. of bytes


device written **
١٨٩

Function calls with the Type 21 interrupt (continued).

AH Operation Input Values Results*

Extended File Management Functions (continued)

CX=No. of bytes to write


DS:DX=Buffer address

41 Delete a file DS:DX=Address of ASCIIZ string None**

43 Get file attribute AL=0 CX=Attribute**


DS:DX=Address of ASCIIZ string
for file

43 Set file attribute AL=1 None **


DS:DX=Address of ASCIIZ string
for file

CX=Attribute

54 Get verify state (See None AL=0 if verify is off


also function 2E)
= 1 if verify is on
56 Rename a file DS:DX=Address of ASCIIZ string None **
for old name
ES:DI=Address of ASCIIZ string
١٩٠

Function calls with the Type 21 interrupt (continued).

AH Operation Input Values Results*

Extended File Management Functions (continued)


For new
Name
Process Management functions

31 Keep process AL=Return code None


DX=Memory size, in paragraphs

4B Load and execute a AL=0 None **


program
DS:DX=Address of ASCIIZ
string for program
ES:BX=Address of parameter
block

4B Load overlay AL=3 None **


DS:DX=Address of ASCIIZ
string for program
ES:BX=Address of parameter
block

4C End process AL=Return code None

4D Get return code of child None AX=Return code


process
١٩١

Function calls with the Type 21 interrupt (continued).

AH Operation Input Values Results*

Process Management Functions (continued)

62 Get PSP None BX=Segment address of


PSP

Memory Management Functions

48 Allocate memory BX=Number of paragraphs AX=Segment address of


requested allocated memory**

49 Free allocated memory ES=Segment address of None **


memory to be freed

4A Set block BX=Number of paragraphs None **


ES= Segment address of
memory area

Get Extended Error Function

59 Get extended error BX=0 AX= Extended code


BH= Error class
BL= Suggested action
CH= Locus

*Besides the registers listed in this column, only AX and the flags are affected.
**If an error occurs, these function calls return CF=1 and an error code in AX.
See the folowing table for the meanings of the error codes.

Function Call Error Reports


Most of the Directory and Extended File Management functions return
CF= 0 if the operation is successful and CF= 1 if an error occurred. Along with
CF=1, they return and error code in AX; the folowing table tells what these
codes mean.
١٩٢

7-2 ‫ﺟﺪول‬
Error codes for DOS function calls.
Code Meaning
1 Invalid function number
2 File not found
3 Path not found
4 Too many open files (no handles left)
5 Access denied
6 Invalid handle
7 Memory control blocks destroyed
8 Insufficient memory
9 Invalid memory block address
10 Invalid environment
11 Invalid format
12 Invalid access code
13 Invalid data
15 Invalid drive was specified
16 Attempted to remove the current directory
17 Not same device
18 No more files
19 Disk is write-protected
20 Bad disk unit
21 Drive not ready
22 Invalid disk command
23 CRC error
24 Invalid length (during disk operation)
25 Seek error
26 Not an MS-DOS disk
27 Sector not found
28 Out of paper
29 Write fault
30 Read fault
31 General failure
32 Sharing violation
١٩٣

Error codes for DOS function calls (continued).


Code Meaning
33 Lock violation
34 Invalid disk change
35 FCB unavailable
50 Network request not supported
51 Remote computer not listening
52 Duplicate name on network
53 Network name not found
54 Network busy
55 Network device no longer exists
56 Net BIOS command limit exceeded
57 Network adapter hardware error
58 Incorrect response from network
59 Unexpected network error
60 Incompatible remote adapt
61 Print queue full
62 Queue not full
63 Not enough space for print file
64 Network name was deleted
65 Access denied
66 Network device type incorrect
67 Network name not found
68 Network name limit exceeded
69 Net BIOS session limit exceeded
70 Temporarily paused
71 Network request not accepted
72 Print or disk redirection is paused
80 File exists
82 Cannot make
83 Interrupt 24 failure
84 Out of structures
85 Already assigned
86 Invalid password
87 Invalid parameter
88 Net write fault

With DOS Microsoft has also included a Get Extended Error function call
(AH=59H) that provides more comprehensive error.
‫‪١٩٤‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﺎﻋﺚ ﭘﺎك ﺷﺪن ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻣﻲﺷﻮد‪.‬‬

‫‪MOV AH , 00‬‬
‫‪MOV AL, 03‬‬
‫‪INT 10 H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﻜﺎن ﻧﻤﺎ ﻳﺎ ‪ Cursor‬را در ﺳﻄﺮ ‪ 13‬ﺳـﺘﻮن ‪40‬‬


‫ﻗﺮار ﻣﻲدﻫﺪ‪ .‬ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲداﻧﻴﺪ ﺻـﻔﺤﻪ ﻣـﺎﻧﻴﺘﻮر ﺑـﺼﻮرت ﺑـﺼﻮرت ﻳـﻚ‬
‫ﺻﻔﺤﻪ ﺷﻄﺮﻧﺠﻲ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣـﻲﺷـﻮد ﻛـﻪ داراي ‪ 80‬ﺳـﺘﻮن و ‪ 25‬ﺳـﻄﺮ‬
‫ﻣﻲﺑﺎﺷﺪ‪ .‬ﺷﻤﺎره ﺳﻄﺮﻫﺎ و ﺳﺘﻮﻧﻬﺎ از ﺻﻔﺮﺷﺮوع ﻣﻲﺷﻮﻧﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AH, 2‬‬


‫‪MOV‬‬ ‫‪BH, 0‬‬
‫‪MOV‬‬ ‫‪DH, 13 ; row‬‬
‫‪MOV‬‬ ‫‪DL, 40 ; column‬‬
‫‪INT‬‬ ‫‪10 H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻳﻚ ﻛﺎرﻛﺘﺮ را از ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﮔﺮﻓﺘﻪ‪ ،‬آﻧﺮا در ﺛﺒﺎت‬


‫‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ و ﺳﭙﺲ روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ‪.‬‬

‫‪MOV‬‬ ‫‪AH, 1‬‬


‫‪INT‬‬ ‫‪21H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻳﻚ ﻛﺎرﻛﺘﺮ را از ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﮔﺮﻓﺘﻪ‪ ،‬آﻧﺮا در ﺛﺒﺎت‬


‫‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‪) .‬روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ ﻧﻤﻲدﻫﺪ(‬

‫‪MOV‬‬ ‫‪AH, 7‬‬


‫‪INT‬‬ ‫‪21H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﺎﻋﺚ ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﻛﻨﺘﺮل ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣـﻞ ‪DOS‬‬

‫ﺑﺮﮔﺮدد‪.‬‬
‫‪١٩٥‬‬

‫‪MOV‬‬ ‫‪AX, 4C00H‬‬


‫‪INT‬‬ ‫‪21H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻛﺎرﻛﺘﺮ ‪ A‬روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر‬


‫ﻧﻤﺎﻳﺶ داده ﺷﻮد‪.‬‬
‫‪MOV‬‬ ‫‪AH, 02H‬‬
‫‪MOV‬‬ ‫‪DL, 65‬‬
‫‪INT‬‬ ‫‪21H‬‬

‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻣﻜﺎن ﻧﻤﺎ ﺑﺎﺑﺘﺪاي ﺳﻄﺮ ﺑﻌﺪ ﻣﻨﺘﻘـﻞ‬
‫ﮔﺮدد‪.‬‬
‫‪MOV‬‬ ‫‪AH, 02H‬‬
‫‪MOV‬‬ ‫‪DL, 0DH‬‬
‫‪INT‬‬ ‫‪21H‬‬
‫‪MOV‬‬ ‫‪DL, 0AH‬‬
‫‪INT‬‬ ‫‪21H‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ دﺳـﺘﻮر ‪ MOV AH, 02H‬ﭘـﺲ از دﺳـﺘﻮر‬


‫‪ INT 21H‬ﻧﻴﺎزي ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬

‫ﺑﺮﻧﺎﻣﻪ ذﻳﻞ ﺟﻬﺖ ﭘﺎﺳﺨﮕﻮﺋﻲ ‪ Y‬ﻳﺎ ‪ N‬ﺑﻪ ﻳﻚ ﭘﻴﻐﺎم ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪GET_KEY:‬‬ ‫‪MOV‬‬ ‫‪AH, 1‬‬


‫‪INT‬‬ ‫‪21H‬‬
‫‪CMP‬‬ ‫‪AL, ′Y′‬‬
‫‪JE‬‬ ‫‪YES‬‬
‫‪CMP‬‬ ‫‪AL, ′N′‬‬
‫‪JE‬‬ ‫‪NO‬‬
‫‪JNE‬‬ ‫‪GET_KEY‬‬
١٩٦

‫ داده‬21 ‫در ذﻳﻞ ﺟﺪول ﻣﺮﺑﻮط ﺑﻪ ﻋﻤﻠﻴﺎت ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﺑﺮاي وﻗﻔﻪ ﻧﻮع‬
.‫ﺷﺪه اﺳﺖ‬

7-3 ‫ﺟﺪول‬
Keyboard operations with Type 21 interrupt.

AH Operation Input Values Results


1 Wait for keyboard None AL=Character
character, then display it
(with Ctrl-Break check)

6 Read keyboard character DL=0FFH AL=Character, if available


(no Ctrl-Break check) =0, if no character is available

7 Wait for keyboard None AL=Character


character, but do not
display it (no Ctrl-Break
check)

8 Same as function 7, but None AL=Character


with Ctrl-Break check

A Read keyboard string into DS:DX=Buffer address Second buffer byte


buffer First buffer byte= Buffer =Number of chars. read
size

B Read keyboard status None AL=0FFH if no character is


available
=0 if character is available

C Clear keyboard buffer and AL=Keyboard function Per keyboard function


call a keyboard function number (1, 6, 7, 8, or A)
١٩٧

‫ در ذﻳـﻞ داده ﺷـﺪه‬21 ‫ﺟﺪول ﻣﺮﺑﻮط ﺑﻪ ﻋﻤﻠﻴﺎت ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﺑﺮاي وﻗﻔـﻪ‬
.‫اﺳﺖ‬

7-4 ‫ﺟﺪول‬

Video operations with Type 21 interrupt.

AH Operation Input Values Results

2 Display a character DL= Character Cursor follows character


(with Ctrl-Break check)

5 Print a character DL=Character None

6 Display a character DL=Character Cursor follows character


(no Ctrl-Break check)

9 Display a string DS:DX= String address. Cursor follows string


String must end with $.
‫‪١٩٨‬‬

‫‪ -7-5‬ﺧﻮاﻧﺪن رﺷﺘﻪﻫﺎ‬
‫در ﺑﺴﻴﺎري از ﺑﺮﻧﺎﻣﻪﻫﺎ ﻧﻴﺎز ﺑﻪ وارد ﻧﻤﻮدن ﻧﺎم ﻳﺎ آدرس ﻳﺎ ﺑﻄـﻮر ﻛﻠـﻲ‬
‫رﺷــﺘﻪاي از ﻃﺮﻳــﻖ ﺻــﻔﺤﻪ ﻛﻠﻴــﺪ ﻣــﻲﺑﺎﺷــﺪ‪ .‬ﺑــﺮاي اﻳﻨﻜــﺎر ﺷــﻤﺎ ﺑﺎﻳــﺴﺘﻲ در‬
‫‪ data segment‬ﻓﻀﺎﺋﻲ ﺑﺎﻧﺪازه ﻣﺎﻛﺰﻳﻤﻢ ﺗﻌﺪاد ﻛﺎرﻛﺘﺮﻫﺎﺋﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳـﺖ‬
‫از ﺻﻔﺤﻪ ﻛﻠﻴﺪ داده ﺷﻮد ﺑﻌﻼوه ‪ 2‬روزو ﻧﻤﻮد‪ .‬اﻳﻦ ﺷﺎﻣﻞ‬
‫اﻟﻒ(ﻳﻚ ﻓﻀﺎ از ﻧﻮع ﺑﺎﻳﺖ ﻛﻪ ﻣﻘﺪار آن ﻣﻌـﺎدل ﺗﻌـﺪاد ﻣـﺎﻛﺰﻳﻤﻢ ﻛﺎرﻛﺘﺮﻫـﺎي‬
‫ورودي ﺑﻌﻼوه ﻳﻚ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ب(ﻳﻚ ﻓﻀﺎ از ﻧﻮع ﺑﺎﻳﺖ ﻛﻪ ﻣﻘـﺪار آن ﺑﻮﺳـﻴﻠﻪ ﺗـﺎﺑﻊ ‪ A‬ﻳـﺎ ‪ 10H‬ﻣـﺸﺨﺺ‬
‫ﻣﻲﮔﺮدد و ﻋﺒﺎرﺗﺴﺖ از ﺗﻌﺪاد ﻛﺎرﻛﺘﺮﻫﺎي واﻗﻌﻲ ﻛﻪ از ﺻﻔﺤﻪ ﻛﻠﻴﺪ داده ﺷﺪه‬
‫اﺳﺖ‪.‬‬
‫ج ( ﻳﻚ ﺑﻠﻮك از ﺑﺎﻳﺘﻬﺎ ﺑﺪون ﻣﻘﺪار اوﻟﻴﻪ ﻛﻪ ﺷﺎﻣﻞ ﻛﺎرﻛﺘﺮﻫﺎﺋﻲ اﺳﺖ ﻛﻪ ﻋﻤﻼً‬
‫از ﻃﺮﻳﻖ ﺻﻔﺤﻪ ﻛﻠﻴﺪ وارد ﮔﺮدﻳﺪه اﺳﺖ‪.‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﺷﻜﻞ ﻛﻠﻲ رﺷﺘﻪ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬


‫)?(‪Stringname DB key-plus-one, keys-plus-one DUP‬‬

‫ﺑﻌﻨﻮان ﻣﺜﺎل ﺑﺮاي رزرو ﻓـﻀﺎﺋﻲ ﺗـﺎ ‪ 50‬ﻛـﺎرﻛﺘﺮ دﺳـﺘﻮراﻟﻌﻤﻞ زﻳـﺮ را‬
‫ﺑﺎﻳﺴﺘﻲ در ‪ data segment‬ﻗﺮار داد‪.‬‬
‫)?( ‪USER_STRING DB 51,51 DUP‬‬

‫ﺣﺎل ﺑﺮاي درﻳﺎﻓﺖ رﺷﺘﻪ از ﺻﻔﺤﻪ ﻛﻠﻴﺪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳﺮ را ﺑﺎﻳﺴﺘﻲ‬


‫اﺟﺮا ﻧﻤﻮد‪.‬‬

‫‪LEA DX, USER_STRING; make DX point to buffer‬‬


‫‪MOV AH, 0AH; read the string‬‬
‫‪INT 21H‬‬
‫‪١٩٩‬‬

‫ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﻞ آن ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪READ_KEYS‬‬ ‫‪PROC FAR‬‬


‫‪PUSH‬‬ ‫‪AX‬‬
‫‪MOV‬‬ ‫‪AX, DATA_SEG‬‬
‫‪MOV‬‬ ‫‪DS, AX‬‬
‫‪LEA‬‬ ‫‪DS, AX‬‬
‫‪LEA‬‬ ‫‪DX, USER_STRING‬‬
‫‪MOV‬‬ ‫‪AH, 0AH‬‬
‫‪INT‬‬ ‫‪21H‬‬
‫‪SUB‬‬ ‫‪CH, CH; Read Character count into CX‬‬
‫‪MOV‬‬ ‫‪CL, USER_STRING+1‬‬
‫‪ADD‬‬ ‫‪DX, 2; Make DX point to text‬‬
‫‪POP‬‬ ‫‪AX‬‬
‫‪RET‬‬
‫‪READ_KEYS‬‬ ‫‪ENDP‬‬

‫در ﺑﺴﻴﺎري از ﻣﻮارد در ﺑﺮﻧﺎﻣﻪﻫﺎ ﭘﻴﻐﺎﻣﻲ ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد و ﺳﭙﺲ از‬
‫ﻛﺎرﺑﺮ اﻧﺘﻈﺎر ﭘﺎﺳﺨﮕﻮﺋﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل ﺷﻤﺎ از ﻛـﺎرﺑﺮ ﻣـﻲﺧﻮاﻫﻴـﺪ ﻛـﻪ‬
‫ﻧﺎﻣﺶ را وارد ﻧﻤﺎﻳﺪ‪ .‬ﺑﺮاي اﻳﻨﻜﺎر اﺑﺘﺪا ﭘﻴﻐﺎﻣﻲ ﻛـﻪ ﻣـﻲ ﺧﻮاﻫﻴـﺪ روي ﺻـﻔﺤﻪ‬
‫ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ داده ﺷﻮد را در ‪ Data segment‬ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﺋﻴﺪ‪ .‬ﺳﭙﺲ ﺑـﺎ‬
‫اﺳـــﺘﻔﺎده از روال ‪ READ_KEYS‬داده ﺷـــﺪه در ﺑـــﺎﻻ اﻳﻨﻜـــﺎر را اﻧﺠـــﺎم‬
‫ﻣﻲدﻫﻴﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-28‬‬
‫‪DATA_SEG PARA DATA ′DATA′‬‬
‫‪GET_NAME DB ′Please enter your name: $′‬‬
‫‪DATA_SEG ENDS‬‬
‫و ﺳﭙﺲ در ‪ code segment‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را ﺑﺎﻳﺴﺘﻲ ﺑﺪﻫﻴﻢ‪.‬‬
٢٠٠

LEA DX, GET_NAME; display the prompt


MOV AH , 9
INT 21h
CALL READ_KEYS; Read the response
‫ اﺷﺎره ﻣﻲﻛﻨﺪ ﺑﻪ رﺷﺘﻪاي ﻛﻪ ﺷـﺎﻣﻞ‬DS:DX ‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ‬
.‫ ﺑﺮاﺑﺮ ﺑﺎ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي رﺷﺘﻪ ﻣﻲﺑﺎﺷﺪ‬CX ‫ﻧﺎم ﻣﻲﺑﺎﺷﺪ و ﻣﺤﺘﻮي‬

time ‫ و‬date ‫ ﻋﻤﻠﻴﺎت‬-7-6


‫ در زﻣﻴﻨﻪ زﻣﺎن‬21 ‫ﺟﺪول ذﻳﻞ ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲﻫﺎي ﺗﺎﺑﻊ وﻗﻔﻪ ﻧﻮع‬
.‫و ﺗﺎرﻳﺦ ﻣﻲﺑﺎﺷﺪ‬
7-5 ‫ﺟﺪول‬

AH Operation Input Values Results *


Note : All time and date values are in binary.

2A Get date None CX=Year


DH=Month
DL=Day

2B Set date CX=Year (1980-2099) AL=0 if date is valid


DH=Month =FF if date is invalid
DL=Day

2C Get time None CH=Hours


CL=Minutes
DH=Seconds
DL=1/100 seconds
2D Set time CH=Hours (0-23) AL=0 if time is valid
CL=Minutes = FF if time is invalid
DH=Seconds
DL=1/100 Seconds

* Besides the registers listed in this column, only AX and the flags are affected.
‫‪٢٠١‬‬

‫‪ -7-6-1‬اﻧﺪازهﮔﻴﺮي زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪﻫﺎ‬


‫ﺑﺎ ﺗﻮﺟﻪ ﺑﺎﻳﻨﻜﻪ ﻣﻲﺗﻮان زﻣﺎن را ﺑﺮﺣـﺴﺐ ﺻـﺪم ﺛﺎﻧﻴـﻪ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫـﺎ ﻣﻄـﺮح‬
‫ﻧﻤﺎﺋﻴﻢ از اﻳﻦ وﻳﮋﮔﻲ ﺑﺮاي اﻧﺪازهﮔﻴﺮي زﻣﺎن اﺟﺮاي ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ ﻳـﺎ ﻗـﺴﻤﺘﻲ از ﻳـﻚ‬
‫ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬ﺑﺮاي اﻳﻨﻜﺎر ﻗﺒﻞ از ﺷﺮوع اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ زﻣـﺎن ﻳـﺎ ‪ time‬را‬
‫ﻣﻲﺧﻮاﻧﻴﻢ آﻧﮕﺎه ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻧﻤﻮده ﺳﭙﺲ زﻣﺎن ﻳﺎ ‪ time‬را ﻣﻲﺧـﻮاﻧﻴﻢ‪ .‬ﺗﻔﺎﺿـﻞ دو‬
‫زﻣﺎن ﺧﻮاﻧﺪه ﺷﺪه زﻣﺎن اﺟﺮا را ﻧﺸﺎن ﻣﻲدﻫﺪ‪ .‬در ذﻳﻞ ﺑﺮﻧﺎﻣﻪاي داده ﺷـﺪه ﻛـﻪ زﻣـﺎن‬
‫اﺟﺮاي ﻳﻚ روال ﺑﻨﺎم ‪ SORT‬را اﻧﺪازه ﻣﻲﮔﻴﺮد‪.‬‬

‫‪Calculate execution time.‬‬


‫;‬ ‫‪This sequence calculates the execution time of a program‬‬
‫;‬ ‫‪Called SORT.‬‬
‫;‬ ‫‪Results:‬‬ ‫‪CH= Hours‬‬
‫;‬ ‫‪CL= Minutes‬‬
‫;‬ ‫‪DH= Seconds‬‬
‫;‬ ‫‪DL= 1/100 Seconds‬‬

‫‪; Put these temporary locations in the data segment:‬‬

‫‪HRS‬‬ ‫‪DB‬‬ ‫?‬


‫‪MINS‬‬ ‫‪DB‬‬ ‫?‬
‫‪SECS‬‬ ‫‪DB‬‬ ‫?‬
‫‪HSECS‬‬ ‫‪DB‬‬ ‫?‬

‫‪; Here is the timing sequence:‬‬

‫‪MOV‬‬ ‫‪AH, 2CH‬‬ ‫‪; Read the start time‬‬


‫‪INT‬‬ ‫‪21H‬‬
‫‪MOV‬‬ ‫‪HRS,CH‬‬ ‫‪; and save it‬‬
‫‪MOV‬‬ ‫‪MINS,CL‬‬
‫‪MOV‬‬ ‫‪SECS,DH‬‬
‫‪MOV‬‬ ‫‪HSECS,DL‬‬
‫‪CALL‬‬ ‫‪SORT‬‬ ‫‪; Execute the procedure‬‬
‫‪MOV‬‬ ‫‪AH, 2CH‬‬ ‫‪; Read the end time‬‬
‫‪INT‬‬ ‫‪21H‬‬
‫‪٢٠٢‬‬

‫‪SUB‬‬ ‫‪DL,HSECS‬‬ ‫‪: Calculate the difference‬‬


‫‪JNC‬‬ ‫‪SUB_SECS‬‬
‫‪ADD‬‬ ‫‪DL, 100‬‬
‫‪DEC‬‬ ‫‪DH‬‬
‫‪SUB_SECS:‬‬ ‫‪SUB‬‬ ‫‪DH, SECS‬‬
‫‪JNC‬‬ ‫‪SUB_MINS‬‬
‫‪ADD‬‬ ‫‪DH, 60‬‬
‫‪DEC‬‬ ‫‪CL‬‬
‫‪SUB_MINS:‬‬ ‫‪SUB‬‬ ‫‪CL, MINS‬‬
‫‪JNC‬‬ ‫‪SUB_HRS‬‬
‫‪ADD‬‬ ‫‪CL, 60‬‬
‫‪DEC‬‬ ‫‪CH‬‬
‫‪SUB_HRS:‬‬ ‫‪SUB‬‬ ‫‪CH, HRS‬‬
‫‪JNC‬‬ ‫‪DONE‬‬
‫‪ADD‬‬ ‫‪CH, 24‬‬
‫‪DONE:‬‬ ‫‪RET‬‬

‫‪ -7-6-2‬اﻳﺠﺎد ﺗﺄﺧﻴﺮ )‪(Generating delays‬‬


‫در ﺑﻌﻀﻲ از ﺑﺮﻧﺎﻣﻪﻫﺎ ﻧﻴﺎز ﺑﻪ اﻳﺠﺎد ﺗﺄﺧﻴﺮ در ﺗﻮﻟﻴﺪ ﺻﻮت از ﻃﺮﻳـﻖ ‪speaker‬‬
‫ﻳﺎ در ﻧﻤﺎﻳﺶ اﺷﻜﺎل ﮔﺮاﻓﻴﻜﻲ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎﺋﻲ ﻛﻪ اﻳﺠﺎد ﺗﺄﺧﻴﺮ ﻣﻲﻧﻤﺎﻳﻨﺪ ﺑﺼﻮرت زﻳﺮ ﻋﻤﻞ ﻣﻲﻧﻤﺎﻳﻨﺪ‪.‬‬
‫اﻟﻒ( وﻗﺖ ﻓﻌﻠﻲ )‪ (Current time‬را ﻣﻲﺧﻮاﻧﻨﺪ‪.‬‬
‫ب( ﻣﻘﺪار ﺗﺄﺧﻴﺮ را ﺑﻪ وﻗﺖ ﻓﻌﻠﻲ اﺿﺎﻓﻪ ﻧﻤﻮده ﺗﺎ زﻣﺎن ﻫﺪف )‪(target time‬‬
‫ﺑﺪﺳﺖ آﻳﺪ‪.‬‬
‫ج( زﻣﺎن ﻫﺪف را ﺗﻨﻈﻴﻢ ﻣﻲﻧﻤﺎﻳﻨﺪ ﺑﻄﻮرﻳﻜﻪ ﺳﺎﻋﺖ آن از ‪ 23‬و دﻗﻴﻘﻪ و ﺛﺎﻧﻴـﻪ‬
‫آن از ‪ 59‬ﺑﻴﺸﺘﺮ ﻧﺸﻮد‪.‬‬
‫د( زﻣﺎن ﻳﺎ ‪ time‬را ﻣﻜﺮراً ﻣﻲﺧﻮاﻧﻨﺪ ﺗﺎ زﻣﺎن ﻓﻌﻠﻲ ﺑﻴﺸﺘﺮ از زﻣﺎن ﻫﺪف ﺷﻮد‪.‬‬
‫ﻧﻤﻮدار ذﻳﻞ ﻣﺮاﺣﻞ اﻳﺠﺎد ﺗﺄﺧﻴﺮ را ﻧﺸﺎن ﻣﻲدﻫﺪ‪ .‬ﻣﺪت زﻣﺎن ﺗﺄﺧﻴﺮ ﺑﺮﺣـﺴﺐ‬
‫دﻗﻴﻘﻪ‪ ،‬ﺛﺎﻧﻴﻪ‪ ،‬و ﺻﺪم ﺛﺎﻧﻴﻪ داده ﻣﻲﺷﻮد‪.‬‬
٢٠٣

START

Read time

A
Target time=
Inputs + current time

Yes Yes Minutes


Hundreds < 60?
< 100?

No No

Hundreds= Minutes=
Hundreds – 100 Minutes –60

Seconds= Hours =
Seconds + 1 Hours +1

Yes Seconds No Hours


<60? =24?

No Yes

Seconds=
Hours =0
Seconds – 60

Minutes =
Read time
Minutes+1

A
Time = No
Target?

Yes

Delay flowchart END


٢٠٤

.‫ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﺗﺄﺧﻴﺮ ﻧﻴﺰ در ذﻳﻞ داده ﺷﺪه اﺳﺖ‬


Generate a delay.
; Make the processor wait for a specified period.
; Inputs: AL= Minutes
; BH= Seconds
; BL=1/100 Seconds
; All registers are preserved.

; Assemble with: MASM DELAY;


; Link with: LINK callprog + DELAY;

PUBLIC DELAY
CSEG SEGMENT PARA PUBLIC ′CODE′
ASSUME CS: CSEG
DELAY PROC FAR
PUSH AX ; Save affected registers
PUSH BX
PUSH CX
PUSH DX
MOV AH, 2CH ; Read current time
INT 21H
; Add the current time to the input values.
MOV AH, CH ; Hours
ADD AL, CL ; Minutes
ADD BH, DH ; Seconds
ADD BL, DL ; Hundredths
; Propagate any carryover.
CMP BL, 100 ;Hundredths must be <100
JB SECS
SUB BL, 100
INC BH
SECS: CMP BH, 60 ; Seconds must be <60
JB MINS
SUB BH,60
INC AL
MINS: CMP AL, 60 ; Minutes must be < 60
JB HRS
SUB AL, 60
INC AH
HRS: CMP AH, 24 ; Hours must be < 24
JNE CHECK
SUB AH, AH
; wait for interval to elapse.
CHECK: PUSH AX ; Read the time again
‫‪٢٠٥‬‬

‫‪MOV‬‬ ‫‪AH, 2CH‬‬


‫‪INT‬‬ ‫‪21H‬‬
‫‪POP‬‬ ‫‪AX‬‬
‫‪CMP‬‬ ‫‪CX, AX‬‬ ‫‪; Compare hours and minutes‬‬
‫‪JA‬‬ ‫‪QUIT‬‬
‫‪JB‬‬ ‫‪CHECK‬‬
‫‪CMP‬‬ ‫‪DX, BX‬‬ ‫‪; Compare seconds and hunds‬‬
‫‪JB‬‬ ‫‪CHECK‬‬
‫‪QUIT:‬‬ ‫‪POP‬‬ ‫‪DX‬‬ ‫‪; Restore registers‬‬
‫‪POP‬‬ ‫‪CX‬‬
‫‪POP‬‬ ‫‪BX‬‬
‫‪POP‬‬ ‫‪AX‬‬
‫‪RET‬‬ ‫‪; Return to calling program‬‬
‫‪DELAY‬‬ ‫‪ENDP‬‬
‫‪CSEG‬‬ ‫‪ENDS‬‬
‫‪END‬‬

‫‪ -7-7‬ﻛﺪﻫﺎي اﺳﻜﻲ و دودوﺋﻲ‬


‫ﻣﻘﺎدﻳﺮ ﻳﺎ اﻋﺪادي ﻛﻪ در ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻌﻨﻮان ورودي از ﻃﺮﻳـﻖ ﺻـﻔﺤﻪ ﻛﻠﻴـﺪ داده‬
‫ﻣﻲﺷﻮﻧﺪ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﻣﻮرد اﺳﺘﻔﺎده رﻳﺰﭘﺮدازﻧﺪه ﻗـﺮار ﮔﻴـﺮد ﺟﻬـﺖ اﻧﺠـﺎم ﻋﻤﻠﻴـﺎت‬
‫رﻳﺎﺿﻲ ﺑﺎﻳﺴﺘﻲ ﺑـﻪ دودوﺋـﻲ ﻳـﺎ ﺑـﺎﻳﻨﺮي ﺗﺒـﺪﻳﻞ ﮔﺮدﻧـﺪ‪ .‬و ﭼﻨﺎﻧﭽـﻪ ﺑﺨـﻮاﻫﻴﻢ ﻧﺘـﺎﻳﺞ‬
‫ﻣﺤﺎﺳﺒﺎت را روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺸﮕﺮ ﻳﺎ دﺳﺘﮕﺎه ﭼﺎﭘﮕﺮ ﺑﻪ ﻧﻤـﺎﻳﺶ درآورﻳـﻢ ﻳـﺎ ﭼـﺎپ‬
‫ﻧﻤﺎﺋﻴﻢ ﺑﺎﻳﺴﺘﻲ ﺗﺒﺪﻳﻞ ﺑﻪ اﺳﻜﻲ ﮔﺮدﻧﺪ‪.‬‬

‫‪ASCII‬‬ ‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬

‫‪BINARY‬‬ ‫رﻳﺰﭘﺮدازﻧﺪه‬

‫‪ASCII‬‬ ‫ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‬


‫‪٢٠٦‬‬

‫‪ -7-7-1‬ﺗﺒﺪﻳﻞ رﺷﺘﻪﻫﺎي ‪ ASCII‬ﺑﻪ دودوﺋﻲ‬


‫ﺗﺎ ‪ 9‬داراي ﻛﺪاﺳﻜﻲ ‪ 48‬ﺗﺎ ‪ 57‬ﻣﻲﺑﺎﺷـﻨﺪ‪.‬‬ ‫‪0‬‬ ‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻲداﻧﻴﻢ ﻛﺎرﻛﺘﺮﻫﺎي‬
‫ﺑﺸﺮح ذﻳﻞ‪:‬‬
‫)‪ASCII Value (Hex‬‬ ‫‪Decimal Digit‬‬
‫‪30‬‬ ‫‪0‬‬
‫‪31‬‬ ‫‪1‬‬
‫‪32‬‬ ‫‪2‬‬
‫‪33‬‬ ‫‪3‬‬
‫‪34‬‬ ‫‪4‬‬
‫‪35‬‬ ‫‪5‬‬
‫‪36‬‬ ‫‪6‬‬
‫‪37‬‬ ‫‪7‬‬
‫‪38‬‬ ‫‪8‬‬
‫‪39‬‬ ‫‪9‬‬

‫از ﻃﺮف دﻳﮕﺮ ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣـﻲداﻧـﻴﻢ ﻫـﺮ ﻋـﺪد را ﺑـﺼﻮرت ﻳـﻚ ﺳـﺮي از‬
‫ﺗﻮاﻧﻬﺎي ‪ 10‬ﻣﻲﺗﻮان ﻧﻤﺎﻳﺶ داد‪.‬‬

‫ﻣﺜﺎل ‪7-29‬‬

‫)‪472 = (2 *1) + (7*10) + (2*100‬‬


‫ﻳﺎ‬
‫‪472=2*102 + 7*101 + 2* 100‬‬

‫و ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ آﻧﻜﻪ در ﻣﻮﻗﻊ ورود اﻋﺪاد‪ ،‬در ﻫﺮ ﻟﺤﻈﻪ ﻓﻘﻂ ﻳـﻚ رﻗـﻢ را وارد‬
‫ﻣﻲﻧﻤﺎﺋﻴﻢ اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺴﺘﻲ وزن رﻗﻢ را ﻣﺪﻧﻈﺮ ﻗﺮار دﻫﺪ‪ .‬ﺑﻌﻨﻮان ﻣﺜﺎل اﮔﺮ ﻛﺎرﺑﺮ‬
‫ﻋﺪد ‪ 95‬را ﺗﺎﻳﭗ ﻧﻤﺎﻳﺪ ﺑﻪ ﻣﺤﺾ درﻳﺎﻓﺖ ‪ 9‬اﻟﮕﻮرﻳﺘﻢ ﺑﺎﻳﺴﺘﻲ آﻧﺮا در ‪ 10‬ﺿﺮب ﻧﻤﺎﻳﺪ‬
‫ﻗﺒﻞ از آﻧﻜﻪ ﺑﺎ ﻋﺪد ‪ 5‬ﺟﻤﻊ ﻧﻤﺎﻳﺪ‪ .‬ﺑﻄﻮر ﻛﻠﻲ ﻓﺮآﻳﻨﺪ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺴﺘﻲ ﺑﻄﺮﻳﻖ ذﻳـﻞ ﻋﻤـﻞ‬
‫ﻧﻤﺎﻳﺪ‪.‬‬
‫‪٢٠٧‬‬

‫اﻟﻒ(اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺴﺘﻲ اوﻟﻴﻦ رﻗﻢ )ﺑﺎ ارزﺷﺘﺮﻳﻦ( را ﺑﺎ ﺣﺬف ﭼﻬﺎر ﺑﻴـﺖ ﻣﺮﺗﺒـﻪ‬
‫ﺑﺎﻻ )ﺑﻴﺖﻫﺎي ‪ 7‬ﺗﺎ ‪ (4‬ﻛﺪ اﺳﻜﻲ ﺑﻪ دودوﺋﻲ ﺗﺒﺪﻳﻞ ﻧﻤﺎﻳﺪ و ﻣﻘﺪار ﺑﺎﻳﻨﺮي ﺑﺪﺳﺖ آﻣﺪه‬
‫را ﻧﮕﻬﺪاري ﻧﻤﺎﻳﺪ‪.‬‬
‫ب(اﻟﮕﻮرﻳﺘﻢ ﺑﺎﻳﺴﺘﻲ ارﻗﺎم ﺑﻌﺪي را ﺑﻪ دودوﺋﻲ ﺗﺒﺪﻳﻞ ﻧﻤﻮده و ﻧﺘﻴﺠﻪ ﻗﺒﻠﻲ ﺑـﻪ دﺳـﺖ‬
‫آﻣﺪه در ﻣﺮﺣﻠﻪ اﻟﻒ را در ‪ 10‬ﺿﺮب ﻧﻤﻮده ﺑﺎ ﻧﺘﻴﺠﻪ ﺑﺪﺳﺖ آﻣﺪه در اﻳﻦ ﻣﺮﺣﻠﻪ ﺟﻤﻊ‬
‫ﻧﻤﺎﻳﺪ‪.‬‬

‫ﻣﺜﺎل ‪7-30‬‬
‫ﻋﺪد ‪ 726‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬

‫‪00110111‬‬ ‫‪00110010‬‬ ‫‪00110110‬‬


‫‪7‬‬ ‫‪2‬‬ ‫‪6‬‬

‫ﺣﺎل ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻟﮕﻮرﻳﺘﻢ داده ﺷﺪه‬

‫‪0111‬‬ ‫‪7‬‬

‫‪0010‬‬ ‫‪2‬‬

‫‪1000110‬‬ ‫‪7*10‬‬ ‫‪70‬‬


‫‪1001000‬‬ ‫‪70+2‬‬ ‫‪72‬‬
‫‪0110‬‬ ‫‪6‬‬

‫‪1011010000‬‬ ‫‪72*10‬‬ ‫‪720‬‬


‫‪1011010110‬‬ ‫‪720+6‬‬ ‫‪726‬‬

‫از ﻃﺮف دﻳﮕﺮ اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺴﺘﻲ ﻗﺎدر ﺑﺎﺷﺪ ﻛﻪ ﺑﺘﻮاﻧﺪ اﻋﺪاد ﻣﻨﻔﻲ را ﻛـﻪ‬
‫ﺑﺼﻮرت رﺷﺘﻪاي از ﻛﺪاﺳﻜﻲ داده ﻣﻲﺷﻮد ﺑﻪ دودوﺋـﻲ ﺗﺒـﺪﻳﻞ ﻧﻤﺎﻳـﺪ‪ .‬ﻧﻤـﻮدار ذﻳـﻞ‬
‫ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار ﺑﻴﻦ ‪ +32767‬ﺗﺎ ‪ –32768‬را اﻧﺠﺎم ﻣﻲدﻫـﺪ‪ .‬در ﺣﻘﻴﻘـﺖ ﻧﺘﻴﺠـﻪ ﻳـﻚ‬
‫ﻋﻤﻼً ﻛﺎر ﺗﺒﺪﻳﻞ را ﺑﻌﻬﺪه دارد‪.‬‬ ‫‪CONV_AB‬‬ ‫ﻣﻘﺪار ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﺪ‪ .‬روال‬
٢٠٨

START

RESULT=0

DECIMAL
COUNT=0

IGNORE
LEADING
BLANKS
NO
(ASSUME POSITIVE)
NO
MINUS SIGN PLUS SIGN
(-)? (+)?
YES YES
POINTER= POINTER=
POINTER+1 POINTER+1

CONV_AB CONV_AB
(CONVERT (CONVERT
STRING) STRING)

YES
YES CONVERSION CONVERSION
ERROR? ERROR?
NO NO
YES YES
RESULT RESULT
< -32768? > 32767?
NO
COMPLEMENT SET ERROR
THE INDICATOR NO
RESULT

END
٢٠٩

Algorithm to convert an ASCII string to binary.


CONV_AB

DECIMAL NO
POINT?

YES
RECORD
DECIMAL
COUNT

POINTER=
POINTER+1

NO
CHARACTER
A DIGIT?
YES
MULTIPLY
PARTIAL RESULT
BY 10

CONVERT ASCII
CODE TO BINARY
DIGIT

RESULT=
RESULT+DIGIT

RESULT TOO YES


BIG?
NO
POINTER=
POINTER+1

YES MORE SET ERROR


CHARACTERS? INDICATOR
NO

RETURN
٢١٠

Convert an ASCII String to Binary


; Converts an ASCII string to its 16-bit, two’s –complement
; Binary equivalent.
; Inputs: DS:DX= starting address of string
; CX= Character count
; Results: CF= 0 indicates no error
; AX= Binary value
; DX=count of digits after decimal point
; DI=0FFH
; CF=1 indicates error
; DS:DI=Address of non-convertible character
; DX and CX are unaffected.

; Assemble with: MASM ASC_BIN;


; Link with: LINK callprog + ASC_BIN;
PUBLIC ASCII _ BIN

CSEG SEGMENT PARA ‘CODE’


ASSUME CS : CSEG
ASCII _ BIN PROC FAR
PUSH BX ;Save BX and CX
PUSH CX
MOV BX,DX ;Put offset in BX
SUB AX,AX ; To start, result =0
SUB DA,DX ; decimal count =0
MOV DI,0FFH ;assume no bad characters
CMP CX,7 ; String too long?
JA NO_GOOD ; If so, go set CF and exit
BLANKS: CMP BYTE PTR [BX] ; ′ ′ Scan past leading blanks
JNE CHK_NEG
INC BX
LOOP BLANKS
CHK_NEG: CMP BYTE PTR [BX] ; ′-′ Negative number?
JNE CHK_POS
INC BX ; If so, increment pointer
DEC CX ;decrement the count,
CALL CONV_AB ; convert the string
JC THRU
CMP AX,32768 ; Is the number too small?
JA NO_GOOD
NEG AX ; No. complement the result
JS GOOD
CMP BYTE PTR [BX],′+′ ; Positive number?
JNE GO_CONV
INC BX ; If so, increment pointer
٢١١

DEC CX ; Decrement the count


GO_CONV: CALL CONV_AB ; Convert the string
JC THRU
CMP AX,32767 ; Is the number too big?
JA NO_GOOD
GOOD: CLC
JNC THRU
NO_GOOD: STC ; If so, set carry flag
THRU: POP CX ; Restore registers
POP BX
RET ; and exit
ASCII_BIN ENDP

; This procedure performs the actual conversion.


CONV_AB PROC
PUSH BP ;Save scratch registers
PUSH BX
MOV BP,BX ;Put pointer in BP
SUB BX,BX ; and clear BX
CHK_PT: CMP DX,0 ; was a decimal point found?
JNZ RANGE ; If so, skip following check
CMP BYTE PTR DS:[BP], ′.′ ; Decimal point?
JNE RANGE
DEC CX ;If so, decrement count,
MOV DX,CX ;and record it in DX
JZ END_CONV ; Exit if CX=0
INC BP ; Increment pointer
RANGE: CMP BYTE PTR DS:[BP], ′0′ ; If the character is not a digit …
JB NON_DIG
CMP BYTE PTR DS:[BP],′9′
JBE DIGIT
NON_DIG: MOV DI,BP ; put its address in DI,
STC ;set the carry Flag,
JC END_CONV ; and exit
DIGIT: IMUL AX,10 ;Multiply the digit in AX by 10
MOV BL, DS:[BP] ;Fetch ASCII code
AND BX,0FH ; save only high bits,
ADD AX,BX ;and update partial result
JC END_CONV ; Exit if result is too big
INC BP ;Otherwise, increment BP
LOOP CHK_PT ; and continue
٢١٢

CLC ; When done, clear carry flag


END_CONV: POP BX ; Restore registers
POP BP
RET ; and return to caller
CONV_AB ENDP
CSEG ENDS
END

.‫ﺑﻪ ﻣﻨﻈﻮر ﺑﺮرﺳﻲ درﺳﺘﻲ ﺟﻮاب ﺑﻄﺮﻳﻖ ذﻳﻞ ﻋﻤﻞ ﻣﻲﻧﻤﺎﺋﻴﻢ‬

CALL ASCII_BIN ; Call the conversion procedure


JNC VALID ; Is the answer valid?
OR DI, DI ; No. find the error condition
JNZ INV_CHAR
OR AX, AX
JNZ RANGE_ER

M ; String was too long

RANGE_ER: ; Number out-of-range


INV_CHAR: ; Invalid character
VALID: ; The answer is valid

‫ﺑﻪ ﻣﻨﻈﻮر ﻧﻤﺎﻳﺶ ﻧﺘﺎﻳﺞ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻳﺎ ﭼﺎپ آﻧﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﮕﺎه‬
‫ ﺑﺮﻧﺎﻣﻪ زﻳـﺮ اﻳـﻦ ﻛـﺎر را‬.‫ﺗﺒﺪﻳﻞ ﻧﻤﻮد‬ ASCII ‫ﭼﺎﭘﮕﺮ ﺑﺎﻳﺴﺘﻲ اﺑﺘﺪا آﻧﻬﺎ را از ﺑﺎﻳﻨﺮي ﺑﻪ‬
.‫اﻧﺠﺎم ﻣﻲدﻫﺪ‬

BIN_ASC- Convert Binary to ASCII


; Converts a signed binary number to a six-byte ASCII
; String (sign plus five digits) in the data segment.
; Inputs: AX= Number to be converted
; DS: DX= starting address of string buffer
; Results: DS:DX= Starting address of string
CX= Character count
; Other registers are preserved.

; Assemble with: MASM BIN_ASC;


; Link with: LINK callprog + BIN_ASC;
٢١٣

PUBLIC BIN_ASCII
CSEG SEGMENT PARA PUBLIC ′CODE′
ASSUME CS: CSEG
BIN_ASCII PROC FAR
PUSH DX ; Save the caller’s registers

PUSH BX
PUSH SI
PUSH AX
MOV BX, DX ; Put offset in BX
MOV CX, 6 ; Fill buffer with spaces
FILL_ BUFF : MOV BYTE PTR [BX], ′ ′
INC BX
LOOP FILL_BUFF
MOV SI, 10 ;Get ready o divide by 10
OR AX, AX ; If value I negative,
JNS CLR_DVD
NEG AX ; make if positive
CLR_DVD: SUB DX, DX ; Clear upper half of dividend
DIV SI ; Divide AX by 10
ADD DX, ′0′ ; Convert remainder to ASCII digit
DEC BX ; Back up through buffer
MOV [BX], DL ; Store char. In the string
INC CX ;Count converted character
OR AX,AX ; All done?
JNZ CLR_DVD ; If not, get next digit
POP AX ; Yes. Get original value

OR AX,AX ;was it negative?


JNS NO_MORE
DEC BX ; Yes. Store sign
MOV BYTE PTR [BX], ′-′
INC CX ; and increase character count
NO_MORE: POP SI ;Restore registers
POP BX
POP DX
RET ; and exit
BIN_ASCII ENDP
CSEG ENDS
END
‫‪٢١٤‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎب ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ ﭘﺸﺘﻪ ﻳﺎ ‪ Stack‬ﺗﻌﺮﻳﻒ ﮔﺮدﻳﺪه ﭘﺸﺘﻪ ﺧﺎﺻـﻴﺖ ‪ LIFO‬دارد ﻳﻌﻨـﻲ‬
‫آﺧﺮﻳﻦ ورودي اوﻟﻴﻦ ﺧﺮوﺟﻲ از ﭘﺸﺘﻪ ﻣﻲﺑﺎﺷﺪ‪ .‬ﭘﺸﺘﻪ در ﺣﻘﻴﻘﺖ ﻗـﺴﻤﺘﻲ از ﺣﺎﻓﻈـﻪ‬
‫را اﺷﻐﺎل ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻋﻤﻠﻴﺎﺗﻲ ﻛﻪ روي ﭘـﺸﺘﻪ اﻧﺠـﺎم ﻣـﻲﺷـﻮد ﻋﺒﺎرﺗـﺴﺖ از ‪ PUSH‬و‬
‫‪.POP‬‬
‫در اﻳﻦ ﻏﺼﻞ ﻫﻤﭽﻨﻴﻦ ﻧﺤﻮه ﺗﻌﺮﻳﻒ ﻣـﺎﻛﺮو داده ﺷـﺪه ﻫـﺮ ﻣـﺎﻛﺮو ﺑـﺎ ﻛﻠﻤـﻪ‬
‫‪ macro‬ﺷﺮوع و ﺑﻪ ‪ endm‬ﺧﺘﻢ ﻣﻲﺷﻮد‪ .‬از ﻣﺎﻛﺮوﻫﺎ ﺑﺮاي ﺳﻬﻮﻟﺖ در ﻧﻮﺷﺘﻦ و ﺗﺎﻳـﭗ‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪ .‬ﻣﺎﻛﺮوﻫﺎ را در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺴﺘﻲ ﺗﻌﺮﻳـﻒ ﻧﻤـﻮد‪ .‬اﻣﻜـﺎن‬
‫اﺳﺘﻔﺎده از روال ﻧﻴﺰ در زﺑﺎن اﺳﻤﺒﻠﻲ وﺟـﻮد دارد‪ .‬روالﻫـﺎ در ﻣﻮﻗـﻊ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺗﻔﺎوت ﻣﺎﻛﺮو و روال در اﻳﻨﺴﺖ ﻛﻪ روال در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣـﻪ‬
‫ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد در ﺻﻮرﺗﻴﻜﻪ ﻣﺎﻛﺮوﻫﺎ در زﻣـﺎن ﺗﺮﺟﻤـﻪ ﺟـﺎﻳﮕﺰﻳﻦ ﻣـﻲﮔﺮدﻧـﺪ‪ .‬از‬
‫ﺗﻌﺪادي ﻋﻤﻠﮕﺮ در ﻣﺎﻛﺮوﻫﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ در اﻳﻦ ﻓﺼﻞ ﺑﺤﺚ ﮔﺮدﻳـﺪه‪ .‬ﻣﻌﻤـﻮﻻً‬
‫در اﻛﺜﺮ ﺑﺮﻧﺎﻣﻪﻫﺎ از وﻗﻔﻪ اﺳﺘﻔﺎده ﻣـﻲﮔـﺮدد‪ .‬در اﻳـﻦ ﻓـﺼﻞ ﺗﻮاﺑـﻊ ﻣﺮﺑـﻮط ﺑـﻪ وﻗﻔـﻪ‬
‫‪ASCII‬‬ ‫ﺑﺼﻮرت ﻛﺎﻣﻞ ﺑﺤﺚ ﺷﺪه اﺳﺖ‪ .‬ﺑﺮاي دادن دادهﻫﺎ ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎﻳﺴﺘﻲ از ﻓـﺮم‬
‫آﻧﻬﺎ را ﺑﻪ ﺑﺎﻳﻨﺮي ﺗﺒﺪﻳﻞ ﻧﻤﻮد و ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﻧﻤﺎﻳﺶ دادهﻫﺎ ﺑﺎﻳـﺴﺘﻲ از ﻓـﺮم ﺑـﺎﻳﻨﺮي‬
‫آﻧﻬﺎ را ﺑﻪ ﺷﻜﻞ‪ ASCII‬ﺗﺒﺪﻳﻞ ﻧﻤﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻣﺨﺼﻮص آﻧﻬﺎ در اﻳﻦ ﻓﺼﻞ ﺗﻬﻴﻪ و‬
‫ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ‪ .‬ﻫﻤﭽﻨـﻴﻦ ﻧﺤـﻮه ﻣﺤﺎﺳـﺒﻪ زﻣـﺎن اﺟـﺮاي ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ ﻧﻴـﺰ ﺑﺤـﺚ‬
‫ﮔﺮدﻳﺪه اﺳﺖ‪.‬‬
‫‪٢١٥‬‬

‫‪ a‬ﺗﻤﺮﻳﻦ‬

‫‪-1‬ﺗﻔﺎوت ‪ macro‬ﺑﺎ ‪ procedure‬ﭼﻴﺴﺖ؟‬

‫‪marcro-2‬ﻫﺎ در ﭼﻪ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ؟‬

‫‪ Procedure-3‬ﻫﺎ در ﭼﻪ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ؟‬

‫‪-4‬ﻛﺎر ﻋﻤﻠﮕﺮﻫﺎي ﻣﺎﻛﺮو ﭼﻴﺴﺖ؟‬

‫‪-5‬ﻛﺎر ‪ REPT, EXITM, IFNB‬ﭼﻴﺴﺖ؟ ﻳﻚ ﻣﺜﺎل ﺑﺮاي ﻫﺮ ﻛﺪام اراﻳﻪ ﻛﻨﻴﺪ‪.‬‬

‫‪-6‬ﻛﺎر ‪ LOCAL‬ﭼﻴﺴﺖ؟ ﻳﻚ ﻣﺜﺎل اراﻳﻪ ﻛﻨﻴﺪ‪.‬‬

‫‪-7‬ﻳﻚ ‪ Macro‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ را ذﺧﻴﺮه ﻧﻤﺎﻳﺪ‪.‬‬

‫‪ Interrupt Vector-8‬ﭼﻴﺴﺖ؟‬

‫‪-9‬در ﭼﻪ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ﺟﺪول ‪ Interrupt vector‬ﻗﺮار دارد؟‬

‫‪-10‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻳﻚ ﭘﻴﻐﺎم دﻟﺨﻮاه را ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬

‫‪-11‬رواﻟﻲ ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ دو ﻣﻘﺪار ﺻﺤﻴﺢ را ﮔﺮﻓﺘﻪ ﻣﺠﻤﻮع آﻧﻬﺎ را ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬

‫‪-12‬رواﻟﻲ ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻓﺎﺻﻠﻪ زﻣﺎﻧﻲ ﺑﻴﻦ ﻓﺸﺎر دو دﻛﻤﻪ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-13‬رواﻟﻲ ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر را ﭘﺎك ﻧﻤﻮده و ﻣﻜﺎن ﻧﻤﺎ را در ﺳﻄﺮ ‪ 10‬ﺳﺘﻮن‬
‫‪ 40‬ﻗﺮار داده آﻧﮕﺎه ﻛﺎرﻛﺘﺮ * را ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬

‫‪-14‬ﻳﻚ ‪ Macro‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﻘﺪار ‪ N‬از ﻧﻮع ﺑﺎﻳﺖ را ﮔﺮﻓﺘﻪ ﻣﺠﻤﻮع زﻳﺮا را ﻣﺤﺎﺳـﺒﻪ‬
‫‪1+2+3+…+N‬‬ ‫ﻧﻤﺎﻳﺪ‪.‬‬
‫‪٢١٦‬‬

‫‪-15‬ﻳﻚ ‪ Procedure‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ وﻗـﺖ را ﺑـﺼﻮرت ﻳـﻚ ﻋـﺪد ﺷـﺶ رﻗﻤـﻲ ﮔﺮﻓﺘـﻪ‬


‫ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ ﻛﻪ ﭘﺲ از ﮔﺬﺷﺖ ‪ 5‬ﺳﺎﻋﺖ و ‪ 55‬دﻗﻴﻘﻪ و ‪ 50‬ﺛﺎﻧﻴـﻪ وﻗـﺖ ﭼﻴـﺴﺖ و‬
‫آﻧﺮا ﻧﻤﺎﻳﺶ دﻫﺪ‪.‬‬

‫‪-16‬ﻳﻚ ‪ Procedure‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ آراﻳﻪ ‪ N‬ﻋﻨﺼﺮ ‪ X‬از ﻧـﻮع ﺑﺎﻳـﺖ را ﺑـﺼﻮرت ﻧﺰوﻟـﻲ‬


‫ﻣﺮﺗﺐ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-17‬ﻳﻚ ‪ Macro‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﻴﻨﻴﻤﻢ ‪ N‬ﻣﻘﺪار از ﻧﻮع ‪ word‬را ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ‪.‬‬

‫‪-18‬ﻳﻚ ‪ Macro‬ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﺎﻳﺪ ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪ N‬از ﻧﻮع ‪ word‬اول‬
‫ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ؟‬

‫‪ N‬از ﻧــﻮع ‪ word‬و ﻣﺜﺒــﺖ را ﮔﺮﻓﺘــﻪ‬ ‫‪, M‬‬ ‫‪-19‬ﻳــﻚ ‪ Macro‬ﺑﻨﻮﻳــﺴﻴﺪ ﻛــﻪ دو ﻣﻘــﺪار‬
‫ﻛﻮﭼﻜﺘﺮﻳﻦ ﻣﻀﺮب ﻣﺸﺘﺮك آﻧﻬﺎ را ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬

‫ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ و ﻣﺠﺬور ﻛﺎﻣﻞ ﺑﺎﺷـﺪ ﻳـﻚ ‪ Macro‬ﺑﺪﻫﻴـﺪ ﻛـﻪ‬ ‫‪N‬‬ ‫‪-20‬اﮔﺮ‬
‫ﺟﺬر آﻧﺮا ﻣﺤﺎﺳﺒﻪ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪٢١٧‬‬

‫ﻓﺼﻞ ﻫﺸﺘﻢ‬
‫ﻋﻤﻠﻴﺎت ﭘﺮدازش رﺷﺘﻪﻫﺎ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻣﻌﺮﻓﻲ رﺷﺘﻪ ﻫﺎ و ﭘﺮدازش آﻧﻬﺎ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻔﺎﻫﻴﻢ زﻳﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ‪.‬‬
‫‪ -1‬ﺗﻌﺮﻳﻒ رﺷﺘﻪ )‪.( String‬‬
‫‪ -2‬اﻧﺘﻘﺎل ﻳﺎ ﺟﺎﺑﺠﺎﺋﻲ رﺷﺘﻪﻫﺎ‪.‬‬
‫‪ -3‬ﻣﻘﺎﻳﺴﻪ رﺷﺘﻪﻫﺎ‪.‬‬
‫‪ -4‬ﺑﺮرﺳﻲ ﻳﺎ ﺟﺴﺘﺠﻮي رﺷﺘﻪﻫﺎ‪.‬‬
‫‪ -5‬ﺳﺎﻳﺮ ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ رﺷﺘﻪﻫﺎ‪.‬‬
‫‪٢١٨‬‬

‫‪ -8-1‬رﺷﺘﻪ )‪(String‬‬
‫رﺷﺘﻪ ﻋﺒﺎرت اﺳﺖ از ﻳﻚ ﺑﻠﻮك ﭘﺸﺖ ﺳﺮ ﻫـﻢ از ﺑﺎﻳـﺖﻫـﺎ ﻳـﺎ ‪ word‬ﻫـﺎ در‬
‫ﺣﺎﻓﻈﻪ اﺻﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ‪ .‬ﻃﻮل رﺷﺘﻪ ﻣﻲﺗﻮاﻧﺪ ﺗﺎ ‪ 64K‬ﺑﺎﻳﺖ ﺑﺎﺷﺪ‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷـﺖ‬
‫ﻛﻪ ﺑﺎ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎﺋﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﺑﺤﺚ ﻧﻤﻮدهاﻳﻢ ﻣﻲﺗﻮان ﻋﻤﻠﻴـﺎت روي رﺷـﺘﻪﻫـﺎ را‬
‫اﻧﺠﺎم داد‪ .‬وﻟﻲ اﺳـﺘﻔﺎده از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘـﺮدازش رﺷـﺘﻪاي ﻛﺎرآﻣـﺪﺗﺮ ﻣـﻲﺑﺎﺷـﺪ‪.‬‬
‫ﻋﻤﻠﻴﺎت ﭘﺮدازش رﺷﺘﻪاي ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪Move‬‬ ‫ﺟﺎﺑﻪﺟﺎﺋﻲ‬ ‫‪MOVS‬‬

‫‪Compare‬‬ ‫ﻣﻘﺎﻳﺴﻪ‬ ‫‪CMPS‬‬

‫‪Load‬‬ ‫ﺑﺎرﻛﺮدن‬ ‫‪LODS‬‬

‫‪Scan‬‬ ‫ﺟﺴﺘﺠﻮ‬ ‫‪SCAS‬‬

‫‪Store‬‬ ‫ذﺧﻴﺮه‬ ‫‪STOS‬‬

‫‪Data‬در ﺑﻌــﻀﻲ از‬ ‫‪segment‬‬ ‫ﻫﻤﺎﻧﻄﻮرﻳﻜــﻪ ﻗــﺒﻼ ﺑﻴ ـﺎن ﮔﺮدﻳــﺪ ﻋــﻼوه ﺑــﺮ‬
‫‪Extra segment‬‬ ‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﭘﺮدازش رﺷﺘﻪاي اﺳـﺘﻔﺎده از ‪ segment‬دﻳﮕـﺮي ﺑﻨـﺎم‬
‫ﻧﻴﺰ ﺿﺮوري ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪EXTRA_SEG‬‬ ‫‪SEGMENT‬‬ ‫‪PARA‬‬ ‫‪′EXTRA′‬‬

‫‪M‬‬
‫‪EXTRA_SEG‬‬ ‫‪ENDS‬‬

‫‪ -8-1-1‬دﺳﺘﻮراﻟﻌﻤﻞ ‪MOVS‬‬
‫از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮاي ﻛﭙﻲ ﻧﻤﻮدن ﻳﻚ رﺷﺘﻪ از ﻣﺤﻠﻲ از ﺣﺎﻓﻈﻪ ﺑـﻪ ﻣﺤـﻞ‬
‫دﻳﮕﺮي از ﺣﺎﻓﻈﻪ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬رﺷﺘﻪاي ﻛﻪ از آن ﻣﻲﺧـﻮاﻫﻴﻢ ﻛﭙـﻲ ﺗﻬﻴـﻪ ﻧﻤـﺎﺋﻴﻢ‬
‫‪٢١٩‬‬

‫رﺷﺘﻪ ﻣﺒﺪاء ﻳﺎ ‪Source‬و رﺷﺘﻪ ﺑﺪﺳﺖ آﻣﺪه را رﺷﺘﻪ ﻣﻘﺼﺪ ﻳﺎ ‪ Destination‬ﻣـﻲﻧﺎﻣﻨـﺪ‪.‬‬


‫ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻋﺒﺎرﺗﺴﺖ از‬
‫‪MOVS‬‬
‫اﻟﻒ( ﭼﻨﺎﻧﭽﻪ رﺷﺘﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ از ‪ MOVSB‬و اﮔﺮ رﺷﺘﻪ از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ از‬
‫‪ MOVSW‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫ب( ﻳﻚ ﻋﻨﺼﺮ از رﺷﺘﻪ ﻣﺒﺪاء را ﺑﻪ رﺷﺘﻪ ﻣﻘﺼﺪ اﻧﺘﻘﺎل ﻣﻲدﻫﺪ‪.‬‬
‫ج( دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOVS‬ﺑﺮ ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻳﺴﺘﻲ آدرس ﺷـﺮوع رﺷـﺘﻪ ﻣﻘـﺼﺪ را در‬
‫‪ Extra‬ﺗﻌﺮﻳـﻒ ﻧﻤـﻮد‪ .‬ﻫﻤﭽﻨـﻴﻦ‬ ‫‪segment‬‬ ‫ﺛﺒﺎت ‪ DI‬ﻗـﺮار داده و رﺷـﺘﻪ ﻣﻘـﺼﺪ را در‬
‫آدرس ﺷـــﺮوع رﺷـــﺘﻪ ﻣﺒـــﺪاء را در ﺛﺒـــﺎت ‪ SI‬ﻗـــﺮار داده و رﺷـــﺘﻪ ﻣﺒـــﺪاء را در‬
‫‪ Data‬ﺗﻌﺮﻳﻒ ﻧﻤﻮد‪ .‬ﺿﻤﻨﺎً ﻣﻘﺪار ﻓﻠﮓ ‪ DF‬ﻣﺸﺨﺺ ﻛﻨﻨـﺪه اﻳـﻦ اﺳـﺖ ﻛـﻪ‬ ‫‪segment‬‬

‫ﻋﻤﻞ ﺟﺎﺑﻪﺟﺎﺋﻲ از اوﻟﻴﻦ ﻋﻨﺼﺮ ﺑﻪ ﻃﺮف آﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﻲﺑﺎﺷﺪ ﻳﺎ ﺑﻠﻌﻜـﺲ‪ .‬ﭼﻨﺎﻧﭽـﻪ‬
‫ﻣﻘﺪار ‪ DF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺑﺎﺷﺪ ﻋﻤﻞ ﺟﺎﺑﻪﺟﺎﺋﻲ از اوﻟﻴﻦ ﻋﻨﺼﺮ ﺑﻪ ﻃﺮف آﺧﺮﻳﻦ ﻋﻨـﺼﺮ‬
‫و ﭼﻨﺎﻧﭽﻪ ﻣﻘﺪار ‪ DF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺑﺎﺷﺪ ﻋﻤﻞ ﺟﺎﺑﻪﺟﺎﺋﻲ از آﺧﺮﻳﻦ ﻋﻨﺼﺮ ﺑﻄﺮف اوﻟﻴﻦ‬
‫ﻋﻨﺼﺮ اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪8-1‬‬
‫‪MOV‬‬ ‫‪SI, OFFSET SOURCE_STR‬‬
‫‪MOV‬‬ ‫‪DI, OFFSET DEST _STR‬‬
‫; ‪CLD‬‬ ‫‪Forward movement‬‬
‫‪MOVSB‬‬

‫ﻗـﺮار داده و‬ ‫‪SI‬‬ ‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﻓﻮق آدرس ﺷﺮوع رﺷﺘﻪ ﻣﺒـﺪاء را در ﺛﺒـﺎت‬
‫آدرس ﺷﺮوع رﺷﺘﻪ ﻣﻘﺼﺪ را در ﺛﺒﺎت ‪ DI‬ﻗﺮار داده و ﺟﻬﺖ ﺣﺮﻛﺖ از اوﻟـﻴﻦ ﻋﻨـﺼﺮ‬
‫ﺑﺎﻋﺚ ﻣﻲﺷـﻮد‬ ‫‪MOVSB‬‬ ‫ﺑﻪ ﻃﺮف آﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻣﺸﺨﺺ ﻧﻤﻮده اﺳﺖ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ‬
‫ﻛﻪ ﻳﻚ ﻋﻨﺼﺮ از رﺷﺘﻪ ﻣﺒﺪاء ﻛﻪ در آدرس ‪ DS:SI‬ﻗـﺮار دارد ﺑـﻪ آدرس ‪ ES:DI‬ﻛﭙـﻲ‬
‫ﮔﺮدد و ﻣﻘﺪار ‪ DI‬و ‪ SI‬ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ ﻳﺎﺑﻨﺪ‪.‬‬
‫‪٢٢٠‬‬

‫‪MOSV‬‬ ‫ﻣﻘـــﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ و رﺷﺘﻪﻫــــــﺎ ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ‬

‫‪DF=0‬‬ ‫*‬
‫‪+‬‬
‫‪-‬‬
‫‪/‬‬
‫‪a‬‬
‫‪DI‬‬ ‫ﺟﻬﺖ ﭘﺮدازش‬ ‫‪b‬‬ ‫‪SI‬‬
‫‪o‬‬
‫‪o‬‬
‫‪k‬‬
‫رﺷﺘﻪ ﻣﻘﺼﺪ‬ ‫رﺷﺘﻪ ﻣﺒﺪأ‬
‫‪Extra segment‬‬ ‫‪Data segment‬‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎ و رﺷﺘﻪﻫﺎ ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOVS‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫*‬ ‫‪DF=0‬‬ ‫*‬


‫‪+‬‬
‫‪-‬‬
‫‪/‬‬
‫‪a‬‬
‫‪DI‬‬ ‫ﺟﻬﺖ ﭘﺮدازش‬ ‫‪b‬‬ ‫‪SI‬‬
‫‪o‬‬
‫‪o‬‬
‫‪k‬‬
‫رﺷﺘﻪ ﻣﻘﺼﺪ‬ ‫رﺷﺘﻪ ﻣﺒﺪأ‬

‫ﭼﻨﺎﻧﭽﻪ ﺑﻪ ﺟﺎي دﺳﺘﻮراﻟﻌﻤﻞ ‪ CLD‬از دﺳﺘﻮراﻟﻌﻤﻞ ‪ STD‬اﺳﺘﻔﺎده ﮔﺮدد ﻣﻘﺎدﻳﺮ‬


‫ﻣﻲآﻳﺪ‪:‬‬ ‫ﺛﺒﺎﺗﻬﺎ و رﺷﺘﻪﻫﺎ ﺑﺼﻮرت زﻳﺮ در‬
‫‪٢٢١‬‬

‫‪DF=1‬‬ ‫*‬
‫‪+‬‬
‫‪-‬‬
‫‪/‬‬
‫‪a‬‬
‫‪DI‬‬ ‫ﺟﻬﺖ ﭘﺮدازش‬ ‫‪b‬‬ ‫‪SI‬‬
‫‪o‬‬
‫‪o‬‬
‫‪k‬‬
‫رﺷﺘﻪ ﻣﻘﺼﺪ‬ ‫رﺷﺘﻪ ﻣﺒﺪأ‬

‫ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي ‪ SI‬و ‪ DI‬ﻳﻚ واﺣﺪ ﻛﺎﻫﺶ ﻣﻲﻳﺎﺑﻨﺪ‪.‬‬

‫‪DF=1‬‬ ‫*‬
‫‪+‬‬
‫‪-‬‬
‫‪/‬‬
‫‪a‬‬
‫‪DI‬‬ ‫ﺟﻬﺖ ﭘﺮدازش‬ ‫‪b‬‬ ‫‪SI‬‬
‫‪o‬‬
‫‪o‬‬
‫‪k‬‬ ‫‪k‬‬
‫رﺷﺘﻪ ﻣﻘﺼﺪ‬ ‫رﺷﺘﻪ ﻣﺒﺪأ‬

‫ﺣﺎل ﺑﺮاي اﻧﺘﻘﺎل ﺳﺎﻳﺮ ﻋﻨﺎﺻﺮ رﺷﺘﻪ ﺑﺎﻳﺴﺘﻲ ﺗﻌﺪاد ﻋﻨﺎﺻـﺮ رﺷـﺘﻪ را در ﺛﺒـﺎت‬
‫ﻗﺮار داد و از ﭘﻴﺸﻮﻧﺪ ‪ REP‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬ ‫‪CX‬‬

‫‪MOV‬‬ ‫‪SI, OFFSET SOURCE_STR‬‬


‫‪MOV‬‬ ‫‪DI, OFFSET DEST _STR‬‬
‫‪CLD‬‬
‫‪MOV‬‬ ‫; ‪CX, 9‬‬ ‫ﺗﻌﺪادﻋﻨﺎﺻﺮ رﺷﺘﻪ‬
‫‪REP‬‬ ‫‪MOVSB‬‬
‫‪٢٢٢‬‬

‫*‬ ‫‪DF=0‬‬ ‫*‬


‫‪+‬‬ ‫‪+‬‬
‫‪-‬‬ ‫‪-‬‬
‫‪/‬‬ ‫‪/‬‬
‫‪a‬‬ ‫‪a‬‬
‫‪b‬‬ ‫‪b‬‬
‫‪o‬‬ ‫‪o‬‬
‫‪o‬‬ ‫‪o‬‬
‫‪k‬‬ ‫‪k‬‬

‫رﺷﺘﻪ ﻣﻘﺼﺪ‬ ‫رﺷﺘﻪ ﻣﺒﺪاء‬

‫ﺗﺎ ﻣﺎداﻣﻴﻜﻪ ﻣﻘﺪار ‪ CX‬ﻣﺨﺎﻟﻒ ﺻـﻔﺮ ﻣـﻲﺑﺎﺷـﺪ ﺑﺎﻋـﺚ اﺟـﺮاي‬ ‫‪REP‬‬ ‫ﭘﻴﺸﻮﻧﺪ‬
‫اﺟـﺮاي‬ ‫‪CX‬‬ ‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOVSB‬ﻣﻲﮔﺮدد‪ .‬ﺑﻪ ﻣﺤﺾ ﺻـﻔﺮ ﺷـﺪن ﻣﻘـﺪار ﺛﺒـﺎت‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOVSB‬ﻣﺘﻮﻗﻒ ﻣـﻲﮔـﺮدد‪ .‬ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﻗـﺒﻼً ﮔﻔﺘـﻪ ﺷـﺪ ﺑـﻪ ﺟـﺎي‬
‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي‬

‫‪MOV‬‬ ‫‪SI, OFFSET SOURCE_STR‬‬


‫‪MOV‬‬ ‫‪DI, OFFSET DEST _STR‬‬

‫از دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي زﻳﺮ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬

‫‪LEA‬‬ ‫‪SI, SOURCE_STR‬‬


‫‪LEA‬‬ ‫‪DI, DEST _STR‬‬

‫ﺿﻤﻨﺎً ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﮔﻔﺘﻪ ﺷﺪ دﺳـﺘﻮراﻟﻌﻤﻞﻫـﺎي ﭘـﺮدازش رﺷـﺘﻪاي در ﻣﻘﺎﺑـﻞ‬


‫اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﻣﻌﻤـﻮﻟﻲ ﻛﺎرآﻣـﺪ و ﻣـﺆﺛﺮﺗﺮ ﻣـﻲﺑﺎﺷـﻨﺪ‪ .‬ﺑﺮﻧﺎﻣـﻪ ﻓـﻮق را‬
‫ﻣﻲﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ذﻳﻞ ﻧﻴﺰ ﻧﻮﺷﺖ‪.‬‬
‫‪٢٢٣‬‬

‫‪MOV‬‬ ‫‪SI, OFFSET‬‬ ‫‪SOURCE_STR‬‬


‫‪MOV‬‬ ‫‪DI, OFFSET‬‬ ‫‪DEST_STR‬‬
‫‪CLD‬‬
‫‪MOV‬‬ ‫‪CX, 9‬‬
‫‪JCXZ‬‬ ‫‪LAB5‬‬
‫‪LAB1 : MOVSB‬‬
‫‪LOOP LAB1‬‬
‫‪LAB5:‬‬
‫‪M‬‬

‫ﺑﻪ‬ ‫‪SOURCE_D‬‬ ‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺑﺎﻋﺚ ﻛﭙﻲ ﺷﺪن ‪ 100‬ﺑﺎﻳﺖ از رﺷﺘﻪاي ﺑﻨﺎم‬
‫‪ DEST_D‬ﻣﻲﺷﻮد‪ .‬ﻫﺮ دو رﺷﺘﻪ در ‪ data segment‬ﻗﺮار دارﻧﺪ‪.‬‬

‫‪PUSH‬‬ ‫‪DS‬‬
‫‪POP‬‬ ‫‪ES‬‬
‫‪CLD‬‬
‫‪LEA‬‬ ‫‪SI, SOURCE_D‬‬
‫‪LEA‬‬ ‫‪DI, DEST_D‬‬
‫‪MOV‬‬ ‫‪CX, 100‬‬
‫‪REP‬‬ ‫‪MOVSB‬‬

‫ﺑـﻪ آدرس ‪ THERE‬ﻣﻨﺘﻘـﻞ‬ ‫‪HERE‬‬ ‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻳﻚ ﺑﺎﻳـﺖ از آدرس‬


‫ﻣﻲﻛﻨﺪ‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻫﺮ دو رﺷﺘﻪ در ‪ Extra segment‬ﻗﺮار دارﻧﺪ‪.‬‬
‫‪LEA SI, ES: HERE‬‬
‫‪LEA DI, ES: THERE‬‬
‫‪MOVSB‬‬

‫‪ -8-1-2‬دﺳﺘﻮراﻟﻌﻤﻞ ‪STOS‬‬
‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻳﻚ ﺑﺎﻳﺖ ﻳﺎ ﻳﻚ ‪ word‬را از ﺛﺒـﺎت ‪ AL‬ﻳـﺎ‬
‫ﺛﺒﺎت ‪ AX‬ﺑﻪ ﻳﻚ ﻋﻨﺼﺮ رﺷﺘﻪ ﻣﻘـﺼﺪ ﻣﻨﺘﻘـﻞ ﻧﻤﺎﻳـﺪ‪ .‬ﺷـﻜﻞ ﻛﻠـﻲ اﻳـﻦ دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪STOS‬‬
‫اﻟﻒ( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮروي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪word‬‬ ‫ب(ﭼﻨﺎﻧﭽﻪ رﺷﺘﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ از دﺳﺘﻮراﻟﻌﻤﻞ ‪ STOSB‬و ﭼﻨﺎﻧﭽﻪ از ﻧـﻮع‬
‫ﺑﺎﺷﺪ از دﺳﺘﻮراﻟﻌﻤﻞ ‪ STOSW‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫‪٢٢٤‬‬

‫ج( ﻣﻘﺪاري ﻛﻪ در رﺷﺘﻪ ﻗﺮار ﻣﻲﮔﻴﺮد ﭼﻨﺎﻧﭽﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ در ﺛﺒـﺎت ‪ AL‬ﻗـﺮار‬
‫داده ﻣﻲﺷﻮد‪ .‬و اﮔﺮ از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ در ﺛﺒﺎت ‪ AX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬
‫و ‪ STD‬ﺑﺮاي ﻣﺸﺨﺺ ﻧﻤﻮدن ﺟﻬﺖ ﭘﺮدازش ﻣـﻲﺗـﻮان‬ ‫‪CLD‬‬ ‫د( از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي‬
‫اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫ه( از ﭘﻴﺸﻮﻧﺪ ‪ REP‬ﻧﻴﺰ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫‪DI‬‬ ‫‪ extra‬ﺗﻌﺮﻳﻒ ﻧﻤﻮد و آدرس ﺷﺮوع آﻧﺮا در ﺛﺒـﺎت‬ ‫‪segment‬‬ ‫ز( رﺷﺘﻪ را ﺑﺎﻳﺴﺘﻲ در‬
‫ﻗﺮار داد‪.‬‬

‫ﻣﺜﺎل ‪8-2‬‬
‫)?( ‪DEST_STR DB 100 DUP‬‬
‫‪MOV AL, ′*′‬‬
‫‪CLD .‬‬
‫‪LEA DI, DEST_STR‬‬
‫‪STOSB‬‬

‫ﻣﻘﺪار * را در ﻋﻨﺼﺮي از رﺷﺘﻪ ﻛﻪ آدرس آن ﺑﻮﺳﻴﻠﻪ ‪ ES:DI‬ﻣﺸﺨﺺ ﻣﻲﺷﻮد‬


‫ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫‪0‬‬
‫‪1‬‬
‫‪2‬‬

‫‪DI‬‬ ‫‪AL‬‬
‫‪′*′‬‬

‫‪M‬‬
‫‪99‬‬
‫‪DEST_STR‬‬ ‫رﺷﺘﻪ‬
‫‪٢٢٥‬‬

‫ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ STOSB‬ﻳﻚ واﺣﺪ ﺑﻪ ﺛﺒﺎت ‪ DI‬اﺿﺎﻓﻪ ﻣﻲﮔﺮدد‪.‬‬

‫*‬ ‫‪0‬‬
‫‪1‬‬

‫‪DI‬‬ ‫‪AL‬‬
‫‪′*′‬‬

‫‪M‬‬
‫‪99‬‬

‫‪CX‬‬ ‫از ﭘﻴﺸﻮﻧﺪ ‪ REP‬ﻧﻴﺰ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬اﻳﻦ ﭘﻴﺸﻮﻧﺪ ﻣﺎداﻣﻴﻜـﻪ ﻣﺤﺘـﻮي‬
‫ﻣﺨﺎﻟﻒ ﺻﻔﺮ ﻣﻲﺑﺎﺷﺪ ﺑﺎﻋﺚ اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ STOSB‬ﻣﻲﮔﺮدد‪.‬‬
‫ﻣﺜﺎل ‪8-3‬‬
‫‪DSTR‬‬ ‫‪DB‬‬ ‫)?(‪100 DUP‬‬
‫‪MOV‬‬ ‫‪CX , 50‬‬
‫‪MOV‬‬ ‫‪AL, ′*′‬‬
‫‪MOV‬‬ ‫‪DI, OFFSET DSTR‬‬
‫‪CLD‬‬
‫‪REP‬‬ ‫‪STOSB‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق ﺑﺎﻋﺚ ﻣﻲﺷﻮد ﻛﻪ ﻣﻘﺪار ‪ 50‬ﻋﻨﺼﺮ اول رﺷﺘﻪ ‪ DSTR‬ﺑﺮاﺑﺮ ﺑـﺎ‬
‫ﻛﺎرﻛﺘﺮ * ﮔﺮدﻧﺪ‪.‬‬
‫ﻣﺜﺎل ‪8-4‬‬
‫‪CLD‬‬ ‫‪.‬‬
‫‪LEA‬‬ ‫‪DI, W_STRING‬‬
‫‪MOV‬‬ ‫‪AX,0‬‬
‫‪MOV‬‬ ‫‪CX, 200‬‬
‫‪REP‬‬ ‫‪STOSW‬‬
‫‪٢٢٦‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق ﻣﻘﺪار دوﻳﺴﺖ ‪ word‬اول رﺷﺘﻪ ‪ W_STRING‬را ﻣﻌﺎدل ﺻﻔﺮ‬
‫ﻗﺮار ﻣﻲدﻫﺪ‪ .‬دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ در اﻳﻨﺠﺎ اﻓﺰاﻳﺶ ‪ DI‬ﺑﺎﻧـﺪازه دو واﺣـﺪ ﻣـﻲﺑﺎﺷـﺪ‬
‫ﭼﻮن رﺷﺘﻪ از ﻧﻮع ‪ word‬ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪ -8-1-3‬دﺳﺘﻮراﻟﻌﻤﻞ ‪LODS‬‬
‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻚ ﻋﻨﺼﺮ رﺷﺘﻪ ﻣﺒﺪاء را در ‪ AL‬ﻳﺎ ‪ AX‬ﻗﺮار ﻣﻲدﻫـﺪ ﺑـﺴﺘﻪ‬
‫ﺑﻪ اﻳﻨﻜﻪ رﺷﺘﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ ﻳﺎ ‪ .word‬ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻋﺒﺎرﺗﺴﺖ از‬

‫‪LODS‬‬

‫اﻟﻒ( ﭼﻨﺎﻧﭽﻪ رﺷﺘﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ از ‪ LODSB‬و ﭼﻨﺎﻧﭽـﻪ از ﻧـﻮع ‪ word‬ﺑﺎﺷـﺪ از‬
‫‪ LODSW‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫ب( اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺮ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج( اﺳﺘﻔﺎده از ﭘﻴﺸﻮﻧﺪ ‪ REP‬ﺑﺎ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ اﻣﻜﺎن ﭘﺬﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪SI‬‬ ‫د( رﺷﺘﻪ ﺑﺎﻳﺴﺘﻲ در ‪ data segment‬ﺗﻌﺮﻳﻒ ﮔﺮدد و آدرس ﺷـﺮوع رﺷـﺘﻪ در ﺛﺒـﺎت‬
‫ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬

‫ﻣﺜﺎل ‪8-5‬‬
‫‪LEA‬‬ ‫‪SI, SOURCE_STR‬‬
‫‪LODSB‬‬

‫اوﻟﻴﻦ ﻋﻨﺼﺮ رﺷﺘﻪ ‪ SOURCE_STR‬در داﺧﻞ ﺛﺒﺎت ‪ AL‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬

‫‪ -8-1-4‬دﺳﺘﻮراﻟﻌﻤﻞ ‪CMPS‬‬
‫اﻳـــﻦ دﺳـــﺘﻮراﻟﻌﻤﻞ دو رﺷـــﺘﻪ ﻣﺒـــﺪاء و ﻣﻘـــﺼﺪ را ﺑـــﺎ ﻫـــﻢ ﻣﻘﺎﻳـــﺴﻪ‬
‫ﻣﻲﻧﻤﺎﻳﺪ‪.‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬ﻋﻤﻞ ﻣـﻲﻧﻤﺎﻳـﺪ‪.‬ﻋﻨـﺼﺮ رﺷـﺘﻪ‬
‫ﻣﺒﺪاء را از ﻋﻨﺼﺮ ﻣﺘﻨﺎﻇﺮ رﺷﺘﻪ ﻣﻘﺼﺪ ﻛﻢ ﻧﻤﻮده و ﻓﻠﮓﻫﺎ را ﺑﺮاﺳﺎس ﻧﺘﻴﺠـﻪ ﺑﺪﺳـﺖ‬
‫‪٢٢٧‬‬

‫آﻣﺪه ﺗﻨﻈﻴﻢ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺎﻋـﺚ ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار ﻫﻴﭽﻜـﺪام از ﻋﻤﻠﻮﻧـﺪﻫﺎ‬
‫ﻧﻤﻲﺷﻮد‪ .‬ﺷﻜﻞ ﻛﻠﻲ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪CMPS‬‬

‫اﻟﻒ( ﭼﻨﺎﻧﭽﻪ رﺷﺘﻪﻫﺎ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﻨﺪ از ‪ CMPSB‬و ﭼﻨﺎﻧﭽﻪ از ﻧـﻮع ‪ word‬ﺑﺎﺷـﻨﺪ‬
‫از ‪ CMPSW‬اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫ب( از ﭘﻴﺸﻮﻧﺪﻫﺎي ‪ REPE‬ﻳﺎ ‪ REPZ‬ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫ج(از ﭘﻴﺸﻮﻧﺪﻫﺎي ‪ REPNE‬ﻳﺎ ‪ REPNZ‬ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫د( رﺷﺘﻪ ﻣﺒﺪاء را ﺑﺎﻳﺴﺘﻲ در ‪ data segment‬ﺗﻌﺮﻳﻒ ﻧﻤﻮد و آدرس ﺷﺮوع آﻧﺮا در ﺛﺒﺎت‬
‫‪ SI‬ﻗﺮار داد‪.‬‬
‫ه( رﺷﺘﻪ ﻣﻘﺼﺪ را ﺑﺎﻳﺴﺘﻲ در ‪ Extra Segment‬ﺗﻌﺮﻳﻒ ﻧﻤﻮده و آدرس ﺷـﺮوع آﻧـﺮا در‬
‫ﺛﺒﺎت ‪ DI‬ﻗﺮار داد‪.‬‬

‫ﻣﺜﺎل ‪8-6‬‬
‫‪MOV‬‬ ‫‪SI, OFFSET SOURCE_STR‬‬
‫‪MOV‬‬ ‫‪DI, OFFSET DEST_STR‬‬
‫‪CMPSB‬‬

‫دو ﻋﻨﺼﺮ اول رﺷـﺘﻪﻫـﺎي ‪ DEST_STR , SOURCE_STR‬را ﺑـﺎ ﻫـﻢ ﻣﻘﺎﻳـﺴﻪ‬


‫ﻣﻲﻧﻤﺎﻳﺪ‪ .‬از ﭘﻴﺸﻮﻧﺪﻫﺎي ‪ REPE‬ﻳﺎ ‪ REPZ‬ﺑـﺎ ﻣﻔﻬـﻮم ‪ repeat equal‬ﻳـﺎ ‪ repeat zero‬ﺑـﺎ‬
‫‪REPZ‬‬ ‫دﺳــﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬ﻣــﻲﺗــﻮان اﺳــﺘﻔﺎده ﻧﻤــﻮد‪ .‬وﻗﺘــﻲ از ﭘﻴــﺸﻮﻧﺪ ‪ REPE‬ﻳــﺎ‬
‫‪CX< > 0 and‬‬ ‫‪ZF=1‬‬ ‫اﺳــﺘﻔﺎده ﻣــﻲﻧﻤــﺎﺋﻴﻢ ﺷــﺮط ﺗﻜــﺮار دﺳــﺘﻮراﻟﻌﻤﻞ اﻳﻨــﺴﺘﻜﻪ‬
‫ﺑﺎﺷﺪ‪.‬‬
‫‪٢٢٨‬‬

‫ﻣﺜﺎل ‪8-7‬‬
‫‪LEA‬‬ ‫‪SI, STR1‬‬
‫‪LEA‬‬ ‫‪DI, STR2‬‬
‫‪MOV‬‬ ‫‪CX, 100‬‬
‫‪CLD‬‬ ‫‪.‬‬
‫‪REPE‬‬ ‫‪CMPSB‬‬
‫‪JZ‬‬ ‫‪FOUND‬‬
‫‪.‬‬
‫‪M‬‬
‫‪FOUND‬‬ ‫‪.‬‬
‫‪.‬‬
‫‪M‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻓﻮق ‪ 100‬ﺑﺎﻳـﺖ از دو رﺷـﺘﻪ ‪ STR1‬و ‪ STR2‬را ﺑـﺎ ﻫـﻢ ﻣﻘﺎﻳـﺴﻪ‬
‫‪ repeat‬ﻳــﺎ‬ ‫‪not equal‬‬ ‫ﻣــﻲﻧﻤﺎﻳــﺪ‪ .‬از ﭘﻴــﺸﻮﻧﺪ ‪ REPNE‬ﻳــﺎ ‪ REPNZ‬ﺑــﺎ ﻣﻔﻬــﻮم‬
‫‪ repeat‬ﺑــﺎ دﺳــﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬ﻣــﻲﺗــﻮان اﺳــﺘﻔﺎده ﻧﻤــﻮد‪ .‬ﺷــﺮط ﺗﻜــﺮار‬ ‫‪not zero‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬آن اﺳﺖ ﻛﻪ ‪ CX < > 0 and ZF=0‬ﺑﺎﺷـﺪ‪ .‬ﻗﻄﻌـﻪ ﺑﺮﻧﺎﻣـﻪ زﻳـﺮ دو‬
‫رﺷﺘﻪ ‪ STRG1‬و ‪ STRG2‬را ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻣﻲﻛﻨﺪ در ﺻﻮرﺗﻴﻜﻪ ﻣﺴﺎوي ﺑﺎﺷﻨﺪ ﻛﻨﺘـﺮل‬
‫ﺑﻪ ‪ SAME‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد‪ .‬ﺻﻔﺖ ‪ LENGTH‬ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻃﻮل رﺷﺘﻪ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪MOV‬‬ ‫‪SI, OFFSET‬‬ ‫‪STRG1‬‬


‫‪MOV‬‬ ‫‪DI, OFFSET‬‬ ‫‪STRG2‬‬
‫‪MOV‬‬ ‫‪CX, LENGTH‬‬ ‫‪STRG3‬‬
‫‪CLD‬‬
‫‪NEXT:‬‬ ‫‪CMPSB‬‬
‫‪JNE‬‬ ‫‪EXIT‬‬
‫‪LOOP‬‬ ‫‪NEXT‬‬
‫‪JMP‬‬ ‫‪SAME‬‬
‫‪EXIT:‬‬
‫‪M‬‬
‫‪SAME:‬‬
‫‪M‬‬
‫‪٢٢٩‬‬

‫‪ -8-1-5‬دﺳﺘﻮراﻟﻌﻤﻞ ‪SCAS‬‬
‫از دﺳﺘﻮراﻟﻌﻤﻞ ‪ SCAS‬ﺑﺮاي ﺟﺴﺘﺠﻮي ﻳﻚ رﺷـﺘﻪ ﺟﻬـﺖ وﺟـﻮد داﺷـﺘﻦ ﻳـﺎ‬
‫ﻧﺪاﺷﺘﻦ ﻳﻚ ﻋﻨﺼﺮ رﺷﺘﻪاي ﻣﻌﻴﻦ ﺑﻜﺎر ﻣﻲرود‪ .‬ﺷﻜﻞ ﻛﻠﻲ ﺑﺼﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪SCAS‬‬

‫‪extra segment‬‬ ‫اﻟﻒ( رﺷﺘﻪ ﻣﻮرد ﺟﺴﺘﺠﻮ ﺑﺎﻳﺴﺘﻲ رﺷﺘﻪ ﻣﻘﺼﺪ ﺑﺎﺷﺪ‪ .‬ﻳﻌﻨـﻲ رﺷـﺘﻪ در‬
‫ﺗﻌﺮﻳﻒ ﺷﺪه و آدرس ﺷﺮوع آن در ﺛﺒﺎت ‪ DI‬ﻗﺮار ﮔﻴﺮد‪.‬‬
‫ب( از ﭘﻴﺸﻮﻧﺪﻫﺎي ‪ REPE‬و ‪ REPNE‬ﻣﻲﺗﻮان ﺑﺮاي اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫و در ﺻـﻮرﺗﻴﻜﻪ از‬ ‫‪AL‬‬ ‫ج( ﻋﻨﺼﺮ ﻣﻮرد ﺟﺴﺘﺠﻮ ﭼﻨﺎﻧﭽﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ در ﺛﺒﺎت‬
‫ﻧﻮع ‪ word‬ﺑﺎﺷﺪ در ﺛﺒﺎت ‪ AX‬ﻗﺮار داده ﻣﻲﺷﻮد‪.‬‬
‫د( از ﻓﻠﮓ ‪ DF‬ﺑﺮاي ﺗﻌﻴﻴﻦ ﺟﻬﺖ ﭘﺮدازش رﺷﺘﻪ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬
‫‪SCASW‬‬ ‫ه(ﭼﻨﺎﻧﭽﻪ رﺷﺘﻪ از ﻧﻮع ﺑﺎﻳﺖ ﺑﺎﺷﺪ ‪ SCASB‬و ﭼﻨﺎﻧﭽﻪ از ﻧﻮع ‪ word‬ﺑﺎﺷﺪ از‬
‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪.‬‬

‫ﻣﺜﺎل ‪8-8‬‬
‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ در رﺷﺘﻪ ‪ STRG‬ﺑﻪ ﺟﺴﺘﺠﻮي * ﻣﻲﭘﺮدازد‪.‬‬

‫‪STRG‬‬ ‫)?( ‪DB 50 DUP‬‬


‫‪MOV‬‬ ‫‪AL , ′*′‬‬
‫‪MOV‬‬ ‫‪CX, 50‬‬
‫‪LEA‬‬ ‫‪DI, STRG‬‬
‫‪CLD‬‬
‫‪REPNE‬‬ ‫‪SCASB‬‬

‫ﻛﺎرﻛﺘﺮي ﻛﻪ ﺑﻪ ﻛﺎرﻛﺘﺮ ﻓﺎﺻﻠﻪ ﺧﺘﻢ ﺷﺪه را‬ ‫‪80‬‬ ‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻳﻚ رﺷﺘﺔ‬
‫ﺟﺴﺘﺠﻮ ﻧﻤﻮده در ﺻـﻮرﺗﻴﻜﻪ ﻛﻠﻴـﻪ ﻋﻨﺎﺻـﺮ رﺷـﺘﻪ ﻛـﺎرﻛﺘﺮ ﻓﺎﺻـﻠﻪ ﺑﺎﺷـﺪ ﻛﻨﺘـﺮل ﺑـﻪ‬
‫‪ NOT_FOUND‬ﻣﻨﺘﻘﻞ ﮔﺮدﻳﺪه در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺑﺎ اوﻟﻴﻦ ﻋﻨﺼﺮ ﻣﺨﺎﻟﻒ ‪ blank‬ﺷﺮوع‬
‫ﻧﻤﻮده و ﻳﻚ زﻳﺮ رﺷﺘﻪ ‪ 30‬ﻛﺎرﻛﺘﺮي از رﺷـﺘﻪ اوﻟﻴـﻪ را ﺑـﻪ رﺷـﺘﻪ ‪ SYMBOL‬اﻧﺘﻘـﺎل‬
‫ﻣﻲدﻫﺪ‪.‬‬
٢٣٠

MOV DI, OFFSET LINE


MOV CX, 80
MOV AL, 20H ; ASCII FOR BLANK
CLD
NEXT: SCAS LINE
1 LOOPE NEXT
JE NOT_FOUND
MOV SI,DI
DEC SI
MOV DI, OFFSET SYMBOL
1 MOV CX, 31
FILL: STOS SYMBOL
LOOP FILL
MOV DI, OFFSET SYMBOL
MOV CX, 31
1 JMP SCANE
MOVE: STOS SYMBOL
SCANE: LODS LINE
CMP AL, 20H
LOOPNE MOVE
M
8-9 ‫ﻣﺜﺎل‬
& ‫ را در ﻧﻈـﺮ ﻣـﻲﮔﻴـﺮد و ﺑـﺪﻧﺒﺎل ﻛـﺎرﻛﺘﺮ‬STRING ‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳـﺮ رﺷـﺘﻪ‬
.‫ ﻳﺎ ﻓﺎﺻﻠﻪ ﺗﺒﺪﻳﻞ ﻧﻤﺎﻳﺪ‬blank ‫ﻣﻲﮔﺮدد ﻛﻪ ﺑﻪ ﻛﺎرﻛﺘﺮ‬
STRLEN EQU 15
STRING DB ′The time & is now′
CLD
MOV AL, ′&′
MOV CX, STRLEN
LEA DI, STRING
REPNE SCASB
JNZ NOT FOUND
DEC DI
MOV BYTE PTR[DI], 20H
M
NOT FOUND:
M
‫‪٢٣١‬‬

‫ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ اﻳﺠﺎد رﺷﺘﻪاي ﺑﺎ اﻟﮕﻮ داده ﺷﺪه ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫‪***---***---***---***---***---***---***---‬‬

‫ﺑﺮاي اﻳﻨﻜﺎر اﺑﺘﺪا رﺷﺘﻪ ‪ PATTERN‬را ﺑﺼﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﺋﻴﻢ‪.‬‬

‫‪***---‬‬

‫ﺣﺎل‬

‫‪PATTERN‬‬ ‫‪DB ′***---′‬‬


‫‪DISPAREA‬‬ ‫)?( ‪DB 42 DUP‬‬
‫‪M‬‬
‫‪CLD‬‬
‫‪MOV‬‬ ‫‪CX, 21‬‬
‫‪LEA‬‬ ‫‪DI, DISPAREA‬‬
‫‪LEA‬‬ ‫‪SI, PATTERN‬‬
‫‪REP‬‬ ‫‪MOVSW‬‬

‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ وﻗﺘﻲ ﺑﻪ اﻧﺘﻬﺎي رﺷﺘﻪ ‪ PATTERN‬رﺳـﻴﺪﻳﻢ ﺑـﺼﻮرت‬


‫اﺗﻮﻣﺎﺗﻴﻚ ﻣﺠﺪداً از ﺳﺮﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد و اﻳـﻦ روش ﺧـﻮﺑﻲ اﺳـﺖ ﺑـﺮاي ﻛﭙـﻲ ﻛـﺮدن‬
‫اﻟﮕﻮﻫﺎ‪.‬‬
‫*‬
‫*‬
‫*‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪DI‬‬

‫‪SI‬‬

‫‪M‬‬
‫‪٢٣٢‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﭘﺮدازش رﺷﺘﻪاي ﺑﺮاي ﭘﺮدازش رﺷﺘﻪﻫﺎ ﺑﻜﺎر ﻣﻲروﻧﺪ‪.‬‬


‫اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ ﻋﺒﺎرﺗﻨﺪ از ﺟﺎﺑﻪﺟﺎﺋﻲ ‪ ، MOVS‬ﻣﻘﺎﻳﺴـﻪ ‪ ، CMPS‬ﺑﺎرﻛﺮدن‬
‫‪ ، LODS‬ﺟﺴﺘﺠﻮ ‪ SCAS‬و ذﺧﻴﺮه ﻛﺮدن ‪ .STOS‬ﻣﻌﻤﻮﻻً از دو رﺷـﺘﻪ ﻣﺒـﺪأ و ﻣﻘـﺼﺪ‬
‫و آدرس ﺷﺮوع رﺷـﺘﻪ‬ ‫‪DI‬‬ ‫اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‪ .‬آدرس ﺷﺮوع رﺷﺘﻪ ﻣﻘﺼﺪ را در رﺟﺴﺘﺮ‬
‫‪ data‬و رﺷـﺘﻪ‬ ‫‪segment‬‬ ‫ﻣﺒﺪأ را در رﺟﺴﺘﺮ ‪ SI‬ﻗـﺮار داده ﻣﻴـﺸﻮﻧﺪ‪ .‬رﺷـﺘﻪ ﻣﺒـﺪأ را در‬
‫‪ extra‬ﺗﻌﺮﻳﻒ ﻣﻲﻧﻤﺎﺋﻴﻢ‪ .‬ﻓﻠﮓ ‪ DF‬ﺟﻬﺖ ﭘﺮدازش را ﻣـﺸﺨﺺ‬ ‫‪segment‬‬ ‫ﻣﻘﺼﺪ را در‬
‫ﻣــﻲﻛﻨــﺪ‪ .‬از ﭘﻴــﺸﻮﻧﺪﻫﺎي ‪ REPZ ،REPNZ ،REPNE ،REPE ،REP‬ﻣــﻲﺗــﻮان ﺑــﺎ‬
‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎي ﭘﺮدازش رﺷﺘﻪاي اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫‪٢٣٣‬‬

‫‪ a‬ﺗﻤﺮﻳﻦ‬

‫‪-1‬ﭘﻴﺸﻮﻧﺪ ‪ REP‬در ﻣﻮرد ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي رﺷﺘﻪاي ﻛﺎرﺑﺮد دارد؟‬

‫‪-2‬ﭘﻴﺸﻮﻧﺪ ‪REPZ‬در ﻣﻮرد ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي رﺷﺘﻪاي ﻛﺎرﺑﺮد دارد؟‬

‫و ‪ SCAS‬روي ﻛﺪام ﻓﻠﮓﻫﺎ اﺛﺮ دارﻧﺪ؟‬ ‫‪STOS‬‬ ‫‪-3‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي‬

‫‪-4‬ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻳﻚ رﺷﺘﻪ ‪ 100‬ﻛﺎرﻛﺘﺮي ﺑﺎ اﺳﺘﻔﺎده از اﻟﮕـﻮي ـ ـ ـ ـ ـ ـ ـ ـ‬


‫ـ زﻳﺮ اﻳﺠﺎد ﻧﻤﺎﻳﺪ‪) .‬راﻫﻨﻤﺎﺋﻲ ‪ 20‬ﻣﺮﺗﺒﻪ اﻟﮕﻮ را ﻛﭙﻲ ﻧﻤﺎﻳﺪ‪(.‬‬

‫*‬ ‫‪-5‬رﺷﺘﻪ ‪ 100‬ﻛﺎراﻛﺘﺮي ‪ STRG‬را در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻛﻠﻴـﻪ ﻛﺎراﻛﺘﺮﻫـﺎي ‪ blank‬آﻧـﺮا ﺑـﻪ‬
‫ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫‪-6‬رﺷﺘﻪ ‪ 100‬ﻛﺎﻛﺘﺮي ‪ STRG‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻠﻴـﻪ ﻛﺎراﻛﺘﺮﻫـﺎي آﻧـﺮا ﺑـﻪ * ﺗﺒـﺪﻳﻞ‬
‫ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫&‬ ‫‪-7‬رﺷﺘﻪ ‪ 100‬ﻛﺎراﻛﺘﺮي ‪ STRG‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ اوﻟﻴﻦ ﻛﺎراﻛﺘﺮ * در رﺷـﺘﻪ را ﺑـﻪ‬
‫ﺗﺒﺪﻳﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬

‫‪-8‬رﺷﺘﻪ ‪ 100‬ﻛﺎراﻛﺘﺮي ‪ STRG1‬را در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ‪ 20‬ﻛﺎراﻛﺘﺮ وﺳﻂ رﺷﺘﻪ را ﺑﻪ رﺷـﺘﻪ‬


‫ﻣﻨﺘﻘﻞ ﻧﻤﺎﺋﻴﺪ‪.‬‬ ‫‪STRG2‬‬

‫‪-9‬رﺷﺘﻪ ‪ 50‬ﻛـﺎراﻛﺘﺮي ‪ STRG1‬و رﺷـﺘﻪ ‪ 100‬ﻛـﺎراﻛﺘﺮي ‪ STRG2‬را در ﻧﻈـﺮ ﺑﮕﻴـﺮد‬


‫ﻣﺸﺨﺺ ﻧﻤﺎﺋﻴﺪ ﻛﻪ آﻳﺎ ‪ 50‬ﻛﺎراﻛﺘﺮ آﺧﺮ رﺷـﺘﻪ ‪ STRG2‬ﻣﻌـﺎدل ‪ STRG1‬ﻣـﻲﺑﺎﺷـﺪ ﻳـﺎ‬
‫ﺧﻴﺮ؟‬

‫‪-10‬رﺷﺘﻪ ‪ 50‬ﻛﺎراﻛﺘﺮي ‪ STRG‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻠﻴﻪ ﻋﻨﺎﺻﺮ * در آﻧﺮا ﺣﺬف ﻧﻤﺎﺋﻴﺪ‪.‬‬
‫)ﻛﺎراﻛﺘﺮ ﺑﻌﺪي را ﺟﺎﻳﮕﺰﻳﻦ * ﻧﻤﺎﺋﻴﺪ(‬
‫‪٢٣٣‬‬

‫ﻓﺼﻞ ﻧﻬﻢ‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎي ﻧﻤﻮﻧﻪ‬

‫ﻫﺪف ﻛﻠﻲ‬
‫ﻧﺤﻮه ﻧﻮﺷﺘﻦ و اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻣﻌﺮﻓﻲ و ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻤﻮﻧﻪ‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻄﺎﻟﺐ زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬
‫‪ -1‬اﺟﺰاي ﻣﺨﺘﻠﻔﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ‪.‬‬
‫‪ -2‬ﻧﺤﻮه ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ و اﺟﺮاي آن‪.‬‬
‫‪٢٣٤‬‬

‫‪ -9-1‬اﺟﺰاي ﺑﺮﻧﺎﻣﻪ‬
‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﮔﻔﺘﻪ ﺷﺪ در ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ ﻣـﻲﺗـﻮان از ﭼﻬـﺎر ﺳـﮕﻤﻨﺖ زﻳـﺮ‬
‫اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫‪STACK‬‬ ‫‪SEGMENT‬‬
‫‪DATA‬‬ ‫‪SEGMENT‬‬
‫‪EXTRA‬‬ ‫‪SEGMENT‬‬
‫‪CODE‬‬ ‫‪SEGMENT‬‬

‫‪DATA‬‬ ‫در ‪ STACK SEGMENT‬ﭘﺸﺘﻪ ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ اﻋﻼن ﻣـﻲﮔـﺮدد‪ .‬در‬
‫‪ SEGMENT‬ﻛﻠﻴﺔ ﻣﺘﻐﻴﺮﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ اﻋﻼن و ﺗﻌﺮﻳﻒ ﻣﻲﺷﻮد‪.‬‬
‫‪ EXTRA‬ﻛﻠﻴــﻪ ﻣﺘﻐﻴﺮﻫــﺎي ﺑﺮﻧﺎﻣــﻪ ﻛــﻪ ﺟﻬــﺖ ﭘــﺮدازش‬ ‫‪SEGMENT‬‬ ‫در‬
‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي رﺷﺘﻪاي ﻣﻮرد ﻧﻴﺎز ﻣﻲﺑﺎﺷﺪ اﻋﻼن و ﺗﻌﺮﻳﻒ ﻣﻲﮔﺮدد‪.‬‬
‫‪ CODE SEGMENT‬ﺷﺎﻣﻞ ﻛﻠﻴﻪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫در زﺑﺎن اﺳﻤﺒﻠﻲ در ﺣﻘﻴﻘـﺖ ﺑﺮﻧﺎﻣـﻪ ﺑﻌﻨـﻮان ﻳـﻚ روال از ﻧـﻮع ‪ FAR‬ﻧﻮﺷـﺘﻪ‬
‫ﻣﻲﺷﻮد ﻛﻪ وﻗﺘﻲ ﺑﺪﺳﺘﻮر ‪ RET‬ﺑﺮﺳﻴﻢ ﻛﻨﺘﺮل ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺮﻣﻲﮔﺮدد‪.‬‬

‫‪ -9-2‬ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻤﻮﻧﻪ‬


‫در ذﻳﻞ ﻳﻚ ﺑﺮﻧﺎﻣﺔ ﻧﻤﻮﻧﻪ داده ﺷﺪه اﺳﺖ‪ .‬اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﻘﺎدﻳﺮ ﻳﻚ آراﻳـﻪ ﭼﻬـﺎر‬
‫ﺑﺎﻳﺘﻲ را وارون ﻧﻤﻮده و ﺑﻪ ﻳﻚ آراﻳﻪ دﻳﮕﺮ ﻣﻨﺘﻘﻞ ﻣﻲ ﻧﻤﺎﻳﺪ‪.‬‬
٢٣٥

STACK_SEG SEGMENT PARA STACK ′STACK′


DW 32 DUP (?)
STACK_SEG ENDS
DATA_SEG SEGMENT PARA ′DATA′
SOURCE DB 10, 20, 30, 40
DEST DB 4 DUP (?)
DATA_SEG ENDS
CODE_SEG SEGMENT PARA ′CODE′
٢٣٦

ASSUME CS:CODE_SEG, DS:DATA_SEG, SS:STACK_SEG


OUP_PROG PROC FAR
;Set up the stack to contain the proper
; Valves so this program can return to Dos.
PUSH DS; Put return segment address on stack
MOV AX , 0
PUSH AX ; put zero return address on stack
; Initialize the data segment address
MOV AX, DATA_SEG ; Initialize DS
MOV DS , AX
;Initialize DEST With zeroes.

MOV DEST, 0 ;First byte


MOV DEST +1, 0 ;Second byte
MOV DEST +2, 0 ;Third byte
MOV DEST +3, 0 ;Fourth byte
;Copy SOURCE table into DEST table in reverse order.
MOV AL, SOURCE
MOV DEST +3, AL
MOV AL, SOURCE+1
MOV DEST+2, AL
MOV AL, SOURCE+2
MOV DEST+1, AL
MOV AL, SOURCE+3
MOV DEST, AL
RET ; Far return to DOS
OUR_PROG ENDP
CODE_SEG ENDS
END OUR_PROG

.‫ ﺑﺼﻮرت زﻳﺮﻣﻲﺑﺎﺷﺪ‬SEGMENT ‫ ﺷﻜﻠﻲ ﻛﻠﻲ‬.‫ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻣﻼﺣﻈﻪ ﻣﻲﺷﻮد‬


‫اﺳﻢ ﺳﮕﻤﻨﺖ‬ SEGMENT

M
‫اﺳﻢ ﺳﮕﻤﻨﺖ‬ ENDS

‫ در‬CODE ‫ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ آدرس ﺷﺮوع ﺳﮕﻤﻨﺖ‬ASSUME ‫دﺳﺘﻮراﻟﻌﻤﻞ‬


‫ و آدرس ﺷـﺮوع ﺳـﮕﻤﻨﺖ‬DS ‫ در ﺛﺒـﺎت‬DATA ‫ آدرس ﺷـﺮوع ﺳـﮕﻤﻨﺖ‬،CS ‫ﺛﺒﺎت‬
.‫ ﻗﺮار ﮔﻴﺮد‬SS ‫ در ﺛﺒﺎت‬STACK
‫‪٢٣٧‬‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ END‬اﻧﺘﻬﺎي ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬در ﻣﻮﻗﻊ ﺗﺮﺟﻤﻪ ﺑﺮﻧﺎﻣﻪ‬


‫ﺑﻪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺑﻪ ﻣﺤﺾ آﻧﻜﻪ ﻣﺘﺮﺟﻢ ﺑﻪ دﺳﺘﻮر ‪ END‬رﺳﻴﺪ ﺗﺮﺟﻤـﻪ ﺑﺮﻧﺎﻣـﻪ ﻣﺘﻮﻗـﻒ‬
‫ﻣﻲﮔﺮدد‪.‬‬

‫‪ -9-3‬ﻧﺤﻮة اﺟﺮاي ﺑﺮﻧﺎﻣﻪ‬


‫دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ﺑﺮﻧﺎﻣﻪ را در ﻳﻚ ﻓﺎﻳﻞ ﺑﺎ ﭘﺴﻮﻧﺪ ‪ .ASM‬ﻗﺮار داده ﺳﭙﺲ دﺳﺘﻮر‬
‫زﻳﺮ را ﻣﻲدﻫﻴﻢ‪.‬‬

‫‪C:\> MASM‬‬ ‫‪ .ASM‬اﺳﻢ ﺑﺮﻧﺎﻣﻪ‬

‫در اﻳﻦ ﻓﺎز ﺑﺮﻧﺎﻣﻪ از ﻧﻈﺮ ﻧﺤﻮي ﺑﺮرﺳﻲ ﺷﺪه ﭼﻨﺎﻧﭽﻪ اﺷﺘﺒﺎﻫﺎت ﻧﺤﻮي داﺷـﺘﻪ‬
‫ﺑﺎﺷﺪ اﺳﻤﺒﻠﺮ اﺷﺘﺒﺎﻫﺎت را ﻣﺘﺬﻛﺮ ﻣﻲﺷﻮد‪ .‬ﭼﻨﺎﻧﭽﻪ اﺷﺘﺒﺎﻫﻲ وﺟـﻮد داﺷـﺘﻪ ﺑﺎﺷـﺪ آﻧـﺮا‬
‫رﻓﻊ ﻧﻤﻮده ﻣﺠﺪداً دﺳﺘﻮر ‪ MASM‬را ﻣﻲدﻫﻴﻢ‪.‬‬
‫ﭼﻨﺎﻧﭽﻪ ﺑﺮﻧﺎﻣﻪ داراي اﺷﺘﺒﺎه ﻧﺤﻮي ﻧﺒﺎﺷﺪ اﺳﻤﺒﻠﺮ ﭘﻴﻐﺎم‬

‫‪NO‬‬ ‫‪WARNINGS‬‬
‫‪NO‬‬ ‫‪ERRORS‬‬
‫را ﻣﻲدﻫﺪ‪ .‬آﻧﮕﺎه ﻓﺮﻣﺎن زﻳﺮ را ﻣﻲدﻫﻴﺪ‪.‬‬

‫‪C:\ASSEMBLY > LINK‬‬ ‫اﺳﻢ ﺑﺮﻧﺎﻣﻪ‬

‫در دﺳﺘﻮراﻟﻌﻤﻞ ﻓﻮق ﻧﻴﺎزي ﺑﻪ ﭘﺴﻮﻧﺪ ‪ ASM‬ﻧﻤﻲﺑﺎﺷـﺪ‪ .‬ﭼﻨﺎﻧﭽـﻪ ﻣـﺸﻜﻠﻲ در‬


‫‪ LINK‬ﺑﺎﺷﺪ ﮔﺰارش ﻣﻲﺷﻮد ﻛﻪ ﺑﺎﻳﺴﺘﻲ آﻧـﺮا رﻓـﻊ ﻧﻤـﻮد و ﺑـﺮاي اﻳﻨﻜـﺎر ﻣﺠـﺪداً از‬
‫دﺳﺘﻮر ‪ LINK‬ﺑﺎﻳﺴﺘﻲ اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﺣﺎل ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻛﺎﻓﻴﺴﺖ ﻛﻪ دﺳﺘﻮر ذﻳﻞ‬
‫را ﺑﺪﻫﻴﻢ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪ > ‪C:\ASSEMBLY‬‬ ‫اﺳﻢ‬
‫در اﻳﻨﺠﺎ ﻧﻴﺰ ﻧﻴﺎزي ﺑﻪ ﭘﺴﻮﻧﺪ ‪ . ASM‬ﻧﻤﻲﺑﺎﺷﺪ‪.‬‬
٢٣٨

‫ ﺑﺮﻧﺎﻣﻪﻫﺎي اﺳﻤﺒﻠﻲ ﻧﻮﺷﺘﻪ ﺷﺪه‬-9-4


.‫در اﻳﻦ ﺑﺨﺶ ﺗﻌﺪادي ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺑﺰﺑﺎن اﺳﻤﺒﻠﻲ ﻧﻮﺷـﺘﻪ ﺷـﺪه اراﺋـﻪ ﻣـﻲﮔـﺮدد‬
‫ و‬25 ‫ را در ﺳـﻄﺢ‬A ‫اوﻟﻴﻦ ﺑﺮﻧﺎﻣﻪ اﺑﺘﺪا ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر را ﭘﺎك ﻧﻤـﻮده ﺳـﭙﺲ ﻛـﺎرﻛﺘﺮ‬
.‫ ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻗﺮار ﻣﻲدﻫﺪ‬13 ‫ﺳﺘﻮن‬
STACK_SEG SEGMENT PARA STACK ′STACK′
DW 32 DUP (?)
STACK_SEG ENDS
;
DATA_SEG SEGMENT PARA ′DATA′
MESSAGE DB ′Nikmehr′, 13, ′$′
DATA_SEG ENDS
CODE_SEG SEGMENT PARA ′CODE′
BEGIN PROC FAR
ASSUME SS:STACK_SEG,CS:CODE_SEG, DS:DATA-SEG
START:
PUSH DS
SUB AX , AX
PUSH AX
MOV AX , DATA_SEG
MOV DS , AX
;
MOV AH , 00
MOV AL , 03
INT 10 H
;
MOV AH , 2
MOV BH , 0
MOV DH , 13 ; row
MOV DL , 25 ; column
INT 10H
;
;
MOV AH , 2
MOV DL , 65
INT 21 H
;
RET
BEGIN ENDP
CODE_SEG ENDS
END START
٢٣٩

.‫ را ﺑﺪﻧﺒﺎل ﻫﻢ روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻇـﺎﻫﺮ ﻣـﻲﺳـﺎزد‬9 ‫ ﺗﺎ‬0 ‫ﺑﺮﻧﺎﻣﻪ ﺑﻌﺪي ارﻗﺎم‬
‫ ﻣــﻲﺑﺎﺷــﺪ و ﻋﻤـﻼً ﻛــﺎري اﻧﺠــﺎم‬NO OPERATION ‫ ﺑــﻪ ﻣﻌﻨــﻲ‬NOP ‫دﺳــﺘﻮراﻟﻌﻤﻞ‬
.‫ﻧﻤﻲدﻫﺪ‬
STACK_SEG SEGMENT PARA STACK ′STACK′
DW 32 DUP (?)
STACK_SEG ENDS
;
;
CODE_SEG SEGMENT PARA STACK ′STACK′
BEGIN PROC FAR
ASSUME SS:STACK_SEG, CS:CODE_SEG
START:
PUSH DS
SUB AX,AX
PUSH AX
;
MOV AH, 00
MOV AL, 03
INT 10 H
;
MOV AH , 2
MOV BH , 0
MOV DH, 13 ;ROW
MOV DL, 25 ; COLUMN
INT 10 H
;
;character input without echo
;
MOV CX, 10
LOOP1:NOP
MOV AH ,7
INT 21H
;
MOV AH ,2
MOV DL , AL
INT 21H
LOOP LOOP1
;
RET
BEGIN ENDP
CODE-SEG ENDS
END START
٢٤٠

.‫ﺑﺮﻧﺎﻣﻪ ﺑﻌﺪي ﻳﻚ ﻣﻘﺪار ﺑﺎﻳﻨﺮي را روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ‬


STACK_SEG SEGMENT PARA ′STACK′
DW 32 DUP(?)
STACK_SEG
ENDS
;
;
DATA-SEG SEGMENT PARA ′DATA′
ASCII-VAL DB 8 DUP (?)
BINARY_VAL
DW?
ASCII_LENGTH DW 8
DATA_SEG
ENDS
CODE_SEG SEGMENT PARA ′CODE′
BEGIN PROC
FAR
ASSUME SS:STACK_SEG,
CS:CODE_SEG,DS:DATA_SEG
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX, DATA_SEG
MOV DS,AX
;
MOV AH, 00
MOV AL , 03
INT 10 H
;
MOV AH, 2
MOV BH,0
MOV DH, 13 ;ROW
MOV DL, 25 ; COLUMN
INT 10H
;
MOV BINARY _ VAL, 32456
CALL BINARYTOASCII
; displaying & printing binary numbers
;
LEA SI, ASCII_VAL
MOV CX, ASCII_LENGTH
LOOP1: MOV AH,2
MOV DL, [SI]
INT 21H
; PRINTING
MOV AH,5
MOV DL, [SI]
INT 21H
INC SI
LOOP LOOP1
٢٤١

;
;
RET
BEGIN ENDP
;
;

BINARYTOASCII PROC NEAR


MOV CX, 10
LEA SI,ASCII_VAL+7
MOV AX,BINARY_VAL
LABE12:
CMP AX,10
JB LABE13
XOR DX,DX
DIV CX
OR DL,30H
MOV [SI], DL
DEC SI
JMP LABLE12
LABEL13:
OR AL, 30H
MOV [SI], AL
RET
BINARYTOASCII ENDP
CODE-SEG ENDS
END START

‫ﺧﺮوﺟﻲ ﺑﺮﻧﺎﻣﻪ ﻋﺒﺎرﺗﻨﺪ از‬


3
2
4
5
6
32456
٢٤٢

.‫ در ﺑﺮﻧﺎﻣﻪﻫﺎ را ﻧﺸﺎن ﻣﻲدﻫﺪ‬Macro ‫ﺑﺮﻧﺎﻣﺔ ﺑﻌﺪي ﻧﺤﻮة اﺳﺘﻔﺎده از‬

NIK MACRO
ASSUME SS:STACK_SEG, CS:CODE_SEG,DS:DATA_SEG
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA_SEG
MOV DS,AX
;
ENDM
STACK_SEG SEGMENT PARA STACK ′STACK′
DW 32 DUP (?)
STACK_SEG ENDS
;
;
DATA_SEG SEGMENT PARA ′DATA′
MESSAGE DB ′DARYOUSH NIKMEHR′ ,13, ′$′
DATA _SEG ENDS
CODE –SEG SEGMENT PARA ′CODE′
NIK
BEGIN PROC FAR
MOV AH, 00
MOV AL, 03
INT 10H
;
MOV AH, 2
MOV BH, 0
MOV DH, 13 ; ROW
٢٤٣

MOV DL, 25; COLUMN


INT 10H
;
;
MOV AH , 2
MOV DL , ′*′
INT 21H
;
;
RET
BEGIN ENDP
CODE_SEG
ENDS
END START
٢٤٤

‫ در ﺑﺮﻧﺎﻣـﻪﻫـﺎ را در‬NEAR ‫ﺑﺮﻧﺎﻣﻪ ﺑﻌـﺪي ﻧﺤـﻮة ﻗـﺮار دادن رواﻟﻬـﺎي از ﻧـﻮع‬


.‫ ﻧﺸﺎن ﻣﻲدﻫﺪ‬CODE SEGMENT

CODE_SEG SEGMENT PARA ′CODE′


BEGIN PROC FAR
ASSUME CS:CODE_SEG , . . .
START:
M
CALL PROCB
M
CALL PROCC
M
RET ; ‫ﻛﻨﺘﺮل ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺮﻣﻲﮔﺮدد‬
BEGIN ENDP
PROCB PROC NEAR
M
RET ; ‫ﻣﻨﺘﻘﻞ ﺷﻮد‬ CALL PROCB ‫ﻛﻨﺘﺮل ﺑﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪ از‬
PROCB ENDP
PROCC PROC NEAR
M
RET ; ‫ﻣﻨﺘﻘﻞ ﺷﻮد‬ PROCC ‫ﻛﻨﺘﺮل ﺑﻪ دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪ از‬
PROCC ENDP
CODE_SEG ENDS
END START
٢٤٥

‫ ﺑﻴﺘﻲ داده ﺷﺪه اﺳﺖ؛ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﻳﻦ دو‬32 ‫در ذﻳﻞ ﺑﺮﻧﺎﻣﻪ ﺿﺮب دو ﻣﻘﺪار‬
.‫ﻣﻘﺪار ﺑﺼﻮرت ﺑﺪون ﻋﻼﻣﺖ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪهاﻧﺪ‬

; Multiplies two 32-bit unsigned number and generates a


; 64-bit product.
; Inputs: CX:BX=Multiplier
; DX:AX=Multiplicand
; Result : Product in DX, CX, BX, and AX (high to low order).

; To assemble: MASM MULU32;


; To Link: LINK callprog+MULU 32;

PUBLIC MULU32
DSEG SEGMENT PARA ′DATA′
HI_MCND DW ?
LO_MCND DW ?
HI_PP1 DW ?
LO_PP1 DW ?
HI_PP2 DW ?
LO_PP2 DW ?
HI_PP3 DW ?
LO_PP3 DW ?
HI_PP4 DW ?
LO_PP4 DW ?
DSEG ENDS

CSEG SEGMENT PARA ′CODE′


ASSUME CS:CSEG,DS:DSEG
MULU32 PROC FAR
PUSH DS ;Save caller’s DS and DI
٢٤٦

PUSH DI
MOV DI, DSEG ;Initialize DS
MOV DS,DI
MOV HI_MCND,DX ;Save multiplicand in memory
MOV LO_MCND,AX
MUL BX ;Form partial product #1
MOV HI_PP1,DX ;and save it in memory
MOV LO_PP1, AX
MOV AX, HI_MCND ;Form partial product #2
MUL BX
MOV HI_PP2, DX ;and save it in memory
MOV LO_PP2, AX
MOV AX,LO_MCND ;Form partial product #3
MUL CX
MOV HI_PP3,DX ;and save it in memory
MOV LO_PP3, AX
MOV AX, HI_MCND ;Form partial product #4
MUL CX
MOV HI_PP4, DX ;and save it in memory
MOV LO_PP4, AX
; Add the partial products to form the final 64-bit product.
MOV AX,LO_PP1 ;Low 16 bits
MOV BX,HI_PP1 ;Form mid-lower 16 bits
ADD BX,LO_PP2 ; with sum #1
ADC HI_PP2,0
ADD BX,LO_PP3 ; and sum #2
MOV CX,HI_PP2 ;Form mid-upper 16 bits
ADC CX,HI_PP3 ;with sum #3
٢٤٧

ADC HI_PP4, 0
ADD CX,LO_PP4 ;and sum #4
MOV DX,HI_PP4 ;Form high 16 bits
ADC DX,0 ;including propagated carry
POP DI ;Restore caller’s registers
POP DS
RET
MULU32 ENDP
CSEG ENDS
END
٢٤٨

.‫ ﺑﻴﺘﻲ ﻋﻼﻣﺘﺪار را ﺗﻌﻴﻴﻦ ﻣﻲﻧﻤﺎﻳﺪ‬32 ‫ﺑﺮﻧﺎﻣﻪ داده ﺷﺪه در ذﻳﻞ ﺣﺎﺻﻠﻀﺮب دو ﻣﻘﺪار‬

; Multiplies two 32-bit signed numbers and generates


; A 64-bit product.
; Inputs: CX:BX = Multiplier
; DX:AX = Multiplicand
; Result : Product in DX, CX, BX, and AX (high to low order)
; Calls MULU32

; To assemble: MASM MULS 32;


; To link: LINK callprog+MULS32+MULU32;

EXTRN MULU32 : FAR


PUBLIC MULS 32
DSEG SEGMENT PARA ′DATA′
NEG_IND DB ?
DSEG ENDS

CSEG SEGMENT PARA ′CODE′


MULS32 PROC FAR
ASSUME CS:CSEG , DS:DSEG
; Initialize the data segment address
PUSH DS ;Save caller’s DS and DI
PUSH DI
MOV DI, DSEG ;Initialize DS
MOV DS , DI

MOV NEG_IND,0 ;Negative indicator=0


CMP DX, 0 ;Multiplicand negative?
JNS CHKCX ;No. Go check multiplier
NOT AX ;Yes.2s-comp.multiplicand
NOT DX
ADD AX,1
ADC DX,0
NOT NEG_IND ;and 1s-comp. Indicator
CHKCX: CMP CX,0 ;Multiplier negative?
JNS GOMUL ;No. Go multiply
NOT BX ;Yes. 2s-comp. Multiplier
NOT CX
ADD BX,1
ADC CX,0
NOT NEG_IND ;and 1s-comp. Indicator
٢٤٩

GOMUL: CALL MULU32 ;Perform unsigned multiplication


CMP NEG_IND,0 ;Does product have right sign?
JZ DONE ;Yes. Exit.
NOT AX ;No. 2s-comp. Product
NOT BX
NOT CX
NOT DX
ADD AX,1
ADC BX,0
ADC CX,0
ADC DX,0
DONE: POP DI ;Restore caller’s registers
POP DS
RET
MULS32 ENDP
CSEG ENDS
END
٢٥٠

.‫ﺑﺮﻧﺎﻣﻪ ذﻳﻞ ﺗﻘﺴﻴﻢ دو ﻣﻘﺪار را اﻧﺠﺎم ﻣﻲدﻫﺪ‬


; This divide procedure determines the correct quotient
; And remainder, regardless of overflow.
; Inputs: BX = Divisor
; DX:AX=Dividend
; Results : BX:AX=Quotient
;

; DX = Remainder
; To assemble: MASM DIVUO;
; To link: LINK callprog+DIVUO;

PUBLIC DIVUO
CSEG SEGMENT PARA ′CODE′
ASSUME CS: CSEG
DIVUO PROC FAR
CMP BX,0 ; Divisor = 0?
JNZ DVROK
DVROK: INT 0 ; Yes. Abort the divide
PUSH ES ; Save working registers
PUSH DI
PUSH CX
MOV DI,0 ; Fetch current INT 0 vector
MOV ES, DI
PUSH ES: [DI] ; and save it on the stack
PUSH ES:[DI+2]
LEA CX, OVR_INT ;Make INT 0 vector
MOV ES: [DI], CX ;point to OVR_INT
MOV CX, SEG OVR_INT
MOV ES: [DI+2], CX
DIV BX ;Perform the division
٢٥١

RESTORE: SUB BX, BX ;If no overflow, BX=0


POP ES: [DI+2] ;Restore INT 0 vector
POP ES: [DI]
POP CX ;Restore registers
POP DI
POP ES
RET

; This interrupt service routine executes if the divide


; Operation produces overflow.

OVR_INT: POP CX ;Modify ret. Addr. Offset


LEA CX, RESTORE ; to skip SUB BX,BX
SUSH CX
SUSH AX
MOV AX,DX ;Set up 1st dividend, 0-Y1
SUB DX,DX
DIV BX ;Q1 is in AX, R1 is in DX
POP CX ;Pop orig. AX into CX
PUSH AX ;Save Q1 on stack
MOV AX,CX ;Set up 2nd dividend, R1-Y0
DIV BX ;Q0 is in AX, R0 is in DX
POP BX ; Final quotient is in BX:AX
IRET
DIVUO ENDP
CSEG ENDS
END
٢٥٢

‫ ﺑﻴﺘـﻲ از روش ﺗﻜـﺮاري ﻧﻴﻮﺗـﻮن اﺳـﺘﻔﺎده‬32 ‫ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﺟﺬر ﻳـﻚ ﻣﻘـﺪار‬
‫ ﺑﺎﺷـﺪ‬N ‫ ﺟـﺬر ﺗﻘﺮﻳـﺐ ﻣﻘـﺪار‬A ‫ روش ﻧﻴﻮﺗﻮن ﺑﺪﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ اﮔﺮ‬.‫ﻣﻲﺷﻮد‬
.‫ ﻣﻲﺑﺎﺷﺪ‬N ‫ ﺗﻘﺮﻳﺐ ﺑﻬﺘﺮي ﺑﺮاي ﺟﺬر‬A1 ‫آﻧﮕﺎه‬

A1 = (N / A + A) / 2

‫ آﻧﮕـﺎه اوﻟـﻴﻦ ﺗﻘﺮﻳـﺐ ﺑﺮاﺑـﺮ ﺑـﺎ‬A=200 ‫ ﺑﺎﺷـﺪ و‬N=10000 ‫ﺑﻌﻨﻮان ﻣﺜـﺎل اﮔـﺮ‬
.‫ ﻣﻲﺑﺎﺷﺪ‬10000 / 200 + 2 = 52

10000/52 = 192, (192+52) / 2 = 122


10000/122 = 81, (122+81) / 2 = 101
10000/101 = 99, (101+99) / 2 = 100
10000 / 100 = 100

.‫ ﺑﻴﺘﻲ را ﻣﺤﺎﺳﺒﻪ ﻣﻲﻧﻤﺎﻳﺪ‬32 ‫ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺟﺬر ﻳﻚ ﻣﻘﺪار‬

; Culculates the square root of a 32-bit integer.


; Input : DX:AX = Integer
; Result : BX = square root
; The original number in DX:AX is unaffected.

; To assemble: MASM SQRT 32;


; To link: LINK callprog+SQRT32;

PUBLIC SQRT32
CSEG SEGMENT PARA ′CODE′
ASSUME CS: CSEG
SQRT32 PROC FAR
PUSH BP ;Save contents of BP
PUSH DX ;and source number DX:AX
PUSH AX
٢٥٣

MOV BP,SP ;BP points to AX on the stack


MOV BX. 200 ;As a first approx,
DIV BX ;divide source number by 200,
ADD AX, 2 ;then add 2
NXT_APP: MOV BX, AX ;Save this approx. in BX
MOV AX, [BP] ;Read source number again
MOV DX, [BP+2]
DIV BX ;Divide by Last approx.
ADD AX,BX ;Average last two approxs.
SHR AX,1
CMP AX,BX ;Last two approxs. Identical?
JE DONE
SUB BX,AX ;No. Check for diff. Of 1
CMP BX,1
JE DONE
CMP BX,-1
JNE NXT_APP
DONE: MOV BX,AX ;Put result in BX
POP AX ;Restore source number
POP DX
POP BP ;and scratch register BP
RET
SQRT32 ENDP
CSEG ENDS
END
٢٥٤

.‫ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﻳﻚ ﻋﻨﺼﺮ از ﻳﻚ ﻟﻴﺴﺖ ﻧﺎﻣﺮﺗﺐ را ﺣﺬف ﻣﻲﻧﻤﺎﻳﺪ‬

; Deletes the value in AX from an unordered list in the


; Extra segment, if that value is in the list.
; Inputs: DI = starting address of the list
; First location = Length of list (words)
; Results: None
; DI and Ax are unaltered.

; Assemble with : MASM DEL_UL;


; Link with: LINK callprog + DEL_UL;
PUBLIC DEL_UL
CSEG SEGMENT PARA ′CODE′
ASSUME CS:CSEG
DEL_UL PROC FAR
CLD ;Make DF=0, to scan forward
PUSH BX ;Save scratch register BX
PUSH DI ; and starting address
MOV CX, ES:[DI] ;Fetch element count
ADD DI, 2 ;Make DI point to 1st data el.
REPNE SCASW ;Value in the list?
JE DELETE ;If so, go delete it.
POP DI ; Otherwise, restore registers
POP BX
RET ;and exit.

; The following instructions delete an element from the list,


; As follows:
; (1) If the element lies at the end of the list,
; Delete it by decreasing the element count by 1.
٢٥٥

; (2) Otherwise, delete the element by moving all


; Subsequent elements up by one position.

DELETE: JCXZ DEC_CNT ;If (CX)= 0, delete last el.


NEXT_EL: MOV BX,ES: [DI] ;Move one element up. In list
MOV ES; [DI-2], BX
ADD DI, 2 ;Point to next element
LOOP NEXT_EL ;Repeat until all els. Moved
DEC_CNT: POP DI ;Decrease el. Count by 1
DEC WORD PTR ES:[DI]
POP BX ;Restore contents of BX
RET ;and exit
DEL_UL ENDP
CSEG ENDS
END

LIST 6 LIST 6
42 42
76 76
122 122
14 ←DELETE 97
97 LIST+5 8
LIST+6 8
٢٥٦

.‫ﺑﺮﻧﺎﻣﻪ ذﻳﻞ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ و ﻣﻴﻨﻴﻤﻢ ﻳﻚ ﻟﻴﺴﺖ ﻧﺎﻣﺮﺗﺐ را ﻣﺸﺨﺺ ﻣﻲﻧﻤﺎﻳﺪ‬

; Finds the maximum and minimum words in an unordered


; List in the extra segment.
; Inputs: ES: DI = Starting address of the list
; First location = Length of list (words)
; Results : AX = Maximum
; BX = Minimum
; DI is unaltered.

; Assemble with : MASM MINMAX;


; Link with: LINK callprog + MINMAX;

PUBLIC MINMAX
CSEG SEGMENT PARA ′CODE′
ASSUME CS: CSEG
MINMAX PROC FAR
PUSH CX
PUSH DI ;Save starting address
MOV CX, ES:[DI] ;Fetch element count
DEC CX ;Get ready for count-1 compares
ADD DI,2 ;point to first element
MOV BX, ES:[DI] ;Declare it both minimum
MOV AX,BX ;and maximum
CHKMIN: ADD DI,2 ;Point to next element
CMP ES: [DI], BX ;Compare element to minimum
JAE CHKMAX ;New minimum found?
MOV BX,ES : [DI] ;Yes. Put is in BX
JMP SHORT NEXTEL
CHKMAX: CMP ES:[DI], AX ;Compare element to maximum
JBE NEXTEL ;New maximum found?
MOV AX, ES:[DI] ;Yes. Put it in AX
NEXTEL: LOOP CHKMIN ;Check entire list
POP DI ;Restore starting address
POP CX
RET ; and exit
MINMAX ENDP
CSEG ENDS
END
٢٥٧

:‫در ذﻳﻞ اﻟﮕﻮرﻳﺘﻢ ﻣﺮﺗﺐ ﺳﺎزي ﺣﺒﺎﺑﻲ داده ﺷﺪه اﺳﺖ‬

START

EXCHANGE
FLAG=1

N=0

NO
ELEMENT N+1
ELEMENT N?

YES
EXCHANGE
THESE
ELEMENTS

EXCHANGE
FLAG=0

N=N+1

NO
END OF LIST?

YES

EXCHANGE YES
FLAG=0?

NO

END
٢٥٨

.‫ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﺗﻌﺪادي ﻋﻨﺎﺻﺮ را ﺑﺼﻮرت ﺻﻌﻮدي ﺑﺮوش ﺣﺒﺎﺑﻲ ﻣﺮﺗﺐ ﻣﻲﻧﻤﺎﻳﺪ‬
; Arranges the 16-bit elements of a list in the extra
; Segment in ascending order, using bubble sort.
; Inputs: ES:DI = starting address of the list
; First location = Length of list (words)
; DI is unaltered.

; Assemble with: MASM B_SORT;


; Link with: LINK callprog + B_SORT;

DSEG SEGMENT PARA ′DATA′


SAVE_CNT DW ?
START_ADDR DW ?
DSEG ENDS

PUBLIC B_SPRT
CSEG SEGMENT PARA ′CODE′
ASSUME CS:CSEG,DS:DSEG
B_SORT PROC FAR
PUSH DS ;Save caller’s registers
SUSH CX
SUSH AX
SUSH BX
MOV AX, DSEG ;Initialize DS
MOV DS,AX
MOV START_ADDR,DI ;Save starting address
MOV CX,ES:[DI] ;Fetch element count
DEC CX ;Get ready for count-1 compares
MOV SAVE_CNT,CX ;Save this value in memory
٢٥٩

INIT: MOV BX,1 ;Exchange flag (BX) = 1


MOV CX,SAVE_CNT ;and load this count into CX
MOV DI,START_ADDR ;Load start address into DI
NEXT: ADD DI,2 ;Address a data element
MOV AX,ES:[DI] ;and load it into AX
CMP ES:[DI+2],AX ;Is next el. <this el.?
JAE CONT ;No. Go check next pair
XCHG ES:[DI+2],AX ;Yes. Exchange these elements.
MOV ES:[DI],AX
SUB BX,BX ;and make exchange flag 0
CONT: LOOP NEXT ;Process entire list
CMP BX,0 ;Any exchanges made?
JE INIT ;If so, process list again
MOV DI,START_ADDR ;If not, restore registers
POP BX
POP AX
POP CX
POP DS
RET ;and exit
B_SORT ENDP
CSEG ENDS
END
٢٦٠

‫ﺑﺮﻧﺎﻣﻪ زﻳﺮ روش ﺑﻬﺘﺮي ﺑﺮاي ﻣﺮﺗﺐ ﻧﻤﻮدن ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳـﻪ ﺑـﺮوش ﺣﺒـﺎﺑﻲ‬
.‫اراﺋﻪ ﻣﻲدﻫﺪ‬
; Arranges the 16-bit elements of a list in the extra
; Segment in ascending order, using bubble sort.
; Inputs: ES:DI = starting address of the list
; First location = Length of list (words)
; DI is unaltered.

; Assemble with: MASM BUBBLE;


; Link with: LINK callprog + BUBBLE;

DSEG SEGMENT PARA ′DATA′


SAVE_CNT DW ?
START_ADDR DW ?
DSEG ENDS

PUBLIC BUBBLE
CSEG SEGMENT PARA ′CODE′
ASSUME CS:CSEG,DS:DSEG
BUBBLE PROC FAR
PUSH DS ;Save caller’s registers
PUSH CX
PUSH AX
PUSH BX
MOV AX, DSEG ;Initialize DS
MOV DS,AX
MOV START_ADDR,DI
MOV CX,ES:[DI] ;Fetch element count
MOV SAVE_CNT,CX ;Save this value in memory
٢٦١

INIT: MOV BX,1 ;Exchange flag (BX) = 1


DEC SAVE_CNT ;Get ready for count-1 compares
JZ SORTED ;Exit if SAVE_CNT is 0
MOV CX,SAVE_CNT ;and load this count into CX
MOV DI, START_ADDR ;Load start address into DI
NEXT: ADD DI,2 ;Address a data element
MOV AX,ES:[DI] ;and load it into AX
CMP ES:[DI+2],AX ;Is next el. <this el.?
JAE CONT ;No. Go check next pair
XCHG ES:[DI+2],AX ;Yes. Exchange these elements.
MOV ES:[DI],AX
SUB BX,BX ;and make exchange flag 0
CONT: LOOP NEXT ;Process entire list
CMP BX,0 ;Any exchanges made?
JE INIT ;If so, process list again
SORTED: MOV DI, START_ADDR ;If not, restore registers
POP BX
POP AX
POP CX
POP DS
RET ;and exit
BUBBLE ENDP
CSEG ENDS
END
٢٦٢

.‫در ذﻳﻞ اﻟﮕﻮرﻳﺘﻢ ﺟﺴﺘﺠﻮي دودوﺋﻲ ﻣﻄﺮح ﮔﺮدﻳﺪه اﺳﺖ‬

START

FETCH INDEX
(ELEMENT
COUNT)

DIVIDE INDEX BY 2

YES
INDEX
=0?

NO
SEARCH ADDRESS=
ADDRESS+INDEX

SEARCH NO SEARCH YES


VALUE VALUE
FOUND? HIGHER
IN LIST?
YES NO, LOWER
DIVIDE INDEX BY 2
END

YES
INDEX
=0?

NO
SEARCH ADDRESS=
ADDRESS-INDEX
٢٦٣

.‫ﺑﻴﺘﻲ اراﺋﻪ ﻣﻲدﻫﺪ‬ 16 ‫ﺑﺮﻧﺎﻣﻪ ذﻳﻞ روش ﺟﺴﺘﺠﻮي دودوﺋﻲ ﺑﺮاي ﻣﻘﺎدﻳﺮ‬
; Searches an ordered list in the extra segment for the
; Word value contained in AX.
; Inputs : ES:DI = starting address of the list
; First location = Length of list (words)
; Results: if the value is in the list,
; CF=0
; SI=offset of matching element
; If the value is not in the list,
; CF = 1
; SI = offset of last element compared
; AX and DI are unaffected.

; Assemble with: MASM B_SEARCH;


; Link with: LINK callprog+B_SEARCH;

DSEG SEGMENT PARA ′DATA′


START_ADDR DW ?
DSEG ENDS

PUBLIC B_SEARCH
CSEG SEGMENT PARA ′CODE′
ASSUME CS:CSEG,DS:DSEG
B_SEARCH PROC FAR
PUSH DS ;Save caller’s DS register
PUSH AX
MOV AX,DSEG ;Initialize DS
MOV DS,AX
POP AX
٢٦٤

; Find out if AX lies beyond the boundaries of the list.


CMP AX,ES:[DI+2] ;Search value <or=first el.?
JA CHK_LAST ;No. Go check last element
LEA SI,ES:[DI+2] ;Yes. Fetch addr. Of first el.
JE EXIT ;If value = 1 st element, exit
STC ; If value < 1 st element, set CF
JMP EXIT ;and then exit
CHK_LAST: MOV SI,ES:[DI] ;Point to last element
SHL SI,1
ADD SI,DI
CMP AX,ES:[SI] ;Search value > or = last el.?
JB SEARCH ;No. Go search list
JE EXIT ;Yes. Exit if value = last el.
STC ;If value > last element, set CF
JMP EXIT ;and then exit
; Search for value within the list.
SEARCH: MOV START_ADDR,DI ;Save starting address in memory
MOV SI, ES:[DI] ;Fetch index
EVEN_IDX: TEST SI,1 ;Force index to an even value
JZ ADD_IDX
INC SI
ADD_IDX: ADD DI,SI ;Calculate next search address
COMPARE: CMP AX, ES:[DI] ;Search value found?
JE ALL_DONE ; If so, exit
JA HIGHER ; Otherwise, find correct half
٢٦٥

; These instructions are executed if the search value is lower


; In the list.
CMP SI , 2 ;Index = 2?
JNE IDX _ OK
NO_MATCH: STC ;If so, set CF
JE ALL_DONE ;and exit
IDX_OK: SHR SI ,1 ;If not, divide index by 2
TEST SI, 1 ;Force index to an even value
JZ SUB_IDX
INC SI
SUB_IDX: SUB DI, SI ;Calculate next address
JMP SHORT COMPARE ; Go check this element

; These instructions are executed if the search value is higher


; In the list.

HIGHER: CMP SI,2 ;Index = 2?


JE NO_MATCH ;If so, go set CF and exit
SHR SI,1 ;If not, divide index by 2
JMP SHORT EVEN_IDX ;Go check next element

; Following are exit instructions.


ALL_DONE: MOV SI,DI ;Move compare address into ST
MOV DI,START_ADDR ;Restore starting address
EXIT: POP DS
RET ;and exit
B_SEARCH ENDP
CSEG ENDS
END
٢٦٦

.‫ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﻳﻚ ﻋﻨﺼﺮ را ﺑﻪ ﻳﻚ ﻟﻴﺴﺖ ﻣﺮﺗﺐ اﺿﺎﻓﻪ ﻣﻲﻧﻤﺎﻳﺪ‬


; Adds the element in AX to an ordered list in the
; Extra segment, if that value is not already in the list.
; Inputs: DI = starting address of the list
; First location = List length (words).
; Result : None
; DI and AX are unaltered.
; The B_SEARCH procedure (Example 5-6) is used to conduct
; The search.

; Assemble with: MASM ADD_2_OL;


; Link with: LINK callprog + ADD_2_OL +B_SEARCH;

EXTRN B_SEARCH:FAR
PUBLIC ADD_TO_OL
CSEG SEGMENT PARA ′CODE′
ASSUME CS:CSEG
ADD_TO_OL PROC FAR
PUSH CX ; Save caller’s registers
PUSH SI
PUSH BX
CALL B_SEARCH ; Is the value in the list?
JNC GOODBYE ; If so, exit
MOV BX,SI ; if not, copy compare addr. To BX
MOV CX,ES: [DI] ; Find address of last element
SHL CX,1
ADD CX,DI ; and put it in CX
PUSH CX ; Save this address on the stack
SUB CX,SI ; Calculate no. of words to be moved
SHR CX,1
٢٦٧

CMP AX,ES: [SI] ; should compare el. Be moved, too?


JA EXCLUDE
INC CX ; Yes. Increase move count by 1
JNZ CHECK_CNT
EXCLUDE: ADD BX,2 ; No. Adjust insert pointer
CHECK_CNT: CMP CX,0 ; Move count = 0?
JNE MOVE_ELS
POP SI ; If so, store value at end of list
MOV ES: [SI+2],AX
JMP SHORT INC_CNT ; Then go increase element count
MOVE_ELS: POP SI ; Load start address for move
PUSH BX ; Save insert address on stack
MOVE_ONE: MOV BX, ES:[SI] ; Move one element down in list
MOV ES: [SI+2], BX
SUB SI,2 ; Point to next element
LOOP MOVE_ONE ; Repeat until all are moved
POP BX ; Retrieve insert address
MOV ES: [BX], AX ; Insert AX in the list
INC_CNT: INC WORD PTR ES:[DI] ; Add 1 to element count
GOODBYE: POP BX ; Restore registers
POP SI
POP CX
RET ; and exit
ADD_TO_OL ENDP
CSEG ENDS
END
٢٦٨

.‫ﺑﺮﻧﺎﻣﻪ داده ﺷﺪه در ذﻳﻞ ﻳﻚ ﻣﻘﺪار را از ﻟﻴﺴﺖ ﻣﺮﺗﺐ داده ﺷﺪه ﺣﺬف ﻣﻲﻧﻤﺎﻳﺪ‬

; Deletes the value in AX from the ordered list in the


; Extra segment, if the value is in the list.
; Inputs: ES: DI = Starting address of the list
; First location = Length of list (words)
; AX and DI are unaffected.
; The B_SEARCH procedure (Example 5-6) is used to conduct
; The search.

; Assemble with: MASM DEL_OL;


; Link with: LINK callprog + DEL_OL + B_SEARCH;

EXTRN B_SEARCH : FAR


PUBLIC DEL_OL
CSEG SEGMENT PARA ′CODE′
DEL_OL PROC FAR
ASSUME CS;CSEG
PUSH CX ; Save caller’s registers
PUSH SI
PUSH BX
CALL B_SEARCH ; Is the value in the list?
JC ADIOS ; If not, exit
MOV CX,ES: [DI] ; If so, find addr. Of last element
SHL CX,1
ADD CX,DI ; and put it in CX
CMP CX,SI ; Is the last el. To be deleted?
JE CNT_M1 ; Yes. Go decrement el. Count
SUB CX,SI ; No. calculate move count
SHR CX,1
٢٦٩

MOVEM: MOV BX,ES: [SI+2] ; Move one element up in list


MOV ES: [SI], BX
ADD SI,2 ; Point to next element
LOOP MOVEM ; Repeat until all are moved
CNT_M1: DEC WORD PTR ES:[DI] ; Decrease element count by 1
ADIOS: POP BX ; Restore registers
POP SI
POP CX
RET ; and exit
DEL_OL ENDP
CSEG ENDS
END
‫‪٢٧٠‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ ﻧﺤﻮه ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﻪ زﺑﺎن اﺳﻤﺒﻠﻲ و ﻧﺤﻮه اﺟﺮاي آﻧﻬﺎ ﺑﺤـﺚ‬
‫ﮔﺮدﻳﺪه اﺳﺖ‪ .‬ﺿﻤﻨﺎً ﭼﻨﺪﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺼﻮرت ﻧﻤﻮﻧﻪ ﻧﻮﺷﺘﻪ ﺷﺪه ﻛﻪ ﻣـﻲﺗﻮاﻧـﺪ اﻟﮕـﻮﺋﻲ‬
‫ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ داﻧﺸﺠﻮﻳﺎن ﺑﺎﺷﺪ‪.‬‬
‫‪٢٧٠‬‬

‫ﻓﺼﻞ دﻫﻢ‬
‫اﺳﻤﺒﻠﻲ ‪80386‬‬

‫ﻫﺪف ﻛﻠﻲ‬
‫در اﻳﻦ ﻓﺼﻞ رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬و زﺑﺎن اﺳﻤﺒﻠﻲ واﺑﺴﺘﻪ ﺑﺤﺚ ﻣﻲﮔﺮدد‪.‬‬

‫اﻫﺪاف رﻓﺘﺎري‬
‫ﭘﺲ از ﻣﻄﺎﻟﻌﻪ اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﻣﻲﺷﻮﻳﺪ‪.‬‬
‫‪ -1‬رﻳﺰﭘﺮدازﻧﺪه ‪. 80386‬‬
‫‪ -2‬اﻧﻮاع ‪ data‬ﻫﺎﺋﻲ ﻛﻪ ﺣﻤﺎﻳﺖ ﻣﻲﻧﻤﺎﻳﺪ و ﻣﺤﺎﺳﺒﻪ آدرس ﻣﻮﺛﺮ‬
‫‪ -3‬ﻣﻌﻤﺎري و ﺛﺒﺎﺗﻬﺎي آن‪.‬‬
‫‪ -4‬آﺷﻨﺎﺋﻲ ﺑﺎ ﻣﺠﻤﻮﻋﻪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪.80386‬‬
‫‪٢٧١‬‬

‫‪80386‬‬ ‫‪ -10-1‬رﻳﺰ ﭘﺮدازﻧﺪه‬


‫رﻳﺰ ﭘﺮدازﻧﺪه ‪ 80386‬ﻳﻚ رﻳﺰﭘﺮدازﻧﺪه ‪ 32‬ﺑﻴﺘـﻲ ﻣـﻲﺑﺎﺷـﺪ ﻛـﻪ ﺑـﺮاي ﺳﻴـﺴﺘﻢ‬
‫ﻋﺎﻣﻠﻬﺎﺋﻲ ﻛﻪ ﻋﻤﻞ ﭼﻨﺪ وﻇﻴﻔﻪاي )‪ (Multitasking‬را اﻧﺠـﺎم ﻣـﻲدﻫﻨـﺪ ﻃﺮاﺣـﻲ ﺷـﺪه‬
‫اﺳﺖ‪ .‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺛﺒﺎﺗﻬﺎي ‪ 32‬ﺑﻴﺘﻲ آن ﻣﻲﺗﻮاﻧﺪ آدرﺳﻬﺎ و اﻧـﻮاع دادهﻫـﺎي ‪ 32‬ﺑﻴﺘـﻲ را‬
‫‪64‬‬ ‫ﺣﻤﺎﻳﺖ ﻧﻤﺎﻳﺪ‪ .‬اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه ﻗﺎدر اﺳﺖ ﺗﺎ ﭼﻬﺎر ﮔﻴﮕﺎﺑﺎﻳﺖ ﺣﺎﻓﻈـﻪ ﻓﻴﺰﻳﻜـﻲ و‬
‫ﺗﺮاﺑﺎﻳﺖ )‪ (Terabyte‬ﺣﺎﻓﻈﻪ ﻣﺠﺎزي را آدرس دﻫﻲ ﻧﻤﺎﻳﺪ‪ .‬ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﭘﻬﻨـﺎي ﺑﺎﻧـﺪ‬
‫ﺑﺎﻻي ‪ ،bus‬اﻣﻜﺎﻧﺎت اﺳﺘﻔﺎده ‪ ، pipelining‬ﺗﺮاﺷﻪ ﺗﺒﺪﻳﻞ آدرس‪ ،‬اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه زﻣـﺎن‬
‫اﺟﺮاي ﻣﺘﻮﺳﻂ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ را ﺧﻴﻠﻲ ﻛﻢ و ﺑﻪ ﺣﺪاﻗﻞ ﻣﻲرﺳﺎﻧﺪ‪ .‬اﻳـﻦ رﻳـﺰ ﭘﺮدازﻧـﺪه‬
‫ﻗﺎدر اﺳﺖ ﻛﻪ ‪ 3‬ﺗﺎ ‪ 4‬ﻣﻴﻠﻴﻮن دﺳﺘﻮراﻟﻌﻤﻞ را در ﻳﻚ ﺛﺎﻧﻴﻪ اﺟﺮا ﻧﻤﺎﻳﺪ‪.‬‬

‫‪ -10-2‬اﻧﻮاع دادهﻫﺎ‬
‫ﺗﺮاﺷﻪ رﻳﺰ ﭘﺮدازﻧﺪه ‪ 80386‬ﭼﻨﺪﻳﻦ ﻧـﻮع داده ﻋـﻼوه ﺑـﺮ آﻧﻬـﺎﺋﻲ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ‬
‫‪ 8086/80286‬ﺣﻤﺎﻳﺖ ﻣﻲﺷﻮﻧﺪ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه ﻣﻘﺎدﻳﺮ ﺻـﺤﻴﺢ‬
‫‪1‬‬ ‫ﺑﺎ ﻋﻼﻣﺖ و ﺑﺪون ﻋﻼﻣﺖ ‪ 32‬ﺑﻴﺘﻲ را ﺣﻤﺎﻳﺖ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ اﻃﻼﻋﺎت ﺑﻴﺘـﻲ از‬
‫ﺗﺎ ‪ 32‬ﺑﻴﺖ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲﻧﻤﺎﻳﺪ‪ .‬اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه اﻧﻮاع اﺷﺎرهﮔﺮﻫﺎي اﺳﺘﺎﻧﺪارد اﺳﺘﻔﺎده‬
‫و اﺷﺎرهﮔﺮﻫﺎي ‪ 32‬و ‪ 48‬ﺑﻴﺘﻲ را ﺣﻤﺎﻳﺖ ﻣﻲﻧﻤﺎﻳـﺪ‪ .‬ﺑﻄـﻮر‬ ‫‪8086/80286‬‬ ‫ﺷﺪه ﺑﻮﺳﻴﻠﻪ‬
‫ﻛﻠﻲ ‪ 80386‬از ﻋﻤﻠﻮﻧﺪﻫﺎي ‪ 32, 16, 8‬ﺑﻴﺘﻲ ﻣﻲﺗﻮاﻧﺪ اﺳﺘﻔﺎده ﻧﻤﺎﻳﺪ‪.‬‬
‫در رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﻧﻜﺎت ذﻳﻞ ﺗﻮﺟﻪ ﻧﻤﻮد‪.‬‬
‫اﻟﻒ( ﻳﻚ ﺑﺎﻳﺖ از ﻫﺸﺖ ﺑﻴﺖ ﭘﻴﻮﺳﺘﻪ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ‪.‬‬
‫ب(ﻳﻚ ‪ word‬از ﺷﺎﻧﺰده ﺑﻴﺖ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ‪.‬‬
‫ج(ﻳﻚ ‪ double word‬از ‪ 32‬ﺑﻴﺖ ﻛﻨﺎر ﻫﻢ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ‪.‬‬
‫د(ﻳﻚ ‪ quad word‬از ‪ 64‬ﺑﻴﺖ ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ‪.‬‬
‫‪٢٧٢‬‬

‫ﻛﻪ ﺑﻮﺳﻴﻠﻪ دﻳﺮﻛﺘﻴﻮﻫﺎي زﻳﺮ در زﺑﺎن اﺳﻤﺒﻠﻲ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲﮔﻴﺮﻧﺪ‪.‬‬

‫‪DB‬‬ ‫‪Define byte‬‬


‫‪DD‬‬ ‫‪Define double word‬‬
‫‪DQ‬‬ ‫‪Define quad word‬‬
‫‪DW‬‬ ‫‪Define word‬‬

‫‪ -10-3‬ﻣﺤﺎﺳﺒﻪ آدرس ﻣﺆﺛﺮ )‪(Effective Address‬‬


‫زﻣﺎﻧﻴﻜﻪ ﻣﻲﺧﻮاﻫﻴﻢ ﺑﻪ ﺳﮕﻤﻨﺖ ﺑﺰرﮔﺘﺮ از ‪ 64k‬دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻧﻤـﺎﺋﻴﻢ آدرس‬
‫ﻣﺆﺛﺮ ﻣﻲﺗﻮاﻧﺪ ‪ 32‬ﺑﻴﺘﻲ ﺑﺎﺷﺪ‪ .‬آدرس ﻣﺆﺛﺮ از ﻣﺠﻤﻮع ﺛﺒﺎت ﻣﺒﻨﺎ‪ ،‬ﺛﺒﺎت ﺷﺎﺧﺺ و ﻳـﻚ‬
‫ﺟﺎﺑﺠﺎﺋﻲ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ‪.‬‬

‫‪ -10-4‬ﻣﻌﻤﺎري‬
‫رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬اﻣﻜﺎن اﺳﺘﻔﺎده از ‪ 32‬ﺛﺒﺎت ﻛﻪ آﻧﻬﺎ را ﻣﻲ ﺗـﻮان ﺑـﻪ ﻫﻔـﺖ‬
‫دﺳﺘﻪ زﻳﺮ ﺗﻘﺴﻴﻢ ﻧﻤﻮد را ﻓﺮاﻫﻢ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬
‫‪ -1‬ﺛﺒﺎﺗﻬﺎي ﻣﺼﺮف ﻋﻤﻮﻣﻲ )‪.(General-purpose registers‬‬
‫‪ -2‬ﺛﺒﺎﺗﻬﺎي ﺳﮕﻤﻨﺖ )‪.(Segment registers‬‬
‫‪ -3‬ﻓﻠﮕﻬﺎ و اﺷﺎرهﮔﺮ دﺳﺘﻮراﻟﻌﻤﻞ )‪.(Instruction pointer and flags‬‬
‫‪ -4‬ﺛﺒﺎﺗﻬﺎي ﻛﻨﺘﺮل )‪.(Control registers‬‬
‫‪ -5‬ﺛﺒﺎﺗﻬﺎي آدرس ﺳﻴﺴﺘﻢ )‪.(System address registers‬‬
‫‪ -6‬ﺛﺒﺎﺗﻬﺎي ﺗﺴﺖ )‪.(Test registers‬‬
‫ﺑﻴﺖ داده را دارﻧﺪ‪.‬‬ ‫ذﺧﻴﺮه‪32 ، 16 ، 8‬‬ ‫ﺛﺒﺎﺗﻬﺎي ﻣﺼﺮف ﻋﻤﻮﻣﻲ اﻣﻜﺎن‬
‫ﺗﻌﺪاد اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﻫﺸﺖ ﺗﺎ ﻣﻲﺑﺎﺷﺪ و اﺳﺎﻣﻲ آﻧﻬﺎ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪EAX‬‬ ‫‪Accumulator‬‬
‫‪EBX‬‬ ‫‪Base‬‬
‫‪ECX‬‬ ‫‪Count‬‬
‫‪EDX‬‬ ‫‪Data‬‬
‫‪ESP‬‬ ‫‪Stack pointer‬‬
‫‪EBP‬‬ ‫‪Base pointer‬‬
٢٧٣

ESI Source Index


EDI Destination Index

31 16 15 0
EAX [AH] AX [AL]
EBX [BH] BX [BL]
ECX [CH] CX [CL]
EDX [DH] DX [DL]

‫ ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ ﺧـﻮد‬AX ‫ ﻫﻤﺎن ﺛﺒﺎت‬EAX ‫ ﺛﺒﺎت‬15 ‫ ﺗﺎ‬0 ‫در ﺣﻘﻴﻘﺖ ﺑﻴﺖﻫﺎي‬
‫ ﻫﻤﻴﻨﻄـﻮر در ﻣـﻮرد ﺳـﺎﻳﺮ‬.‫ ﺗﻘﺴﻴﻢ ﻣـﻲﮔﺮدﻧـﺪ‬AH ‫ و‬AL ‫ﻧﻴﺰ ﺑﻪ دو ﺛﺒﺎت ﻫﺸﺖ ﺑﻴﺘﻲ‬
. EDX، ECX ، EBX‫ﺛﺒﺎﺗﻬﺎي‬
EDI ، ESI ، EBP ، ESP ‫ ﺑﻴﺘـــﻲ ﺑﻨﺎﻣﻬـــﺎي‬32 ‫ داراي ﭼﻬـــﺎر ﺛﺒـــﺎت‬80386
‫ ﺑﺘﺮﺗﻴﺐ ﺷﺎﻧﺰده ﺑﻴﺖ اول اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﻣﻲ ﺑﺎﺷﻨﺪ‬DI ، SI ، BP ، SP ‫ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺛﺒﺎﺗﻬﺎي‬
SP Stack Pointer
BP Base Pointer
SI Source Index
DI Destination Index

31 16 15 0 1
SP ESP

BP EBP

SI ESI

DI EDI

:‫ اﺳﺎﻣﻲ اﻳﻦ ﺛﺒﺎﺗﻬﺎ ﻋﺒﺎرﺗﻨﺪ از‬.‫ ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﺪ‬16 ‫ داراي ﺷﺶ ﺛﺒﺎت ﺳﮕﻤﻨﺖ‬80386

CS Code Segment
DS Data Segment
SS Stack Segment
ES Extra Segment
FS
GS
‫‪٢٧٤‬‬

‫‪15‬‬ ‫‪0‬‬
‫‪CS‬‬
‫‪DS‬‬
‫‪SS‬‬
‫‪ES‬‬
‫‪FS‬‬
‫‪GS‬‬

‫‪ 80368‬داراي ﻳﻚ ﺛﺒﺎت اﺷﺎره ﮔﺮ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺑﺎﺷﺪ ﻛﻪ ‪ 32‬ﺑﻴﺘﻲ اﺳﺖ ﺑﻨـﺎم‬


‫‪ . EIP‬ﻣﺤﺘﻮي ﺛﺒﺎت ‪ EIP‬آدرس ﻣـﺆﺛﺮ دﺳـﺘﻮراﻟﻌﻤﻞ ﺑﻌـﺪي ﻛـﻪ ﺑﺎﻳـﺴﺘﻲ اﺟـﺮا ﺷـﻮد‬
‫ﻣﻲﺑﺎﺷﺪ‪ 16 .‬ﺑﻴﺖ اول ﺛﺒﺎت ‪ EIP‬ﺑﻨﺎم ‪ IP‬ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﺑﺼﻮرت ﺟﺪاﮔﺎﻧﻪ ﻣﻲﺗﻮان ﺑـﻪ آن‬
‫دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻧﻤﻮد‪.‬‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪0‬‬


‫‪EIP‬‬ ‫‪IP‬‬

‫ﺛﺒﺎت ﻓﻠﮓ ﻳﺎ ﻓﻠﮓ ﺛﺒﺎت در رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬ﺑﻪ ‪ 32‬ﺑﻴﺖ ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻪ اﺳﺖ‪.‬‬
‫ﺛﺒﺎت ﻓﻠﮓ ﺑﻨﺎم ‪ EFLAGS‬ﻣـﻲﺑﺎﺷـﺪ‪ .‬اﻟﺒﺘـﻪ ﺑﺎﻳـﺴﺘﻲ ﺗﻮﺟـﻪ داﺷـﺖ ﻛـﻪ ‪ 16‬ﺑﻴـﺖ اول‬
‫‪ EFLAGS‬ﻫﻤﺎن ﻓﻠﮓ ﺛﺒﺎت ﻣﻄﺮح ﺷﺪه در ﻓﺼﻠﻬﺎي ﻗﺒﻞ ﻣﻲﺑﺎﺷﺪ‪.‬‬

‫‪31‬‬ ‫‪16‬‬ ‫‪15‬‬ ‫‪0‬‬


‫‪EFLAG‬‬ ‫‪Flags‬‬

‫ﺳﺎﺧﺘﺎر ﺛﺒﺎت ‪ EFLAGS‬در ذﻳﻞ داده ﺷﺪه اﺳﺖ‪.‬‬

‫‪15‬‬ ‫‪14‬‬ ‫‪13‬‬ ‫‪12‬‬ ‫‪11‬‬ ‫‪10‬‬ ‫‪9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪NT‬‬ ‫‪IO‬‬ ‫‪PL‬‬ ‫‪OF‬‬ ‫‪DF‬‬ ‫‪IF‬‬ ‫‪TF‬‬ ‫‪SF‬‬ ‫‪ZF‬‬ ‫‪//‬‬ ‫‪AF‬‬ ‫‪//‬‬ ‫‪PF‬‬ ‫‪//‬‬ ‫‪CF‬‬

‫‪31‬‬ ‫‪30‬‬ ‫‪29‬‬ ‫‪28‬‬ ‫‪27‬‬ ‫‪26‬‬ ‫‪25‬‬ ‫‪24‬‬ ‫‪23‬‬ ‫‪22‬‬ ‫‪21‬‬ ‫‪20‬‬ ‫‪19‬‬ ‫‪18‬‬ ‫‪17‬‬ ‫‪16‬‬
‫‪VM‬‬ ‫‪RF‬‬
٢٧٥

‫ﻛﻪ‬
RF Resume Flag
VM Virtual Mode Flag

CR3, CR2, CR0 ‫ ﺑﻴﺘﻲ ﺑﻨﺎﻣﻬـﺎي‬32 ‫ داراي ﺳﻪ ﺛﺒﺎت ﻛﻨﺘﺮل‬80386 ‫رﻳﺰﭘﺮدازﻧﺪه‬


‫ ﺷﺎﻣﻞ ﺷﺶ ﻓﻠﮓ از ﻗﺒﻞ ﺗﻌﺮﻳﻒ ﺷﺪه ﺑﺮاي ﻛﻨﺘﺮل رﻳﺰﭘﺮدازﻧﺪه و‬CR0 ‫ ﺛﺒﺎت‬.‫ﻣﻲ ﺑﺎﺷﺪ‬
.‫وﺿﻌﻴﺖ آن ﻣﻲﺑﺎﺷﺪ‬

31 16 15 0
CR0
CR2
CR3

‫ داراي ﭼﻬﺎر ﺛﺒﺎت ﺑﺎ ﻛﺎرﺑﺮد ﻣﺨـﺼﻮص ﺑﻨﺎﻣﻬـﺎي‬80386 ‫ﻫﻤﭽﻨﻴﻦ رﻳﺰﭘﺮدازﻧﺪه‬


‫ ﺑﻴﺘــﻲ و‬32 ‫ ﺛﺒﺎﺗﻬــﺎي‬IDTR ‫ و‬GDTR ‫ ﻛــﻪ‬.‫ ﻣــﻲﺑﺎﺷــﺪ‬TR ، LDTR ، IDTR ، GDTR
.‫ ﺛﺒﺎﺗﻬﺎي ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﻨﺪ‬TR ، LDTR

31 16 15 0

GDTR

IDTR

LDTR

TR

GETR Global descriptor table register


IDTR Interrupt descriptor table register
LDT Local descriptor table register
TR Task state segment table register
‫‪٢٧٦‬‬

‫‪80386‬‬ ‫‪ -10-5‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي‬
‫ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻛﻠﻴـﻪ ﻣﻄـﺎﻟﺒﻲ ﻛـﻪ در ﻣـﻮرد رﻳﺰﭘﺮدازﻧـﺪه ‪ 80286‬در‬
‫ﻓﺼﻠﻬﺎي ﻗﺒﻞ ﻣﻄﺮح ﺷﺪ ﺗﻮﺳﻂ رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬ﻛﺎﻣﻼً ﻣﻲﺗﻮاﻧﻨﺪ ﺑـﺪون ﻫﻴﭽﮕﻮﻧـﻪ‬
‫ﺗﻐﻴﻴﺮي ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ ﻳﻌﻨﻲ ﻛﻠﻴﻪ ﺑﺮﻧﺎﻣﻪﻫﺎﺋﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﻧﻮﺷﺘﻪ ﺷﺪه ﻣﻲﺗﻮان‬
‫ﺑﻮﺳﻴﻠﻪ رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬اﺟﺮا ﻧﻤﻮد‪ .‬ﺿﻤﻨﺎً ﻓﻬﺮﺳـﺘﻲ از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ 80386‬در‬
‫‪80386‬‬ ‫اﻧﺘﻬﺎي اﻳﻦ ﻓﺼﻞ داده ﺷﺪه اﺳﺖ‪ .‬ﺑﺎﻳﺴﺘﻲ ﺗﻮﺟـﻪ داﺷـﺖ ﻛـﻪ در رﻳﺰﭘﺮدازﻧـﺪه‬
‫ﻋﻤﻠﻮﻧــﺪﻫﺎ ﻣــﻲﺗﻮاﻧﻨــﺪ ‪ 32‬ﺑﻴﺘــﻲ ﺑﺎﺷــﻨﺪ ﻛــﻪ اﻳﻨﻜــﺎر در ﻣــﻮرد ‪ 80286‬اﻣﻜــﺎن ﭘــﺬﻳﺮ‬
‫ﻧﺒﻮد‪.‬‬
‫ﻣﺜﺎل‬

‫‪ADD‬‬ ‫‪AX, BX‬‬


‫‪ADD‬‬ ‫‪EBX , ECX‬‬

‫ﻛﻪ دوﻣﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺤﺘﻮي ‪ ECX‬ﻛﻪ ‪ 32‬ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﺪ ﺑﺎ ﻣﺤﺘﻮي ‪ EBX‬ﻛﻪ‬


‫‪ 32‬ﺑﻴﺘﻲ ﻣﻲﺑﺎﺷﺪ ﺟﻤﻊ ﻧﻤﻮده ﻧﺘﻴﺠﻪ در ‪ EBX‬ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬

‫ﻣﺜﺎل دﻳﮕﺮ‬

‫‪ADD‬‬ ‫‪AL , 4‬‬


‫‪ADD‬‬ ‫‪EAX , 98765432H‬‬

‫ﻛﻪ ﻣﻘﺪار ﺛﺎﺑﺖ داده ﺷﺪه را ﺑﺎ ﻣﺤﺘﻮي ‪ EAX‬ﺟﻤﻊ ﻣﻲﻧﻤﺎﻳﺪ‪.‬‬

‫ﻳﺎ در ﻣﻮرد ‪ AND‬ﻣﻲﺗﻮاﻧﻴﻢ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را ﺑﻜﺎر ﻧﺒﺮﻳﻢ‪.‬‬

‫‪AND‬‬ ‫‪AX , BX‬‬


‫‪AND‬‬ ‫‪EAX , ECX‬‬

‫در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ ،CBW‬ﻫﻤﺎﻧﻄﻮرﻳﻜﻪ ﻗﺒﻼً ﮔﻔﺘﻪ ﻣﻲﺷﻮد ﻣـﻲﺗـﻮان ﺑـﺮاي‬


‫ﺗﺒﺪﻳﻞ ﺑﺎﻳﺖ ﺑﻪ ‪ word‬اﺳﺘﻔﺎده ﻧﻤﻮد‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻘـﺪار ﻣـﻮرد ﻧﻈـﺮ را در ‪ AL‬ﻗـﺮار‬
‫ﻣﻲدﻫﻴﻢ و ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬ﻧﺘﻴﺠﻪ در ‪ AX‬ﻗﺮار ﻣﻲﮔﻴـﺮد‪ .‬اﻣـﺎ ﺑـﺮاي‬
‫‪٢٧٧‬‬

‫‪ double‬ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻣﻘﺪار ﻣﻮرد ﻧﻈـﺮ را در ﺛﺒـﺎت ‪ AX‬ﻗـﺮار‬ ‫‪word‬‬ ‫ﺗﺒﺪﻳﻞ ‪ word‬ﺑﻪ‬
‫داده ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬ﻧﺘﻴﺠﻪ در ‪ EAX‬ﻗﺮار ﻣﻲﮔﻴﺮد‪.‬‬
‫در ﻣﻮرد ‪ ADC‬ﻣﻲﺗﻮاﻧﻴﻢ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را اﺳﺘﻔﺎده ﻧﻤﺎﺋﻴﻢ‪.‬‬
‫‪ADC‬‬ ‫‪AL , 4‬‬
‫‪ADC‬‬ ‫‪AX , 298‬‬
‫‪ADC‬‬ ‫‪EBX , 22334455H‬‬
‫‪ADC‬‬ ‫‪TABLE [SI] , 2‬‬
‫‪ADC‬‬ ‫‪NUMBE, 12345678‬‬
‫‪ADC‬‬ ‫‪DL , BL‬‬
‫‪ADC‬‬ ‫‪SI , X‬‬
‫‪ADC‬‬ ‫‪X, SI‬‬

‫ﻧﻤﺎﺋﻴﻢ‪:‬‬ ‫در ﻣﻮرد ‪ CMP‬ﻣﻲﺗﻮاﻧﻴﻢ از دﺳﺘﻮراﻟﻌﻠﻬﺎي ذﻳﻞ اﺳﺘﻔﺎده‬

‫‪CMP‬‬ ‫‪BL , 5‬‬


‫‪CMP‬‬ ‫‪EAX , 0FFFF0000H‬‬
‫‪CMP‬‬ ‫‪AL , 7‬‬
‫‪CMP‬‬ ‫‪AX , BX‬‬
‫‪CMP‬‬ ‫‪EDX , EAX‬‬
‫‪CMP‬‬ ‫‪EBX , Y‬‬

‫ﻧﻤﺎﺋﻴﻢ‪:‬‬ ‫در ﻣﻮرد ‪ MOV‬از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﺑﻌﻨﻮان ﻣﺜﺎل ﻣﻲﺗﻮاﻧﻴﻢ اﺳﺘﻔﺎده‬

‫‪MOV‬‬ ‫‪AX , Y‬‬


‫‪MOV‬‬ ‫‪ECX , X‬‬
‫‪MOV‬‬ ‫‪X , AL‬‬
‫‪MOV‬‬ ‫‪BX , ES‬‬
‫‪MOV‬‬ ‫‪TABLE [BX] , SS‬‬
‫‪MOV‬‬ ‫‪DS , AX‬‬
‫‪MOV‬‬ ‫‪EAX , ECX‬‬
‫‪MOV‬‬ ‫]‪CX, [BP][SI‬‬
‫‪MOV‬‬ ‫‪EAX, 12345678H‬‬

‫در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ﺿﺮب ﺑﻌﻨﻮان ﻣﺜـﺎل ﻣـﻲﺗـﻮاﻧﻴﻢ از دﺳـﺘﻮراﻟﻌﻤﻞ ذﻳـﻞ اﺳـﺘﻔﺎده‬
‫ﻧﻤﺎﺋﻴﻢ‪:‬‬
‫‪MOV‬‬ ‫‪EAX, 0FCAB1234H‬‬
‫‪MUL‬‬ ‫‪EBX‬‬
‫‪٢٧٨‬‬

‫ﻛﻪ ﻧﺘﻴﺠﻪ در ‪ EDX : EAX‬ذﺧﻴﺮه ﻣﻲﮔﺮدد‪.‬‬

‫ﻧﻤﻮد‪:‬‬ ‫در ﻣﻮرد ‪ NEG‬ﻣﻲﺗﻮان از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ اﺳﺘﻔﺎده‬

‫‪NEG‬‬ ‫‪AL‬‬
‫‪NEG‬‬ ‫‪EBX‬‬

‫ﺑﺮﻳﻢ‪:‬‬ ‫در ﻣﻮرد ‪ NOT‬ﻣﻲﺗﻮاﻧﻴﻢ ﺑﻌﻨﻮان ﻣﺜﺎل دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را ﺑﻜﺎر‬

‫‪NOT‬‬ ‫‪AL‬‬
‫‪NOT‬‬ ‫‪AX‬‬
‫‪NOT‬‬ ‫‪EBX‬‬

‫در ﻣﻮرد ‪ PUSH‬و ‪ POP‬ﻣﻲﺗﻮاﻧﻴﻢ ﺑﻌﻨﻮان ﻣﺜﺎل از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ اﺳﺘﻔﺎده ﻧﻤﺎﺋﻴﻢ‪:‬‬

‫‪POP‬‬ ‫‪CX‬‬
‫‪POP‬‬ ‫‪EAX‬‬
‫‪POP‬‬ ‫‪SS‬‬
‫‪PUSH‬‬ ‫‪BX‬‬
‫‪PUSH‬‬ ‫‪EAX‬‬
٢٧٩

80386 ‫ﻣﺠﻤﻮﻋﻪ ﻛﺎﻣﻞ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي‬


10-1 ‫ﺟﺪول‬
Instruction Meaning Assembler Format
AAA ASCII Adjust after Add AAA
AAD ASCII Adjust before Divide AAD
AAM ASCII Adjust after Multiply AAM
AAS ASCII Adjust after Subtract AAS
ADC Add with Carry ADC Dest,src
ADD Add ADD Dest,src
AND Logical AND AND Dest,src
ARRL Adjust RPL Field of Selector ARPL Sel,reg
BOUND Check Array Bounds BOUND Reg,bound
BSF Bit Scan Forward BSF Dest,src
BSR Bit Scan Reverse BSR Dest,src
BT Bit Test BT Base,offset
BTC Bit Test and complement BTC Base,offset
BTR Bit Test and Reset BTR Base,offset
BTS Bit Test and Set BTS Base,offset
CALL Call Procedure CALL Dest
CBW Convert Byte to Word CBW
CDQ Convert Double Word to Quad Word CDQ
CLC Clear Carry Flag CLC
CLD Clear Direction Flag CLD
CLI Clear Interrupt Flag CLI
CLTS Clear Task-Switched Flag CLTS
CMC Complement Carry Flag CMC
CMP Compare CMP Dest,src
CMPS Compare Strings CMPS Dest,src
CWD Convert Word to Double Word* CWD
CWDE Convert Word to Double Word* CWDE
DAA Decimal Adjust after Add DAA
DAS Decimal Adjust after Subtract DAS
DEC Decrement by 1 DEC Dest
DIV Unsigned Divide DIV Acc,src
ENTER Make Stack Frame for Procedure ENTER Storage,level
ESC Escape ESC
HLT Halt HLT
IDIV Signed Divide IDIV Acc,src
IMUL Signed Multiply IMUL Acc,src
IN Input from Port IN Acc,port
INC Increment by 1 INC Dest
INT Software Interrupt (Trap) INT Inttype
INTO Interrupt If Overflow INTO
IRET Interrupt Retum IRET
٢٨٠

Instruction Meaning Assembler Format


JA Jump If Above JA Dest
JAE Jump If Above or Equal JAE Dest
JB Jump If Below JB Dest
JBE Jump If Below or Equal JBE Dest
JC Jump If Carry JC Dest
JCXZ Jump If CX Is Zero JCXZ Dest
JE Jump If Equal JE Dest
JECXZ Jump If ECX Is Zero JECXZ Dest
JG Jump If Greater JG Dest
JGE Jump If Greater or Equal JGE Dest
JL Jump If Less JL Dest
JLE Jump If Less or Equal JLE Dest
JMP Jump Unconditionally JMP Dest
JNA Jump If Not Above JNA Dest
JNAE Jump If Not Above or Equal JNAE Dest
JNB Jump If Not Below JNB Dest
JNBE Jump If Not Below or Equal JNBE Dest
JNC Jump If No Carry JNC Dest
JNE Jump If Not Equal JNE Dest
JNG Jump If Not Greater JNG Dest
JNGE Jump If Not Greater or Equal JNGE Dest
JNL Jump If Not Less JNL Dest
JNLE Jump If Not Less or Equal JNEL Dest
JNO Jump if No Overflow JNO Dest
JNP Jump if Parity Odd JNP Dest
JNS Jump if Sign Positive JNS Dest
JNZ Jump if Not Zero JNZ Dest
JO Jump if Overflow JO Dest
JP Jump if parity Even JP Dest
JPE Jump if parity Even JPE Dest
JPO Jump if parity Odd JPO Dest
JS Jump if Sign Negative JS Dest
JZ Jump if Zero JZ Dest
LAHF Load Flags into AH Register LAHF
LAR Load Access Rights Byte LAR Reg,src
LDS Load DS Register LDS Reg,src
LEA Load Effective Address LEA Reg,src
LEAVE Leave Procedure LEAVE
LES Load ES Register LES Reg,src
LFS Load FS Register LFS Reg,src
LGS Load GS Register LGS Reg,src
LGDT Load GDT Register LGDT Src
LIDT Load IDT Register LIDT Src
٢٨١

Instruction Meaning Assembler Format


LLDT Load LDT Register LLDT Src
LMSW Load Machine Status Word LMSW Src
LOCK Lock Bus LOCK
LODS Load String LODS Src
LOOP Loop with CX Counter LOOP Dest
LOOPE Loop If Equal LOOPE Dest
LOOPNE Loop If Not Equal LOOPNE Dest
LOOPNZ Loop If Not Zero LOOPNZ Dest
LOOPZ Loop If Zero LOOPZ Dest
LSL Load Segment Limit LSL Reg,src
LSS Load SS Register LSS Reg,src
LTR Load Task Register LTR Src
MOV Move Data MOV Dest,src
MOV Move to/from Special Regs MOV Dest,src
MOVS Move String MOVS Dest,src
MOVSX Move with Sign-Extend MOVSX Reg,src
MOVZX Move with Zero-Extend MOVZX Reg,src
MUL Unsigned Multiply MUL Acc,src
NEG 2’s Complement Negation NEG Dest
NOP No Operation NOP
NOT 1’s Complement Negation NOT Dest
OR Logical Inclusive OR OR Dest,src
OUT Output to Port OUT Port,acc
OUTS Output String OUTS DX,src
POP Pop Operand off Stack POP Dest
POPA Pop All General Registers POPA
POPF Pop Flags off Stack POPF
PUSH Pop Operand Onto Stack PUSH Src
PUSHA Push All General Registers PUSHA
PUSHF Push Flags onto Stack PUSHF
RCL Rotate Left through Carry RCL Dest,count
RCR Rotate Right through Carry RCR Dest,count
REP Repeat REP
REPE Repeat while Equal REPE
REPNE Repeat while Not Equal REPNE
REPNZ Repeat while Not Zero REPNZ
REPZ Repeat while Zero REPZ
RET Repeat from Procedure RET
ROL Rotate Left ROL Dest,count
ROR Rotate Right ROR Dest,count
SAHF Store AH Register in Flags SAHF
SAL Shift Arithmetic Left SAL Dest,count
SAR Shift Arithmetic Right SAR Dest,count
٢٨٢

Instruction Meaning Assembler Format


SBB Subtract with Borrow SBB Dest,src
SCAS Compare String SCAS Dest
SETcc Set Byte on Condition SETcc Dest
SGDT Store GDT Register SGDT Dest
SHL Shift Logical Left SHL Dest, count
SHLD Double Precision Shift Left SHLD Dest, src,count
SHR Shift Logical Right SHR Dest,count
SHRD Double Precision Shift Right SHRD Dest,src,count
SIDT Store IDT Register SIDT Dest
SLDT Store LDT Register SLDT Dest
SMSW Store Machine Status Word SMSW Dest
STC Set Carry Flag STC
STD Set Direction Flag STD
STI Set Interrupt Flag STI
STOS Store String STOS Dest
STR Store Task Register STR Dest
SUB Subtract SUB Dest,src
TEST Logical Compare TEST Dest,src
VERR Verify Segment for Reading VERR Sel
VERW Verify Segment for Writing VERW Sel
WAIT Wait until BUSY#Negated WAIT
XCHG Exchange Operand, Register XCHG Dest,src
XLAT Table Lookup XLAT Source-table
XOR Logical Exclusive OR XOR Dest,src

*CWD sign extends register AX into registers DX and AX, whereas CWDE sign
extends AX into EAX.
٢٨٣

10-2 ‫ﺟﺪول‬
DEC Subtract 1
INC Add 1
NOT Logical NOT (complement or invert)
ROL Rotate left
ROR Rotate right
SBB Subtract with borrow
SHL Shift logical left
SHR Shift logical right
SUB Subtract
TEST Bit test
Program control
CALL Call subroutine
INT Interrupt (trap)
JA Jump if above
JAE Jump if above or equal
JB Jump if below
JBE Jump if below or equal
JC Jump if carry
JE Jump if equal
JMP Jump unconditionally
JNC Jump if not carry
JNE Jump if not equal
JNS Jump if not sign
JNZ Jump if non zero
JS Jump if sign
JZ Jump if zero
RET Return from subroutine
٢٨٤

10-3 ‫ﺟﺪول‬

Frequently Used 80386 Instructions


ADC Add with carry
ADD Add
AND Logical AND
CALL Call subroutine
CMP Compare
DEC Subtract 1
IN Input
INC Add 1
INT Interrupt (trap)
JA Jump if above
JAE Jump if above or equal
JB Jump if below
JBE Jump if below or equal
JC Jump if carry
JE Jump if equal
JMP Jump unconditionally
JNC Jump if not carry
JNE Jump if not equal
JNS Jump if sign positive
JNZ Jump if not zero
JS Jump if sign negative
LEA Load effective address
MOV Move
NOT Logical NOT
(complement or invert)
OUT Output
POP Load from stack
PUSH Store on stack
RET Return from subroutine
ROL Rotate left
ROR Rotate right
SBB Subtract with borrow
‫‪٢٨٥‬‬

‫ﻣﺮوري ﺑﺮ ﻣﻄﺎﻟﺐ ﻓﺼﻞ‬

‫در اﻳﻦ ﻓﺼﻞ در ﻣﻮرد رﻳﺰ ﭘﺮدازﻧﺪه ‪ 80386‬ﺑﺤـﺚ ﮔﺮدﻳـﺪ‪ .‬ﻫﻤـﺎﻧﻄﻮري ﻛـﻪ‬
‫ﮔﻔﺘﻪ ﺷﺪ اﻳﻦ رﻳﺰ ﭘﺮدازﻧﺪه ﻳﻚ رﻳﺰﭘﺮدازﻧﺪه ‪ 32‬ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷـﺪ و ﺗﻤـﺎم دﺳـﺘﻮراﻟﻌﻤﻞ‬
‫ﻫﺎﻳﻲ ﻛﻪ روي رﻳﺰﭘﺮدازﻧﺪه ‪ 80286‬اﺟﺮا ﻣﻲ ﺷﻮد روي اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه ﻧﻴﺰﻗﺎﺑﻞ اﺟـﺮا‬
‫ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﺛﺒﺎت ﻫﺎي ‪ 32‬ﺑﻴﺘﻲ آن ﻋﺒﺎرﺗﻨﺪ از ‪ . EDXٍ ، ECXٍ ، EBX ، EAX‬در ﺿـﻤﻦ‬
‫ﻣﻲ ﺗﻮان از ﺛﺒـﺎت ﻫـﺎي ‪، CH ، CL ، BH ، BL ، AH ، AL ، DX ، CX ، BX ، AX‬‬
‫‪ DH ، DL‬و ‪ ...‬اﺳــﺘﻔﺎده ﻧﻤــﻮد‪.‬درﻧﻬﺎﻳــﺖ ﺟــﺪول ﻛﻠــﻲ ﻓﺮﻣــﺖ دﺳــﺘﻮراﻟﻌﻤﻠﻬﺎ ﺑــﺮاي‬
‫رﻳﺰﭘﺮدازﻧﺪه ‪ 80386‬داده ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺎ ﻣﺮور آن ﻣﻲ ﺗﻮان ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺨﺘﻠﻔﻲ را ﺑﻪ‬
‫راﺣﺘﻲ ﻧﻮﺷﺖ و ﺑﺮ روي اﻳﻦ رﻳﺰﭘﺮدازﻧﺪه اﺟﺮا ﻧﻤﻮد‬
٢٨٦

1 ‫ﺿﻤﻴﻤﻪ‬
(OPERATORS) ‫ﻋﻤﻠـﮕﺮﻫﺎ‬
Operator Function
Arithmetic
+ Format: value1 + value2
Adds value1 and value2.

- Format: value1 – value2


Subtracts value2 from value1.

* Format: value1 * value2


Multiplies value2 by value1.

/ Format: value1 / value2


Divides value1 by value2, and returns the
quotient.
MOD Format: value1 MOD value2
Divides value1 by value2, and returns the
Remainder.

SHL Format: value SHL expression


Shifts value left by expression bit positions.

SHR Format: value SHR expression


Shifts value right by expression bit positions.
٢٨٧

Operator Function
Logical
AND Format: value1 AND value2
Takes logical AND of value1 and value2.

OR Format: value1 OR value2


Takes logical inclusive-OR of value1 and
value2.

XOR Format: value1 XOR valure2


Takes logical exclusive-OR of value1 and
Value2.

NOT Format: NOT value


Reverses the state of each bit in value; that is, it takes
the one’s complement.
Relational
EQ Format: operand1 EQ operand2
True if the two operands are identical.

NE Format: operad1 NE operand2


True if the two operands are not identical.

LT Format: operand1 LT operand2


True if operand1 is less than operand2.

GT Format: operand1 GT operand2


True if operand1 is greater than operand2.

LE Format: operand1 LE operand2


True if operand1 is less than or equal to operand2.
GE Format: operand1 GE operand2
True if operand1 is greater than or equal to operand2.

Value - Returning

$ Format: $
Returns the current value of the location
counter.

SEG Format: SEG variable


Or
SEG label
Returns the segment value of variable or label.
٢٨٨

Operator Function
OFFSET Format: OFFSET variable
Or
OFFSET label
Returns the offset value of variable or label.

LENGTH Format: LENGTH variable


Returns the length in units (bytes or words) for any
variable defined using DUP.

TYPE Format: TYPE variable


Or
TYPE label
For variables, TYPE returns 1 (BYTE),
2(WORD), or 4 (DOUBLEWORD). For
labels, it returns –1 (NEAR) or-2(FAR).
Value-Returning
SIZE Format: SIZE variable
Returns the product of LENGTH times TYPE.
Attribute
Format: type PTR expression
Overrides the type (BYTE or WORD) or distance
PTR (NEAR or FAR) of a memory address operand. Type is
the new attribute and expression is the identifier whose
attribute is to to be overridden.

DS: Format: seg –reg: addr-expr


ES: or
SS: seg-reg: label
CS: or
seg-reg: variable
Overrides the segment attribute of a label, variable, or
address expression.
SHORT Format: JMP SHORT labe1
Tells the assembler that the JMP target label is no
farther than 127 bytes past the next instruction.

THIS Format: THIS attribute


or
THIS type
Creates a memory address operand of either distance
attribute (NEAR or FAR) or either type attribute (BYTE
or WORD) at an offset equal to the current value of the
location counter and a segment attribute of the enclosing
segment.
٢٨٩

Operator Function
HIGH Format: HIGH value
or
HIGH expression
Returns the high-order byte of a 16-bit numeric value or
address expression.
Attribute
LOW Format: LOW value
or
LOW expression
Returns the low-order byte of a 16-bit numeric value or
address expression.
٢٩٠

2 ‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره‬
Instruction Set Summary
For each instruction, it shows the general assembler format and which
flags are affected. In the Flags column, -means unchanged, * means may have
changed, and? Means undefined.

Flags
mnemonic Assembler format

OF

DF

AF

CF
TF

ZF

PF
SF
IF
AAA AAA ? - - - ? ? * ? *
AAD AAD ? - - - * * ? * ?
AAM AAM ? - - - * * ? * ?
AAS AAS ? - - - ? ? * ? *
ADC ADC Destination,source * - - - * * * * *
ADD ADD Destination,source * - - - * * * * *
AND AND Destination,source 0 - - - * * ? * 0
BOUND BOUND Reg16,source - - - - - - - - -
CALL CALL Target - - - - - - - - -
CBW CBW - - - - - - - - -
CLC CLC - - - - - - - - 0
CLD CLD - 0 - - - - - - -
CLI CLI - - 0 - - - - - -
CMC CMC - - - - - - - - *
CMP CMP Destination,source * - - - * * * * *
CMPS CMPS Dest-string,source- * - - - * * * * *
string
CMPSB CMPSB * - - - * * * * *
CMPSW CMPSW * - - - * * * * *
CWD CWD - - - - - - - - -
DAA DAA ? - - - * * * * *
DAS DAS ? - - - * * * * *
DEC DEC Destination * - - - * * * * -
DIV DIV Source ? - - - ? ? ? ? ?
ENTER ENTER Immed16,level - - - - - - - - -
ESC ESC Ext,opcode,source - - - - - - - - -

HLT HLT - - - - - - - - -

IDIV IDIV source ? - - - ? ? ? ? ?


IMUL IMUL Source * - - - ? ? ? ? *
IMUL IMUL Dest[,source],immed * - - - ? ? ? ? *
IN IN Accumulator,port - - - - - - - - -
INC INC Destination * - - - * * * * -
INS INS Dest-string,DX - - - - - - - - -
INT INT Interrupt-type - - 0 0 - - - - -
INTO INTO - - 0 0 - - - - -
٢٩١

Flags
mnemonic Assembler format

OF

DF

AF

CF
TF

ZF

PF
SF
IF
IRET IRET * * * * * * * * *

JA/JNBE JA Short-label - - - - - - - - -
JAE/JNB JAE Short-label - - - - - - - - -
JB/JNAE/JC JB Short-label - - - - - - - - -
JBE/JNA JBE Short-label - - - - - - - - -
JCXZ JCXZ Short-label - - - - - - - - -
JE/JZ JE Short-label - - - - - - - - -
JG/JNLE JG Short-label - - - - - - - - -
JGE/JNL JGE Short-label - - - - - - - - -
JL/JNGE JL Short-label - - - - - - - - -
JLE/JNG JLE Short-label - - - - - - - - -
JMP JMP Target - - - - - - - - -
JNC JNC Short-label - - - - - - - - -
JNE/JNZ JNE Short-label - - - - - - - - -
JNO JNO Short-label - - - - - - - - -
JNP/JPO JNP Short-label - - - - - - - - -
JNS JNS Short-label - - - - - - - - -
JO JO Short-label - - - - - - - - -
JP/JPE JP Short-label - - - - - - - - -
JS JS Short-label - - - - - - - - -
LAHF LAHF - - - - - - - - -
LDS LDS Reg16,mem32 - - - - - - - - -
LEA LEA Reg16,mem16 - - - - - - - - -
LEAVE LEAVE - - - - - - - - -
LES LES Reg16,mem32 - - - - - - - - -
LOCK LOCK - - - - - - - - -
LODS LODS Source-string - - - - - - - - -
LODSB LODSB - - - - - - - - -
LODSW LODSW - - - - - - - - -
LOOP LOOP Short-label - - - - - - - - -
LOOPE/LOOPZ LOOPE Short-label - - - - - - - - -
LOOPNE/LOO LOOPNE Short-label - - - - - - - - -
PNZ
MOV MOV Destination, source - - - - - - - - -
MOVS MOVS Dest-string,source- - - - - - - - - -
string
MOVSB MOVSB - - - - - - - - -
MOVSW MOVSW - - - - - - - - -
MUL MUL Source * - - - ? ? ? ? *

NEG NEG Destination * - - - * * * * *


NOP NOP - - - - - - - - -
NOT NOT Destination - - - - - - - - -

OR OR Destination, source 0 - - - * * ? * 0
OUT OUT Port, accumulator - - - - - - - - -
OUTS OUTS DX, source-string - - - - - - - - -

POP POP destination - - - - - - - - -


٢٩٢

Flags
mnemonic Assembler format

OF

DF

AF

CF
TF

ZF

PF
SF
IF
POPA POPA - - - - - - - - -
POPF POPF * * * * * * * * *
PUSH PUSH Source - - - - - - - - -
PUSH PUSH Immediate - - - - - - - - -
PUSHA PUSHA - - - - - - - - -
PUSHF PUSHF - - - - - - - - -

RCL/RCR RCL Destination,1 * - - - - - - - *


RCL/RCR RCL Destination, CL ? - - - - - - - *
RCL/RCR RCL Destination, count ? - - - - - - - *
REP REP - - - - - - - -
REPE/REPZ REPE - - - - - - - - -
REPNE/REPNZ REPNE - - - - - - - - -
RET [pop-value] - - - - - - - - -
ROL/ROR ROL Destination, 1 * - - - - - - - *
ROL/ROR ROL Destination, CL ? - - - - - - - *
ROL/ROR ROL Destination, count ? - - - - - - - *
SAHF SAHF - - - - * * * * *
SAL/SHL SAL Destination, 1 * - - - * * ? * *
SAL/SHL SAL Destination, CL ? - - - * * ? * *
SAL/SHL SAL Destination, count ? - - - * * ? * *
SAR SAR Destination, 1 0 - - - * * ? * *
SAR SAR Destination, CL ? - - - * * ? * *
SAR SAR Destination, count ? - - - * * ? * *
SBB SBB Destination, source * - - - * * * * *
SCAS SCAS Dest-string * - - - * * * * *
SCASB SCASB * - - - * * * * *
SCASW SCASW * - - - * * * * *
SHR SHR Destination,1 * - - - 0 * ? * *
SHR SHR Destination, CL ? - - - 0 * ? * *
SHR SHR Destination, count ? - - - 0 * ? * *
STC STC - - - - - - - - 1
STD STD - 1 - - - - - - -
STI STI - - 1 - - - - - -
STOS STOS Dest-string - - - - - - - - -
STOSB STOSB - - - - - - - - -
STOSW STOSW - - - - - - - - -
SUB SUB Destination, source * - - - * * * * *

TEST TEST Destination, source 0 - - - * * ? * 0

WAIT WAIT - - - - - - - - -

XCHG XCHG Destination, source - - - - - - - - -


XLAT XLAT Source-table - - - - - - - - -
XOR XOR Destination, source 0 - - - * * ? * 0
٢٩٣

3 ‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره‬
Instruction times

Instruction Clocks Bytes


AAA 3 1

AAD 14 2

AAM 16 1

AAS 3 1

ADC Register, Register 2 2


ADC Register, memory 7* 2-4
ADC Memory, register 7* 2-4
ADC Register, immediate 3 3-4
ADC Memory, immediate 7* 3-6
ADC Accumulator; immediate 3 2-3

ADD Register, register 2 2


ADD Register, memory 7* 2-4
ADD Memory, register 7* 2-4
ADD Register, immediate 3 3-4
ADD Memory, immediate 7* 3-6
ADD Accumulator; immediate 3 2-3

AND Register, register 2 2


AND Register, memory 7* 2-4
AND Memory, register 7* 2-4
AND Register, immediate 3 3-4
AND Memory, immediate 7* 3-6
AND Accumulator; immediate 3 2-3

BOUND reg16,source 13* 2

CALL Near-proc 7+m 3


CALL Far-proc 13+m 5
CALL Memptr16 11+m* 2-4
CALL Regptr16 7+m 2
CALL Memptr32 16+m 2-4
٢٩٤

Instruction Clocks Bytes


CBW 2 1

CLC 2 1

CLD 2 1

CL1 3 1

CMC 2 1

CMP Register, register 2 2


CMP Register, memory 6* 2-4
CMP Memory, register 7* 2-4
CMP Register, immediate 3 3-4
CMP Memory, immediate 6* 3-6
CMP Accumulator; immediate 3 2-3

CMPS Dest-string, source-string 8 1


CMPS (repeat)dest-string,source-string 5+9(rep) 1

CWD 2 1

DAA/DAS 3 1

DEC Register 2 1-2


DEC Memory 7* 2-4

DIV Reg8 14 2
DIV Reg16 22 2
DIV Mem8 17* 2-4
DIV Mem16 25* 2-4

ENTER Immed16,0 11 4
ENTER Immed16,1 15 4
ENTER Immed16,level 12+4(L) 4

ESC Immediate, memory 9-20* 2-4


ESC Immediate, register 2 2

HLT 2 1

IDIV Reg8 17 2
IDIV Reg16 25 2
٢٩٥

Instruction Clocks Bytes


IDIV Mem8 20* 2-4
IDIV Mem16 28* 2-4

IMUL Reg8 13 2
IMUL Reg16 21 2
IMUL Mem8 16* 2-4
IMUL Mem16 24* 2-4
IMUL Dest-reg,reg16,immediate 21* 3-4
IMUL Dest-reg, memory, immediate 24* 3-4

IN Accumulator, immed8 5 2
IN Accumulator, DX 5 1

INC Register 2 1-2


INC Memory 7* 2-4

INS Dest-string, DX 5 1
INS (rep) dest-string,DX 5+4(rep) 1

INT Immed8 23+m 1-2

INTO 24+m or 3 1

IRET 17+M 1

All conditional jump instructions except JCXZ:


Jccc Short-label 7+m or 3 2

JCXZ Short-label 8+m or 4 2

JMP Short-label 7+m 2


JMP Near-label 7+m 3
JMP Far-label 11+m 5
JMP Memptr16 11+m* 2-4
JMP Regptr16 7+m 2
JMP Memptr32 15+m* 2-4

LAHF 2 1

LDS Reg16, mem32 7* 2-4

LEA Reg16,mem16 3* 2-4


٢٩٦

Instruction Clocks Bytes


LEAVE 5 1

LES Reg16, mem32 7* 2-4

LOCK 0 1

LODS Source-string 5 1
LODS (repeat)source-string 5+4(rep) 1

LOOP Short-label 8+m or 4 2


LOOPE/LOOPZ Short-label 8+m or 4 2
LOOPNE/LOOPNZ Short-label 8+m or 4 2

MOV Memory, accumulator 3 3


MOV Accumulator, memory 5 3
MOV Register, register 2 2
MOV Register, memory 5* 2-4
MOV Memory, register 3* 2-4
MOV Register, immediate 2 2-3
MOV Memory, immediate 3* 3-6
MOV Seg-reg,reg16 2 2
MOV Seg-reg-mem16 5* 2-4
MOV Reg16,seg-reg 2 2
MOV Memory, seg-reg 3* 2-4

MOVS Dest-string,source-string 5 1
MOVS (repeat)dest-string,source-string 5+4(rep) 1

MUL Reg8 13 2
MUL Reg16 21 2
MUL Mem8 16* 2-4
MUL Mem16 24* 2-4

NEG Register 2 2
NEG Memory 7* 2-4

NOP 2 1

NOT Register 2 2
NOT Memory 7* 2-4

OR Register, register 2 2
OR Register, memory 7* 2-4
٢٩٧

Instruction Clocks Bytes


OR Memory, register 7* 2-4
OR Register, immediate 3 3-6
OR Memory, immediate 7* 3-6
OR Accumulator; immediate 3 2-3

OUT Immed8, accumulator 3 2


OUT DX, accumulator 3 1

OUTS DX,source-string 5 1
OUTS (rep)DX, source-string 5+4(rep) 1

POP Register 5 1
POP Memory 5* 2-4

POPA 19 1

POPE 5 1

PUSH Register 3 1
PUSH Memory 5* 2-4
PUSH Immediate 3 2-3
PUSHA 17 1

PUSHF 3 1

RCL/RCR/ROL/ROR register,1 2 2
RCL/RCR/ROL/ROR register, CL 5+1/bit 2
RCL/RCR/ROL/ROR memory,1 7* 2-4
RCL/RCR/ROL/ROR memory, CL 8*+1/bit 2-4
RCL/RCR/ROL/ROR reg, count 5+1/bit 3
RCL/RCR/ROL/ROR memory, count 8*+1/bit 3-5

REP 0 1
REPE/REPZ 0 1
REPNE/REPNZ 0 1

RET (near, no pop) 11+M 1


RET (near, pop) 11+M 3
RET (far, no pop) 15+M 1
RET (far, pop) 15+M 3

SAHF 2 1
٢٩٨

Instruction Clocks Bytes


SAL/SHL/SAR/SHR register, 1 2 2
SAL/SHL/SAR/SHR register, CL 5+1/bit 2
SAL/SHL/SAR/SHR memory,1 7* 2-4
SAL/SHL/SAR/SHR memory, CL 8*+1/bit 2-4
SAL/SHL/SAR/SHR reg, count 5+1/bit 3
SAL/SHL/SAR/SHR memory, count 8*+1/bit 3-5

SBB Register, register 2 2


SBB Register, memory 7* 2-4
SBB Memory, register 7* 2-4
SBB Register, immediate 3 3-4
SBB Memory, immediate 7* 3-6
SBB Accumulator; immediate 3 2-3

SCAS Dest-string 7 1
SCAS (repeat) dest-string 5+8(rep) 1

STC/STD/STI 2 1

STOS Dest-string 3 1
STOS (repeat) dest-string 4+3(rep) 1

SUB Register, register 2 2


SUB Register, memory 7* 2-4
SUB Memory, register 7* 2-4
SUB Register, immediate 3 3-4
SUB Memory, immediate 7* 3-6
SUB Accumulator; immediate 3 2-3

TEST Register, register 2 2


TEST Register, memory 6* 2-4
TEST Register, immediate 3 3-4
TEST Memory, immediate 6* 3-6
TEST Accumulator; immediate 3 2-3

WAIT 3 1

XCHG Accumulator, reg16 3 1


XCHG Memory, register 5* 2-4
XCHG Register, register 3 2

XLAT Source-table 5 1
٢٩٩

Instruction Clocks Bytes


XOR Register, register 2 2
XOR Register, memory 7* 2-4
XOR Memory, register 7* 2-4
XOR Register, immediate 3 3-4
XOR Memory, immediate 7* 3-6
XOR Accumulator; immediate 3 2-3
‫‪٣٠٠‬‬

‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره ‪4‬‬


‫ﻛﺪ ﻣﺎﺷﻴﻦ دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ‬

‫ﺛﺒﺎت ﺳﮕﻤﻨﺖ‬ ‫ﺛﺒﺎت ‪ 8‬ﺑﻴﺘﻲ‬ ‫ﺛﺒﺎت ‪ 16‬ﺑﻴﺘﻲ‬ ‫ﻛﺪ‬


‫‪ES‬‬ ‫‪AL‬‬ ‫‪AX‬‬ ‫‪000‬‬
‫‪CS‬‬ ‫‪CL‬‬ ‫‪CX‬‬ ‫‪001‬‬
‫‪SS‬‬ ‫‪DL‬‬ ‫‪DX‬‬ ‫‪010‬‬
‫‪DS‬‬ ‫‪BL‬‬ ‫‪BX‬‬ ‫‪011‬‬
‫‪AH‬‬ ‫‪SP‬‬ ‫‪100‬‬

‫‪CH‬‬ ‫‪BP‬‬ ‫‪101‬‬

‫‪DH‬‬ ‫‪SI‬‬ ‫‪110‬‬

‫‪BH‬‬ ‫‪DI‬‬ ‫‪111‬‬

‫ﻛﺪﮔﺬاري آدرس ﻣﻮﺛﺮ‬


‫‪R/m‬‬ ‫‪Mod=00‬‬ ‫‪ mod=10‬ﻳﺎ ‪Mod=01‬‬
‫‪000‬‬ ‫]‪[BX+SI‬‬ ‫ﺟﺎﺑﺠﺎﻳﻲ‪[BX+SI+‬‬ ‫]ﻣﻘﺪار‬
‫‪001‬‬ ‫]‪[BX+DI‬‬ ‫ﺟﺎﺑﺠﺎﻳﻲ‪[BX+DI+‬‬ ‫]ﻣﻘﺪار‬
‫‪010‬‬ ‫]‪[BP+SI‬‬ ‫ﺟﺎﺑﺠﺎﻳﻲ‪[BP+SI+‬‬ ‫]ﻣﻘﺪار‬
‫‪011‬‬ ‫]‪[BP+DI‬‬ ‫ﺟﺎﺑﺠﺎﻳﻲ‪[BP+DI+‬‬ ‫]ﻣﻘﺪار‬
‫‪100‬‬ ‫]‪[SI‬‬ ‫‪[SI+‬‬ ‫]ﻣﻘﺪار ﺟﺎﺑﺠﺎﻳﻲ‬
‫‪101‬‬ ‫]‪[DI‬‬ ‫‪[DI+‬‬ ‫]ﻣﻘﺪار ﺟﺎﺑﺠﺎﻳﻲ‬
‫‪110‬‬ ‫)ﺣﺎﻟﺖ ﻣﺴﺘﻘﻴﻢ(‬ ‫‪[BP+‬‬ ‫]ﻣﻘﺪار ﺟﺎﺑﺠﺎﻳﻲ‬
‫‪111‬‬ ‫]‪[BX‬‬ ‫‪[BX+‬‬ ‫]ﻣﻘﺪار ﺟﺎﺑﺠﺎﻳﻲ‬
‫‪٣٠١‬‬

‫ﻓﻴﻠﺪ “‪ ”mod‬در اﻳﻦ ﺣﺎﻟﺖﻫﺎ ﺗﻌﻴﻴﻦ ﻛﻨﻨﺪه آن اﺳﺖ ﻛﻪ ﭼﻨﺪ ﺑﺎﻳﺖ ﺑﻌﻨﻮان ﻣﻘﺪار‬
‫ﺟﺎﺑﺠﺎﻳﻲ وﺟﻮد دارد‪ .‬ﻣﻘﺪار ‪ 00‬ﺑﻪ اﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ ﺑﺎﻳـﺖ ﺟﺎﺑﺠـﺎﻳﻲ در ﻛـﺪ ﻣﺎﺷـﻴﻦ‬
‫وﺟﻮد ﻧﺪارد‪ .‬ﻳﻌﻨﻲ ﺣﺎﻟﺖ آدرس دﻫﻲ ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ ﺑﺎ ﺛﺒﺎت ﻳـﺎ آدرس دﻫـﻲ ﺷـﺎﺧﺺ‬
‫دار ﺑﺎ ﺛﺒﺎت ﭘﺎﻳﻪ ﺑﺪون ﻣﻘﺪار ﺟﺎﺑﺠﺎﻳﻲ اﺧﺘﻴﺎري اﺳﺖ‪ .‬ﻣﻘـﺪار ‪ 10‬در ﻓﻴﻠـﺪ “‪ ”mod‬ﺑـﻪ‬
‫اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ دو ﺑﺎﻳﺖ ﺟﺎﺑﺠﺎﻳﻲ در ﻛﺪ ﻣﺎﺷﻴﻦ وﺟﻮد دارد‪ ،‬اﻳﻦ ﻛﻠﻤﻪ ﺑﻪ ﻣﻘﺪاري‬
‫ﻛﻪ از ﺛﺒﺎت ﺷﺎﺧﺺ و ﻳﺎ ﺛﺒﺎت ﻣﺒﻨﺎ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ اﺿﺎﻓﻪ ﻣﻲﺷﻮد‪ .‬ﻣﻘـﺪار ‪ 01‬در ﻓﻴﻠـﺪ‬
‫“‪ ”mod‬ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻳﻚ ﺑﺎﻳﺖ ﺟﺎﺑﺠﺎﻳﻲ در ﻛﺪ ﻣﺎﺷﻴﻦ وﺟﻮددارد‪ ،‬اﻳﻦ ﺑﺎﻳﺖ‬
‫ﺑﻌﻨﻮان ﻳﻚ ﻋﺪد ﻋﻼﻣﺖ دار در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد و ﻗﺒﻞ از آﻧﻜﻪ ﺑـﺎ ﻣﻘـﺪاري ﻛـﻪ از‬
‫ﺛﺒﺎت ﺷﺎﺧﺺ و ﻳﺎ ﺛﺒﺎت ﻣﺒﻨﺎ ﺑﺪﺳﺖ ﻣﻲآﻳﺪ ﺟﻤﻊ ﮔﺮدد ﺑـﻪ ﻳـﻚ ﻛﻠﻤـﻪ ﺗﻮﺳـﻌﻪ ﭘﻴـﺪا‬
‫ﻣﻲﻛﻨﺪ‪.‬‬
‫ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻋﻤﻠﻮﻧﺪ ]‪ [BP‬در ﺟﺪول ﺑﺎﻻ ﻧﻴﺎﻣﺪه اﺳﺖ‪ .‬ﺗﺮﻛﻴﺐ ﻣﻨﻄﻘﻲ‬
‫‪ mod=00‬و ‪ r/m=110‬ﻳﻚ ﺟﻔﺖ وﻳﮋه اي اﺳﺖ ﻛﻪ ﺣﺎﻟﺖ ﻣﺴﺘﻘﻴﻢ ﺣﺎﻓﻈﻪ را ﻣﺸﺨﺺ‬
‫‪bp‬‬ ‫ﻣﻲﻛﻨﺪ‪ .‬اﻳﻦ ﺑﺪان ﻣﻌﻨﺎﺳﺖ ﻛﻪ ﻫﻴﭻ ﺣﺎﻟﺖ آدرس دﻫﻲ ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ ﺛﺒﺎت ﺑـﺎ ﺛﺒـﺎت‬
‫وﺟﻮد ﻧﺪارد‪ .‬اﺳﻤﺒﻠﺮ ]‪ [BP‬را ﺑﻪ ]‪ [BP+0‬ﺗﺒﺪﻳﻞ ﻛـﺮده و از ﺣﺎﻟـﺖ ‪ mod=01‬اﺳـﺘﻔﺎده‬
‫ﻛﺮده و ﺑﺎﻳﺖ ﺟﺎﺑﺠﺎﻳﻲ را ﺑﺮاﺑﺮ ﺻﻔﺮ ﻗﺮار ﻣﻲدﻫﺪ‪.‬‬
‫ﻛﻠﻤــﻪ آدرس در ﺟــﺪول ﺑﻌــﺪي در ﭘﺮاﻧﺘــﺰ ﻗــﺮار ﮔﺮﻓﺘــﻪ اﺳــﺖ زﻳــﺮا ﺗﻤــﺎم‬
‫‪r/m=110‬‬ ‫ﻋﻤﻠﻮﻧﺪﻫﺎي ﺣﺎﻓﻈﻪ ﺑﻪ ﺑﺎﻳﺖﻫﺎي اﺿﺎﻓﻲ ﻫﺪف ﻧﻴﺎز ﻧﺪارﻧﺪ‪ .‬اﮔـﺮ ‪ mod=00‬و‬
‫)آدرس دﻫﻲ ﻣﺴﺘﻘﻴﻢ( ﺑﺎﺷﺪ‪ ،‬دو ﺑﺎﻳﺖ اﺿﺎﻓﻲ وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ‪.‬‬
٣٠٢

5 ‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره‬
‫ﺟﺪول ﻛﺪ اﺳﻜﻲ‬
ASCII Character Sets
MSD 0 1 2 3 4 5 6 7
LSD 000 001 010 011 100 101 110 111
0 0000 NUL DLE SP 0 @ P p
1 0001 SOH DC1 ! 1 A Q a q
2 0010 STX DC2 “ 2 B R b r
3 0011 ETX DC3 # 3 C S c s
4 0100 EOT DC4 $ 4 D T d t
5 0101 ENQ NAK % 5 E U e u
6 0110 ACK SYN & 6 F V f v
7 0111 BEL ETB , 7 G W g w
8 1000 BS CAN ( 8 H X h x
9 1001 HT EM ) 9 I Y i y
A 1010 LF SUB * : J Z j z
B 1011 VT ESC + ; K [ k {
C 1100 FF FS , < L \ i |
D 1101 CR GS - = M ] m }
E 1110 SO RS . > N ↑ n ~
F 1111 SI US / ? O ← o DEL

NUL -Null DLE -Data Link Escape


SOH -Start of Heading DC -Device Control
STX -Start of Text NAK -Negative Acknowledge
ETX -End of Text SYN -Synchronous ldle
EOT -End of Transmission ETB -End of Transmission Block
ENQ -Enquiry CAN -Cancel
ACK -Acknowledge EM -End of Medium
BEL -Bell SUB -Substitute
BS -Backspace ESC -Escape
HT -Horizontal Tabulation FS -File Separator
LF -Line Feed GS -Group Separator
VT -Vertical Tabulation RS -Record separator
FF -Form Feed US -Unit Separator
CR -Carriage Return SP -Space (Blank)
SO -Shift Out DEL -Delete
SI -Shift In
٣٠٣

6 ‫ﺿﻤﻴﻤﻪ ﺷﻤﺎره‬
‫ﻛﺪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ‬

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


00 add mem8, reg8 mod reg r/m, (address)
01 add mem 16, reg16 mod reg r/m, (address)
02 add reg8, mem8 mod reg r/m, (address)
add reg8, reg8 11 dest_reg source_reg
03 add reg16, mem16 mod reg r/m, (address)
add reg16, reg16 11 dest_reg source_ reg
04 add al, imm8 immediate byte
05 add ax,imm16 immediate word
06 push es (none)
07 pop es (none)
08 or mem8, reg8 mod reg r/m, (address)
09 or mem16, reg16 mod reg r/m, (address)
0a or reg8, mem8 mod reg r/m, (address)
or reg8, reg8 11 dest_reg source_ reg
0b or reg16, mem16 mod reg r/m, (address)
or reg16, reg16 11 dest_reg source_ reg
0c or al, imm8 immediate byte
0d or ax, imm16 immediate word
0e push cs (none)
0f
10 adc mem8, reg8 mod reg r/m, (address)
11 adc mem16, reg16 mod reg r/m, (address)
12 adc reg8, mem8 mod reg r/m, (address)
adc reg8, reg8 11 dest_reg source_ reg
٣٠٤

13 adc reg16, mem16 mod reg r/m, (address)


adc reg16, reg16 11 dest_reg source_ reg
14 adc al, imm8 immediate byte
15 adc ax, imm16 immediate word
16 push ss (none)
17 pop ss (none)
18 sbb mem8, reg8 mod reg r/m, (address)
19 sbb mem16, reg16 mod reg r/m, (address)
1a sbb reg8, mem8 mod reg r/m, (address)
sbb reg8, reg8 11 dest_reg source_ reg
1b sbb reg16, mem16 mod reg r/m, (address)
sbb reg16, reg16 11 dest_reg source_ reg
1c sbb al, imm8 immediate byte
1d sbb ax, imm16 immediate word
1e push ds (none)
1f pop ds (none)
20 and mem8, reg8 mod reg r/m, (address)
21 and mem16, reg16 mod reg r/m, (address)
22 and reg8, mem8 mod reg r/m, (address)
and reg8, reg8 11 dest_reg source_ reg
23 and reg16, mem16 mod reg r/m, (address)
and reg16, reg16 11 dest_reg source_ reg
24 and al, imm8 immediate byte
25 and ax, imm16 immediate word
26 es segment override prefix byte
27 daa (none)
28 sub mem8, reg8 mod reg r/m, (address)
29 sub mem16, reg16 mod reg r/m, (address)
2a sub reg8, mem8 mod reg r/m, (address)
sub reg8, reg8 11 dest_reg source_ reg
٣٠٥

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


2b sub reg16, mem16 mod reg r/m, (address)
sub reg16, reg16 11 dest_reg source_ reg
2c sub al, imm8 immediate byte
2d sub ax, imm16 immediate word
2e cs segment override prefix byte
2f das (none)
30 xor mem8, reg8 mod reg r/m, (address)
31 xor mem16, reg16 mod reg r/m, (address)
32 xor reg8, mem8 mod reg r/m, (address)
xor reg8, reg8 11 dest_reg source_ reg
33 xor reg16, mem16 mod reg r/m, (address)
xor reg16, reg16 11 dest_reg source_ reg
34 xor al, imm8 immediate byte
35 xor ax,imm16 immediate word
36 ss segment override prefix byte
37 aaa (none)
38 cmp mem8, reg8 mod reg r/m, (address)
39 cmp mem16, reg16 mod reg r/m, (address)
3a cmp reg8, mem8 mod reg r/m, (address)
cmp reg8, reg8 11 dest_reg source_ reg
3b cmp reg16, mem16 mod reg r/m, (address)
cmp reg16, reg16 11 dest_reg source_ reg
3c cmp al, imm8 immediate byte
3d cmp ax, imm16 immediate word
3e ds segment override prefix byte
3f aas (none)
40 inc ax (none)
41 inc cx (none)
42 inc dx (none)
٣٠٦

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


43 inc bx (none)
44 inc sp (none)
45 inc bp (none)
46 inc si (none)
47 inc di (none)
48 dec ax (none)
49 dec cx (none)
4a dec dx (none)
4b dec bx (none)
4c dec sp (none)
4d dec bp (none)
4e dec si (none)
4f dec di (none)
50 push ax (none)
51 push cx (none)
52 push dx (none)
53 push bx (none)
54 push sp (none)
55 push bp (none)
56 push si (none)
57 push di (none)
58 pop ax (none)
59 pop cx (none)
5a pop dx (none)
5b pop bx (none)
5c pop sp (none)
5d pop bp (none)
5e pop si (none)
5f pop di (none)
٣٠٧

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


60-6f
70 jo displacement byte
71 jno displacement byte
72 jb/jnae/jc displacement byte
73 jnb/jae/jnc displacement byte
74 je/jz displacement byte
75 jne/jnz displacement byte
76 jbe/jna displacement byte
77 jnbe/ja displacement byte
78 js displacement byte
79 jns displacement byte
7a jp/jpe displacement byte
7b jnp/jpo displacement byte
7c jl/jnge displacement byte
7d jnl/jng displacement byte
7e jle/jng displacement byte
7f jnle/jg displacement byte
80 add mem8, imm8 mod 000 r/m, (address), immediate byte
add reg8, imm8 11 000 reg, immediate byte
or mem8, imm8 mod 001 r/m, (address), immediate byte
or reg8, imm8 11 001 reg, immediate byte
adc mem8, imm8 mod 010 r/m, (address), immediate byte
adc reg8, imm8 11 010 reg, immediate byte
sbb mem8, imm8 mod 011 r/m, (address), immediate byte
sbb reg8, imm8 11 011 reg, immediate byte
and mem8, imm8 mod 100 r/m, (address), immediate byte
and reg8, imm8 11 100 reg, immediate byte
sub mem8, imm8 mod 101 r/m, (address), immediate byte
sub reg8, imm8 11 101 reg, immediate byte
٣٠٨

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


xor mem8, imm8 mod 110 r/m, (address), immediate byte
xor reg8, imm8 11 110 reg, immediate byte
cmp mem8, imm8 mod 111 r/m, (address), immediate byte
cmp reg8, imm8 11 111 reg, immediate byte
81 and mem16,imm16 mod 000 r/m, (address), immediate word
and reg16,imm16 11 000 reg, immediate word
or mem16,imm16 mod 001 r/m, (address), immediate word
or reg16,imm16 11 001 reg, immediate word
adc mem16,imm16 mod 010 r/m, (address), immediate word
adc reg16,imm16 11 010 reg, immediate word
sbb mem16,imm16 mod 011 r/m, (address), immediate word
sbb reg16,imm16 11 011 reg, immediate word
and mem16,imm16 mod 100 r/m, (address), immediate word
and reg16,imm16 11 100 reg, immediate word
sub mem16,imm16 mod 101 r/m, (address), immediate word
sub reg16,imm16 11 101 reg, immediate word
xor mem16,imm16 mod 110 r/m, (address), immediate word
xor reg16,imm16 11 110 reg, immediate word
cmp mem16,imm16 mod 111 r/m, (address), immediate word
cmp reg16,imm16 11 111 reg, immediate word

82
83 mod 000 r/m, (address), immediate byte
and reg16,imm8 11 000 reg, immediate byte

or mem16, imm8 mod 001 r/m, (address), immediate byte

or reg16,imm8 11 001 reg, immediate byte

adc mem16, imm8 mod 010 r/m, (address), immediate byte

adc reg16,imm8 11 010 reg, immediate byte

sbb mem16, imm8 mod 011 r/m, (address), immediate byte

sbb reg16,imm8 11 011 reg, immediate byte


٣٠٩

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


and mem16, imm8 mod 100 r/m, (address), immediate byte

and reg16,imm8 11 100 reg, immediate byte

sub mem16, imm8 mod 101 r/m, (address), immediate byte


sub reg16,imm8 11 101 reg, immediate byte

xor mem16, imm8 mod 110 r/m, (address), immediate byte

xor reg16,imm8 11 110 reg, immediate byte

cmp mem16, imm8 mod 111 r/m, (address), immediate byte

cmp reg16,imm8 11 111 reg, immediate byte

84 test reg8, mem8 mod reg r/m, (address)


test reg8, reg8 11 dest_reg source_ reg

85 test reg16, mem16 mod reg r/m, (address)


test reg16, reg16 11 dest_reg source_ reg

86 xchg reg8, mem8 mod reg r/m, (address)


xchg reg8, reg8 11 dest_reg source_ reg

87 xchg reg16, mem16 mod reg r/m, (address)


xchg reg16, reg16 11 dest_reg source_ reg

88 mov mem8, reg8 mod reg r/m, (address)


mov mem8, reg8 11 dest_reg source_ reg

89 mov mem16, reg16 mod reg r/m, (address)


mov reg16, reg16 11 dest_reg source_ reg

8a mov reg8, mem8 mod reg r/m, (address)


8b mov reg16, mem16 11 dest_reg source_ reg (address)
8c mov mem16, sreg mod reg r/m, (address)
mov reg16, sreg 11 reg r/m
8d lea reg16, mem mod reg r/m, (address)
8e mov sreg, mem16 mod reg r/m, (address)
mov sreg, reg16 11 reg r/m
8f pop mem16 mod 000 r/m, (address)
٣١٠

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


90 nop (none)
91 xchg ax,cx (none)
92 xchg ax,dx (none)
93 xchg ax,bx (none)
94 xchg ax,sp (none)
95 xchg ax,bp (none)
96 xchg ax,si (none)
97 xchg ax,di (none)
98 cbw (none)
99 cwd (none)
9a call offest and segment number words
(far direct)
9b wait (none)
9c pushf (none)
9d popf (none)
9e sahf (none)
9f lahf (none)
A0 mov al, mem8 offset word (direct addressing)
A1 mov ax, mem16 offset word
A2 mov mem8, al offset word
A3 mov mem16, ax offset word
A4 movsh (none)
A5 movsw (none)
A6 cmpsb (none)
A7 cmpsw (none)
A8 test al, imm8 immediate byte
A9 test ax, imm16 immediate word
AA stosb (none)
AB stosw (none)
٣١١

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


AC lodsb (none)
AD lodsw (none)
AE scasb (none)
AF scasw (none)
B0 mov al, imm8 immediate byte
B1 mov cl, imm8 immediate byte
B2 mov dl, imm8 immediate byte
B3 mov bl, imm8 immediate byte
B4 mov ah, imm8 immediate byte
B5 mov ch, imm8 immediate byte
B6 mov dh, imm8 immediate byte
B7 mov bh, imm8 immediate byte
B8 mov ax, imm16 immediate word
B9 mov cx, imm16 immediate word
BA mov dx, imm16 immediate word
BB mov bx, imm16 immediate word
BC mov sp, imm16 immediate word
BD mov bp, imm16 immediate word
BE mov si, imm16 immediate word
BF mov di, imm16 immediate word
C0, C1
C2 ret imm16 immediate word
(near return)
C3 ret (none)
(near return)
C4 les reg16, mem mod reg r/m, (address)
C5 lds reg16, mem mod reg r/m, (address)
C6 mov mem8, imm8 mod 000 r/m, (address), immediate byte
mov reg8, imm8 11 000 r/m, immediate byte
٣١٢

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


C7 mov mem16, imm16 mod 000 r/m, (address), immediate word
mov reg1, imm16 11 000 r/m, immediate word
C8,C9
CA ret imm16 immediate word
(far return)
CB ret (none)
(far return)
CC int 3 (none)
CD int imm8 immediate byte
CE into (none)
CF iret (none)
D0 rol mem8,1 mod 000 r/m, (address)
rol reg8,1 11 000 reg
ror mem8,1 mod 001 r/m, (address)
ror reg8,1 11 001 reg
rcl mem8,1 mod 010 r/m, (address)
rcl reg8,1 11 010 reg
rcr mem8,1 mod 011 r/m, (address)
rcr reg8,1 11 011 reg
shl/sal mem8,1 mod 100 r/m, (address)
shl/sal reg8,1 11 100 reg
shr mem8,1 mod 101 r/m, (address)
shr reg8,1 11 101 reg
sar mem8,1 mod 111 r/m, (address)
sar reg8,1 11 111 reg

D1 rol mem16,1 mod 000 r/m, (address)


rol reg16,1 11 000 reg

ror mem16,1 mod 001 r/m, (address)

ror reg16,1 11 001 reg


٣١٣

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


rcl mem16,1 mod 010 r/m, (address)

rcl reg16,1 11 010 reg

rcr mem16,1 mod 011 r/m, (address)


rcr reg16,1 11 011 reg
shl/sal mem16,1 mod 100 r/m, (address)
shl/sal reg16,1 11 100 reg
shr mem16,1 mod 101 r/m, (address)
shr reg16,1 11 101 reg
sar mem16,1 mod 111 r/m, (address)
sar reg16,1 11 111 reg
(110 not used with 8088)
D2 rol mem8,cl mod 000 r/m, (address)
rol reg8,cl 11 000 reg
ror mem6,cl mod 001 r/m, (address)
ror reg8,cl 11 001 reg
rcl mem8,cl mod 010 r/m, (address)
rcl reg8,cl 11 010 reg
rcr mem8,cl mod 011 r/m, (address)
rcr reg8,cl 11 011 reg
shl/sal mem8, cl mod 100 r/m, (address)
shl/sal reg8, cl 11 100 reg
shr mem8, cl mod 101 r/m, (address)
shr reg8, cl 11 101 reg
sar mem8, cl mod 111 r/m, (address)
sar reg8, cl 11 111 reg

D3 rol mem16, cl mod 000 r/m, (address)


rol reg16, cl 11 000 reg
٣١٤

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


ror mem16, cl mod 001 r/m, (address)
ror reg16, cl 11 001 reg
rcl mem16, cl mod 010 r/m, (address)
rcl reg16, cl 11 010 reg
rcr mem16, cl mod 011 r/m, (address)
rcr reg16, cl 11 011 reg
shl/sal mem16, cl mod 100 r/m, (address)
shl/sal reg16,cl 11 100 reg
shr mem16, cl mod 101 r/m, (address)
shr reg16, cl 11 101 reg
sar mem16, cl mod 111 r/m, (address)
sar reg16, cl 11 111 reg

D4 aam 0a
D5 aad 0a
D6
D7 xlat (none)
D8 esc 0 mod 000 r/m, (address)
D9 esc 1 mod 001 r/m, (address)
DA esc 2 mod 010 r/m, (address)
DB esc 3 mod 011 r/m, (address)
DC esc 4 mod 100 r/m, (address)
DD esc 5 mod 101 r/m, (address)
DE esc 6 mod 110 r/m, (address)
DF esc 7 mod 111 r/m, (address)
E0 loopnz / loopne displacement byte
E1 loopz/loope displacement byte
E2 loop displacement byte
E3 jcxz displacement byte
E4 in al, port port byte
٣١٥

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


E5 in al, port port byte
E6 out al, port port byte
E7 out ax, port port byte
E8 call displacement word
(near relative)
E9 jmp displacement word
(intra-segment relative)
EA jmp offset and segment number words
(inter-segment direct)
AB jmp displacement byte
(inter-segment relative short)
EC in al, dx (none)
ED in ax, dx (none)
EE out al, dx (none)
EF out ax, dx (none)
F0 lock prefix byte
F1
F2 repne /repnz prefix byte
F3 rep/repe/repz prefix byte
F4 hlt (none)
F5 cmc (none)
F6 test mem8, imm8 mod 000 r/m, (address), immediate byte
test reg8, imm8 11 000 reg, immediate byte
not mem8 mod 010 r/m, (address)
not reg8 11 010 reg
neg mem8 mod 011 r/m, (address)
neg reg8 11 011 reg
mul mem8 mod 100 r/m, (address)
mul reg8 11 100 reg
imul mem8 mod 101 r/m, (address)
imul reg8 11 101 reg
٣١٦

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


div mem8 mod 110 r/m, (address)
div reg8 11 110 reg
idiv mem8 mod 111 r/m, (address)
idiv reg8 11 111 reg
F7 test mem16, imm16 mod 000 r/m, (address), immediate word
test reg16, imm16 11 000 reg, immediate word
not mem16 mod 010 r/m, (address)
not reg16 11 010 reg
neg mem16 mod 011 r/m, (address)
neg reg16 11 011 reg
mul mem16 mod 100 r/m, (address)
mul reg16 11 100 reg
imul mem16 mod 101 r/m, (address)
imul reg16 11 101 reg
div mem16 mod 110 r/m, (address)
div reg16 11 110 reg
idiv mem16 mod 111 r/m, (address)
idiv reg 16 11 111 reg
F8 clc (none)
F9 stc (none)
FA cli (none)
FB sti (none)
FC cld (none)
FD std (none)
FE inc mem8 mod 000 r/m, (address)
inc reg8 11 000 reg
dec mem8 mod 001 r/m, (address)
dec reg8 11 001 reg
FF inc mem16 mod 000 r/m, (address)
٣١٧

‫ﻛﺪ ﻋﻤﻞ‬ ‫دﺳﺘﻮراﻟﻌﻤﻞﻫﺎ و ﻋﻤﻠﻮﻧﺪﻫﺎ‬ ‫ﺳﺎﺧﺘﺎر ﺑﺎﻳﺘﻬﺎ‬


dec mem16 mod 001 r/m, (address)
call mod 010 r/m, (address)
(far indirect)
call mod 011 r/m, (address)
(near indirect)
jmp mod 100 r/m, (address)
(intra –segment indirect)
jmp mod 101 r/m, (address)
(inter-segment indirect)
push mem16 mod 110 r/m, (address)
‫‪٣١٨‬‬

‫ﺳﺌﻮاﻻت ﭼﻬﺎر ﮔﺰﻳﻨﻪاي‬

‫‪ -1‬اﮔﺮ ‪ AX=0A21‬و ‪ BX=0010‬ﺑﺎﺷﺪ وﺿﻌﻴﺖ ﻓﻠﮕﻬﺎ در اﺛﺮ اﺟﺮاي دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫‪ CMP AX,BX‬ﭼﻴﺴﺖ؟‬
‫‪ZF=0‬‬ ‫‪SF=0‬‬ ‫‪OF=0‬‬ ‫‪CF=0‬‬ ‫اﻟﻒ‪.‬‬
‫‪ZF=1‬‬ ‫‪SF=1‬‬ ‫‪OF=0‬‬ ‫‪CF=1‬‬ ‫ب‪.‬‬
‫‪ZF=0‬‬ ‫‪SF=0‬‬ ‫‪OF=1‬‬ ‫‪CF=1‬‬ ‫ج‪.‬‬
‫‪ZF=1‬‬ ‫‪SF=1‬‬ ‫‪OF=1‬‬ ‫‪CF=1‬‬ ‫د‪.‬‬

‫‪ -2‬ﻛﺪام ﻳﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ‪ CF‬ﺑﻲﺗﺄﺛﻴﺮ ﻫﺴﺘﻨﺪ؟‬


‫‪SAR‬‬ ‫اﻟﻒ‪.‬‬
‫‪ROR‬‬ ‫ب‪.‬‬
‫‪CMC‬‬ ‫ج‪.‬‬
‫‪MOVS‬‬ ‫د‪.‬‬
‫‪٣١٩‬‬

‫‪ -3‬ﻛﺪام ﻳﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ﺛﺒﺎت ﻧﺸﺎﻧﻪﻫﺎ ﺗﺎﺛﻴﺮ ﻣﻲﮔﺬارد؟‬


‫‪POP‬‬ ‫اﻟﻒ‪.‬‬
‫‪IN‬‬ ‫ب‪.‬‬
‫‪OR‬‬ ‫ج‪.‬‬
‫‪PUSHF‬‬ ‫د‪.‬‬

‫‪ -4‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﻏﻴﺮ ﻣﺠﺎز اﺳﺖ؟‬


‫‪MUL BX‬‬ ‫اﻟﻒ‪.‬‬
‫‪INC NUM‬‬ ‫ب‪.‬‬
‫‪NOP‬‬ ‫ج‪.‬‬
‫‪SHR AX,3‬‬ ‫د‪.‬‬

‫‪ -5‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪CMP 10,BX‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV TEMP,COUNT‬‬ ‫ب‪.‬‬
‫‪MOV DS,ES‬‬ ‫ج‪.‬‬
‫‪CBW‬‬ ‫د‪.‬‬

‫‪ -6‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ‪ DEC‬و ‪ INC‬روي ﻛـﺪاﻣﻴﻚ از ﻧـﺸﺎﻧﻪﻫـﺎي ذﻳـﻞ ﺑـﻲﺗـﺄﺛﻴﺮ‬


‫ﻫﺴﺘﻨﺪ؟‬
‫‪CF‬‬ ‫اﻟﻒ‪.‬‬
‫‪OF‬‬ ‫ب‪.‬‬
‫‪SF‬‬ ‫ج‪.‬‬
‫‪ZF‬‬ ‫د‪.‬‬
‫‪٣٢٠‬‬

‫‪ -7‬ﺑﺮ اﺛﺮ ﺟﻤﻊ ﻛﺪام ﻳﻚ از زوج اﻋﺪاد ذﻳﻞ‪ ،‬ﺳﺮرﻳﺰي رخ ﺧﻮاﻫﺪ داد )اﻋﺪاد در‬
‫ﻣﺒﻨﺎي ‪ 16‬ﻫﺴﺘﻨﺪ(؟‬
‫‪0A07,0FD3‬‬ ‫اﻟﻒ‪.‬‬
‫‪0206,FFB0‬‬ ‫ب‪.‬‬
‫‪FFE7,FFF6‬‬ ‫ج‪.‬‬
‫‪483F,745A‬‬ ‫د‪.‬‬

‫‪ SEG‬ﭼـﻪ زﻣـﺎﻧﻲ‬ ‫‪DATA‬‬ ‫‪ MOV‬ﻣﻘـﺪار‬ ‫‪AX,SEG DATA‬‬ ‫‪ -8‬در دﺳﺘﻮراﻟﻌﻤﻞ‬


‫ﻣﻌﻴﻦ ﻣﻲﮔﺮدد )‪ DATA‬ﻧﺎم ﺳﮕﻤﻨﺖ داده اﺳﺖ(؟‬
‫اﻟﻒ‪ .‬زﻣﺎن اﺳﻤﺒﻞ ﻛﺮدن‬
‫ب‪ .‬زﻣﺎن ‪ LINK‬ﻛﺮدن‬
‫ج‪ .‬زﻣﺎن اﺟﺮاي واﻗﻌﻲ ﺑﺮﻧﺎﻣﻪ‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -9‬دﺳﺘﻮر ﺗﻌﺮﻳﻒ ﻧﻮع ﺳﺎﺧﺘﺎر ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫‪S1‬‬ ‫‪STRUCT‬‬
‫‪F1‬‬ ‫? ‪DW‬‬
‫‪F2‬‬ ‫)?(‪DB 10 DUP‬‬
‫‪S1‬‬ ‫‪ENDS‬‬
‫د‪15 .‬‬ ‫ج‪ .‬ﺻﻔﺮ‬ ‫ب‪14 .‬‬ ‫اﻟﻒ‪12 .‬‬

‫‪ -10‬آدرس ﭘﻨﺞ رﻗﻤﻲ ‪ 1F558‬ﻣﻌﺎدل ﻛﺪاﻣﻴﻚ از آدرﺳﻬﺎي ذﻳﻞ اﺳﺖ؟‬


‫‪1055:1018‬‬ ‫اﻟﻒ‪.‬‬
‫‪1E00:5581‬‬ ‫ب‪.‬‬
‫‪1E55:1008‬‬ ‫ج‪.‬‬
‫‪18A3:5B28‬‬ ‫د‪.‬‬
‫‪٣٢١‬‬

‫‪SUB AX,CX‬‬ ‫‪ -11‬اﮔﺮ ‪ CX=01A2,AX=0075‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟـﺮاي دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫ﻣﺤﺘﻮاي ‪ SF‬و ‪ AX‬ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪SF=1 AX=FED3‬‬ ‫اﻟﻒ‪.‬‬
‫‪SF=0 AX=FED3‬‬ ‫ب‪.‬‬
‫‪SF=1 AX=0127‬‬ ‫ج‪.‬‬
‫‪SF=0 AX=0127‬‬ ‫د‪.‬‬

‫‪ -12‬ﭘﺲ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻣﺤﺘﻮاي ‪ AX‬ﭼﻪ ﺧﻮاﻫﺪ ﺑﻮد؟‬


‫‪STC‬‬
‫‪MOV AX,10‬‬
‫‪MOV BX,4‬‬
‫‪ADC AX,BX‬‬
‫اﻟﻒ‪16 .‬‬
‫ب‪15 .‬‬
‫ج‪10 .‬‬
‫د‪5 .‬‬

‫‪ -13‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﺑﺎﻗﻴﻤﺎﻧﺪه ﺗﻘﺴﻴﻢ ﻣﺤﺘـﻮاي ‪ DX‬ﺑـﺮ ‪ 8‬را ﻣﺤﺎﺳـﺒﻪ‬


‫ﻣﻲﻛﻨﺪ؟‬
‫‪AND DX,0007‬‬ ‫اﻟﻒ‪.‬‬
‫‪OR DX,0007‬‬ ‫ب‪.‬‬
‫‪AND DX,0008‬‬ ‫ج‪.‬‬
‫‪OR DX,0008‬‬ ‫د‪.‬‬

‫‪ -14‬روال ‪ PROC1‬از ﻧﻮع ‪ FAR‬دو ﭘـﺎراﻣﺘﺮ ‪ N1‬و ‪ N2‬را از ﻃﺮﻳـﻖ ﭘـﺸﺘﻪ و ﺑـﻪ‬
‫ﺻﻮرت ذﻳﻞ درﻳﺎﻓﺖ ﻣﻲﻛﻨﺪ‪.‬‬
‫‪PUSH N1‬‬
‫‪PUSH N2‬‬
‫‪CALL PROC1‬‬
‫‪٣٢٢‬‬

‫در ﻟﺤﻈﻪ ورود ﺑﻪ روال ‪ PROC1‬آدرس ‪ N2‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬


‫‪SP+2‬‬ ‫اﻟﻒ‪.‬‬
‫‪SP- 2‬‬ ‫ب‪.‬‬
‫‪SP+4‬‬ ‫ج‪.‬‬
‫‪SP- 4‬‬ ‫د‪.‬‬

‫‪ -15‬ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﭼﻪ ﻋﺒﺎرﺗﻲ را ﻣﺤﺎﺳﺒﻪ ﺧﻮاﻫﺪ ﻛﺮد؟‬


‫‪MOV‬‬ ‫‪AX,X‬‬
‫‪AND‬‬ ‫‪AX,AX‬‬
‫‪NEG‬‬ ‫‪AX‬‬
‫‪ADD‬‬ ‫‪AX,Y‬‬
‫‪SUB‬‬ ‫‪AX,Z‬‬
‫‪INC‬‬ ‫‪AX‬‬
‫‪2X+Y- Z‬‬ ‫اﻟﻒ‪.‬‬
‫‪2(X+Y+Z)+1‬‬ ‫ب‪.‬‬
‫‪(- 2X)+Y- Z+1‬‬ ‫ج‪.‬‬
‫)‪2(X+Y- Z‬‬ ‫د‪.‬‬

‫‪ -16‬اﮔﺮ ‪ AX=FFFF‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻣﺤﺘﻮاي ‪ AX‬ﭼﻴﺴﺖ؟‬


‫‪NEG‬‬ ‫‪AX‬‬
‫‪ROR‬‬ ‫‪AX,1‬‬
‫‪MOV‬‬ ‫‪CL,3‬‬
‫‪SAR‬‬ ‫‪AX,CL‬‬
‫‪F000‬‬ ‫اﻟﻒ‪.‬‬
‫‪1000‬‬ ‫ب‪.‬‬
‫‪0000‬‬ ‫ج‪.‬‬
‫‪FFFO‬‬ ‫د‪.‬‬
‫‪٣٢٣‬‬

‫‪ -17‬ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻣﺤﺘﻮاي ‪ AX‬ﭼﻴﺴﺖ؟‬


‫‪MOV CX,10‬‬
‫‪MOV AX,5‬‬
‫‪FOR: DEC AX‬‬
‫‪CMP AX,0‬‬
‫‪LOOPNE FOR‬‬
‫اﻟﻒ‪ .‬ﺻﻔﺮ‬
‫ب‪1 .‬‬
‫ج‪-1 .‬‬
‫د‪-2 .‬‬

‫‪ -18‬ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪IMUL BL‬‬ ‫اﻟﻒ‪.‬‬
‫‪XCHG TEMP, AX‬‬ ‫ب‪.‬‬
‫‪DIV 10,VALUE‬‬ ‫ج‪.‬‬
‫‪CLD‬‬ ‫د‪.‬‬
‫‪ -19‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ﺛﺒﺎت ﻧﺸﺎﻧﻪﻫﺎ ﺗﺎﺛﻴﺮ ﻣﻲﮔﺬارﻧﺪ؟‬
‫‪MOV‬‬ ‫اﻟﻒ‪.‬‬
‫‪XCHG‬‬ ‫ب‪.‬‬
‫‪STOS‬‬ ‫ج‪.‬‬
‫‪MUL‬‬ ‫د‪.‬‬
‫‪AX, SEG‬‬ ‫‪ MOV‬ﺣﺎﻟـﺖ ﻋﻤﻠﻮﻧـﺪﻫﺎي‬ ‫‪AX, SEG DATA‬‬ ‫‪ -20‬در دﺳﺘﻮراﻟﻌﻤﻞ‬
‫‪ DATA‬ﺑﻪ ﺗﺮﺗﻴﺐ ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ )‪ DATA‬ﻧﺎم ﺳﮕﻤﻨﺖ اﺳﺖ(؟‬
‫اﻟﻒ‪ .‬ﺑﻲ اواﺳﻄﻪ‪ ،‬ﺛﺒﺎت‬
‫ب‪ .‬ﺣﺎﻓﻈﻪ ﻣﺴﺘﻘﻴﻢ‪ ،‬ﺛﺒﺎت‬
‫ج‪ .‬ﺣﺎﻓﻈﻪ ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ از ﻧﻮع داراي ﻣﺒﻨﺎ‪ ،‬ﺛﺒﺎت‬
‫د‪ .‬ﺑﻼواﺳﻄﻪ‪ ،‬ﺣﺎﻓﻈﻪ ﻣﺴﺘﻘﻴﻢ‬
‫‪٣٢٤‬‬

‫‪ -21‬ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ ﭘﻴﺎده ﺳﺎزي ﻃﺮح ذﻳﻞ اﺳﺖ؟‬


‫‪IF (AX<=10 OR BX=100) THEN‬‬
‫‪AX=AX+1,‬‬
‫‪CMP AX,10‬‬ ‫اﻟﻒ‪.‬‬
‫‪JLE T1‬‬
‫‪.CMP.‬‬ ‫‪BX,100‬‬
‫‪JE‬‬ ‫‪T1‬‬
‫‪T1: INC AX‬‬
‫‪CMP AX,10‬‬ ‫ب‪.‬‬
‫‪JLE T1‬‬
‫‪CMP BX,100‬‬
‫‪JE T1‬‬
‫‪JMP T2‬‬
‫‪T1: INC AX‬‬
‫‪T2:‬‬
‫‪CMP AX,10‬‬ ‫ج‪.‬‬
‫‪JNE T1‬‬
‫‪CMP BX,100‬‬
‫‪JNLE T1‬‬
‫‪INC AX‬‬
‫‪T1:‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -22‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ ﺻﺤﻴﺢ ﻧﻴﺴﺖ؟‬


‫اﻟﻒ‪ .‬ﻧﺘﻴﺠﻪ ﺷﻴﻔﺖ رﻳﺎﺿﻲ و ﻣﻨﻄﻘﻲ ﺑﻪ ﻃﺮف ﭼﭗ ﻳﻜﺴﺎن ﻫﺴﺘﻨﺪ‪.‬‬
‫ب‪ .‬ﻓﻠﮓ ﺳﺮرﻳﺰي ﺑﺮاي ﺷﻴﻔﺖ ﭼﻨﺪ ﺑﻴﺘﻲ ﺗﻌﺮﻳﻒ ﻧﺸﺪه اﺳﺖ‪.‬‬
‫ج‪ .‬ﻋﻤﻞ ﺷﻴﻔﺖ ﺑﻪ ﻃﺮف ﭼﭗ روي ﻓﻠﮓ ‪ PF‬ﺑﻲﺗﺎﺛﻴﺮ اﺳﺖ‪.‬‬
‫د‪ .‬در ﻋﻤﻞ ﺷﻴﻔﺖ ﭼﻨﺪ ﺑﻴﺘﻲ ﺑﻪ ﭼﭗ ‪ ،‬ﺑﻴﺘﻬﺎﻳﻲ ﻛﻪ از ﻃﺮف ﭼﭗ ﺑﻴﺮون ﻣﻲروﻧـﺪ ﺑـﻪ‬
‫دور رﻳﺨﺘﻪ ﻣﻲﺷﻮﻧﺪ‪،‬ﻣﮕﺮ آﺧﺮﻳﻦ ﺑﻴﺖ ﻛﻪ در ﻓﻠﮓ ‪ CF‬ذﺧﻴﺮه ﻣﻲﮔﺮدد‪.‬‬

‫‪ -23‬ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﭼﻪ ﻛﺎري اﻧﺠﺎم ﻣﻲدﻫﺪ‪) .‬ﻓﺮض ﻣﻲﻛﻨﻴﻢ ﺛﺒﺎﺗﻬﺎي ﻻزم دﻳﮕـﺮ‬
‫ﺗﻨﻈﻴﻢ ﺷﺪهاﻧﺪ‪(.‬‬
‫‪٣٢٥‬‬

‫‪MOV AL,′* ′‬‬


‫‪MOV CX,10‬‬
‫‪MOV DI,OFFSET STR‬‬
‫‪CID‬‬
‫‪REP STOSB‬‬
‫اﻟﻒ‪ .‬ﻛﺎراﻛﺘﺮ ‪ ′*′‬را در رﺷﺘﻪ ‪ STR‬ﺟﺴﺘﺠﻮ ﻣﻲﻛﻨﺪ‪.‬‬
‫ب‪ .‬ﺗﺎ وﻗﺘﻲ ﺑﻪ ﻛﺎراﻛﺘﺮ ‪ ′*′‬ﻧﺮﺳﻴﺪه اﺳـﺖ ﭘـﻮﻳﺶ را ﺗـﺎ ‪ 10‬ﻛـﺎراﻛﺘﺮ اول ‪ STR‬اداﻣـﻪ‬
‫ﻣﻲدﻫﺪ‪.‬‬
‫ج‪ .‬ﻛﺎراﻛﺘﺮ ‪ ′*′‬را در ‪ 10‬ﻛﺎراﻛﺘﺮ اول ‪ STR‬ﻛﭙﻲ ﻣﻲﻛﻨﺪ‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -24‬اﮔﺮ اﺟﺮاي دﺳﺘﻮرﻫﺎي ‪ ،ADD‬ﺳﻪ ﭘﺎﻟﺲ و اﺟﺮاي ‪ 4 ،MOV‬ﭘﺎﻟﺲ و ‪،LOOP‬‬


‫‪ 8‬ﭘﺎﻟﺲ زﻣﺎﻧﻲ ﻣﺼﺮف ﻛﻨﻨﺪ‪ ،‬در اﻳﻦ ﺻﻮرت اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳـﻞ ﭼﻨـﺪ ﭘـﺎﻟﺲ‬
‫زﻣﺎﻧﻲ ﻧﻴﺎز دارد؟‬
‫‪MOV CX,5‬‬
‫‪B:ADD AX,2‬‬
‫‪LOOP B‬‬
‫د‪49 .‬‬ ‫ج‪55 .‬‬ ‫ب‪59 .‬‬ ‫اﻟﻒ‪15 .‬‬
‫‪ -25‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬
‫‪MOV TEMP,COUNT‬‬ ‫اﻟﻒ‪.‬‬
‫‪MUL‬‬ ‫‪2‬‬ ‫ب‪.‬‬
‫‪PUSHF‬‬ ‫‪AX‬‬ ‫ج‪.‬‬
‫‪CBW‬‬ ‫د‪.‬‬
‫‪٣٢٦‬‬

‫‪ -26‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ روي ﻓﻠﮕﻬﺎ ﺗﺎﺛﻴﺮ ﻣﻲﮔﺬارد؟‬


‫‪MOV‬‬ ‫اﻟﻒ‪.‬‬
‫‪INC‬‬ ‫ب‪.‬‬
‫‪STOS‬‬ ‫ج‪.‬‬
‫‪LOOP‬‬ ‫د‪.‬‬

‫‪ -27‬ﭘﺲ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ‪ CX‬ﺣﺎوي ﭼﻪ ﻣﻘﺪاري ﺧﻮاﻫﺪ ﺑـﻮد )‪ temp‬و‬


‫‪ num1‬ﺗﻮﺳﻂ دﺳﺘﻮر ‪ DW‬در ﺳﮕﻤﻨﺖ ‪ DATA‬ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ(؟‬
‫‪MOV‬‬ ‫‪CX,0‬‬
‫‪MOV‬‬ ‫‪BX,10‬‬
‫‪MOV‬‬ ‫‪AX,123‬‬
‫‪LOOP1:‬‬ ‫‪CWD‬‬
‫‪DIV‬‬ ‫‪BX‬‬
‫‪MOV‬‬ ‫‪NUM1,DX‬‬
‫‪MOV‬‬ ‫‪TEMP,AX‬‬
‫‪MOV‬‬ ‫‪AX,CX‬‬
‫‪MUL‬‬ ‫‪BX‬‬
‫‪ADD‬‬ ‫‪AX,NUM1‬‬
‫‪MOV‬‬ ‫‪CX,AX‬‬
‫‪MOV‬‬ ‫‪AX,TEMP‬‬
‫‪CMP‬‬ ‫‪AX,0‬‬
‫‪JNZ‬‬ ‫‪LOOP1‬‬
‫د‪321 .‬‬ ‫ج‪123 .‬‬ ‫ب‪456 .‬‬ ‫اﻟﻒ‪444 .‬‬

‫‪ -28‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات زﻳﺮ ﻣﺠﺎز اﺳﺖ؟‬


‫‪CMP‬‬ ‫‪BH,′*′‬‬ ‫اﻟﻒ‪.‬‬
‫‪OUT 05A4H,AL‬‬ ‫ب‪.‬‬
‫‪MOV‬‬ ‫‪DS,CS‬‬ ‫ج‪.‬‬
‫‪MOV IP,AX‬‬ ‫د‪.‬‬
٣٢٧

‫ ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ ﭘﻴﺎده ﺳﺎزي دﺳﺘﻮر ﺷﺮﻃﻲ ذﻳﻞ اﺳﺖ؟‬-29


IF (NOT (A>=10 OR BX<=1) ) THEN
CX=CX+1
.‫اﻟﻒ‬
CMP A,10
JGE EXIT
CMP B,1
JLE EXIT
JMP M
EXIT: INC CX
M:
.‫ب‬
CMP A,10
JGE EXIT
CMP B,1
JLE EXIT
EXIT: INC CX
.‫ج‬
CMP A,10
JNL EXIT
CMP B,1
JNG EXIT
INC CX
EXIT:
‫ ﻫﻴﭽﻜﺪام‬.‫د‬

‫ ﻛـﺪاﻣﻴﻚ از ﻣـﻮارد ذﻳـﻞ‬BX ‫ ﭘﺲ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺤﺘﻮاي‬-30


‫اﺳﺖ؟‬
MOV CL,4
MOV AX,FFFF
CLC
RCR AX,CL
0FFF .‫اﻟﻒ‬
FFF0 .‫ب‬
F000 .‫ج‬
000F .‫د‬
‫‪٣٢٨‬‬

‫‪ -31‬ﻣﺎﻛﺮوي ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬


‫‪MAC1‬‬ ‫‪MACRO‬‬
‫‪CMP‬‬ ‫‪AX,0‬‬
‫‪JE‬‬ ‫‪TEST‬‬
‫‪ADD‬‬ ‫‪AX,AX‬‬
‫‪TEST:‬‬ ‫‪ADD‬‬ ‫‪AX,AX‬‬
‫‪ENDM‬‬

‫ﭘﺲ ازاﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻣﺤﺘﻮاي ‪ AX‬ﭼﻪ ﺧﻮاﻫﺪ ﺑﻮد؟‬


‫‪MOV AX,3‬‬
‫‪MAC1‬‬
‫‪MAC1‬‬

‫اﻟﻒ‪12 .‬‬
‫ب‪9 .‬‬
‫ج‪15 .‬‬
‫د‪ .‬اﺳﻤﺒﻠﺮ ﭘﻴﻐﺎم ﺧﻄﺎ ﻣﻲدﻫﺪ‪.‬‬

‫‪ -32‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﻏﻴﺮ ﻣﺠﺎز اﺳﺖ؟‬


‫‪CMPSW‬‬ ‫اﻟﻒ‪.‬‬
‫‪IRET‬‬ ‫ب‪.‬‬
‫‪LEA BX,AX‬‬ ‫ج‪.‬‬
‫‪LOOPNE FOR1‬‬ ‫د‪.‬‬

‫‪ -33‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺗﻌﺮﻳﻒ ﻣﺎﻛﺮوي ذﻳﻞ ﻛﺪاﻣﻴﻚ از ﻓﺮاﺧﻮاﻧﻲﻫﺎي ذﻳﻞ ﺑﺎﻋﺚ ﺑـﺮوز‬
‫ﺧﻄﺎ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪MAC2 MACRO N1,N2,N3,N4‬‬
‫‪MOV‬‬ ‫‪AX,N1‬‬
‫>‪IFNB<N2‬‬
‫‪ADD‬‬ ‫‪AX,N2‬‬
‫‪ENDIF‬‬
‫>‪IFNB<N3‬‬
‫‪ADD‬‬ ‫‪AX,N3‬‬
‫‪٣٢٩‬‬

‫‪ENDIF‬‬
‫>‪IFNB<N4‬‬
‫‪ADD‬‬ ‫‪AX,N4‬‬
‫‪ENDIF‬‬
‫‪ENDM‬‬
‫‪MAC1 BX, CX,DX,1‬‬ ‫اﻟﻒ‪.‬‬
‫‪MAC1 BX,CX,100‬‬ ‫ب‪.‬‬
‫‪MAC1 BX,DX‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -34‬دﺳﺘﻮر ‪ REPE‬در ﻛﺪام ﻳﻚ از ﺷﺮاﻳﻂ ذﻳﻞ ﺗﻜﺮار را اداﻣﻪ ﻣﻲدﻫﺪ؟‬


‫‪CX=0 AND ZF=0‬‬ ‫اﻟﻒ‪.‬‬
‫‪CX< >0 OR ZF=0‬‬ ‫ب‪.‬‬
‫‪CX< >0 AND ZF=1‬‬ ‫ج‪.‬‬
‫‪CX=0 OR ZF=1‬‬ ‫د‪.‬‬

‫‪ -35‬اﮔﺮ در ‪ 20‬ﻛﺎراﻛﺘﺮ اول رﺷﺘﻪ ‪ STRING‬ﺣﺪاﻗﻞ ﻳﻚ ﻛﺎراﻛﺘﺮ ‪ S‬وﺟﻮد داﺷﺘﻪ‬


‫ﺑﺎﺷﺪ‪ ،‬ﭘﺲ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ‪ DI‬ﺣﺎوي ﭼﻴﺴﺖ؟ )ﻓﺮض ﻛﻨﻴﺪ ﺛﺒﺎﺗﻬﺎي ﻻزم‬
‫دﻳﮕﺮ ﺑﻪ درﺳﺘﻲ ﺗﻨﻈﻴﻢ ﺷﺪه اﺳﺖ(‬
‫‪MOV‬‬ ‫‪AL, ′S′‬‬
‫‪LEA‬‬ ‫‪DI, STRING‬‬
‫‪D‬‬
‫‪REPNE‬‬ ‫‪SCASB‬‬
‫‪DEC‬‬ ‫‪DI‬‬

‫اﻟﻒ‪ DI .‬ﺣﺎوي اﻓﺴﺖ اوﻟﻴﻦ وﻗﻮع ﻛﺎراﻛﺘﺮ ‪ S‬در رﺷﺘﻪ ‪ STRING‬اﺳﺖ‪.‬‬


‫ب‪ DI .‬ﺣﺎوي ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ‪ S‬در رﺷﺘﻪ ‪ STRING‬اﺳﺖ‪.‬‬
‫ج‪ DI .‬ﺣﺎوي اﻓﺴﺖ ﻛﺎراﻛﺘﺮ ﻗﺒﻞ از اوﻟﻴﻦ وﻗﻮع ﻛﺎراﻛﺘﺮ ‪ S‬در رﺷﺘﻪ ‪ STRING‬اﺳﺖ‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪٣٣٠‬‬

‫‪AL‬‬ ‫‪ -36‬ﻣﺤﺘﻮاي ‪ AL‬ﭼﻪ ﻋﺪدي ﺑﺎﺷﺪ ﺗﺎ ﺑﻌﺪ از اﺟﺮاي دﺳـﺘﻮرات ذﻳـﻞ ﻣﻘـﺪار‬
‫ﺻﻔﺮ ﺷﻮد؟‬
‫‪XOR AL,0FH‬‬
‫‪00‬‬ ‫اﻟﻒ‪.‬‬
‫‪FF‬‬ ‫ب‪.‬‬
‫‪0F‬‬ ‫ج‪.‬‬
‫‪F0‬‬ ‫د‪.‬‬
‫‪IMUL‬‬ ‫‪ -37‬اﮔﺮ ‪ AX=FF15‬و ‪ VALUE=0003‬ﺑﺎﺷـﺪ ﺑﻌـﺪ از اﺟـﺮاي دﺳـﺘﻮر‬
‫‪ VALUE‬ﻓﻠﮕﻬﺎي ‪ CF‬و ‪ OF‬ﻛﺪاﻣﻴﻚ از ﻣﻘﺎدﻳﺮ ذﻳﻞ را دارﻧﺪ؟‬
‫‪CF=0‬‬ ‫‪،‬‬ ‫‪OF=1‬‬ ‫اﻟﻒ‪.‬‬
‫‪CF=1‬‬ ‫‪،‬‬ ‫‪OF=0‬‬ ‫ب‪.‬‬
‫‪CF=1‬‬ ‫‪،‬‬ ‫‪OF=1‬‬ ‫ج‪.‬‬
‫‪CF=0‬‬ ‫‪،‬‬ ‫‪OF=0‬‬ ‫د‪.‬‬
‫‪ -38‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ دﺳﺘﻮر ذﻳﻞ ﭼﻪ ﻋﺪدي در ﻣﺒﻨﺎي ‪ 16‬در ‪ BYTE1‬ذﺧﻴﺮه ﻣﻲﺷﻮد‪.‬‬
‫‪BYTE1 DB - 128‬‬
‫‪70‬‬ ‫اﻟﻒ‪.‬‬
‫‪80‬‬ ‫ب‪.‬‬
‫‪FF‬‬ ‫ج‪.‬‬
‫‪08‬‬ ‫د‪.‬‬
‫‪ -39‬ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ‪ DX‬ﺣﺎوي ﭼﻪ ﻋﺪدي ﺧﻮاﻫـﺪ ﺑـﻮد )در‬
‫ﻣﺒﻨﺎي ‪(16‬؟‬
‫‪MOV BX,1‬‬
‫‪MOV AX,- 1‬‬
‫‪MUL BX‬‬
‫اﻟﻒ‪ DX .‬ﺗﻐﻴﻴﺮي ﻧﻤﻲﻛﻨﺪ و ﻣﻘﺪار ﻗﺒﻠﻲ ﺧﻮد را دارد‪.‬‬
‫‪1111‬‬ ‫ب‪.‬‬
‫‪0000‬‬ ‫ج‪.‬‬
‫‪FFFF‬‬ ‫د‪.‬‬
‫‪٣٣١‬‬

‫‪ -40‬آدرس ﭘﻨﺞ رﻗﻤﻲ )در ﻣﺒﻨﺎي ‪ (16‬ﺷﺮوع ﺳﮕﻤﻨﺖ ﺷﻤﺎره ‪ (0010)16‬ﻛـﺪاﻣﻴﻚ‬


‫از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪01010‬‬ ‫اﻟﻒ‪.‬‬
‫‪00100‬‬ ‫ب‪.‬‬
‫‪0011F‬‬ ‫ج‪.‬‬
‫‪00111‬‬ ‫د‪.‬‬

‫ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬ ‫‪(342)5‬‬ ‫‪ -41‬ﻣﻜﻤﻞ ﭘﺎﻳﻪ‬


‫‪113‬‬ ‫اﻟﻒ‪.‬‬
‫‪213‬‬ ‫ب‪.‬‬
‫‪102‬‬ ‫ج‪.‬‬
‫‪103‬‬ ‫د‪.‬‬

‫‪ -42‬ﻛﺪاﻣﻴﻚ ازاﺳﺎﻣﻲ ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪TEMP$‬‬ ‫اﻟﻒ‪.‬‬
‫‪TEMP. NUM‬‬ ‫ب‪.‬‬
‫‪TEMP%‬‬ ‫ج‪.‬‬
‫‪TEMP4‬‬ ‫د‪.‬‬

‫‪ -43‬دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫))‪B DB 2(5 DUP(′*′),4 DUP(′0′‬‬
‫‪120‬‬ ‫اﻟﻒ‪.‬‬
‫‪11‬‬ ‫ب‪.‬‬
‫‪40‬‬ ‫ج‪.‬‬
‫‪18‬‬ ‫د‪.‬‬
‫‪٣٣٢‬‬

‫‪ -44‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ در ‪ D‬ﭼﻪ ﻋﺪدي ذﺧﻴﺮه ﻣﻲﺷﻮد؟‬


‫‪DATA‬‬ ‫‪SEGMENT‬‬
‫‪A‬‬ ‫‪DB‬‬ ‫)‪5DUP(9‬‬
‫‪B‬‬ ‫‪DB‬‬ ‫)‪6DUP(8‬‬
‫‪C‬‬ ‫‪DB‬‬ ‫‪OFFSET‬‬ ‫‪B‬‬
‫‪11‬‬ ‫د‪.‬‬ ‫‪5‬‬ ‫ج‪.‬‬ ‫‪6‬‬ ‫ب‪.‬‬ ‫‪0‬‬ ‫اﻟﻒ‪.‬‬

‫‪AX‬‬ ‫‪ -45‬اﮔﺮ ‪ AX‬ﺣﺎوي ﻋﺪد ده ﺑﺎﺷﺪ ﭘﺲ از اﺟﺮاي دﺳـﺘﻮرات ذﻳـﻞ ﻣﺤﺘـﻮاي‬


‫ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪NEG‬‬ ‫‪AX‬‬
‫‪ADD‬‬ ‫‪AX,AX‬‬
‫‪NEG‬‬ ‫‪AX‬‬
‫‪DEC‬‬ ‫‪AX‬‬
‫‪21‬‬ ‫د‪.‬‬ ‫‪20‬‬ ‫ج‪.‬‬ ‫‪19‬‬ ‫ب‪.‬‬ ‫‪18‬‬ ‫اﻟﻒ‪.‬‬

‫‪ -46‬ﭘﺲ از اﺟﺮاي دﺳﺘﻮرات ذﻳﻞ ‪ BX‬ﺣﺎوي ﭼﻪ ﻣﻘﺪاري اﺳﺖ؟‬


‫‪MOV‬‬ ‫‪CX,5‬‬
‫‪MOV‬‬ ‫‪BX,16‬‬
‫‪LOOP:‬‬ ‫‪DEC‬‬ ‫‪BX‬‬
‫‪CMP‬‬ ‫‪BX,0‬‬
‫‪LOOPNE‬‬ ‫‪FOR‬‬
‫‪11‬‬ ‫د‪.‬‬ ‫‪0‬‬ ‫ج‪.‬‬ ‫‪15‬‬ ‫ب‪.‬‬ ‫‪12‬‬ ‫اﻟﻒ‪.‬‬

‫‪ -47‬ﻛﺪام ﻳﻚ از دﺳﺘﻮرات ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪cbw‬‬ ‫اﻟﻒ‪.‬‬
‫‪cwd ax‬‬ ‫ب‪.‬‬
‫‪cmp 10,ax‬‬ ‫ج‪.‬‬
‫‪cld bx‬‬ ‫د‪.‬‬
٣٣٣

‫ ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﭘﻴﺎده ﺳﺎزي ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬-48


cmp temp,10
Jng e
Cmp ali,8
Jne e
Dec count
E:
if (temp > 10and ali=8) .‫اﻟﻒ‬
count=count –1
if (temp < 10 or ali=8) .‫ب‬
count = count –1
if (temp > 10 or ali < > 8) .‫ج‬
count = count –1
if (temp < 10 and ali < > 8) .‫د‬
count = count –1

:‫ ﻓﺮض ﻛﻨﻴﺪ ﺳﮕﻤﻨﺖ داده ﺣﺎوي دو دﺳﺘﻮر ذﻳﻞ ﺑﺎﺷﺪ‬-49


source DB "Summe"
dest DB "Summi"
‫ و‬SI ‫ ﺑﺎﺷﺪ ﻣﻘﺎدﻳﺮ ﺛﺒﺎﺗﻬﺎي‬0005,dest ‫ و آدرس ﺷﺮوع‬0000,Source ‫اﮔﺮ آدرس ﺷﺮوع‬
‫ ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﭼﻪ ﺧﻮاﻫﺪ ﺑﻮد؟‬DI
Lea Si,source
Lea Di,dest
Cld
Mov Cx,6
Repne Cmpsb
DI=0005, SI=0000 .‫اﻟﻒ‬
DI=0009, SI=0004 .‫ب‬
DI=000A, SI=0005 .‫ج‬
DI=0006, SI=0001 .‫د‬
‫‪٣٣٤‬‬

‫ﻣﻘﺪار ‪ AX‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ‬ ‫‪rol AX,1‬‬ ‫‪ -50‬اﮔﺮ ‪ AX=A9D7‬ﺑﻌﺪ از اﺟﺮاي‬


‫اﺳﺖ؟‬
‫‪54EB‬‬ ‫اﻟﻒ‪.‬‬
‫‪53AF‬‬ ‫ب‪.‬‬
‫‪A9D7‬‬ ‫ج‪.‬‬
‫‪B9D6‬‬ ‫د‪.‬‬

‫‪ -51‬دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺪ ﺣﺎﻓﻈﻪ را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫‪temp‬‬ ‫‪DB‬‬ ‫))‪20Dup(2Dup(′*′),3Dup(′1′‬‬
‫‪20‬‬ ‫د‪.‬‬ ‫‪100‬‬ ‫ج‪.‬‬ ‫‪120‬‬ ‫ب‪.‬‬ ‫‪25‬‬ ‫اﻟﻒ‪.‬‬

‫‪ -52‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪mov ds,12‬‬ ‫اﻟﻒ‪.‬‬
‫‪mov cs,ds‬‬ ‫ب‪.‬‬
‫‪mov IP,12‬‬ ‫ج‪.‬‬
‫‪mov ax, OFFSET TE‬‬ ‫د‪.‬‬

‫‪ -53‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪DW‬‬ ‫‪12*10‬‬ ‫اﻟﻒ‪.‬‬
‫‪DW‬‬ ‫"‪"ABC‬‬ ‫ب‪.‬‬
‫‪mov‬‬ ‫‪[bx],2‬‬ ‫ج‪.‬‬
‫‪push‬‬ ‫‪2‬‬ ‫د‪.‬‬

‫‪ -54‬ﻣﻜﻤﻞ ‪ 2‬ﻋﺪد ‪ 00001010‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬


‫‪11110101‬‬ ‫ب‪.‬‬ ‫‪11110110‬‬ ‫اﻟﻒ‪.‬‬
‫‪01101111‬‬ ‫د‪.‬‬ ‫‪00000110‬‬ ‫ج‪.‬‬
‫‪٣٣٥‬‬

‫‪ -55‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻏﻴﺮﻣﺠﺎز اﺳﺖ؟‬


‫‪mul bx‬‬ ‫اﻟﻒ‪.‬‬
‫‪add 1,ax‬‬ ‫ب‪.‬‬
‫‪inc num‬‬ ‫ج‪.‬‬
‫‪inc ax‬‬ ‫د‪.‬‬

‫‪ -56‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ‪ CF‬را ﺗﻐﻴﻴﺮ ﻧﻤﻲدﻫﺪ؟‬


‫‪cmc‬‬ ‫اﻟﻒ‪.‬‬
‫‪stc‬‬ ‫ب‪.‬‬
‫‪clc‬‬ ‫ج‪.‬‬
‫‪Jc‬‬ ‫د‪.‬‬

‫‪ -57‬اﮔﺮ ‪ dh=F5‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ‪ neg dh‬ﻣﺤﺘﻮاي ‪ dh‬ﭼﻴﺴﺖ؟‬


‫‪oB‬‬ ‫اﻟﻒ‪.‬‬
‫‪F4‬‬ ‫ب‪.‬‬
‫‪5F‬‬ ‫ج‪.‬‬
‫‪F5‬‬ ‫د‪.‬‬

‫‪ -58‬اﮔﺮ ‪ SP=0100‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻣﺤﺘﻮاي ‪ SP‬ﭼﻴﺴﺖ؟‬


‫‪push ax‬‬
‫‪push bx‬‬
‫‪push cx‬‬
‫‪0106‬‬ ‫اﻟﻒ‪.‬‬
‫‪0104‬‬ ‫ب‪.‬‬
‫‪00FA‬‬ ‫ج‪.‬‬
‫‪00FC‬‬ ‫د‪.‬‬
‫‪٣٣٦‬‬

‫‪ -59‬دﺳﺘﻮر ‪ rep‬در ﻛﺪاﻣﻴﻚ از ﺣﺎﻻت ذﻳﻞ ﺗﻜﺮار را اداﻣﻪ ﻣﻲدﻫﺪ؟‬


‫‪CX≠0‬‬ ‫اﻟﻒ‪.‬‬
‫‪ZF≠0‬‬ ‫ب‪.‬‬
‫‪ZF=0‬‬ ‫ج‪.‬‬
‫‪CX=0‬‬ ‫د‪.‬‬

‫‪AX‬‬ ‫‪ -60‬اﮔﺮ ‪ AX=A9D7‬و ‪ CL=04‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ‪ Sar ax, cl‬ﻣﻘـﺪار‬
‫ﭼﻴﺴﺖ؟‬
‫‪FA9D‬‬ ‫اﻟﻒ‪.‬‬
‫‪0F9D‬‬ ‫ب‪.‬‬
‫‪9D7F‬‬ ‫ج‪.‬‬
‫‪9D70‬‬ ‫د‪.‬‬

‫‪AX‬‬ ‫‪ -61‬اﮔﺮ ‪ BL=FF‬و ‪ AX=FE01‬ﺑﺎﺷﺪ ﺑﻌـﺪ از اﺟـﺮاي دﺳـﺘﻮر ‪ div bl‬ﻣﻘـﺪار‬


‫ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪EF01‬‬ ‫اﻟﻒ‪.‬‬
‫‪00FF‬‬ ‫ب‪.‬‬
‫‪FE01‬‬ ‫ج‪.‬‬
‫‪E0E0‬‬ ‫د‪.‬‬
‫‪CF‬‬ ‫‪ -62‬اﮔﺮ ‪ AL=6E‬و ‪ ch=0A‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر ‪ imul ch‬ﻣﻘﺎدﻳﺮ ‪ AX‬و‬
‫و ‪ OF‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪AX=044c, CF=1, OF=1‬‬ ‫اﻟﻒ‪.‬‬
‫‪AX=044c, CF=0, OF=0‬‬ ‫ب‪.‬‬
‫‪AX=046E, CF=0, OF=0‬‬ ‫ج‪.‬‬
‫‪AX=046E, CF=1, OF=1‬‬ ‫د‪.‬‬
‫‪٣٣٧‬‬

‫‪ -63‬ﺣﻠﻘﻪ ذﻳﻞ ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻣﻲﺷﻮد؟‬


‫‪mov‬‬ ‫‪cx,- 1‬‬
‫‪for:‬‬
‫‪M‬‬
‫‪loop‬‬ ‫‪for‬‬
‫‪65535‬‬ ‫اﻟﻒ‪.‬‬
‫‪65536‬‬ ‫ب‪.‬‬
‫‪0‬‬ ‫ج‪.‬‬
‫‪1‬‬ ‫د‪.‬‬

‫‪ -64‬ﻛﺪاﻣﻴﻚ از اﻋﺪاد ذﻳﻞ ﻧﻤﻲﺗﻮاﻧﺪ ﺑﻪ ﻋﻨﻮان ﻋﻤﻠﻮﻧﺪ ‪ DW‬اﺳﺘﻔﺎده ﺷﻮﻧﺪ؟‬


‫‪32768‬‬ ‫اﻟﻒ‪- .‬‬
‫‪132768‬‬ ‫ب‪.‬‬
‫‪65535‬‬ ‫ج‪.‬‬
‫‪32000‬‬ ‫د‪.‬‬

‫‪ -65‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮرات ذﻳﻞ ﻏﻴﺮﻣﺠﺎز اﺳﺖ؟‬


‫‪lea ax,array‬‬ ‫اﻟﻒ‪.‬‬
‫‪lea ax,bx‬‬ ‫ب‪.‬‬
‫]‪mov ax,[bx‬‬ ‫ج‪.‬‬
‫‪mov ax,SEG data‬‬ ‫د‪.‬‬
‫‪ -66‬اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﻋﺪد ‪ FF‬را در ﻣﺒﻨﺎي ‪ 16‬در ﺧﺎﻧﻪاي از ﺣﺎﻓﻈﻪ ذﺧﻴﺮه ﻛﻨـﻴﻢ از‬
‫ﻛﺪاﻣﻴﻚ از ﻋﻤﻠﻮﻧﺪﻫﺎي ذﻳﻞ ﻧﻤﻲﺗﻮان ﺑﻪ ﻋﻨﻮان ﻋﻤﻠﻮﻧﺪ ‪ DB‬اﺳﺘﻔﺎده ﻛﺮد؟‬
‫‪255‬‬ ‫اﻟﻒ‪.‬‬
‫‪1‬‬ ‫ب‪- .‬‬
‫‪11111111b‬‬ ‫ج‪.‬‬
‫‪88Q‬‬ ‫د‪.‬‬
‫‪٣٣٨‬‬

‫‪ -67‬ﻛﺪاﻣﻴﻚ از ﻣﻮارد ذﻳﻞ ﺻﺤﻴﺢ ﻧﻴﺴﺖ؟‬


‫اﻟﻒ‪ .‬ﻛﺪ ﻣﺎﻛﺮو در ﻣﺤﻞ ﻓﺮاﺧﻮاﻧﻲ ﻣﺎﻛﺮو ﻛﭙﻲ ﻣﻲﺷﻮد‪.‬‬
‫ب‪ .‬اﺳﺘﻔﺎده از ﻣﺎﻛﺮو ﺑﻪ ﺟﺎي روال ﻣﻌﻤﻮﻻً ﺑﺎﻋﺚ ﻃﻮﻻﻧﻲ ﺷﺪن ﻛﺪ ﻫﺪف ﻣﻲﺷﻮد‪.‬‬
‫ج‪ .‬اﺳﺘﻔﺎده از ﻣﺎﻛﺮو ﺑﻪ ﺟﺎي روال ﻣﻌﻤﻮﻻً ﺑﺎﻋﺚ اﺟﺮاي ﺳﺮﻳﻌﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻣﻲﺷﻮد‪.‬‬
‫د‪ .‬ﻋﻤﻞ ﺟﺎﻳﮕﺰﻳﻨﻲ دﺳﺘﻮر ﻓﺮاﺧﻮاﻧﻲ ﻣﺎﻛﺮو ﺑﺎ ﻛﺪ ﻣﺎﻛﺮو در زﻣﺎن اﺟﺮا اﻧﺠﺎم ﻣﻲﺷﻮد‪.‬‬

‫‪ -68‬دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫))’‪ABLE, DB 10DUP(3DUP(‘A’), 9 DUP (‘B‬‬
‫اﻟﻒ‪22 .‬‬
‫ب‪120 .‬‬
‫ج‪270 .‬‬
‫د‪39 .‬‬

‫‪ -69‬دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫)?(‪DW 100H DUP‬‬
‫‪100‬‬ ‫اﻟﻒ‪.‬‬
‫‪1024‬‬ ‫ب‪.‬‬
‫‪512‬‬ ‫ج‪.‬‬
‫‪200‬‬ ‫د‪.‬‬

‫‪ -70‬ﻛﺪام ﻳﻚ از ﻧﺎﻣﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪TEMP. 2‬‬ ‫اﻟﻒ‪.‬‬
‫‪?TEMP‬‬ ‫ب‪.‬‬
‫?‪TEMP‬‬ ‫ج‪.‬‬
‫‪TEMP4‬‬ ‫د‪.‬‬
‫‪٣٣٩‬‬

‫‪ -71‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻛﺪ ذﻳﻞ‪ ،‬آﻓﺴﺖ ﺷﺮوع دﺳﺘﻮر ‪ NUM DB 12‬ﭼﻴﺴﺖ؟‬


‫‪DATA‬‬ ‫‪SEGMENT‬‬
‫‪TOTAL‬‬ ‫‪DW‬‬ ‫‪23‬‬
‫‪SUM‬‬ ‫‪DB‬‬ ‫‪8‬‬
‫‪NUM‬‬ ‫‪DB‬‬ ‫‪12‬‬
‫‪DATA‬‬ ‫‪ENDS‬‬
‫‪0004‬‬ ‫اﻟﻒ‪.‬‬
‫‪0003‬‬ ‫ب‪.‬‬
‫‪0002‬‬ ‫ج‪.‬‬
‫‪0001‬‬ ‫د‪.‬‬

‫‪ -72‬ﻛﻮﭼﻜﺘﺮﻳﻦ و ﺑﺰرﮔﺘﺮﻳﻦ ﻋﻤﻠﻮﻧﺪﻫﺎي ﻋﺪدي دﺳﺘﻮر ‪ DB‬ﻛﺪام ﻳﻚ از ﻣـﻮارد‬


‫ذﻳﻞ اﺳﺖ؟‬
‫‪128,128‬‬ ‫اﻟﻒ‪- .‬‬
‫‪127,128‬‬ ‫ب‪- .‬‬
‫‪128,255‬‬ ‫ج‪- .‬‬
‫‪255,- 255‬‬ ‫د‪.‬‬

‫‪ -73‬ﻣﻜﻤﻞ ‪ ،2‬ﻋﺪد ‪ ،110‬ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬


‫‪1001‬‬ ‫اﻟﻒ‪.‬‬
‫‪1010‬‬ ‫ب‪.‬‬
‫‪1110‬‬ ‫ج‪.‬‬
‫‪0111‬‬ ‫د‪.‬‬

‫‪ ING‬و دﺳﺘﻮراﻟﻌﻤﻞ ‪ ADD AX,1‬ﻛﺪام‬ ‫‪AX‬‬ ‫‪ -74‬در ﻣﻮرد اﺳﺘﻔﺎده از دﺳﺘﻮراﻟﻌﻤﻞ‬


‫ﻣﻮرد ﻏﻠﻂ اﺳﺖ؟‬
‫اﻟﻒ‪ .‬ﺳﺮﻋﺖ اﺟﺮاي ‪ INC AX‬از ‪ ADD AX,1‬ﺑﻴﺸﺘﺮ اﺳﺖ‪.‬‬
‫ب‪ .‬ﺣﺎﻓﻈﻪ ﻣﺼﺮﻓﻲ ‪ INC AX‬از ‪ ADD AX‬ﻛﻤﺘﺮ اﺳﺖ‪.‬‬
‫‪٣٤٠‬‬

‫ج‪ .‬ﻧﺘﻴﺠﻪ )ﻣﻘﺪار ‪ (AX‬اﺟﺮاي اﻳﻦ دو دﺳﺘﻮراﻟﻌﻤﻞ ﻳﻜﺴﺎن اﺳﺖ‪.‬‬


‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -75‬در ﻣﻮرد ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ ﺻﺤﻴﺢ اﺳﺖ؟‬


‫‪PUSH‬‬ ‫‪AX‬‬
‫‪PUSH‬‬ ‫‪- BX‬‬
‫‪POP‬‬ ‫‪AX‬‬
‫‪POP‬‬ ‫‪BX‬‬
‫اﻟﻒ‪ .‬اﻳﻦ ﻗﻄﻌﻪ ﻛﺪ داراي ﺧﻄﺎ ﺑﻮده و ﺗﺮﺟﻤﻪ ﻧﻤﻲﺷﻮد‬
‫ب‪ .‬اﻳﻦ ﻛﺪ ﻫﻴﭻ ﺗﻐﻴﻴﺮي در ﻣﻘﺎدﻳﺮ ‪ AX‬و ‪ BX‬اﻳﺠﺎد ﻧﻤﻲﻛﻨﺪ‬
‫ج‪ .‬ﻣﻘﺪار ‪ AX‬و ‪ BX‬را ﺗﻌﻮﻳﺾ ﻣﻲﻛﻨﺪ‪.‬‬
‫د‪ .‬ﻣﻘﺪار ‪ AX‬و ‪ BX‬را دو ﺑﺮاﺑﺮ ﻣﻲﻛﻨﺪ‪.‬‬

‫‪ -76‬ﻗﻄﻌﻪ ﻛﺪ ذﻳﻞ ﭘﻴﺎده ﺳﺎزي ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬


‫‪CMP‬‬ ‫‪SUM,200‬‬
‫‪JGE‬‬ ‫‪A‬‬
‫‪CMP‬‬ ‫‪A VER,5‬‬
‫‪JNE‬‬ ‫‪B‬‬
‫‪A:‬‬ ‫‪MOV‬‬ ‫‪COUNT,100‬‬
‫‪B:‬‬
‫)‪IF (SUM>=200 OR AVER=5‬‬ ‫اﻟﻒ‪.‬‬
‫‪COUNT=100‬‬
‫)‪IF (SUM>=200 AND AVER=5‬‬ ‫ب‪.‬‬
‫‪COUNT=100‬‬
‫)‪IF(SUM>=200 OF AVER< >5‬‬ ‫ج‪.‬‬
‫‪COUNT=100‬‬
‫)‪IF (SUM<=200 AND AVER< > 5‬‬ ‫د‪.‬‬
‫‪COUNT=100‬‬

‫‪ -77‬ﻛﺪام ﻳﻚ از دﺳﺘﻮرات ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪CMP 100,AX‬‬ ‫ب‪.‬‬ ‫‪PUSHF AX‬‬ ‫اﻟﻒ‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬ ‫‪MOV [BX],0‬‬ ‫ج‪.‬‬
‫‪٣٤١‬‬

‫‪ -78‬ﻛﺪام ﻳﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ﻓﻠﮕﻬﺎ ﻣﻮﺛﺮﻧﺪ؟‬


‫‪JCXZ‬‬ ‫اﻟﻒ‪.‬‬
‫‪PUSHF‬‬ ‫ب‪.‬‬
‫‪CMC‬‬ ‫ج‪.‬‬
‫‪XCHG‬‬ ‫د‪.‬‬
‫‪ -79‬ﭘﻴﺸﻮﻧﺪ ﺗﻜﺮار ‪ REPZ‬ﺗﺤﺖ ﻛـﺪام ﻳـﻚ از ﺷـﺮاﻳﻂ ذﻳـﻞ ﺗﻜـﺮار را اداﻣـﻪ‬
‫ﻣﻲدﻫﺪ؟‬
‫‪CX=0‬‬ ‫ﻳﺎ‬ ‫‪zf=1‬‬ ‫اﻟﻒ‪.‬‬
‫‪CX=0‬‬ ‫ﻳﺎ‬ ‫‪zf=0‬‬ ‫ب‪.‬‬
‫‪CX< > 0‬‬ ‫و‬ ‫‪zf=1‬‬ ‫ج‪.‬‬
‫‪CX< > 0‬‬ ‫و‬ ‫‪zf=0‬‬ ‫د‪.‬‬

‫‪ XOR‬ﻣﻌﺎدل ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻞ ذﻳﻞ اﺳﺖ؟‬ ‫‪CL,11111111‬‬ ‫‪ -80‬دﺳﺘﻮراﻟﻌﻤﻞ‬


‫‪NOT CL‬‬ ‫اﻟﻒ‪.‬‬
‫‪OR CL,CL‬‬ ‫ب‪.‬‬
‫‪AND CL,00000000‬‬ ‫ج‪.‬‬
‫‪TEST CL 11111111‬‬ ‫د‪.‬‬

‫‪ -81‬ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ ﺻﺤﻴﺢ ﻧﻴﺴﺖ‪:‬‬


‫اﻟﻒ‪ .‬رواﻟﻬﺎي ‪ NEAR‬در ﻫﻤﺎن ﺳﮕﻤﻨﺖ ﻛﺪي ﻛـﻪ ﻓـﺮا ﺧـﻮاﻧﻲ ﻣـﻲﺷـﻮد‪ ،‬ﺗﻌﺮﻳـﻒ‬
‫ﻣﻲﮔﺮدﻧﺪ‪.‬‬
‫ب‪ .‬رواﻟﻬﺎي ‪ FAR‬در ﺳﮕﻤﻨﺘﻲ ﺟﺪا از ﺳﮕﻤﻨﺖ ﻛﺪ ﻓﺮا ﺧﻮاﻧﻨﺪه روال ﻗﺮار دارد‪.‬‬
‫ج‪ .‬دﺳﺘﻮر ‪ CALL‬ﺑـﺮاي ﻓﺮاﺧـﻮاﻧﻲ رواﻟﻬـﺎي ‪ FAR‬ﺛﺒﺎﺗﻬـﺎي ‪ CS‬و ‪ IP‬و ﺑـﺮاي روال‬
‫‪ NEAR‬ﻓﻘﻂ ‪ IP‬را در ﭘﺸﺘﻪ ذﺧﻴﺮه ﻣﻲﻛﻨﺪ‪.‬‬
‫د‪ .‬وﻗﺘﻲ ﻣﻘﺪاري در ﭘﺸﺘﻪ ﻗﺮار ﻣﻲﮔﻴﺮد ‪ SP‬اﻓﺰاﻳﺶ ﻣﻲﻳﺎﺑﺪ‪.‬‬
‫‪٣٤٢‬‬

‫‪ -82‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮد‪.‬‬


‫‪MOV‬‬ ‫‪AX,1‬‬
‫‪MOV‬‬ ‫‪CX,10‬‬
‫‪P:‬‬

‫‪INC‬‬ ‫‪AX‬‬
‫‪LOOP‬‬ ‫‪P‬‬
‫ﭘﺲ از اﺟﺮاي ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻘﺪار ‪ AX‬ﭼﻴﺴﺖ؟‬
‫اﻟﻒ‪9 .‬‬
‫ب‪11 .‬‬
‫ج‪10 .‬‬
‫د‪65536 .‬‬

‫‪ NEG‬ﻣﺤﺘﻮاي ‪ AX‬ﻛﺪام ﻳـﻚ‬ ‫‪AX‬‬ ‫‪ -83‬اﮔﺮ ‪ AX=ffff‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر‬


‫از ﻣﻘﺎدﻳﺮ ذﻳﻞ )در ﻣﺒﻨﺎي ده( اﺳﺖ‪.‬‬
‫اﻟﻒ‪1 .‬‬
‫ب‪-1 .‬‬
‫ج‪0 .‬‬
‫د‪65536 .‬‬

‫‪IDIV‬‬ ‫‪ -84‬اﮔﺮ ‪ AX=0032‬و ‪ DX=0000‬و ‪ CX=000B‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮر‬


‫‪ CX‬ﻣﻘﺎدﻳﺮ ‪ DX‬و ‪ AX‬ﻛﺪام ﻳﻚ از ﻣﻮارد ذﻳﻞ اﺳﺖ؟‬
‫‪AX=0004‬‬ ‫‪DX=0006‬‬ ‫اﻟﻒ‪.‬‬
‫‪AX=0006‬‬ ‫‪DX=000B‬‬ ‫ب‪.‬‬
‫‪AX=000B‬‬ ‫‪DX=0006‬‬ ‫ج‪.‬‬
‫‪AX=0006‬‬ ‫‪DX=0004‬‬ ‫د‪.‬‬
‫‪٣٤٣‬‬

‫‪ -85‬اﮔﺮ ‪ AX=ff50‬و ‪ CX=0023‬و ‪ CF=1‬ﺑﺎﺷﺪ آﻧﮕﺎه ﺑﻌﺪ از اﺟﺮاي دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫‪ ADC AX,CX‬ﻣﻘﺎدﻳﺮ ‪ AX‬و ‪ CF‬ﻛﺪاﻣﻴﻚ از ﻣﻘﺎدﻳﺮ ذﻳﻞ اﺳﺖ؟‬
‫‪CF=0 AX=FF74‬‬ ‫اﻟﻒ‪.‬‬
‫‪CF=1 AX=FF73‬‬ ‫ب‪.‬‬
‫‪CF=0 AX=FF73‬‬ ‫ج‪.‬‬
‫‪CF=1 AX=FF74‬‬ ‫د‪.‬‬

‫‪ -86‬ﺗﻌﺮﻳﻒ ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ را ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ؟‬


‫‪P‬‬ ‫‪STRUC‬‬
‫‪C‬‬ ‫‪DW‬‬ ‫?‬
‫‪C2‬‬ ‫‪DW‬‬ ‫?‬
‫‪C3‬‬ ‫‪DB‬‬ ‫)?(‪10DUP‬‬
‫‪P‬‬ ‫‪ENDS‬‬
‫‪S1‬‬ ‫‪P‬‬ ‫)> <(‪50DUP‬‬
‫اﻟﻒ‪700 .‬‬
‫ب‪14 .‬‬
‫ج‪64 .‬‬
‫د‪500 .‬‬

‫‪ -87‬اﮔﺮ اﺧﺘﻼف ﻋﺪدي ﻛﺪ اﺳﻜﻲ ﺣﺮوف ﻛﻮﭼﻚ و ﺑﺰرگ ‪ 32‬ﺑﺎﺷﺪ آﻧﮕﺎه ﺑﺮاي‬
‫ﺗﺒﺪﻳﻞ ﺣﺮوف ﻛﻮﭼﻚ ﺑﻪ ﺣﺮوف ﺑﺰرگ و ﺑﺎﻟﻌﻜﺲ از ﻛـﺪام دﺳـﺘﻮراﻟﻌﻤﻞ ذﻳـﻞ‬
‫ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد )ﻓﺮض ﻛﻨﻴﺪ ﺣﺮف ﻣﻮرد ﻧﻈﺮ در ‪ CL‬ﺑﺎﺷﺪ(‪.‬‬
‫‪XOR CL,00100000‬‬ ‫اﻟﻒ‪.‬‬
‫‪OR CL,00100000‬‬ ‫ب‪.‬‬
‫‪NOT CL‬‬ ‫ج‪.‬‬
‫‪AND 00100000‬‬ ‫د‪.‬‬
‫‪٣٤٤‬‬

‫‪ ROL‬ﻣﻘـﺪار ‪ DX‬ﭼـﻪ‬ ‫‪DX,1‬‬ ‫‪ DX=D0‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟـﺮاي دﺳـﺘﻮر‬ ‫‪56‬‬ ‫‪ -88‬اﮔﺮ‬


‫ﺧﻮاﻫﺪ ﺑﻮد؟‬
‫‪6828‬‬ ‫ب‪.‬‬ ‫‪A0AC‬‬ ‫اﻟﻒ‪.‬‬
‫‪ADD0‬‬ ‫د‪.‬‬ ‫‪A0AD‬‬ ‫ج‪.‬‬

‫‪ -89‬ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﺑﻪ ﭼﻪ ﻣﻌﻨﻲ اﺳﺖ‪.‬‬


‫‪MOV‬‬ ‫‪CX,20‬‬
‫‪MOV‬‬ ‫‪BX,6‬‬
‫‪FOR:‬‬ ‫‪M‬‬
‫‪DEC‬‬ ‫‪BX‬‬
‫‪CMP‬‬ ‫‪BX,0‬‬
‫‪LOOPN1:‬‬ ‫‪FOR‬‬
‫اﻟﻒ‪ .‬ﻳﻚ ﺣﻠﻘﻪ ﺑﺎ ‪ 20‬ﺑﺎر اﺟﺮا‬
‫ب‪ .‬ﻳﻚ ﺣﻠﻘﻪ ﺑﺎ ‪ 6‬ﺑﺎر اﺟﺮا‬
‫ج‪ .‬ﻳﻚ ﺣﻠﻘﻪ ﺑﺎ ‪ 26‬ﺑﺎر اﺟﺮا‬
‫د‪ .‬ﻳﻚ ﺣﻠﻘﻪ ﺑﺎ ‪ 13‬ﺑﺎر اﺟﺮا‬
‫‪ -90‬دﺳﺘﻮرات زﻳﺮ ﻣﻌﺎدل ﻛﺪام ﮔﺰﻳﻨﻪ اﺳﺖ‪.‬‬
‫‪CMP‬‬ ‫‪AX,10‬‬
‫‪JE‬‬ ‫‪L1‬‬
‫‪CMP‬‬ ‫‪BX,20‬‬
‫‪JNE‬‬ ‫‪LJ‬‬
‫‪ADD‬‬ ‫‪AX‬‬
‫‪LE ADD‬‬ ‫‪BX‬‬
‫)‪IF(AX< >10 AND BX=20‬‬ ‫اﻟﻒ‪.‬‬
‫‪AX=AX+1‬‬
‫‪ELSE BX=BX+1‬‬
‫‪IF(AX< >10‬‬ ‫)‪AND BX=20‬‬ ‫ب‪.‬‬
‫‪AX=AX+1‬‬
‫‪ELSE BX=BX+1‬‬
‫‪IF (AX=10‬‬ ‫)‪AND BX< >20‬‬ ‫ج‪.‬‬
‫‪AX=AX+1‬‬
‫‪ELSE BX=BX+1‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪٣٤٥‬‬

‫‪ -91‬ﻛﺪام ﻳﻚ از دﺳﺘﻮرات زﻳﺮ ﻣﺠﺎز اﺳﺖ‪.‬‬


‫‪shr ax,4‬‬ ‫اﻟﻒ‪.‬‬
‫‪sar bx,3‬‬ ‫ب‪.‬‬
‫‪imul 3‬‬ ‫ج‪.‬‬
‫‪pushf‬‬ ‫د‪.‬‬

‫‪ -92‬اﻧﺠﺎم ﻛﺪام ﺟﻤﻊ زﻳﺮ ﻣﻨﺠﺮ ﺑﻪ ﺳﺮرﻳﺰ ) ‪ (overflow‬ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬


‫‪0A07+01d3‬‬ ‫اﻟﻒ‪.‬‬
‫‪0206+FFB0‬‬ ‫ب‪.‬‬
‫‪483F+645A‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -93‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ repne‬ﺗﺤﺖ ﻛﺪام ﻳﻚ از ﺷﺮاﻳﻂ زﻳﺮ ﺗﻜﺮار را اداﻣﻪ ﻣﻲدﻫﺪ؟‬


‫‪cx< >0 or zf< >0‬‬ ‫اﻟﻒ‪.‬‬
‫‪cx< >0 or zf=0‬‬ ‫ب‪.‬‬
‫‪cx< >0 and‬‬ ‫‪zf=0‬‬ ‫ج‪.‬‬
‫‪cx=0‬‬ ‫‪and‬‬ ‫‪zf< >0‬‬ ‫د‪.‬‬

‫‪ -94‬اﮔﺮ ‪ ax=0F‬و ‪ bx=0E‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ ﻓﻠﮕﻬـﺎ ﺑـﻪ ﭼـﻪ‬
‫ﺻﻮرت ﺧﻮاﻫﺪ ﺷﺪ؟‬
‫‪cmp‬‬ ‫‪bx,ax‬‬
‫‪of=0 ,‬‬ ‫‪cf=1,‬‬ ‫‪sf=1‬‬ ‫اﻟﻒ‪.‬‬
‫‪of=0 ,‬‬ ‫‪cf=0,‬‬ ‫‪sf=0‬‬ ‫ب‪.‬‬
‫‪of=1 ,‬‬ ‫‪cf=1,‬‬ ‫‪sf=1‬‬ ‫ج‪.‬‬
‫‪of=0 ,‬‬ ‫‪cf=1,‬‬ ‫‪sf=0‬‬ ‫د‪.‬‬
‫‪٣٤٦‬‬

‫‪ -95‬ﭘﺲ از اﺟﺮاي دﺳﺘﻮرات زﻳﺮ ﻣﻘﺪار ‪) ax‬در ﻣﺒﻨﺎي ‪ (16‬ﭼﻴﺴﺖ؟‬


‫‪mov ax,‬‬ ‫‪100h‬‬
‫‪stc‬‬
‫‪adc‬‬ ‫‪ax,ax‬‬
‫‪200‬‬ ‫اﻟﻒ‪.‬‬
‫‪201‬‬ ‫ب‪.‬‬
‫‪202‬‬ ‫ج‪.‬‬
‫‪199‬‬ ‫د‪.‬‬

‫‪ -96‬ﻣﻘﺪار ﻧﻬﺎﻳﻲ ‪ ax‬ﭘﺲ از اﺟﺮاي ﻛﺪ زﻳﺮ ﭼﻴﺴﺖ؟‬


‫‪mov‬‬ ‫‪ax,x‬‬
‫‪mov‬‬ ‫‪bx,y‬‬
‫‪add‬‬ ‫‪bx,z‬‬
‫‪add‬‬ ‫‪bx,bx‬‬
‫‪ncg‬‬ ‫‪ax‬‬
‫‪add‬‬ ‫‪ax,bx‬‬
‫‪2(z+y)- x‬‬ ‫اﻟﻒ‪.‬‬
‫)‪2(x+y- x‬‬ ‫ب‪.‬‬
‫‪2y+z- x‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -97‬ﺑﺮاي اﻳﻨﻜﻪ ﻓﻘﻂ ﺑﻴﺖ ﺳـﻮم ‪ ax‬را ﻳـﻚ ﻛﻨـﻴﻢ از ﻛـﺪام ﻳـﻚ از دﺳـﺘﻮرات‬
‫ﻣﻲﺗﻮاﻧﻴﻢ اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟‬
‫‪or ax,4‬‬ ‫اﻟﻒ‪.‬‬
‫‪and ax,4‬‬ ‫ب‪.‬‬
‫‪xor ax,4‬‬ ‫ج‪.‬‬
‫‪not ax,4‬‬ ‫د‪.‬‬
‫‪٣٤٧‬‬

‫‪ -98‬ﺑﻌﺪ از اﺟﺮاي ﻛﺪ زﻳﺮ ﻣﻘﺪار ‪ cx‬ﭼﻴﺴﺖ؟‬

‫‪mov cx,10‬‬
‫‪ll:‬‬

‫‪M‬‬
‫‪loop l l‬‬

‫‪10‬‬ ‫اﻟﻒ‪.‬‬
‫‪0‬‬ ‫ب‪.‬‬
‫‪1‬‬ ‫ج‪.‬‬
‫د‪-1 .‬‬

‫‪ -99‬ﻛﺪاﻣﻴﻚ از ﻣﺠﻤﻮﻋﻪ دﺳﺘﻮرات زﻳﺮ ﺻﺤﻴﺢ ﻧﻴﺴﺖ؟‬


‫‪in‬‬ ‫‪ax, 0ffh‬‬ ‫اﻟﻒ‪.‬‬
‫‪in‬‬ ‫‪ax,07ch‬‬ ‫ب‪.‬‬
‫‪mov cx,0717h‬‬ ‫ج‪.‬‬
‫‪in‬‬ ‫‪ax,cx‬‬
‫‪mov dx,07ch‬‬ ‫د‪.‬‬
‫‪in ax,dx‬‬

‫‪ -100‬ﭘﺲ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﻣﻘﺪار ‪ AX‬ﭼﻴﺴﺖ؟‬


‫‪MOV‬‬ ‫‪AX,1‬‬
‫‪MOV‬‬ ‫‪CL,4‬‬
‫‪SHL‬‬ ‫‪AX,CL‬‬
‫‪XOR‬‬ ‫‪AX,AX‬‬
‫‪000F‬‬ ‫اﻟﻒ‪.‬‬
‫‪FFF0‬‬ ‫ب‪.‬‬
‫‪0000‬‬ ‫ج‪.‬‬
‫‪FFFF‬‬ ‫د‪.‬‬
‫‪٣٤٨‬‬

‫‪ -101‬اﮔﺮ ‪ SP=00F0‬ﺑﺎﺷﺪ ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﻣﻘﺪار ‪ SP‬ﭼﻴﺴﺖ؟‬


‫‪PUSH‬‬ ‫‪AX‬‬
‫‪PUSH‬‬ ‫‪BX‬‬
‫‪PUSH‬‬ ‫‪CX‬‬
‫‪00EA‬‬ ‫اﻟﻒ‪.‬‬
‫‪00F9‬‬ ‫ب‪.‬‬
‫‪00F6‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -102‬ﻛﺪام ﻣﻮرد ﻏﻠﻂ اﺳﺖ؟‬


‫اﻟﻒ‪ .‬ﺷﻴﻔﺖ رﻳﺎﺿﻲ و ﻣﻨﻄﻘﻲ ﺑﻪ ﭼﭗ ﻳﻜﺴﺎن اﺳﺖ‪.‬‬
‫ب‪ .‬ﻓﻠﮓ ﺳﺮرﻳﺰي ﺑﺮاي ﺷﻴﻒ ﭼﻨﺪ ﺑﻴﺘﻲ ﺗﻌﺮﻳﻒ ﻧﺸﺪه اﺳﺖ‪.‬‬
‫ج‪ .‬ﺷﻴﻒ رﻳﺎﺿﻲ و ﻣﻨﻄﻘﻲ ﺑﻪ راﺳﺖ ﻳﻜﺴﺎن ﻫﺴﺘﻨﺪ‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -103‬ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﻣﻘﺪار ‪ AX‬ﭼﻘﺪر اﺳﺖ؟‬


‫‪SEGMENT‬‬ ‫‪DATA‬‬
‫‪DB A‬‬ ‫‪"ALI",13,10‬‬
‫‪DB B‬‬ ‫"‪"REZA‬‬
‫‪ENDS‬‬
‫‪CODE‬‬ ‫‪SEGMENT‬‬
‫‪MOV AX, Offest B‬‬
‫‪6‬‬ ‫اﻟﻒ‪.‬‬
‫‪4‬‬ ‫ب‪.‬‬
‫‪3‬‬ ‫ج‪.‬‬
‫‪10‬‬ ‫د‪.‬‬
‫‪٣٤٩‬‬

‫‪ -104‬اﮔﺮ ‪ si=0000‬و ‪ di=0005‬ﺑﺎﺷﺪ ﻣﻘﺎدﻳﺮ ‪ si,di‬ﺑﻌﺪ از اﺟﺮاي ﻗﻄﻌـﻪ ﻛـﺪ زﻳـﺮ‬


‫ﭼﻴﺴﺖ؟‬
‫‪Source‬‬ ‫‪Db‬‬ ‫"‪"book‬‬
‫‪Dest‬‬ ‫‪Db‬‬ ‫"‪"book‬‬
‫‪Lea‬‬ ‫‪Si,source‬‬
‫‪Lea‬‬ ‫‪Di,dest‬‬
‫‪Mov cx,5‬‬
‫‪Repne cmpsb‬‬
‫‪SI=0000 , di=0005‬‬ ‫اﻟﻒ‪.‬‬
‫‪SI=0001 ,‬‬ ‫‪di=0006‬‬ ‫ب‪.‬‬
‫‪SI=0004 , di=0009‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -105‬اﮔﺮ ﻛﺪ دﺳﺘﻮر ‪ add‬ﭼﻬﺎر ﺑﺎﻳـﺖ و ‪ mov‬دو ﺑﺎﻳـﺖ ﺑﺎﺷـﺪ اﺳـﻤﺒﻠﺮ ﺑـﺮاي‬


‫دﺳﺘﻮرات زﻳﺮ ﭼﻨﺪ ﺑﺎﻳﺖ در ﻧﻈﺮ ﻣﻲﮔﻴﺮد؟‬
‫‪M1‬‬ ‫‪Macro‬‬ ‫‪N1,n2‬‬
‫‪Mov‬‬ ‫‪Ax,n1‬‬
‫‪Add‬‬ ‫‪Ax,n2‬‬
‫‪Endm‬‬
‫‪M1‬‬ ‫‪Cx,bx‬‬
‫‪M1‬‬ ‫‪Dx,cx‬‬
‫‪4‬‬ ‫اﻟﻒ‪.‬‬
‫‪6‬‬ ‫ب‪.‬‬
‫‪10‬‬ ‫ج‪.‬‬
‫‪20‬‬ ‫د‪.‬‬

‫‪ -106‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻤﻌﻠﻬﺎي ذﻳﻞ روي ﻓﻠﮓﻫﺎ اﺛﺮ دارﻧﺪ؟‬


‫‪CALL‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV‬‬ ‫ب‪.‬‬
‫‪INC‬‬ ‫ج‪.‬‬
‫‪LOOP‬‬ ‫د‪.‬‬
‫‪٣٥٠‬‬

‫‪ -107‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪SHL DL,5‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV CS,300‬‬ ‫ب‪.‬‬
‫‪MOV IP,3600‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد ﺑﺎﻻ‬

‫‪ -108‬دﺳﺘﻮر ﺗﻜﺮار زﻳﺮ ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻣﻲﮔﺮدد؟‬


‫‪XOR‬‬ ‫‪AX,AX‬‬
‫‪MOV‬‬ ‫‪CX,AX‬‬
‫‪LOOP1:‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪LOOP LOOP1‬‬
‫اﻟﻒ‪ .‬اﺻﻼً اﺟﺮا ﻧﻤﻲﺷﻮد‬
‫ب‪ .‬ﻳﻜﺒﺎر اﺟﺮا ﻣﻲﺷﻮد‬
‫ج‪ 65536 .‬دﻓﻌﻪ اﺟﺮا ﻣﻲﺷﻮد‬
‫د‪ 32767 .‬دﻓﻌﻪ اﺟﺮا ﻣﻲﺷﻮد‬

‫‪ -109‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﭼﻨﺪ ﺑﺎﻳﺖ از ﺣﺎﻓﻈﻪ اﺷﻐﺎل ﻣﻲﺷﻮد؟‬


‫‪X‬‬ ‫‪DB‬‬ ‫’‪‘P LEASE YWAIT‬‬
‫‪Y‬‬ ‫‪DW‬‬ ‫)?(‪4DUP‬‬
‫‪Z‬‬ ‫‪DD‬‬ ‫‪35000,42000‬‬
‫‪20‬‬ ‫اﻟﻒ‪.‬‬
‫‪27‬‬ ‫ب‪.‬‬
‫‪7‬‬ ‫ج‪.‬‬
‫‪30‬‬ ‫د‪.‬‬
‫‪٣٥١‬‬

‫‪ -110‬ﻗﻄﻌﻪ ﺑﺮﻧﺎﻣﻪ زﻳﺮ ﭼﻪ ﻛﺎري را اﻧﺠﺎم ﻣﻲدﻫﺪ؟‬

‫‪MOV‬‬ ‫‪AL, ′a′‬‬


‫‪AND‬‬ ‫‪AL,0DFH‬‬

‫اﻟﻒ‪ .‬ﺣﺮف ‪ ′A′‬را ﺑﻪ ‪ ′a′‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ‬


‫ب‪ .‬ﺣﺮف ‪ ′a′‬را ﺑﻪ ‪ ′A′‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ‬
‫ج‪ .‬ﻣﺤﺘﻮاي ‪ AL‬را ﺗﻐﻴﻴﺮ ﻧﻤﻲدﻫﺪ‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -111‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ CLD .‬ﻣﻘﺪار ‪ DF‬را ﺻﻔﺮ ﻣﻲﻛﻨﺪ‬
‫ب‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ LAHF‬ﺑﺎﻳـﺖ داراي ارزش ﻛﻤﺘـﺮ رﺟﻴـﺴﺘﺮ ﻓﻠـﮓ را در ‪ AH‬ﻗـﺮار‬
‫ﻣﻲدﻫﺪ‬
‫ج‪ .‬دﺳﺘﻮر ‪ X‬و ‪ bx‬و ‪ LEA‬آدرس ‪ X‬را در رﺟﻴﺴﺘﺮ ‪ BX‬ﻗﺮار ﻣﻲدﻫﺪ‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد ﺑﺎﻻ‬

‫‪ -112‬در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‬
‫ب‪ .‬ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﺤﺘﻮي ﻳﻚ ﺑﺎﻳﺖ ﻛﻪ در رﺟﻴﺴﺘﺮ ‪ AL‬ﻗﺮار دارد ﺑﻴﻚ ‪ Word‬اﺳﺘﻔﺎده‬
‫ﻣﻲﺷﻮد‬
‫ج‪ .‬اﻟﻒ و ب‬
‫د‪ .‬در ﻣﺤﺘﻮي رﺟﻴﺴﺘﺮ ‪ AL‬را دو ﺑﺮاﺑﺮ ﻣﻲﻧﻤﺎﻳﺪ‬
‫‪٣٥٢‬‬

‫‪ -113‬در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬ﺑﺮﻧﺎﻣﻪ ﻣﻘﺎﻳﺴﻪ دو ﻣﻘﺪار اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‬
‫ب‪ .‬ﺑﺮاي ﻣﻘﺎﻳﺴﻪ دو رﺷﺘﻪ اﺳﺘﻔﺎده ﻣﻲﮔﺮدد‬
‫ج‪ .‬اﺳﺘﻔﺎده از ﭼﻨﻴﻦ دﺳﺘﻮري ﻣﺠﺎز ﻧﻤﻲﺑﺎﺷﺪ‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪ -114‬ﺑﺮاي ﻣﻜﻤﻞ ﻧﻤﻮدن ﺑﻴﺖﻫﺎي ﺷﻤﺎره ‪ 7,5,2‬رﺟﻴﺴﺘﺮ ‪ AL‬از ﭼﻪ دﺳﺘﻮراﻟﻌﻠﻤﻲ‬
‫اﺳﺘﻔﺎده ﻣﻲﺷﻮد؟‬
‫‪XOR AL, 0A4H‬‬ ‫اﻟﻒ‪.‬‬
‫‪AND AL,0A4H‬‬ ‫ب‪.‬‬
‫‪NOT AL‬‬ ‫ج‪.‬‬
‫‪NEG AL‬‬ ‫د‪.‬‬

‫‪ -115‬ﺑﺮاي ﺟﺎﺑﻪ ﺟﺎ ﻧﻤﻮدن دو ﻣﻘﺪار ﺣﺎﻓﻈـﻪ ‪ X‬و ‪ Y‬از ﻧـﻮع ‪ WORD‬از ﻛـﺪام‬
‫دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد؟‬
‫‪MOV X,Y‬‬ ‫اﻟﻒ‪.‬‬
‫‪XCHG X,Y‬‬ ‫ب‪.‬‬
‫‪LEA X,Y‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -116‬در ﻣﻮرد آدرس ﺷﺮوع ‪segment‬ﻫﺎ ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬از ﻫﺮ آدرس دﻟﺨﻮاﻫﻲ در ﺣﺎﻓﻈﻪ ﻣﻲﺗﻮاﻧﻨﺪ ﺷﺮوع ﺷﻮﻧﺪ‬
‫ب‪ .‬ﺑﺎﻳﺴﺘﻲ ﻗﺎﺑﻞ ﺗﻘﺴﻴﻢ ﺑﺮ ‪ 16‬ﺑﺎﺷﺪ‬
‫ج‪ .‬ﺑﺎﻳﺴﺘﻲ ﻗﺎﺑﻞ ﺗﻘﺴﻴﻢ ﺑﺮ ‪ 8‬ﺑﺎﺷﺪ‬
‫د‪ .‬ﺑﺎﻳﺴﺘﻲ ﻓﺮد ﺑﺎﺷﺪ‬
‫‪٣٥٣‬‬

‫‪ -117‬ﭘﺲ از اﺟﺮاي ﻋﻤﻞ زﻳﺮ ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻣﻲﺑﺎﺷﺪ؟‬

‫‪A2B4+‬‬

‫‪88F3‬‬

‫‪ZF‬‬ ‫‪SF‬‬ ‫‪CF‬‬ ‫‪OF‬‬

‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫اﻟﻒ‪.‬‬


‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫ب‪.‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫ج‪.‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫د‪.‬‬

‫‪ LEA‬ﻣﻌﺎدل ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻞ ﻣﻲﺑﺎﺷﺪ؟‬ ‫‪BX ,Z‬‬ ‫‪ -118‬دﺳﺘﻮراﻟﻌﻤﻞ‬


‫‪MOV BX,Z‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV BX OFFSET Z‬‬ ‫ب‪.‬‬
‫‪MOV BX OFSET,Z‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪ -119‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ اﺳﺖ؟‬


‫اﻟﻒ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﻤﻞ ﻧﻤﻮده وﻟﻲ ﻧﺘﻴﺠـﻪ در ﺟـﺎﺋﻲ‬
‫ذﺧﻴﺮه ﻧﻤﻲﺷﻮد‬
‫ب‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬دﻗﻴﻘﺎً ﻣﺎﻧﻨﺪ دﺳﺘﻮراﻟﻌﻤﻞ ‪ SUB‬ﻋﻤﻞ ﻣﻲﻧﻤﺎﻳﺪ‬
‫ج‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMP‬روي ﻓﻠﮓﻫﺎي ‪ AF‬و ‪ CF‬اﺛﺮ ﻧﺪارﻧﺪ‬
‫‪ CMP‬ﻣﺠﺎز ﻧﻴﺴﺖ‬ ‫‪AX,AX‬‬ ‫د‪ .‬اﺳﺘﻔﺎده از دﺳﺘﻮر‬
‫‪٣٥٤‬‬

‫‪ -120‬اﮔـﺮ ‪ AX=300, BL=- 5, AL=4‬ﻛـﺪاﻣﻴﻚ از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳـﺮ ﻣﺠـﺎز‬


‫ﻧﻴﺴﺖ؟‬
‫‪MUL BL‬‬ ‫اﻟﻒ‪.‬‬
‫‪MUL AL,BL‬‬ ‫ب‪.‬‬
‫ج‪ .‬اﻟﻒ و ب‬
‫‪IDIV BL‬‬ ‫د‪.‬‬

‫‪ -121‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳﺮ ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ ﻣﻘﺪار ﻓﻠﮓ‪ CF‬ﻣﻲﺷﻮد؟‬


‫‪CLC‬‬ ‫اﻟﻒ‪.‬‬
‫‪CMC‬‬ ‫ب‪.‬‬
‫‪STC‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد‬

‫‪ -122‬اﺳﺘﻔﺎده از ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪PUSH CS‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV IP,100‬‬ ‫ب‪.‬‬
‫‪POP AL‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد‬

‫‪ -123‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ روي ﻓﻠﮓﻫﺎ ﺑﻲاﺛﺮﻧﺪ؟‬


‫‪PUSH,POP‬‬ ‫اﻟﻒ‪.‬‬
‫‪PUSHF‬‬ ‫ب‪.‬‬
‫ج‪ .‬اﻟﻒ و ب‬
‫‪POPF‬‬ ‫د‪.‬‬
‫‪٣٥٥‬‬

‫‪ CMP‬از ﻛﺪاﻣﻴﻚ از دﺳـﺘﻮراﻟﻌﻤﻠﻬﺎي زﻳـﺮ‬ ‫‪AL , -20‬‬ ‫‪ -124‬ﺑﻌﺪ از دﺳﺘﻮراﻟﻌﻤﻞ‬


‫ﻧﻤﻲﺗﻮان اﺳﺘﻔﺎده ﻧﻤﻮد؟‬
‫‪JL LAB1‬‬ ‫اﻟﻒ‪.‬‬
‫‪JNGE LAB1‬‬ ‫ب‪.‬‬
‫‪JB LAB1‬‬ ‫ج‪.‬‬
‫‪JLE LAB1‬‬ ‫د‪.‬‬

‫‪ JBE‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB1‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﮔﺮ‬ ‫‪LAB1‬‬ ‫‪ -125‬در دﺳﺘﻮراﻟﻌﻤﻞ‬


‫اﻟﻒ‪ CF=0 .‬ﺑﺎﺷﺪ‬
‫ب‪ ZF=0 .‬ﺑﺎﺷﺪ‬
‫ج‪ CF=1 .‬و ‪ ZF=0‬ﺑﺎﺷﺪ‬
‫د‪ CF=0 .‬و ‪ ZF=0‬ﺑﺎﺷﺪ‬

‫‪ -126‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬در ﻣﺎﻛﺮوﻫﺎ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎﺋﻲ ﻛﻪ ﺑﺎ ;; ﺷﺮوع ﻣﻲﺷﻮﻧﺪ در ﺑﺮﻧﺎﻣﻪ ﻟﻴﺴﺖ ﻧﻤﻲﺷﻮد‪.‬‬
‫ب‪ .‬در ﻓﺮاﺧﻮاﻧﻲ ﻣﺎﻛﺮوﻫﺎ ﻣﻲﺗﻮان ﺑﻌﻀﻲ از ﭘﺎراﻣﺘﺮﻫﺎ را ذﻛﺮ ﻧﻜﺮد‬
‫ج‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ STOS‬ﻣﻘﺪار ﺑﻌﻀﻲ از ﻓﻠﮓﻫﺎ را ﺗﻐﻴﻴﺮ ﻣﻲدﻫﺪ‬
‫د‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ LODS‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‬

‫‪CL‬‬ ‫‪ -127‬اﮔﺮ ‪ CL=3‬و ‪ DL=8DH‬و ‪ CF=1‬ﺑﺎﺷﺪ‪ .‬ﭘﺲ از اﺟﺮاي دﺳـﺘﻮراﻟﻌﻤﻞ‬


‫‪ SAR‬ﻣﻘﺪار ﺛﺒﺎت ‪ DL‬ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ؟‬ ‫‪DL‬‬ ‫و‬
‫‪11110001B‬‬ ‫اﻟﻒ‪.‬‬
‫‪00010001B‬‬ ‫ب‪.‬‬
‫‪10001000B‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪٣٥٦‬‬

‫‪ -128‬دﺳﺘﻮر ﺗﻜﺮار زﻳﺮ ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻣﻲﮔﺮدد؟‬


‫‪MOV‬‬ ‫‪CX,10‬‬
‫‪LOOP1:‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪MOV CX,5‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪LOOP LOOP1‬‬
‫اﻟﻒ‪ 10 .‬ﺑﺎر‬
‫ب‪ .‬ﺑﻲﻧﻬﺎﻳﺖ ﺑﺎر‬
‫ج‪ 5 .‬ﺑﺎر‬
‫د‪ 50 .‬ﺑﺎر‬

‫‪ -129‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﭼﻪ ﻛﺎري را اﻧﺠﺎم ﻣﻲدﻫﻨﺪ؟‬


‫‪MOV‬‬ ‫‪AH, 01H‬‬
‫‪INT‬‬ ‫‪21H‬‬
‫اﻟﻒ‪ .‬ﻣﻨﺘﻈﺮ ﻣﻲﻣﺎﻧﺪ ﻛﻪ ﻛﻠﻴﺪي از ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﻮد‬
‫ب‪ .‬ﻛﺎرﻛﺘﺮي از ﺻﻔﺤﻪ ﻛﻠﻴﺪ داده ﻣﻲﺷﻮد در ‪ AL‬ﻗﺮار ﻣﻲدﻫﺪ‬
‫ج‪ .‬اﻟﻒ و ب‬
‫د‪ .‬ﻛﺎرﻛﺘﺮي از ﺻﻔﺤﻪ ﻛﻠﻴﺪ داده ﻣﻲﺷﻮد روي ﺻﻔﺤﻪ ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ‬

‫‪ -130‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ اﺳﺖ؟‬


‫اﻟﻒ‪ .‬اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺣﺎﻓﻈﻪ ﺑﻪ ﺛﺒﺎت اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ‪.‬‬
‫ب‪ .‬اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺛﺒﺎت ﺑﻪ ﺣﺎﻓﻈﻪ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ‪.‬‬
‫ج‪ .‬اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺛﺒﺎت ﺑﻪ رﺟﻴﺴﺘﺮ اﻣﻜﺎن ﭘﺬﻳﺮ ﻣﻲﺑﺎﺷﺪ‬
‫د‪ .‬اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺣﺎﻓﻈﻪ ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﺴﺘﻘﻴﻤﺎً اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ‬
‫‪٣٥٧‬‬

‫‪ -131‬دﺳﺘﻮراﻟﻌﻤﻞ ﺗﻜﺮار زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪:‬‬

‫‪Loop1:‬‬ ‫‪MOV‬‬ ‫‪CX,10‬‬


‫‪M‬‬
‫‪Loop‬‬ ‫‪Loop1‬‬

‫اﻟﻒ‪ .‬ﺑﻲ ﻧﻬﺎﻳﺖ ﺑﺎر اﺟﺮا ﻣﻲﺷﻮد‬


‫ب‪ 5 .‬ﺑﺎر اﺟﺮا ﻣﻲﺷﻮد‬
‫ج‪ .‬اﺻﻼً اﺟﺮا ﻧﻤﻲﺷﻮد‬
‫د‪ 0 .‬ﺑﺎر اﺟﺮا ﻣﻲﺷﻮد‬

‫‪ -132‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺠﺎز اﺳﺖ؟‬


‫‪MOV AX,BL‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV CS,100‬‬ ‫ب‪.‬‬
‫‪MOV DS,CS‬‬ ‫ج‪.‬‬
‫]‪MOV AX,[BX‬‬ ‫د‪.‬‬

‫‪ -133‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪:‬‬


‫‪CMP‬‬ ‫‪AL,- 5‬‬
‫‪JA‬‬ ‫‪LAB1‬‬

‫اﻟﻒ‪ .‬اﺳﺘﻔﺎده از اﻳﻦ دو دﺳﺘﻮراﻟﻌﻤﻞ ﺑﺘﺮﺗﻴﺐ داده ﺷﺪه ﺻﺤﻴﺢ اﺳﺖ‪.‬‬


‫ب‪ JA .‬ﺑﺎﻳﺴﺘﻲ ﺑﻪ ‪ JG‬ﺗﻐﻴﻴﺮ ﻛﻨﺪ‪.‬‬
‫ج‪ .‬ﻣﻘﺎدﻳﺮ ﻣﻨﻔﻲ را ﻧﻤﻲﺗﻮان در دﺳﺘﻮر ‪ CMP‬اﺳﺘﻔﺎده ﻧﻤﻮد‪.‬‬
‫د‪ JA .‬ﺑﺎﻳﺴﺘﻲ ﺑﻪ ‪ JL‬ﺗﻐﻴﻴﺮ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪٣٥٨‬‬

‫‪ -134‬دﺳﺘﻮراﻟﻌﻤﻞ ﺗﻜﺮار زﻳﺮ ﭼﻨﺪ ﻣﺮﺗﺒﻪ اﺟﺮا ﻣﻲﺷﻮد؟‬


‫‪MOV‬‬ ‫‪CX, 0‬‬
‫‪Loop1:‬‬ ‫‪M‬‬
‫‪Loop‬‬ ‫‪Loop1‬‬
‫اﻟﻒ‪ .‬ﺻﻔﺮ ﻣﺮﺗﺒﻪ‬
‫ب‪ .‬ﻳﻜﺒﺎر‬
‫ج‪ 65536 .‬دﻓﻌﻪ‬
‫د‪ .‬دو ﻣﺮﺗﺒﻪ‬
‫‪ -135‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ اﺳﺖ؟‬
‫اﻟﻒ‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ب‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CWD‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج‪ .‬در دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬ﻋﻤﻠﻮﻧﺪ ﺑﺎﻳﺴﺘﻲ در ﺛﺒﺎت ‪ AL‬ﻗﺮار ﮔﻴﺮد‪.‬‬
‫‪ DOUBLE‬ﻣﻲﺷﻮد‪.‬‬ ‫‪WORD‬‬ ‫د‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CBW‬ﺑﺎﻋﺚ ﺗﺒﺪﻳﻞ ﻳﻚ ‪ WORD‬ﺑﻪ‬

‫‪ -136‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬ﺑﺮاي ﻣﻜﻤﻞ ﻧﻤﻮدن ﺗﻌﺪادي ﺑﻴﺖ در ﻳﻚ ﺛﺒـﺎت از دﺳـﺘﻮراﻟﻌﻤﻞ ‪ OR‬اﺳـﺘﻔﺎده‬
‫ﻣﻲﮔﺮدد‪.‬‬
‫ب‪ .‬ﺑﺮاي ﺻﻔﺮ ﻧﻤﻮدن ﺗﻌﺪادي ﺑﻴـﺖ در ﻳـﻚ ﺛﺒـﺎت از دﺳـﺘﻮراﻟﻌﻤﻞ ‪ AND‬اﺳـﺘﻔﺎده‬
‫ﻣﻲﺷﻮد‪.‬‬
‫ج‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ TEST‬ﻧﺘﻴﺠﻪ را در ﺟﺎﺋﻲ ذﺧﻴﺮه ﻧﻤﻲﻛﻨﺪ‪.‬‬
‫د‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ NOT‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪ LEA‬ﻣﻌﺎدل‬ ‫‪BX,TAB+5‬‬ ‫‪ -137‬دﺳﺘﻮراﻟﻌﻤﻞ‬
‫‪MOV BX,OFFSET TAB+5‬‬ ‫اﻟﻒ‪.‬‬
‫‪MOV BX,TAB+5‬‬ ‫ب‪.‬‬
‫‪MOV TAB+5,BX‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪٣٥٩‬‬

‫ﺑﺮاﺑـﺮ‬ ‫‪BX‬‬ ‫ﺑﺎﺷﺪ و ﻣﺤﺘﻮي‬ ‫‪101010000111001B0‬‬ ‫ﺑﺮاﺑﺮ ﺑﺎ‬ ‫‪AX‬‬ ‫‪ -138‬اﮔﺮ ﻣﺤﺘﻮي‬
‫‪ ADD‬ﻛﺪام ﮔﺰﻳﻨـﻪ‬ ‫‪AX,BX‬‬ ‫ﺑﺎ ‪ 100010101101010B0‬ﺑﺎﺷﺪ ﭘﺲ از اﺟﺮاي دﺳﺘﻮر‬
‫ﺻﺤﻴﺢ اﺳﺖ؟‬
‫‪OF=1, SF=1, AF=1, PF=1‬‬ ‫اﻟﻒ‪.‬‬
‫‪OF=1, SF=1, AF=0, PF=0‬‬ ‫ب‪.‬‬
‫‪OF=1, SF=0, AF=1, PF=1‬‬ ‫ج‪.‬‬
‫‪OF=1, SF=0, AF=1, PF=1‬‬ ‫د‪.‬‬

‫‪ -139‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ اﺳﺖ؟‬


‫اﻟﻒ‪ .‬دﺳﺘﻮر ‪ CALL‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ب‪ .‬دﺳﺘﻮر ‪ LODS‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪ SUB‬ﻣﺤﺘﻮي ‪ CF‬را ﺻﻔﺮ ﻣﻲﻛﻨﺪ‬ ‫‪AX,AX‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﺮ ﺳﻪ ﻣﻮرد‬

‫‪ -140‬ﺑﺮاي ﻣﻜﻤﻞ ﻧﻤﻮدن ﺑﻴﺖﻫﺎي ﺷﻤﺎره ﻓﺮد ﺛﺒﺎت ‪ AL‬از ﺟﻪ دﺳﺘﻮري اﺳﺘﻔﺎده‬
‫ﻣﻲﮔﺮدد؟‬
‫‪XOR AL,AAH‬‬ ‫اﻟﻒ‪.‬‬
‫‪XOR AL,0AAH‬‬ ‫ب‪.‬‬
‫‪OR AL, 0AAH‬‬ ‫ج‪.‬‬
‫‪AND AL, 0AAH‬‬ ‫د‪.‬‬
‫‪ -141‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬
‫‪PUSHF‬‬ ‫‪AX‬‬ ‫اﻟﻒ‪.‬‬
‫‪POP AL‬‬ ‫ب‪.‬‬
‫‪PUSH AL‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد‬
‫‪٣٦٠‬‬

‫‪ JCXZ‬را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪.‬‬ ‫‪LAB‬‬ ‫‪ -142‬دﺳﺘﻮراﻟﻌﻤﻞ‬


‫اﻟﻒ‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﮔﺮ ‪ CX=0‬ﺑﺎﺷﺪ‪.‬‬
‫ب‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﮔﺮ ‪ CF=0‬ﺑﺎﺷﺪ‪.‬‬
‫ج‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﮔﺮ ‪ DF=0‬ﺑﺎﺷﺪ‪.‬‬
‫د‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﺷﻮد اﮔﺮ ‪ CX‬ﻣﻌﺎدل ﺻﻔﺮ ﻧﺒﺎﺷﺪ‪.‬‬

‫‪ -143‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪NEG AL‬‬ ‫اﻟﻒ‪.‬‬
‫‪NOT AL‬‬ ‫ب‪.‬‬
‫‪PUSH AL‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬

‫‪JA LAB‬‬ ‫‪ -144‬در دﺳﺘﻮر‬


‫اﻟﻒ‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد اﮔﺮ ‪ CF=0‬ﺑﺎﺷﺪ‪.‬‬
‫ب‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد اﮔﺮ ‪ CF=1‬ﺑﺎﺷﺪ‪.‬‬
‫ج‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد اﮔﺮ ‪ CF=0, ZF=0‬ﺑﺎﺷﺪ‪.‬‬
‫د‪ .‬ﻛﻨﺘﺮل ﺑﻪ ‪ LAB‬ﻣﻨﺘﻘﻞ ﻣﻲﮔﺮدد اﮔﺮ ‪ ZF=1‬ﺑﺎﺷﺪ‪.‬‬

‫‪ -145‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬دﺳﺘﻮرﻫﺎي ﭘﺮش روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‬
‫ب‪ .‬دﺳﺘﻮر ‪ TEST‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫ج‪ .‬دﺳﺘﻮر ‪ MOV‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫د‪ .‬دﺳﺘﻮر ‪ LEA‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‪.‬‬
‫‪٣٦١‬‬

‫‪ -146‬در ﻣﻮرد ﺟﻤﻊ دو ﻣﻘﺪار از ﻧﻮع ‪ WORD‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬اﮔﺮ ﻣﻘﺪار ‪ MSB‬ﻧﺘﻴﺠﻪ ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺷﻮد ‪ SF‬ﺑﺮاﺑﺮ ﻳﻚ ﻣﻲﺷﻮد‪.‬‬
‫ب‪ .‬اﮔﺮ ﺗﻌﺪاد ﺑﻴﺖﻫﺎي ﻳﻚ در ‪ 8‬ﺑﻴﺖ اول زوج ﺑﺎﺷﺪ ‪ ZF‬ﺑﺮاﺑﺮ ﺻﻔﺮ ﻣﻲﺷﻮد‪.‬‬
‫ج‪ .‬اﮔﺮ ﻧﺘﻴﺠﻪ ﺟﻤﻊ ﺻﻔﺮ ﺷﻮد ‪ ZF‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣﻲﺷﻮد‪.‬‬
‫د‪ .‬ب و ج‬

‫‪ -147‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬دﺳﺘﻮر ‪ XCHG‬روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﺪارد‬
‫‪ XCHG‬ﺑﺎﻋﺚ ﻣﺒﺎدﻟﺔ ﻣﺘﺤﻮي ‪ X,Y‬ﻣﻲﮔـﺮدد‪ X,Y) .‬از‬ ‫‪X,Y‬‬ ‫ب‪ .‬اﺳﺘﻔﺎده از دﺳﺘﻮر‬
‫ﻧﻮع ‪ WORD‬ﻣﻲﺑﺎﺷﺪ‪( .‬‬
‫‪ NOT‬ﻣﻜﻤﻞ ‪ 1‬ﻣﻘﺪار ‪ AL‬را ﻣﻲدﻫﺪ‪.‬‬ ‫‪AL‬‬ ‫ج‪ .‬دﺳﺘﻮر‬
‫‪ NEG‬ﻣﻜﻤﻞ ‪ 2‬ﻣﻘﺪار ‪ AL‬را ﻣﻲدﻫﺪ‪.‬‬ ‫‪AL‬‬ ‫د‪ .‬دﺳﺘﻮر‬

‫‪ -148‬در ﻣﻮرد دﺳﺘﻮراﻟﻌﻤﻞ ‪ INC‬ﻛﺪام ﮔﺰﻳﻨﻪ ﻏﻠﻂ ﻣﻲﺑﺎﺷﺪ؟‬


‫اﻟﻒ‪ .‬روي ‪ CF‬اﺛﺮ دارد‪.‬‬
‫ب‪ .‬روي ‪ CF‬اﺛﺮ ﻧﺪارد‬
‫ج‪ .‬روي ‪ SF‬اﺛﺮ دارد‬
‫د‪ .‬روي ‪ ZF‬اﺛﺮ دارد‬

‫‪ -149‬ﻛﺪام دﺳﺘﻮراﻟﻌﻤﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪SUB 100,AL‬‬ ‫اﻟﻒ‪.‬‬
‫‪IMUL 20‬‬ ‫ب‪.‬‬
‫‪DIV 100‬‬ ‫ج‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد‬
‫‪٣٦٢‬‬

‫‪MUL BL‬‬ ‫‪ -150‬در دﺳﺘﻮراﻟﻌﻤﻞ‬


‫اﻟﻒ‪ .‬اﮔﺮ ‪ OF‬و ‪ CF‬ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ ﺷﻮﻧﺪ ﻧﺘﻴﺠﻪ ﺣﺎﺻﻠﻀﺮب در ﻳﻚ ﺑﺎﻳﺖ ﺟﺎ ﻧﻤﻲﺷﻮد‪.‬‬
‫ب‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬ﻓﻘﻂ روي ‪ OF‬و ‪ CF‬اﺛﺮ دارﻧﺪ‪.‬‬
‫ج‪ .‬در دﺳﺘﻮراﻟﻌﻤﻞ ‪ MUL‬ﻋﻤﻠﻮﻧﺪ ﻧﺒﺎﻳﺴﺘﻲ ﻣﻘﺪار ﺛﺎﺑﺘﻲ ﺑﺎﺷﺪ‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد ﺑﺎﻻ‬

‫‪ -151‬ﻛﺪاﻣﻴﻚ از دﺳﺘﻮراﻟﻌﻠﻤﻬﺎي ذﻳﻞ ﻣﺠﺎز ﻧﻴﺴﺖ؟‬


‫‪SHL OPR, CL‬‬ ‫اﻟﻒ‪.‬‬
‫‪ROL OPR,2‬‬ ‫ب‪.‬‬
‫‪SAL OPR,CL‬‬ ‫ج‪.‬‬
‫‪STD‬‬ ‫د‪.‬‬

‫‪ -152‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ اﺳﺖ؟‬


‫اﻟﻒ‪ SCAS .‬ﺑﺮاي ﭘﻮﻳﺶ ﻳﻚ رﺷﺘﻪ ﺟﻬﺖ وﺟﻮد ﻳﺎ ﻋﺪم وﺟﻮد ﻳﻚ ﻋﻨﺼﺮ رﺷـﺘﻪاي‬
‫ﻣﻌﻴﻦ ﺑﻜﺎر ﻣﻲرود‪.‬‬
‫ب‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ MOVS‬ﺑﺮ روي ﻫﻴﭻ ﻓﻠﮕﻲ اﺛﺮ ﻧﻤﻲﮔﺬارد‪.‬‬
‫ج‪ .‬دﺳﺘﻮراﻟﻌﻤﻞ ‪ CMPS‬ﺑﺮاي ﻣﻘﺎﻳﺴﻪ ﻣﺤﺘﻮي دو رﺷﺘﻪ ﺑﻜﺎر ﻣﻲرود‪.‬‬
‫د‪ .‬ﻛﻠﻴﻪ ﻣﻮارد ﺑﺎﻻ‬

‫‪ -153‬ﻛﺪام ﮔﺰﻳﻨﻪ ﺻﺤﻴﺢ ﻧﻴﺴﺖ؟‬


‫اﻟﻒ‪ .‬ﭘﺎراﻣﺘﺮﻫﺎ در دﺳﺘﻮر ‪ ،MACRO‬ﻧﻤﺎدﻫﺎي ﻣﻌﻤﻮﻟﻲ ﻫـﺴﺘﻨﺪ ﻛـﻪ ﺑﻮﺳـﻴﻠﻪ ﻋﻼﻣـﺖ‬
‫ﻛﺎﻣﺎ از ﻳﻜﺪﻳﮕﺮ ﺟﺪا ﻣﻲﺷﻮﻧﺪ‪.‬‬
‫ب‪ .‬ﺗﻌﺮﻳﻒ ﻳﻚ ‪ MACRO‬ﺷﺒﻴﻪ ﺗﻌﺮﻳﻒ ﻳﻚ روال در ﻳﻚ زﺑﺎن ﺳﻄﺢ ﺑﺎﻻ ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ج‪ .‬ﻳﻚ ‪ MACRO‬ﻣﻲﺗﻮاﻧﺪ در ﻫﺮ ﺟﺎي ﺑﺮﻧﺎﻣﻪ اﺳﻤﺒﻠﻲ ﺗﻌﺮﻳﻒ ﺷﻮد‪.‬‬
‫د‪ .‬ﺗﻮﺿﻴﺤﺎﺗﻲ ﻛﻪ ﺑﺎ ;; در ﻳﻚ ‪ MACRO‬ﺷﺮوع ﻣﻲﺷﻮد ﻫﺮﮔﺰ ﻟﻴﺴﺖ ﻧﻤﻲﺷﻮد‪.‬‬
‫‪٣٦٣‬‬

‫‪ -154‬دﺳﺘﻮراﻟﻌﻤﻠﻬﺎي ذﻳﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ .‬ﺑﺎ اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻠﻬﺎ ﭼﻨﺪ ﺑﺎﻳـﺖ‬


‫ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ ﻣﻲﻳﺎﺑﺪ؟‬
‫‪X‬‬ ‫‪DB‬‬ ‫)?(‪10 DUP‬‬
‫‪Y‬‬ ‫‪DB‬‬ ‫‪′WAIT′, 13, 20‬‬
‫‪Z‬‬ ‫‪DW‬‬ ‫)?(‪4DUP‬‬

‫‪23‬‬ ‫اﻟﻒ‪.‬‬
‫‪20‬‬ ‫ب‪.‬‬
‫‪24‬‬ ‫ج‪.‬‬
‫‪22‬‬ ‫د‪.‬‬

‫‪ -155‬ﭼﺮا از زﺑﺎن اﺳﻤﺒﻠﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻴﻢ؟ )دو ﭘﺮدازﻧـﺪهﻫـﺎي ﻣﻌﻤـﻮﻟﻲ ﻣﺜـﻞ‬


‫‪ 68060, Pentium, 8086‬و …(‬
‫اﻟﻒ‪ .‬ﺑﺪﻟﻴﻞ ﺳﺮﻋﺖ ﺑﻴﺸﺘﺮ ﻧﺴﺒﺖ ﺑﻪ زﺑﺎن ﺳﻄﺢ ﺑﺎﻻ‬
‫ب‪ .‬ﺑﻌﻠﺖ ﻗﺎﺑﻠﻴﺖ زﻳﺎد در ﻛﻨﺘﺮل ﻣﺴﺘﻘﻴﻢ روي ﭘﺮدازﻧﺪه‬
‫ج‪ .‬ﺑﺪﻟﻴﻞ ﺣﺠﻢ ﻛﻮﭼﻜﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻧﺴﺒﺖ ﺑﻪ زﺑﺎن ﺳﻄﺢ ﺑﺎﻻ‬
‫د‪ .‬ﻫﺮ ﺳﻪ ﻣﻮرد‬

‫‪ -156‬ﺛﺒﺎﺗﻬﺎي ﻫﻤﻪ ﻣﻨﻈﻮره ﻛﺪاﻣﻨﺪ؟‬


‫‪SI, DI, SP, IP, BP‬‬ ‫اﻟﻒ‪.‬‬
‫‪CS, SS, DS, ES‬‬ ‫ب‪.‬‬
‫‪DX, CX, BX, AX‬‬ ‫ج‪.‬‬
‫‪CS, IP, Flags‬‬ ‫د‪.‬‬
‫‪٣٦٤‬‬

‫‪ -157‬از ﺛﺎﺑﺖ ‪ Flags‬ﭼﻪ اﺳﺘﻔﺎدهاي ﻣﻲﺷﻮد؟ )ﭘﺮﭼﻢﻫﺎ=‪(Flags‬‬


‫اﻟﻒ‪ .‬ﺑﺮاي اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ﺣﺎﻓﻈﻪ ﺑﻪ داﺧﻞ ‪ CPU‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫ب‪ .‬ﺑﺮاي اﻧﺘﻘﺎل اﻃﻼﻋﺎت از ‪ CPU‬ﺑﻪ ﺣﺎﻓﻈﻪ اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫ج‪ .‬ﺑﺮاي ﺗﺼﻤﻴﻢﮔﻴﺮﻳﻬﺎ از آن اﺳﺘﻔﺎده ﻧﻤﻲﺷﻮد‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‬
‫‪ -158‬ﭘﺸﺘﻪ ﻳﺎ ‪ Stack‬ﭼﻴﺴﺖ؟‬
‫اﻟﻒ‪ .‬ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ﺟﺎﻧﺒﻲ ﻛﻪ ﺑﻪ ﻣﻨﻈﻮر ذﺧﻴـﺮه ﺳـﺎزي اﻃﻼﻋـﺎت از آن اﺳـﺘﻔﺎده‬
‫ﻣﻲﺷﻮد‪.‬‬
‫ب‪ .‬ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ اﺻﻠﻲ ﻛﻪ ﺑﻪ ﻣﻨﻈﻮر ذﺧﻴﺮه ﺳﺎزي ﺑﺎزﻳﺎﺑﻲ اﻃﻼﻋـﺎت ﺧـﺼﻮﺻﺎً‬
‫در ﻫﻨﮕﺎم ‪ Int, Call‬اﺳﺘﻔﺎده ﻣﻲﺷﻮد‪.‬‬
‫ج‪ .‬ﻗﺴﻤﺘﻲ از دﻳﺴﻚ ﺳﺨﺖ ﻛﻪ در ﻣﻘﺎﺑﻞ دﺳﺘﻴﺎﺑﻲ ‪ cpu‬ﻫﺎي دﻳﮕـﺮ ﻣﺤﺎﻓﻈـﺖ ﺷـﺪه‬
‫اﺳﺖ‪.‬‬
‫د‪ .‬ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ﻛﻤﻜﻲ ﻛﻪ در ﻣﻘﺎﺑﻞ "ﺧﻮاﻧﺪ ﺷﺪن" ﻣﺤﺎﻓﻈﺖ ﺷﺪه اﺳﺖ‪.‬‬
‫‪ -159‬از ﭘﺸﺘﻪ ﻳﺎ ‪ Stack‬اﻃﻼﻋﺎت ﺑﻪ ﭼﻪ ﺻﻮرت ذﺧﻴﺮه ﻣﻲﺷﻮﻧﺪ؟‬
‫اﻟﻒ‪ last in first out) LIFO .‬و آﺧﺮﻳﻦ ورود اوﻟﻴﻦ ﺧﺮوج(‬
‫ب‪ First in first out ) FIFO .‬و اوﻟﻴﻦ ورود اوﻟﻴﻦ ﺧﺮوج(‬
‫‪FIFO‬‬ ‫ج‪ .‬ﻫﻢ ‪ LIFO‬و ﻫﻢ‬
‫‪FIFO‬‬ ‫د‪ .‬ﻳﺎ ‪ LIFO‬و ﻳﺎ‬
‫‪ -160‬ﭼﮕﻮﻧﻪ از دو ﺛﺒﺎت ‪ 16‬ﺑﻴﺘﻲ‪ ،‬ﻣﻲﺗﻮان ﻳﻚ آدرس ‪ 20‬ﺑﻴﺘﻲ ﺳﺎﺧﺖ؟‬
‫اﻟﻒ‪ .‬اﻣﻜﺎن ﻧﺪارد‪.‬‬
‫ب‪ .‬ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎ را در ﻋﺪد ‪ 16‬ﺿﺮب ﻛﻨﻴﻢ و آن ﻳﻜﻲ دﻳﮕﺮ را ﺑﺎ آن ﺟﻤﻊ ﻛﻨﻴﻢ‪.‬‬
‫ج‪ .‬ﻳﻜﻲ از ﺛﺒﺎﺗﻬﺎ را ﭼﻬﺎر ﺑﻴﺖ ﺑﻪ ﺳﻤﺖ ﭼـﭗ ‪ Shift‬دﻫـﻴﻢ و ﺛﺒـﺎت دﻳﮕـﺮ را ﺑـﺎ آن‬
‫ﺟﻤﻊ ﻛﻨﻴﻢ‪.‬‬
‫د‪ .‬ﻣﻮارد ب و ج‬
‫‪٣٦٥‬‬

‫‪ -161‬ﺛﺒﺎت ‪ ES‬ﺑﺮاي ﻳﻚ "ﺛﺒﺎت ﻗﻄﻌﻪ داده اﺿﺎﻓﻲ" ﻣﻔﻴﺪ واﻗﻊ ﺷﺪه اﺳﺖ‪ .‬اﮔﺮ‬
‫و …( ﻧﺪاﺷـﺘﻪ‬ ‫‪GS, FS‬‬ ‫ﭼﻨﻴﻦ اﺳﺖ ﭘﺲ ﭼﺮا ﺑﻴﺶ از ﻳﻚ ﺛﺒـﺎت اﺿـﺎﻓﻲ )ﻣـﺜﻼً‬
‫ﺑﺎﺷﻴﻢ؟‬
‫اﻟﻒ‪ .‬ﺑﻴﺶ از ﻳﻜﻲ ﻣﻮرد ﻧﻴﺎز ﻣﺮﻛﺰ واﻗﻊ ﻧﺨﻮاﻫﺪ ﺷﺪ‪.‬‬
‫ب‪ .‬ﺗﻜﻨﻮﻟﻮژي زﻣﺎن ﺳـﺎﺧﺖ ‪ 8086‬ﻣﺤـﺪودﻳﺖ داﺷـﺘﻪ اﺳـﺖ … اﻳﻨﻜـﻪ از ﺳﻴـﺴﺘﻢ‬
‫‪ 80386‬آﻧﺮا ﻣﻲﺑﻴﻨﻴﻢ )ﻳﻌﻨﻲ ﺛﺒﺎﺗﻬﺎي اﺿﺎﻓﻲ ﻋﻼوه ﺑﺮ ‪(FS‬‬
‫ج‪ .‬اﺻﻮﻻً ﺛﺒﺎت ‪ ES‬ﺑﻌﻨﻮان ﻳﻚ ﺛﺒﺎت داده اﺿﺎﻓﻲ اﺳﺘﻔﺎده ﻧﻤﻲﺷﻮد‪.‬‬
‫د‪ .‬ﻣﻤﻜﻦ اﺳﺖ اﻳﻦ ﻛﺎر ﻋﻤﻠﻲ ﻧﺒﺎﺷﺪ‪ ،‬اﻣﺎ ﺗﺎﻛﻨﻮن ﻣﺸﺎﻫﺪه ﺷﺪه اﺳﺖ )ﻳﻌﻨﻲ اﺳﺘﻔﺎده از‬
‫ﺛﺒﺎﺗﻬﺎي ﻗﻄﻌﻪ ﻋﻼوه ﺑﺮ ‪( FS‬‬

‫‪ -162‬ﺗﻔﺎوت ﻓﺎﻳﻞ ‪ COM, EXE‬ﭼﻴﺴﺖ؟‬


‫اﻟﻒ‪ .‬ﻓﺎﻳﻞ ‪ EXE‬ﻣﺤﺪودﻳﺖ اﻧﺪازه ﻧﺪارد وﻟﻲ ﻓﺎﻳﻞ ‪ COM‬ﺣﺪاﻛﺜﺮ ﺑﻪ اﻧﺪازه ﻳﻚ ﻗﻄﻌﻪ‬
‫ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ب‪ .‬ﻓﺎﻳﻞ ‪ COM‬از آدرس ‪ 100H‬ﺷﺮوع ﻣﻲﺷﻮد وﻟﻲ ﻓﺎﻳﻞ ‪EXE‬ﭼﻨﻴﻦ ﻧﻴﺴﺖ‪.‬‬
‫ج‪ .‬اﺻﻮﻻً اﻳﻦ دو در واﻗﻊ ﻳﻜﻲ ﻫﺴﺘﻨﺪ و ﻫﺮ دو ﻓﺎﻳﻠﻬﺎي ﻗﺎﺑﻞ اﺟﺮا ﻧﻴﺴﺘﻨﺪ و ﺗﻔـﺎوﺗﻲ‬
‫ﻧﺪارﻧﺪ‪.‬‬
‫د‪ .‬ﻣﻮارد اﻟﻒ و ب‬
‫‪ -163‬ﺗﻔﺎوت ‪ Call‬و ‪ INT‬ﭼﻴﺴﺖ؟‬
‫‪ IP,‬را در ﭘﺸﺘﻪ ﻗـﺮار دﻫـﺪ‬ ‫‪CS‬‬ ‫اﻟﻒ‪ .‬ﺑﻮﺳﻴﻠﻪ ‪ Call‬ﻣﻲﺗﻮان ﺳﻴﺴﺘﻢ را وادار ﺳﺎﺧﺖ ﺗﺎ‬
‫وﻟﻲ ﺑﻮﺳﻴﻠﻪ ‪ INT‬ﻣﻲﺗﻮان اﻳﻦ ﻛﺎر را ﻧﻤﻮد ﻋﻼوه ﺑﺮ اﻳﻨﻜﻪ ‪ Floy‬را ﻧﻴﺰ ذﺧﻴﺮه ﺳﺎﺧﺖ‪.‬‬
‫ب‪ Call .‬ﺑﺮاي ﺻﺪا زدن ﻳﻚ روﻳﻪ ﺑﻜﺎر ﻣﻲرود و ‪ INT‬وﺟﻮد ﻧﺪارد‪.‬‬
‫ج‪ .‬ﺗﻔﺎوﺗﻲ ﻧﺪارﻧﺪ و ارﻗﺎم ﻳﻜﺴﺎن ﺑﺮاي ﻳﻚ دﺳﺘﻮر ﻣﻲﺑﺎﺷﻨﺪ‪.‬‬
‫ذﺧﻴﺮه ﻣﻲﺷﻮد )در رﺷﺘﻪ( وﻟﻲ در ‪ INT‬ﻫﻢ ‪ CS‬و ﻫﻢ ‪ IP‬ذﺧﻴـﺮه‬ ‫‪IP‬‬ ‫د‪ .‬در ‪ Call‬ﻓﻘﻂ‬
‫ﻣﻲﺷﻮد‪.‬‬
‫‪٣٦٦‬‬

‫‪ -164‬ﻣﺠﻤﻮﻋﻪ ﺳﻪ دﺳﺘﻮراﻟﻌﻤﻞ زﻳﺮ ﭼﻪ ﻋﻤﻠﻲ را اﻧﺠﺎم ﻣﻲ دﻫﺪ؟‬


‫‪XOR‬‬ ‫‪AX,BX‬‬
‫‪XOR‬‬ ‫‪BX,AX‬‬
‫‪XOR‬‬ ‫‪AX,BX‬‬
‫اﻟﻒ‪ .‬ﻣﺤﺘﻮاي ﺛﺒﺖ ‪ AX‬را ﺑﺎ ‪ BX‬ﻋﻮض ﻣﻲﻛﻨﺪ‪.‬‬
‫ب‪ .‬ﻣﺤﺘﻮاي ﺛﺒﺎت ‪ AX‬را ﺑﻪ )‪ (AX ⊕ BX‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ‪.‬‬
‫ج‪ .‬ﻣﺤﺘﻮاي ﺛﺒﺎت ‪ BX‬را ﺑﻪ )‪ (BX ⊕ AX‬ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ‪.‬‬
‫د‪ .‬ﻫﻴﭽﻜﺪام‪.‬‬

‫‪ -165‬در ‪ 8086 CPU‬دو دﺳﺘﻮر وﺟﻮد دارد ﻛﻪ ﻇﺎﻫﺮاً ﻋﻴﻨﺎً ﻳﻚ ﻛـﺎر ﻣـﻲﻛﻨﻨـﺪ‪.‬‬
‫ﭼﺮا اﻳﻦ دو دﺳﺘﻮراﻟﻌﻤﻞ در ﻛﻨﺎر ﻳﻜﺪﻳﮕﺮ وﺟﻮد دارﻧـﺪ؟ )در ﺻـﻮرﺗﻴﻜﻪ وﺟـﻮد‬
‫ﻳﻜﻲ از آﻧﻬﺎ ﻛﺎﻓﻲ ﺑﻪ ﻧﻈﺮ ﻣﻲرﺳﺪ(‪:‬‬
‫‪INC DX, ADD AX,1‬‬
‫‪.‬‬ ‫اﻟﻒ‪ .‬ﺑﺪﻟﻴﻞ اﻳﻨﻜﻪ ﺷﺎﻳﺪ ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺲ ﻳﻜﻲ از اﻳﻦ دو ﻓﺮم را ﻧﺘﻮاﻧﺪ ﺑﺨﺎﻃﺮ ﺑﺴﭙﺎرد‬
‫‪ INC‬ﻳﻚ ﺑﺎﻳﺘﻲ اﺳﺖ‪.‬‬ ‫‪DX‬‬ ‫ب‪ .‬دﺳﺘﻮر ‪ ADD‬دو ﺑﺎﺑﺘﻲ اﺳﺖ در ﺻﻮرﺗﻴﻜﻪ دﺳﺘﻮر‬
‫‪ INC‬دو ﺑﺎﻳﺘﻲ اﺳﺖ‪.‬‬ ‫‪DX‬‬ ‫ج‪ .‬دﺳﺘﻮر ‪ ADD‬ﻳﻚ ﺑﺎﻳﺘﻲ اﺳﺖ‪ ،‬در ﺻﻮرﺗﻴﻜﻪ دﺳﺘﻮر‬
‫د‪ .‬اﻳﻦ دو دﺳﺘﻮر دﻗﻴﻘﺎً ﻣﻌﺎدل ﻣﻲﺑﺎﺷﻨﺪ و ﻳﻚ ﻣﻌﺎدل ﺑﺎﻳﻨﺮي ﻛﺎﻣﻼً ﻳﻜﺴﺎن دارﻧﺪ‬

‫زﻳﺮ ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻣﻲﺷﻮد‪loop :‬دﺳﺘﻮر ‪166-‬‬


‫‪MOV‬‬ ‫‪CX,0‬‬
‫‪Loble:‬‬ ‫‪Loop‬‬ ‫‪Loble‬‬
‫اﻟﻒ‪ .‬ﺑﻲﻧﻬﺎﻳﺖ‬
‫ب‪ .‬اﺻﻼً اﺟﺮا ﻧﻤﻲﺷﻮد‬
‫‪1‬‬ ‫ج‪ FFFF .‬ﺑﺎر ﺑﻌﻼوه‬
‫د‪ FFFF .‬ﺑﺎر‬
‫‪ -167‬ﻫﺪف از ‪ FAT‬ﭼﻪ ﻣﻲﺑﺎﺷﺪ؟‬
‫اﻟﻒ‪ .‬اﺧﺘﺼﺎص ﻓﻀﺎي دﻳﺴﻚ ﺑﺮاي ﻓﺎﻳﻠﻬﺎ‬
‫‪٣٦٧‬‬

‫‪I/O‬‬ ‫ب‪ .‬اﺧﺘﺼﺎص ﻓﻀﺎي دﻳﺴﻚ ﺑﺮاي‬


‫ج‪ .‬ﻣﻘﻴﻢ ﺳﺎﺧﺘﻦ ﺑﺮﻧﺎﻣﻪﻫﺎ‬
‫‪DOS‬‬ ‫د‪ .‬اﻳﺠﺎد ﺗﻮاﺑﻊ‬

‫‪ -168‬ﻫﺪف از اﻳﺠﺎد ﻣﺎﻛﺮو ﭼﻴﺴﺖ؟‬


‫اﻟﻒ‪ .‬ﺳﺎدﮔﻲ و ﻛﻢ ﻛﺮدن ﺗﻌﺪاد دﺳﺘﻮراﻟﻌﻤﻞ‬
‫ب‪ .‬اﻳﺠﺎد ﻗﺎﺑﻠﻴﺖ ﺧﻮاﻧﺎﺋﻲ زﻳﺎدﺗﺮ‬
‫ج‪ .‬ﻣﻮارد اﻟﻒ و ب‬
‫د‪ .‬ﺳﺮﻋﺖ ﺑﺨﺸﻴﺪن ﺑﻪ اﺟﺮا ﺑﺮﻧﺎﻣﻪ‬
‫‪٣٦٨‬‬

‫واژه ﻧﺎﻣﻪ‬
‫‪Abacus‬‬ ‫ﭼﺮﺗﻜﻪ‬
‫‪Abort‬‬ ‫ﻣﺘﻮﻗﻒ ﻛﺮدن‪-‬ﻧﺎﻗﺺ ﺗﻤﺎم ﺷﺪن‬
‫‪Abstract‬‬ ‫ﻣﺠﺮد – اﻧﺘﺰاع‬
‫‪Access‬‬ ‫دﺳﺘﺮﺳﻲ‬
‫‪Access time‬‬ ‫زﻣﺎن دﺳﺘﺮﺳﻲ‬
‫‪Accounting‬‬ ‫ﺣﺴﺎﺑﺪاري‬
‫‪Accumulator‬‬ ‫آﻛﻮﻣﻮﻻﺗﻮر‪ -‬اﻧﺒﺎره‪ -‬ﻣﺨﺰن‬
‫‪Action‬‬ ‫ﻋﻤﻞ‬
‫‪Action cycle‬‬ ‫دوره ﻳﺎ ﺳﻴﻜﻞ ﻋﻤﻞ‬
‫‪Action rate‬‬ ‫ﻣﻴﺰان ﻋﻤﻞ‬
‫‪Active‬‬ ‫ﻓﻌﺎل‬
‫‪Actual‬‬ ‫واﻗﻌﻲ‬
‫‪Actual address‬‬ ‫آدرس واﻗﻌﻲ‬
‫‪Actual decimal point‬‬ ‫ﻧﻘﻄﻪ اﻋﺸﺎر واﻗﻌﻲ‬
‫‪Add‬‬ ‫ﺟﻤﻊ ﻛﺮدن‬
‫‪Addendum‬‬ ‫ﺿﻤﻴﻤﻪ‬
‫‪Adder‬‬ ‫ﺟﻤﻊ ﻛﻨﻨﺪه‬
٣٦٩

Addition ‫ﺟﻤﻊ‬
Additional ‫اﺿﺎﻓﻲ‬
Address ‫آدرس – ﻧﺸﺎﻧﻲ‬
Addressee ‫ﮔﻴﺮﻧﺪه – ﻣﺨﺎﻃﺐ‬
Addressing system ‫ﺳﻴﺴﺘﻢ آدرس دﻫﻲ‬
Adjacent ‫ ﻧﺰدﻳﻚ‬-‫ﻣﺠﺎور‬
Adjective ‫ﺻﻔﺖ‬
Alarm ‫ﺳﻴﮕﻨﺎل – آژﻳﺮ‬
Alarm display ‫ﻧﻤﺎﻳﺶ ﺳﻴﮕﻨﺎل‬
Algebra ‫ﺟﺒﺮ‬
Algorithm ‫اﻟﮕﻮرﻳﺘﻢ‬
Alphabet ‫ﺣﺮوف اﻟﻔﺒﺎء‬
Ambiguity ‫اﺑﻬﺎم‬
Analog ‫ﻗﻴﺎﺳﻲ‬
Analysis ‫ﺗﺤﻠﻴﻞ‬-‫آﻧﺎﻟﻴﺰ‬
And gate '‫'و‬ ‫ﻣﺪار‬
And operator '‫'و‬ ‫ﻋﻤﻠﮕﺮ‬
Application ‫ﻛﺎرﺑﺮد‬
Application program ‫ﺑﺮﻧﺎﻣﻪ ﻛﺎرﺑﺮدي‬
‫‪٣٧٠‬‬

‫‪Applicant‬‬ ‫ﻣﺘﻘﺎﺿﻲ‬
‫‪Approach‬‬ ‫ﻧﺰدﻳﻜﻲ‪-‬ﺗﻤﺎﻳﻞ‪-‬دﺳﺘﺮﺳﻲ‬
‫‪Arbitrary‬‬ ‫اﺧﺘﻴﺎري‪-‬دﻟﺨﻮاه‬
‫‪Arithmetic‬‬ ‫)ﻋﻠﻢ( ﺣﺴﺎب‬
‫‪Arithmetical‬‬ ‫ﺣﺴﺎﺑﻲ‬
‫‪Arithmetic register‬‬ ‫ﺛﺒﺎت ﻣﺤﺎﺳﺒﺎﺗﻲ‬
‫‪Arithmetic section‬‬ ‫ﻗﺴﻤﺖ ﻣﺤﺎﺳﺒﺎﺗﻲ‬
‫‪Arithmetic unit‬‬ ‫واﺣﺪ ﻣﺤﺎﺳﺒﺎﺗﻲ‬
‫‪Arm‬‬ ‫ﺑﺎزو‬
‫‪Array‬‬ ‫آراﻳﻪ‬
‫‪Artificial intelligence‬‬ ‫ﻫﻮش ﻣﺼﻨﻮﻋﻲ‬
‫‪Artificial language‬‬ ‫زﺑﺎن ﻣﺼﻨﻮﻋﻲ‬
‫‪Ascending‬‬ ‫ﺻﻌﻮدي‬
‫‪Ascending sort‬‬ ‫ﻣﺮﺗﺐ ﻧﻤﻮدن ﺻﻌﻮدي‬
‫‪ASCII‬‬ ‫ﻛﺪ آﻣﺮﻳﻜﺎﺋﻲ ﺑﺮاي ﻣﺒﺎدﻟﻪ اﻃﻼﻋﺎت‬
‫‪Assemble‬‬ ‫ﻣﻮﻧﺘﺎژ‪-‬ﻣﻮﻧﺘﺎژ ﻛﺮدن‬
‫‪Audio‬‬ ‫ﺷﻨﻮاﺋﻲ‬
‫‪Audit‬‬ ‫رﺳﻴﺪﮔﻲ‪-‬ﻣﻤﻴﺰي‬
‫‪Automatic‬‬ ‫ﺧﻮدﻛﺎر‪-‬اﺗﻮﻣﺎﺗﻴﻚ‬
٣٧١

Auxiliary ‫ﻛﻤﻜﻲ‬
Auxiliary operations ‫ﻋﻤﻠﻴﺎت ﻛﻤﻜﻲ‬
Available ‫ﻣﻮﺟﻮد‬
Background ‫زﻣﻴﻨﻪ‬
Back up ‫ﭘﺸﺘﻴﺒﺎﻧﻲ‬
Back up system ‫ﺳﻴﺴﺘﻢ ﭘﺸﺘﻴﺒﺎﻧﻲ‬
Base data ‫داده ﻣﺒﻨﺎ‬
Base number ‫ﻋﺪد ﻣﺒﻨﺎ‬
Base register ‫ﺛﺒﺎت ﻣﺒﻨﺎ ﻳﺎ ﺷﺎﺧﺺ‬
Begin ‫ﺷﺮوع ﻛﺮدن – ﺷﺮوع‬
Bi Conditional ‫دو ﺷﺮﻃﻲ‬
Bidirectional ‫دو ﺟﻬﺘﻲ‬
Binary ‫دودوﻳﻲ‬
Binary code ‫ﻛﺪدودوﺋﻲ‬
Binary digits ‫ارﻗﺎم دودوﺋﻲ‬
Binary half adder ‫ﻧﻴﻢ ﺟﻤﻊ ﻛﻨﻨﺪه دودوﺋﻲ‬
Binary logic ‫ﻣﻨﻄﻖ دودوﺋﻲ‬
Binary numbers ‫اﻋﺪاد دودوﺋﻲ‬
Binary notation ‫ﻧﻤﺎﻳﺶ دودوﺋﻲ‬
‫‪٣٧٢‬‬

‫‪Binary operation‬‬ ‫ﻋﻤﻠﻴﺎت دودوﺋﻲ‬


‫‪Binary variable‬‬ ‫ﻣﺘﻐﻴﺮ دودوﺋﻲ‬
‫‪Bit‬‬ ‫‪1‬‬ ‫رﻗﻢ ‪ 0‬ﻳﺎ‬
‫‪Bit pattern‬‬ ‫اﻟﮕﻮي ﺑﻴﺘﻲ‬
‫‪Blank‬‬ ‫ﺧﺎﻟﻲ‪ -‬ﻓﺎﺻﻠﻪ‬
‫‪Block‬‬ ‫ﺑﻠﻮك‬
‫‪Block entry‬‬ ‫ورودي ﺑﻠﻮك‬
‫‪Boolean‬‬ ‫ﺑﻮل‬
‫‪Boolean algebra‬‬ ‫ﺟﺒﺮﺑﻮل‬
‫‪Branch‬‬ ‫ﺷﺎﺧﻪ‬
‫‪Branching‬‬ ‫ﺷﺎﺧﻪ ﺷﺎﺧﻪ ﻛﺮدن‪ -‬ﻣﻨﺸﻌﺐ ﻛﺮدن‬
‫‪Bubble sort‬‬ ‫ﻣﺮﺗﺐ ﻛﺮدن ﺣﺒﺎﺑﻲ‬
‫‪Buffer‬‬ ‫ﺑﺎﻓﺮ‪-‬ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ اﺻﻠﻲ‬
‫‪Button‬‬ ‫دﻛﻤﻪ‬
‫‪Cable‬‬ ‫ﻛﺎﺑﻞ‬
‫‪Cache memory‬‬ ‫ﺣﺎﻓﻈﻪ ﻧﻬﺎن‬
‫‪Calculate‬‬ ‫ﻣﺤﺎﺳﺒﻪ ﻛﺮدن‬
‫‪Calculator‬‬ ‫ﻣﺎﺷﻴﻦ ﺣﺴﺎب‬
‫‪Capacity‬‬ ‫ﻇﺮﻓﻴﺖ‬
٣٧٣

Cell ‫ﺳﻠﻮل‬
Center ‫ﻣﺮﻛﺰ‬
Central ‫ﻣﺮﻛﺰي‬
Central processor ‫ﭘﺮدازﺷﮕﺮ ﻣﺮﻛﺰي‬
Chain ‫زﻧﺠﻴﺮ‬
Character recognition ‫ﺷﻨﺎﺧﺖ ﻛﺎرﻛﺘﺮ‬
Check bit ‫ﺑﻴﺖ ﻛﻨﺘﺮل‬
Check digit ‫رﻗﻢ ﻛﻨﺘﺮﻟﻲ‬
Chip ‫ﺗﺮاﺷﻪ‬
Circuit ‫ﻣﺪار‬
Clear ‫ﭘﺎك ﻛﺮدن‬
Column ‫ﺳﺘﻮن‬
Combination ‫ﺗﺮﻛﻴﺐ‬
Command ‫ﻓﺮﻣﺎن‬
Comment ‫ﻣﻼﺣﻈﺎت – ﻧﻈﺮﻳﻪ‬-‫ﺗﻔﺴﻴﺮ‬
Communications ‫ارﺗﺒﺎﻃﺎت‬
Compare ‫ﻣﻘﺎﻳﺴﻪ ﻛﺮدن‬
Comparing unit ‫واﺣﺪ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه‬
Comparison ‫ﻣﻘﺎﻳﺴﻪ‬
٣٧٤

Compatible ‫ﺳﺎزﮔﺎر ﻛﺮدن‬


Compatiblity ‫ﺳﺎزﮔﺎري‬
Compile ‫ﺗﺮﺟﻤﻪ ﻛﺮدن‬
Compiler ‫ﻣﺘﺮﺟﻢ‬
Compiling phase ‫ﻓﺎز ﺗﺮﺟﻤﻪ‬
Complement ‫ﻣﻜﻤﻞ‬
Component ‫ﻣﺆﻟﻔﻪ‬
Compound condition ‫ﺷﺮط ﺗﺮﻛﻴﺒﻲ‬
Compress ‫ﻓﺸﺮده ﻛﺮدن‬
Compute ‫ﻣﺤﺎﺳﺒﻪ ﻛﺮدن‬
Computer ‫ﻣﺤﺎﺳﺒﻪ ﻛﻨﻨﺪه‬
Computer network ‫ﺷﺒﻜﻪ ﻛﺎﻣﭙﻴﻮﺗﺮي‬
Condensed ‫ﻣﺘﺮاﻛﻢ – ﺧﻼﺻﻪ‬
Connect time ‫زﻣﺎن اﺗﺼﺎل‬
Content ‫ﻣﺤﺘﻮي‬
Context ‫زﻣﻴﻨﻪ‬
Continuous ‫ﭘﻴﻮﺳﺘﻪ‬
Control cycle ‫ﺣﻠﻘﻪ ﻛﻨﺘﺮل‬
Conversion ‫ﺗﺒﺪﻳﻞ‬
٣٧٥

Counter ‫ﺷﻤﺎرﻧﺪه‬
Critical ‫ﺑﺤﺮاﻧﻲ‬
Critical path ‫ﻣﺴﻴﺮ ﺑﺤﺮاﻧﻲ‬
CRT ‫ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‬
Cylinder ‫ﺳﻴﻠﻨﺪر‬
Data ‫داده‬
Data base ‫ﭘﺎﻳﮕﺎه داده‬
Data description ‫ﺗﻮﺻﻴﻒ داده‬
Date error ‫ﺧﻄﺎي داده‬
Data location ‫ﻣﺤﻞ داده‬
Data management ‫ﻣﺪﻳﺮﻳﺖ داده‬
Data manipulation ‫دﺳﺘﻜﺎري داده‬
Data preparation ‫ﺗﺪارك داده‬
Data processing ‫ﭘﺮدازش داده‬
Data rules ‫ﻗﻮاﻋﺪ داده‬
Data transfer ‫اﻧﺘﻘﺎل داده‬
Deciding ‫ﺗﺼﻤﻴﻢ ﮔﻴﺮي‬
Decimal ‫اﻋﺸﺎري‬
Decimal digit ‫رﻗﻢ اﻋﺸﺎري‬
٣٧٦

Decimal number ‫ﻋﺪد اﻋﺸﺎري‬


Decimal notation ‫ﻧﻤﺎﻳﺶ اﻋﺸﺎري‬
Decimal numbering system ‫ﺳﻴﺴﺘﻢ اﻋﺪاد اﻋﺸﺎري‬
Decimal point ‫ﻧﻘﻄﻪ اﻋﺸﺎر‬
Decision ‫ﺗﺼﻤﻴﻢ ﮔﻴﺮي‬
Decision box ‫ﺟﻌﺒﻪ ﺗﺼﻤﻴﻢﮔﻴﺮي‬
Decision logic ‫ﻣﻨﻄﻖ ﺗﺼﻤﻴﻢﮔﻴﺮي‬
Decision – making system ‫ﺳﻴﺴﺘﻢ ﺗﺼﻤﻴﻢﮔﻴﺮي‬
Decision mechanism ‫ﻣﻜﺎﻧﻴﺰم ﺗﺼﻤﻴﻢﮔﻴﺮي‬
Decision rules ‫ﻗﻮاﻋﺪ ﺗﺼﻤﻴﻢﮔﻴﺮي‬
Define ‫ﺗﻌﺮﻳﻒ ﻛﺮدن‬
Definition ‫ﺗﻌﺮﻳﻒ‬
Delay ‫ﺗﺄﺧﻴﺮ‬
Delay time ‫زﻣﺎن ﺗﺄﺧﻴﺮ‬
Delete ‫ﺣﺬف‬
Density ‫ﭼﮕﺎﻟﻲ – داﻧﺴﻴﺘﻪ‬
Dependent variables ‫ﻣﺘﻐﻴﺮﻫﺎي واﺑﺴﺘﻪ‬
Descending ‫ﻧﺰوﻟﻲ‬
Descending sort ‫ﻣﺮﺗﺐ ﺳﺎزي ﻧﺰوﻟﻲ‬
٣٧٧

Design ‫ﻃﺮح‬
Device ‫وﺳﻴﻠﻪ – دﺳﺘﮕﺎه‬
Diagnosis ‫ﺗﺸﺨﻴﺺ‬
Diagram ‫ﻧﻤﻮدار‬
Difference ‫اﺧﺘﻼف‬
Digital clock ‫ﺳﺎﻋﺖ دﻳﺠﻴﺘﺎل‬
Disk ‫دﻳﺴﻚ‬
Disk operating system DOS ‫ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ دﻳﺴﻚ‬
Display ‫ﻧﻤﺎﻳﺶ‬
Display unit ‫واﺣﺪ ﻧﻤﺎﻳﺶ‬
Distance ‫ﻓﺎﺻﻠﻪ‬
Distribute ‫ﺗﻮزﻳﻊ ﻛﺮدن‬
Division ‫ﺗﻘﺴﻴﻢ‬
Document ‫ ﺳﻨﺪ‬-‫ﻣﺪرك‬
Documentation ‫ﻣﺴﺘﻨﺪات‬
Double length ‫ﻃﻮل ﻣﻀﺎﻋﻒ‬
Double precision ‫دﻗﺖ ﻣﻀﺎﻋﻒ‬
Dynamic ‫ﭘﻮﻳﺎ‬
Dynamic memory ‫ﺣﺎﻓﻈﻪ ﭘﻮﻳﺎ‬
٣٧٨

Effective ‫ﻣﻮﺛﺮ‬
Effective speed ‫ﺳﺮﻋﺖ ﻣﺆﺛﺮ‬
Effective address ‫آدرس ﻣﺆﺛﺮ‬
Efficiency ‫ﻛﺎراﺋﻲ‬
End of file ‫اﻧﺘﻬﺎي ﻓﺎﻳﻞ‬
Epitome ‫ﺧﻼﺻﻪ‬-‫رﺋﻮس ﻣﻄﺎﻟﺐ‬
Equality ‫ﻛﻴﻔﻴﺖ‬
Equipment ‫ﺗﺠﻬﻴﺰات‬
Erase ‫ﭘﺎك ﻛﺮدن‬-‫از ﺑﻴﻦ ﺑﺮدن‬
Eraser ‫ﭘﺎك ﻛﻦ‬-‫ﭘﺎك ﻛﻨﻨﺪه‬
Error ‫ﺧﻄﺎ‬
Error code ‫رﻣﺰ ﺧﻄﺎ‬
Error detection ‫ﺗﺸﺨﻴﺺ ﺧﻄﺎ‬
Error message ‫ﭘﻴﻐﺎم ﺧﻄﺎ‬
Error rate ‫ﻧﺮخ ﺧﻄﺎ‬
Exchange ‫ﻣﺒﺎدﻟﻪ‬
Execute ‫اﺟﺮا ﻛﺮدن‬
Execution ‫اﺟﺮا‬
Execution cycle ‫ﺳﻴﻜﻞ اﺟﺮا‬
‫‪٣٧٩‬‬

‫‪Exit‬‬ ‫ﺧﺮوج‬
‫‪Exit point‬‬ ‫ﻧﻘﻄﻪ ﺧﺮوج‬
‫‪Expression‬‬ ‫ﻋﺒﺎرت‬
‫‪Extension‬‬ ‫ﺑﺴﻂ‪-‬ﺗﻮﺳﻌﻪ‪-‬ﺗﻤﺪﻳﺪ‬
‫‪External‬‬ ‫ﺧﺎرﺟﻲ‬
‫‪External interrupt‬‬ ‫وﻗﻔﻪ ﺧﺎرﺟﻲ‬
‫‪External labels‬‬ ‫ﺑﺮﭼﺴﺐﻫﺎي ﺧﺎرﺟﻲ‬
‫‪Facility‬‬ ‫ﺗﺴﻬﻴﻼت‬
‫‪Factor‬‬ ‫ﻓﺎﻛﺘﻮر –ﻋﺎﻣﻞ – ﺿﺮﻳﺐ‬
‫‪Failure‬‬ ‫ﺷﻜﺴﺖ – ﺧﺮاﺑﻲ‬
‫‪Fixed‬‬ ‫ﺛﺎﺑﺖ‬
‫‪Fixed length‬‬ ‫ﻃﻮل ﺛﺎﺑﺖ‬
‫‪Flag‬‬ ‫ﻓﻠﮓ‪-‬ﭘﺮﭼﻢ‬
‫‪Floating point‬‬ ‫ﻧﻘﻄﻪ اﻋﺸﺎر ﺷﻨﺎور‬
‫‪Floating point numbers‬‬ ‫اﻋﺪاد ﺑﺎ ﻧﻘﻄﻪ اﻋﺸﺎر ﺷﻨﺎور‬
‫‪Flowchart‬‬ ‫ﻓﻠﻮﭼﺎرت – ﻧﻤﻮدار‬
‫‪Folder‬‬ ‫ﭘﻮﺷﻪ‬
‫‪Format‬‬ ‫ﻗﺎﻟﺐ‪-‬ﺷﻜﻞ‬
‫‪Gate‬‬ ‫دروازه ﻣﺪار‬
٣٨٠

General ‫ﻋﻤﻮﻣﻲ‬
Generator ‫اﻳﺠﺎد ﻛﻨﻨﺪه‬
Global ‫ﺳﺮاﺳﺮي‬
Half ‫ﻧﻴﻢ‬-‫ﻧﺼﻒ‬
Halt ‫ﻣﺘﻮﻗﻒ ﻛﺮدن‬
Hardware ‫ﺳﺨﺖ اﻓﺰار‬
Heading ‫ﻋﻨﻮان‬-‫ﺗﻴﺘﺮ‬
Help ‫ﻛﻤﻚ‬
High speed ‫ﺳﺮﻋﺖ ﺑﺎﻻ‬
High order ‫ﻣﺮﺗﺒﻪ ﺑﺎﻻ‬
Identifier ‫ﺷﻨﺎﺳﻪ‬
Idle time ‫زﻣﺎن ﺑﻴﻜﺎري‬
Ignore ‫اﻏﻤﺎض ﻛﺮدن‬
Image ‫ﺗﺼﻮﻳﺮ‬
Implicit ‫ﺿﻤﻨﻲ‬
Inactive ‫ﻏﻴﺮﻓﻌﺎل‬
Inclusive ‫درﺑﺮﮔﻴﺮﻧﺪه‬
Increment ‫اﻓﺰاﻳﺶ‬
Independent ‫ﻣﺴﺘﻘﻞ‬
٣٨١

Index ‫ﺷﺎﺧﺺ‬-‫اﻧﺪﻳﺲ‬
Indexed address ‫آدرس ﺷﺎﺧﺺ دار‬
Indicate ‫ﻧﺸﺎن دادن – ﺗﻌﻴﻴﻦ ﻛﺮدن‬
Indirect ‫ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ‬
Indirect address ‫آدرس ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ‬
Indirect reference address ‫آدرس ارﺟﺎع ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ‬
Information ‫اﻃﻼﻋﺎت‬
Information retrieval ‫ﺑﺎزﻳﺎﺑﻲ اﻃﻼﻋﺎت‬
Input ‫ورودي‬
Input data ‫داده ورودي‬
Instruction ‫دﺳﺘﻮراﻟﻌﻤﻞ‬
Instruction address ‫آدرس دﺳﺘﻮراﻟﻌﻤﻞ‬
Instruction address register ‫ﺛﺒﺎت آدرس دﺳﺘﻮراﻟﻌﻤﻞ‬
Integer ‫ﺻﺤﻴﺢ‬
Integrated system ‫ﺳﻴﺴﺘﻢ ﻣﺠﺘﻤﻊ‬
Interface ‫ﻣﻴﺎﻧﺠﻲ‬-‫واﺳﻄﻪ‬
Internal ‫داﺧﻠﻲ‬
Internal code ‫ﻛﺪ ﻳﺎ رﻣﺰ داﺧﻠﻲ‬
Internal sort ‫ﻣﺮﺗﺐ ﺳﺎزي داﺧﻠﻲ‬
‫‪٣٨٢‬‬

‫‪Interrupt‬‬ ‫وﻗﻔﻪ‬
‫‪Interrupt system‬‬ ‫ﺳﻴﺴﺘﻢ وﻗﻔﻪ‬
‫‪Iteration‬‬ ‫ﺗﻜﺮار‬
‫‪Iterative‬‬ ‫ﺗﻜﺮاري‬
‫‪Key‬‬ ‫ﻛﻠﻴﺪ‬
‫‪Keyboard‬‬ ‫ﺻﻔﺤﻪ ﻛﻠﻴﺪ‬
‫‪Label‬‬ ‫ﺑﺮﭼﺴﺐ‬
‫‪Language‬‬ ‫زﺑﺎن‬
‫‪Language compiler‬‬ ‫ﻣﺘﺮﺟﻢ زﺑﺎن‬
‫‪Level‬‬ ‫ﺳﻄﺢ‬
‫‪Library‬‬ ‫ﻛﺘﺎﺑﺨﺎﻧﻪ‪-‬ﻣﺮﻛﺰ اﺳﻨﺎد‬
‫‪Light‬‬ ‫ﻧﻮر‬
‫‪Limit‬‬ ‫ﻣﺤﺪود ﻛﺮدن‬
‫‪Limited‬‬ ‫ﻣﺤﺪود‬
‫‪Link‬‬ ‫ﻣﺘﺼﻞ ﻛﺮدن‪-‬اﺗﺼﺎل‬
‫‪List‬‬ ‫ﻓﻬﺮﺳﺖ‬
‫‪Load‬‬ ‫ﺑﺎرﻛﺮدن‬
‫‪Loader‬‬ ‫ﺑﺮﻧﺎﻣﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺑﺮاي ﺑﺎر ﻛﺮدن ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻓﻈﻪ‬
‫‪Location‬‬ ‫ﻣﺤﻞ – ﺟﺎ‬
‫‪Logical‬‬ ‫ﻣﻨﻄﻘﻲ‬
‫‪Logical operation‬‬ ‫ﻋﻤﻠﻴﺎت ﻣﻨﻄﻘﻲ‬
‫‪Logical operator‬‬ ‫ﻋﻤﻠﮕﺮ ﻣﻨﻄﻘﻲ‬
‫‪Logical shift‬‬ ‫ﺷﻴﻔﺖ ﻣﻨﻄﻘﻲ‬
‫‪Loop‬‬ ‫ﺣﻠﻘﻪ‪-‬ﺣﻠﻘﻪ ﺗﻜﺮار‬
‫‪٣٨٣‬‬

‫‪Low‬‬ ‫ﭘﺎﺋﻴﻦ‬
‫‪Low order‬‬ ‫ﻣﺮﺗﺒﻪ ﭘﺎﺋﻴﻦ‬
‫‪Low order digit‬‬ ‫رﻗﻢ ﻣﺮﺗﺒﻪ ﭘﺎﺋﻴﻦ‬
‫‪LSD‬‬ ‫ﺑﻴﺖ ﺑﺎﻛﻤﺘﺮﻳﻦ ارزش‬
‫‪Magnetic‬‬ ‫ﻣﻐﻨﺎﻃﻴﺴﻲ‬
‫‪Magnetic disk‬‬ ‫دﻳﺴﻚ ﻣﻐﻨﺎﻃﻴﺴﻲ‬
‫‪Main‬‬ ‫اﺻﻠﻲ‬
‫‪Maintenance‬‬ ‫ﺗﻌﻤﻴﺮ و ﻧﮕﻬﺪاري‬
‫‪Major‬‬ ‫اﺻﻠﻲ‬
‫‪Major key‬‬ ‫ﻛﻠﻴﺪ اﺻﻠﻲ‬
‫‪Malfunction‬‬ ‫ﺧﺮاﺑﻲ‪-‬از ﻛﺎر اﻓﺘﺎدﮔﻲ‬
‫‪Match‬‬ ‫ﺗﻄﺒﻴﻖ‪-‬ﺟﻮر‬
‫‪Matching error‬‬ ‫ﺧﻄﺎي ﺗﻄﺒﻴﻖ‬
‫‪Mathematical‬‬ ‫رﻳﺎﺿﻲ‬
‫‪Matrix‬‬ ‫ﻣﺎﺗﺮﻳﺲ‬
‫‪Mechanism‬‬ ‫ﻣﻜﺎﻧﻴﺰم‪-‬روش‬
‫‪Medium‬‬ ‫وﺳﻴﻠﻪ ﺑﺮاي ﺿﺒﻂ داده‬
‫‪Memory‬‬ ‫ﺣﺎﻓﻈﻪ‬
‫‪Memory address register‬‬ ‫ﺛﺒﺎت آدرس ﺣﺎﻓﻈﻪ‬
‫‪Memory cycle‬‬ ‫ﺳﻴﻜﻞ ﻳﺎ دوره ﺣﺎﻓﻈﻪ‬
‫‪Memory dump‬‬ ‫ﺗﺨﻠﻴﻪ ﺣﺎﻓﻈﻪ‬
‫‪Memory exchange‬‬ ‫ﻣﺒﺎدﻟﻪ ﺣﺎﻓﻈﻪ‬
‫‪Memory hierarchy‬‬ ‫ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺐ ﺣﺎﻓﻈﻪ‬
‫‪Memory location‬‬ ‫ﻣﺤﻞ ﺣﺎﻓﻈﻪ‬
٣٨٤

Memory protection ‫ﺣﻔﺎﻇﺖ ﺣﺎﻓﻈﻪ‬


Memory register ‫ﺛﺒﺎت ﺣﺎﻓﻈﻪ‬
Merge ‫ادﻏﺎم‬
Message ‫ﭘﻴﻐﺎم‬
Message exchange ‫ﻣﺒﺎدﻟﻪ ﭘﻴﻐﺎم‬
Method ‫روش‬
Microsecond ‫ﻣﻴﻜﺮوﺛﺎﻧﻴﻪ‬-‫ﻣﻴﻠﻴﻮﻧﻴﻮم ﺛﺎﻧﻴﻪ‬
Minimum ‫ﻛﻮﭼﻜﺘﺮﻳﻦ‬
Mistake ‫اﺷﺘﺒﺎه‬
Mode ‫ﻃﺮﻳﻘﻪ‬-‫ﻃﺮز‬-‫روش‬
Module ‫ﺑﺮﻧﺎﻣﻪ‬-‫ﻣﺎژول‬
Monitor ‫ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‬
Multiply ‫ﺿﺮب ﻛﺮدن‬
Multiplication ‫ﺿﺮب‬
Multiprocessor ‫ﻛﺎﻣﭙﻴﻮﺗﺮ داراي ﭼﻨﺪ رﻳﺰﭘﺮدازﻧﺪه‬
Negative ‫ﻣﻨﻔﻲ‬
Notation ‫ﻧﻤﺎﻳﺶ‬
Number ‫ﻋﺪد‬
Numeric ‫ﻋﺪدي‬
Operand ‫ﻋﻤﻠﻮﻧﺪ‬
Operand address ‫آدرس ﻋﻤﻠﻮﻧﺪ‬
Operating system ‫ﺳﻴﺴﺘﻢ اﺟﺮاﺋﻲ‬
Operation ‫ﻋﻤﻞ‬
Operational unit ‫واﺣﺪ اﺟﺮاﺋﻲ‬
٣٨٥

Operator ‫ﻋﻤﻠﮕﺮ‬-‫اﭘﺮاﺗﻮر‬
Operator error ‫ﺧﻄﺎي اﭘﺮاﺗﻮر‬
Option ‫ﮔﺰﻳﻨﻪ‬
Order ‫ﺗﺮﺗﻴﺐ‬
Out of range ‫ﺧﺎرج از داﻣﻨﻪ‬
Output ‫ﺧﺮوﺟﻲ‬
Output equipment ‫ﺗﺠﻬﻴﺰات ﺧﺮوﺟﻲ‬
Output unit ‫واﺣﺪ ﺧﺮوﺟﻲ‬
Overflow ‫ﺳﺮرﻳﺰﺷﺪن‬-‫ﺳﺮرﻳﺰي‬
Overflow check ‫ﺑﺮرﺳﻲ ﺳﺮرﻳﺰي‬
Page ‫ﺻﻔﺤﻪ‬
Page address ‫آدرس ﺻﻔﺤﻪ‬
Page heading ‫ﻋﻨﻮان ﺻﻔﺤﻪ‬
Paging ‫ﺻﻔﺤﻪ ﺑﻪ ﺻﻔﺤﻪ ﻛﺮدن‬
Parallel ‫ﻣﻮازي‬
Parallel operation ‫ﻋﻤﻠﻴﺎت ﻣﻮازي‬
Parity bit ‫ﺑﻴﺖ ﺗﻮازن‬
Path ‫ﻣﺴﻴﺮ‬
Pattern ‫اﻟﮕﻮ‬
Pattern recognition ‫ﺗﺸﺨﻴﺺ اﻟﮕﻮ‬
Perform ‫ﻋﻤﻞ ﻛﺮدن‬-‫اﻧﺠﺎم دادن‬
Peripheral ‫ﺟﺎﻧﺒﻲ‬
Peripheral equipment ‫وﺳﺎﺋﻞ ﺟﺎﻧﺒﻲ –ﺗﺠﻬﻴﺰات ﺟﺎﻧﺒﻲ‬
Permanent ‫داﺋﻢ‬
٣٨٦

Phase ‫ﻣﺮﺣﻠﻪ‬-‫ﻓﺎز‬
Point ‫ﻧﻘﻄﻪ‬
Pointer ‫اﺷﺎرهﮔﺮ‬
Position ‫ﻣﻮﻗﻌﻴﺖ – ﺟﺎ‬
Precision ‫دﻗﺖ‬
Predefined ‫از ﻗﺒﻞ ﺗﻌﺮﻳﻒ ﺷﺪه‬
Primary ‫اوﻟﻴﻪ‬-‫اﺻﻠﻲ‬
Printer ‫ﭼﺎﭘﮕﺮ‬
Priority ‫اوﻟﻮﻳﺖ‬
Priority interrupt ‫وﻗﻔﻪ اوﻟﻮﻳﺖ دار‬
Problem ‫ﻣﺴﺄﻟﻪ‬
Procedural ‫روﻳﻪاي‬
Procedure ‫روﻳﻪ‬-‫روال‬
Process ‫ﻓﺮآﻳﻨﺪ‬
Processor ‫ﭘﺮدازﺷﮕﺮ‬
Production ‫ﻣﺤﺼﻮل‬-‫ﺗﻮﻟﻴﺪ‬
Program ‫ﺑﺮﻧﺎﻣﻪ‬
Program compilation ‫ﺗﺮﺟﻤﺔ ﺑﺮﻧﺎﻣﻪ‬
Program error ‫ﺧﻄﺎي ﺑﺮﻧﺎﻣﻪ‬
Programmer ‫ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ‬
Programming ‫ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ‬
Program segment ‫ﻗﻄﻌﻪ ﻳﺎ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ‬
Quantity ‫ﻣﻘﺪار‬
Queue ‫ﺻﻒ‬
‫‪٣٨٧‬‬

‫‪Ram‬‬ ‫ﺣﺎﻓﻈﻪ اﺻﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ‬


‫‪Random‬‬ ‫ﺗﺼﺎدﻓﻲ‬
‫‪Random access‬‬ ‫دﺳﺘﺮﺳﻲ ﺗﺼﺎدﻓﻲ‬
‫‪Random number‬‬ ‫اﻋﺪاد ﺗﺼﺎدﻓﻲ‬
‫‪Rapid memory‬‬ ‫ﺣﺎﻓﻈﻪ ﺳﺮﻳﻊ‬
‫‪Rate‬‬ ‫ﻧﺮخ‬
‫‪Ratio‬‬ ‫ﻧﺴﺒﺖ‬
‫‪Raw data‬‬ ‫دادهﻫﺎي ﺧﺎم ﻳﺎ اوﻟﻴﻪ‬
‫‪Read‬‬ ‫ﺧﻮاﻧﺪن‬
‫‪Read time‬‬ ‫زﻣﺎن ﺧﻮاﻧﺪن‬
‫‪Real number‬‬ ‫اﻋﺪاد ﺣﻘﻴﻘﻲ‬
‫‪Receive‬‬ ‫درﻳﺎﻓﺖ ﻛﺮدن‬
‫‪Receiver‬‬ ‫درﻳﺎﻓﺖ ﻛﻨﻨﺪه‬
‫‪Record‬‬ ‫رﻛﻮرد‬
‫‪Record length‬‬ ‫ﻃﻮل رﻛﻮرد‬
‫‪Register‬‬ ‫ﺛﺒﺎت‪-‬رﺟﻴﺴﺘﺮ‬
‫‪Register address‬‬ ‫آدرس ﺛﺒﺎت‬
‫‪Relative‬‬ ‫ﻧﺴﺒﻲ‬
‫‪Relative code‬‬ ‫ﻛﺪ ﻧﺴﺒﻲ‬
‫‪Repeat‬‬ ‫ﺗﻜﺮار ﻛﺮدن‬
‫‪Repeat counter‬‬ ‫ﺷﺎﺧﺺ ﺗﻜﺮار‬
‫‪Repeater‬‬ ‫ﺗﻜﺮار ﻛﻨﻨﺪه‬
‫‪Report‬‬ ‫ﮔﺰارش ﻛﺮدن‪-‬ﮔﺰارش‬
‫‪Retrieve‬‬ ‫ﺑﺎزﻳﺎﺑﻲ‬
‫‪٣٨٨‬‬

‫‪Return‬‬ ‫ﺑﺮﮔﺸﺖ‬
‫‪Rules‬‬ ‫ﻗﻮاﻋﺪ‬
‫‪Run‬‬ ‫اﺟﺮا ﻛﺮدن ﺑﺮﻧﺎﻣﻪ‪-‬اﺟﺮاي ﺑﺮﻧﺎﻣﻪ‬
‫‪Sample‬‬ ‫ﻧﻤﻮﻧﻪ‬
‫‪Scan‬‬ ‫ﺑﺎ دﻗﺖ ﻧﮕﺎه ﻛﺮدن‪-‬ﺑﺮرﺳﻲ ﻛﺮدن‬
‫‪Screen‬‬ ‫ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ‬
‫‪Section‬‬ ‫ﺑﺨﺶ‬
‫‪Segment‬‬ ‫ﻗﻄﻌﻪ‪-‬ﻗﺴﻤﺖ‬
‫‪Segmentation‬‬ ‫ﻗﺴﻤﺖ ﻛﺮدن‪-‬ﻗﻄﻌﻪ ﻗﻄﻌﻪ ﻛﺮدن‬
‫‪Separator‬‬ ‫ﺟﺪا ﻛﻨﻨﺪه‬
‫‪Sequence‬‬ ‫دﻧﺒﺎﻟﻪ‪-‬ﺗﺮﺗﻴﺐ‬
‫‪Sequential‬‬ ‫ﻣﺘﻮاﻟﻲ‬
‫‪Sequential processing‬‬ ‫ﭘﺮدازش ﻣﺘﻮاﻟﻲ‬
‫‪Serial access‬‬ ‫دﺳﺘﺮﺳﻲ ﺳﺮي‬
‫‪Set‬‬ ‫ﻗﺮاردادن‪-‬ﺗﻌﻴﻴﻦ ﻛﺮدن‪-‬ﺗﻨﻈﻴﻢ ﻛﺮدن –ﻣﻴﺰان ﻛﺮدن – ﻣﺠﻤﻮﻋﻪ‬
‫‪Shared storage‬‬ ‫ﺣﺎﻓﻈﻪ اﺷﺘﺮاﻛﻲ‬
‫‪Shift‬‬ ‫ﺟﺎﺑﻪﺟﺎﺋﻲ‬
‫‪Sign‬‬ ‫ﻋﻼﻣﺖ‬
‫‪Signed‬‬ ‫ﻋﻼﻣﺘﺪار‬
‫‪Significance‬‬ ‫ﺑﺎاﻫﻤﻴﺖ‬
‫‪Software‬‬ ‫ﻧﺮم اﻓﺰار‬
‫‪Solution‬‬ ‫راه ﺣﻞ‬
‫‪Sort‬‬ ‫ﻣﺮﺗﺐ ﻧﻤﻮدن‬
‫‪Sort bubble‬‬ ‫ﻣﺮﺗﺐ ﻛﺮدن ﺑﻪ روش ﺣﺒﺎﺑﻲ‬
٣٨٩

Space ‫ﻓﻀﺎ‬
Stack ‫ﭘﺸﺘﻪ‬
Standard ‫اﺳﺘﺎﻧﺪارد‬
Status ‫وﺿﻌﻴﺖ‬
Step ‫ﮔﺎم‬-‫ﻣﺮﺣﻠﻪ‬-‫ﻗﺪم‬
Storage ‫ﺣﺎﻓﻈﻪ‬
Storage block ‫ﺑﻠﻮك ﺣﺎﻓﻈﻪ‬
String ‫رﺷﺘﻪ‬
Symbol ‫ﻧﻤﺎد‬
Symbolic address ‫آدرس ﻧﻤﺎدي‬
Symbol table ‫ﺟﺪول ﻧﻤﺎدي‬
System ‫ﺳﻴﺴﺘﻢ – دﺳﺘﮕﺎه‬
Table ‫ﺟﺪول‬
Table lookup ‫ﺟﺴﺘﺠﻮي ﺟﺪول‬
Tape ‫ﻧﻮار ﻣﻐﻨﺎﻃﻴﺴﻲ‬
Temporary ‫ﻣﻮﻗﺖ‬
Terminal ‫ﻧﻘﻄﻪ ﻧﻬﺎﺋﻲ‬-‫ﺗﺮﻣﻴﻨﺎل‬
Test data ‫داده ﺟﻬﺖ ﺗﺴﺖ‬
Time ‫زﻣﺎن‬
Time scale ‫ﻣﻘﻴﺎس زﻣﺎن‬
Transmission ‫اﻧﺘﻘﺎل‬
Unconditional ‫ﺑﺪون ﺷﺮط‬
Unit ‫ﻗﺴﻤﺖ‬-‫واﺣﺪ‬
User ‫ﻛﺎرﺑﺮ‬
٣٩٠

Variable ‫ﻣﺘﻐﻴﺮ‬
Variable length ‫ﺑﻄﻮل ﻣﺘﻐﻴﺮ‬
Verify ‫ﺑﺮرﺳﻲ ﻛﺮدن‬
Virtual ‫ﻣﺠﺎزي‬
Waiting state ‫وﺿﻌﻴﺖ اﻧﺘﻈﺎر‬
Warning ‫اﺧﻄﺎر‬
Word ‫ﺷﺎﻧﺰده ﺑﻴﺖ‬-‫ﻛﻠﻤﻪ‬
Write ‫ﻧﻮﺷﺘﻦ‬
Zero ‫ﺻﻔﺮ‬
Zero divide ‫ﺗﻘﺴﻴﻢ ﺑﺮ ﺻﻔﺮ‬

You might also like