Você está na página 1de 15

‫‪4‬‬

‫أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫اﻷهﺪاف اﻟﺘﻌﻠﻴﻤﻴﺔ‪:‬‬
‫ﺳﻨﺘﻌﻠﻢ ﻓﻲ هﺬا اﻟﻔﺼﻞ‪:‬‬
‫ﻟﻤﺎذا ﻳﻤﺘﻠﻚ اﻟﺤﺎﺳﻮب اﻟﻌﺪﻳﺪ ﻣﻦ أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ‪.‬‬ ‫‪.1‬‬
‫ﺗﻄﺒﻴﻘﺎت اﻟﻌﻨﻮﻧﺔ اﻟﻔﻮرﻳﺔ‪.‬‬ ‫‪.2‬‬
‫اﻟﻌﻨﻮﻧﺔ ﻏﻴﺮ اﻟﻤﺒﺎﺷﺮة وﺗﻄﺒﻴﻘﺎﺗﻬﺎ‪.‬‬ ‫‪.3‬‬
‫اﻟﻌﻨﻮﻧﺔ اﻟﻨﺴﺒﻴﺔ ﻟﻠﺤﺎﺳﻮب واﻟﻤﺴﺘﺨﺪﻣﺔ ﻣﻦ أﺟﻞ اﻟﻘﻔﺰ إﻟﻰ اﻟﺘﻌﻠﻴﻤﺎت اﻟﻘﺮﻳﺒﺔ‪.‬‬ ‫‪.4‬‬
‫اﻟﻌﻨﻮﻧﺔ اﻟﺪﻟﻴﻠﻴﺔ واﻟﻘﺎﻋﺪﻳﺔ وآﻴﻔﻴﺔ اﺳﺘﺨﺪاﻣﻬﻤﺎ ﻓﻲ ﻋﻨﻮﻧﺔ ﻋﻨﺎﺻﺮ ﻣﺼﻔﻮﻓﺎت ﻣﺘﻌﺪدة اﻷﺑﻌﺎد‪.‬‬ ‫‪.5‬‬
‫اﺳﺘﺨﺪام اﻟﻌﻨﻮﻧﺔ اﻟﻘﺎﻋﺪﻳﺔ ﻓﻲ ﻋﻤﻠﻴﺔ إﻋﺎدة ﺗﻮﺿﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬ ‫‪.6‬‬

‫ﻫﻨﺎﻙ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﱵ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻋﻨﺪ ﺗﺼﻤﻴﻢ ﺍﳌﻌﺎﰿ‪ .‬ﺳﻨﺪﺭﺱ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ‬
‫ﺃﺭﺑﻌﺔ ﺃﳕﺎﻁ ﻣﺸﻬﻮﺭﺓ ﻟﻠﻌﻨﻮﻧﺔ ﻭﻣﺴﺘﺨﺪﻣﺔ ﰲ ﺣﻮﺍﺳﺐ ﺷﺮﻛﺔ ‪ .IBM‬ﳚﺐ ﻋﻠﻰ ﻣﺼﻤﻢ ﻭﺣﺪﺓ‬
‫ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ ﺃﻥ ﻳﻀﻴﻒ ﻣﺴﺠﻼﺕ ﺧﺎﺻﺔ ﻭﺗﻌﻠﻴﻤﺎﺕ ﺁﻟﺔ ﺟﺪﻳﺪﺓ ﻟﺘﺪﻋﻢ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﻫﺬﻩ‪.‬‬

‫‪ 4.1‬ﻣﺎ هﻲ اﻟﺤﺎﺟﺔ ﻷﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ‬


‫ﻫﻨﺎﻙ ﺣﺎﺟﺔ ﰲ ﺃﻱ ﺑﺮﻧﺎﻣﺞ ﺣﺎﺳﻮﰊ ﻟﻌﻨﻮﻧﺔ ﺍﳌﻌﻄﻴﺎﺕ ﻭﺍﻟﺘﻌﻠﻴﻤﺎﺕ‪ .‬ﻓﻔﻲ ﺍﳌﺜﺎﻝ ﺍﻟﱪﳎﻲ ﺍﳌﻌﻄﻰ ﰲ‬
‫ﺍﻟﺸﻜﻞ )‪ (3-1‬ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ‪ ،‬ﺗﻌﻨﻮﻥ ﺗﻌﻠﻴﻤﺔ ‪ MOV CX, 3‬ﻣﻌﻄﻴﺎﺕ )ﺛﺎﺑﺖ ﺑﻘﻴﻤﺔ ‪ ،(3‬ﻭﺗﻌﻨﻮﻥ‬
‫ﺗﻌﻠﻴﻤﺔ ‪ LOOP‬ﺗﻌﻠﻴﻤﺔ ﺃﺧﺮﻯ ﻣﺴﺒﻮﻗﺔ ﺑﺎﻟﻼﻓﺘﺔ ‪ ،next‬ﻭﻣﺜﻞ ﻫﺬﻩ ﺍﻟﻌﻨﺎﻭﻳﻦ ﻫﻲ ﺟﺰﺀ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ‪.‬‬
‫ﻫﻨﺎﻙ ﺑﻌﺾ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻣﺜﻞ ‪ JMP‬ﻭ‪ LOOP‬ﲢﺘﺎﺝ ﻟﻌﻨﻮﺍﻥ ﻭﺍﺣﺪ ﻭﻫﻨﺎﻙ ﺗﻌﻠﻴﻤﺎﺕ ﺃﺧﺮﻯ ﻣﺜﻞ‬
‫‪ MOV AX, num‬ﲢﺘﺎﺝ ﻟﻌﻨﻮﺍﻧﲔ‪ ،‬ﳘﺎ ﻋﻨﻮﺍﻥ ﺍﳌﺴﺠﻞ ﻭﻋﻨﻮﺍﻥ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﺨﺰﻧﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪.RAM‬‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪70‬‬

‫‪RAM‬‬ ‫ﻳﺆﺛﺮ ﻃﻮﻝ ﺍﻟﻌﻨﻮﺍﻥ ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ ﻋﻠﻰ ﻃﻮﻝ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﱵ ﺗﺆﺛﺮ ﺑﺪﻭﺭﻫﺎ ﻋﻠﻰ ﺣﺠﻢ ﺍﻟﺬﺍﻛﺮﺓ‬
‫ﺍﳌﻄﻠﻮﺏ ﻟﺘﺨﺰﻳﻦ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﺇﻥ ﺃﺑﺴﻂ ﳕﻂ ﻟﻠﻌﻨﻮﻧﺔ ﻳﻌﺮﻑ ﺑﺎﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ )‪ ،(direct addressing‬ﻭﰲ ﻫﺬﺍ ﺍﻟﻨﻤﻂ ﳓﺘﺎﺝ ﺇﱃ‬
‫ﻋﻨﻮﺍﻥ ﺑﻄﻮﻝ ‪ n‬ﺑﺖ ﻟﻌﻨﻮﻧﺔ ‪ 2‬ﻣﻮﻗﻌﹰﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪ .RAM‬ﻭﻣﻊ ﺯﻳﺎﺩﺓ ﺗﻌﻘﻴﺪ ﺍﳊﻮﺍﺳﺐ ﻭﺍﺗﺴﺎﻉ‬
‫‪n‬‬

‫ﳎﺎﻻﺕ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﺍﺯﺩﺍﺩ ﺍﻟﻄﻠﺐ ﻋﻠﻰ ﺳﻌﺎﺕ ﺃﻛﱪ ﻟﻠﺬﺍﻛﺮﺓ‪ ،‬ﻓﻜﻲ ﻧﻘﻮﻡ ﺑﻌﻨﻮﻧﺔ ﻣﺒﺎﺷﺮﺓ ﻟﺬﺍﻛﺮﺓ‬
‫‪ RAM‬ﺑﺴﻌﺔ ‪ 64MB‬ﳓﻦ ﲝﺎﺟﺔ ﻟﻌﻨﻮﺍﻥ ﺑﻄﻮﻝ ‪ 26‬ﺑﺘﹰﺎ )‪ .(2 =64M‬ﺇﻥ ﺍﺳﺘﺨﺪﺍﻡ ﻃﺮﻳﻘﺔ ﺗﺸﻔﲑ‬
‫‪26‬‬

‫ﻭﺃﳕﺎﻁ ﻋﻨﻮﻧﺔ ﺫﻛﻴﺔ ﺳﻴﺆﺩﻱ ﺇﱃ ﲣﻔﻴﺾ ﻃﻮﻝ ﻫﺬﺍ ﺍﻟﻌﻨﻮﺍﻥ ﺑﺸﻜﻞ ﻣﻠﺤﻮﻅ‪ .‬ﺇﻥ ﺇﻧﻘﺎﺹ ﻃﻮﻝ‬
‫ﺍﻟﻌﻨﻮﺍﻥ ﺳﻴﻜﻮﻥ ﻋﻠﻰ ﺣﺴﺎﺏ ﺯﻣﻦ ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﺍﳌﻌﻄﻴﺎﺕ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﻛﻤﺎ ﺳﻨﺮﻯ ﻻﺣﻘﹰﺎ‪.‬‬
‫ﰿ ﺑﺸﻜﻞ ﻋﺎﻡ ﻗﻠﻴﻞ ﻭﻫﻮ ﻣﻦ ﺭﺗﺒﺔ ‪ 64 ،32 ،16 ،8‬ﻭﻫﺬﻩ ﺍﳌﺴﺠﻼﺕ‬ ‫ﺇﻥ ﻋﺪﺩ ﺍﳌﺴﺠﻼﺕ ﰲ ﺍﳌﻌﺎ ِ‬
‫ﻻ ﺛﺎﺑﺘﹰﺎ ﻣﻦ ﺭﺗﺒﺔ ‪6, 5, 4, 3‬‬
‫ﻗﺎﺑﻠﺔ ﻟﻠﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ‪ ،‬ﻛﻤﺎ ﺇﻥ ﺣﻘﻞ ﺍﻟﻌﻨﻮﺍﻥ ﻟﻠﻤﺴﺠﻞ ﺑﺎﻟﺘﻌﻠﻴﻤﺔ ﻳﺸﻜﻞ ﻃﻮ ﹰ‬
‫ﺑﺖ ﻭﻟﻄﺎﳌﺎ ﺃﻥ ﺍﳌﺴﺠﻼﺕ ﻣﻮﺟﻮﺩﺓ ﺿﻤﻦ ﺍﳌﻌﺎﰿ ﻓﺈﻧﻪ ﻳﺘﻢ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻬﺎ ﺑﺸﻜﻞ ﺃﺳﺮﻉ ﻣﻦ‬
‫ﺍﻟﻮﺻﻮﻝ ﺇﱃ ﻣﻮﺍﻗﻊ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪ ،‬ﻭﻻﺑﺪ ﳌﱪﻣﺞ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺴﺠﻼﺕ ﻗﺪﺭ ﺍﳌﺴﺘﻄﺎﻉ‬
‫ﻟﻴﻘﻠﻞ ﻣﻦ ﺯﻣﻦ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﻻ ﺗﻔﻴﺪ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﰲ ﺗﻘﻠﻴﻞ ﻛﻤﻴﺔ ﺍﻟﺘﺨﺰﻳﻦ ﻟﻠﱪﺍﻣﺞ ﻓﺤﺴﺐ ﻭﺇﳕﺎ ﺗﻔﻴﺪ ﺃﻳﻀﹰﺎ ﰲ ﺗﻘﻠﻴﻞ ﺯﻣﻦ ﺗﻨﻔﻴﺬ‬
‫ﺍﻟﱪﺍﻣﺞ ﻭﻫﺬﺍ ﻣﺎ ﺳﻨﺮﺍﻩ ﰲ ﺍﻟﻔﻘﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ‪ .‬ﻓﺒﺎﻹﺿﺎﻓﺔ ﺇﱃ ﺍﻟﻔﻌﺎﻟﻴﺔ ﰲ ﺍﻟﺘﺨﺰﻳﻦ ﻭﰲ ﺯﻣﻦ ﺗﻨﻔﻴﺬ‬
‫ﺍﻟﱪﻧﺎﻣﺞ ﻓﺈﻥ ﻫﻨﺎﻙ ﻣﻔﻬﻮﻣﲔ ﻧﻮﻋﻴﲔ ﻣﺮﻏﻮﺑﲔ ﺧﺎﺻﲔ ﺑﺎﻟﱪﻧﺎﻣﺞ ﻭﳘﺎ ﺍﳌﺮﻭﻧﺔ ﻭﻗﺎﺑﻠﻴﺔ ﺍﻟﻘﺮﺍﺀﺓ‬
‫ﻭﺍﻟﻠﺬﺍﻥ ﻳﺴﺎﻋﺪﺍﻥ ﰲ ﺻﻴﺎﻧﺔ ﺍﻟﱪﺍﻣﺞ‪ ،‬ﻻﺣﻆ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫)‪ADD AX, BX (instruction-1‬‬

‫)ﺍﳌﺼﺪﺭ ﻭﺍﻟﻮﺟﻬﺔ(‪ ،‬ﻭﻫﺬﺍﻥ‬ ‫‪ADD‬‬ ‫ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ ﳌﻌﺎﻣﻠﻲ ﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫ﺍﳌﻌﺎﻣﻼﻥ ﻳﺸﲑﺍﻥ ﺇﱃ ﺍﳌﺴﺠﻼﺕ‪ .‬ﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ ﺇﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫)‪ADD A, B (instruction-2‬‬

‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ ﻭﻛﻼ ﺍﳌﻌﺎﻣﻠﲔ ﻣﻮﺟﻮﺩﺍﻥ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪ .RAM‬ﻣﻦ ﺍﻟﻮﺍﺿﺢ ﺑﺄﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫)‪ (instruction-2‬ﺳﺘﻜﻮﻥ ﺃﻛﱪ ﻃﻮ ﹰﻻ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ )‪ .(instruction-1‬ﻓﺈﺫﺍ ﻛﺎﻥ ﻻﺑﺪ ﻣﻦ ﺍﺳﺘﺨﺪﺍﻡ‬
‫‪ 26‬ﺑﺘﹰﺎ ﻟﻌﻨﻮﻧﺔ ﺫﺍﻛﺮﺓ ‪ RAM‬ﺑﺴﻌﺔ ‪ 64MB‬ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ ﻓﺈﻧﻪ ﻣﻦ ﺍﻟﻮﺍﺿﺢ ﺑﺄﻥ ﺣﻘﻞ ﺍﳌﻌﺎﻣﻞ ﻟﻠﺘﻌﻠﻴﻤﺔ‬
‫ﻼ ﺟﺪﹰﺍ ﻭﺫﻟﻚ ﻋﻨﺪﻣﺎ ﻧﺮﻏﺐ ﰲ‬ ‫)‪ (instruction-2‬ﺳﻴﺤﺘﺎﺝ ﺇﱃ ‪ 52‬ﺑﺘﹰﺎ ﻟﻮﺣﺪﻩ‪ ،‬ﻭﻫﺬﺍ ﻳﻌﺘﱪ ﻃﻮﻳ ﹰ‬
‫ﲡﻤﻴﻊ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺑﻄﻮﻝ ‪ 32‬ﺃﻭ ‪ 48‬ﺑﺘﹰﺎ‪ .‬ﺍﳊﻞ ﺍﻟﺒﺪﻳﻞ ﻫﻮ ﺃﻥ ﻧﺴﺘﺨﺪﻡ ﻣﺴﺠﻞ ﻣﻦ ﺃﺟﻞ ﺇﺣﺪﻯ‬
‫ﺍﳌﻌﺎﻣﻼﺕ ﻭﻧﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ ﳌﻮﺍﻗﻊ ﺍﻟﺬﺍﻛﺮﺓ ‪ RAM‬ﻣﻦ ﺃﺟﻞ ﺍﳌﻌﺎﻣﻞ ﺍﻵﺧﺮ‪:‬‬
‫‪ADD AX, Y‬‬

‫ﻭﻫﻨﺎﻙ ﻃﺮﻕ ﻋﻨﻮﻧﺔ ﺃﺧﺮﻯ ﺗﺴﺘﺨﺪﻡ ﻟﺘﻘﻠﻴﻞ ﻃﻮﻝ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻭﻫﺬﺍ ﻣﺎ ﺳﻨﻨﺎﻗﺸﻪ ﰲ ﺍﳌﻘﻄﻊ ‪ 4.4‬ﻭﺍﳌﻘﻄﻊ ‪.4.5‬‬
‫‪71‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫‪ 4.2‬اﻟﻌﻨﻮﻧﺔ اﻟﻔﻮرﻳﺔ‬
‫ﺇﺫﺍ ﻛﺎﻧﺖ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﻄﻠﻮﺏ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﻦ ﻗﺒﻞ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺗﺸﻜﻞ ﺟﺰﺀﹰﺍ ﻣﻦ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻓﺈﻧﻪ ﰲ‬
‫ﺯﻣﻦ ﺍﻟﺘﻨﻔﻴﺬ‪ ،‬ﻋﻨﺪ ﺟﻠﺐ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ‪ ،‬ﺳﻴﺘﻢ ﺟﻠﺐ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﻄﻠﻮﺑﺔ ﻣﻌﻬﺎ‪ ،‬ﻭﻫﻜﺬﺍ‬
‫ﻻ ﺗﻮﺟﺪ ﺣﺎﺟﺔ ﻷﻱ ﺯﻣﻦ ﺇﺿﺎﰲ ﳉﻠﺐ ﻫﺬﻩ ﺍﳌﻌﻄﻴﺎﺕ‪ .‬ﻫﺬﺍ ﺍﻟﻨﻤﻂ ﻣﻦ ﻋﻨﻮﻧﺔ ﺍﳌﻌﻄﻴﺎﺕ ﻳﺪﻋﻰ‬
‫ﺑﺎﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ )‪ ،(immediate addressing‬ﺍﻧﻈﺮ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪MOV CX, 7‬‬

‫ﺇﻥ ﺍﳌﻌﻄﻴﺎﺕ ﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﻫﻲ ﺛﺎﺑﺖ ﺑﺪﻭﻥ ﺇﺷﺎﺭﺓ ﻣﺴﺎ ٍﻭ ﻟﻠﻘﻴﻤﺔ ‪ 7‬ﻭﻫﻮ ﻳﺸﻜﻞ ﺟﺰﺀﹰﺍ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ‪.‬‬
‫ﻓﺈﺫﺍ ﻛﺎﻥ ﻃﻮﻝ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ 16‬ﺑﺘﹰﺎ ﻣﻨﻬﺎ ‪ 8‬ﺑﺘﺎﺕ ﳐﺼﺼﺔ ﻟﺸﻴﻔﺮﺓ ﺍﻟﻌﻤﻠﻴﺔ )‪ (MOV CX‬ﻓﺈﻥ ﺍﻟﺜﻤﺎﻥ ﺑﺘﺎﺕ‬
‫ﺍﻟﺒﺎﻗﻴﺔ ﺳﺘﺨﺼﺺ ﻟﻠﻤﻌﻄﻴﺎﺕ‪ .‬ﻭﻫﻜﺬﺍ ﺑﺜﻤﺎﻥ ﺑﺘﺎﺕ ﳓﺼﻞ ﻋﻠﻰ ‪ 256‬ﺗﺮﻛﻴﺒﺔ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻟﺘﻤﺜﻴﻞ‬
‫ﺍﻷﺭﻗﺎﻡ ﺍﻟﺼﺤﻴﺤﺔ ﺑﺪﻭﻥ ﺇﺷﺎﺭﺓ ﻣﻦ ﺻﻔﺮ ﻭﺣﱴ ‪ .255‬ﳝﻜﻦ ﺑﺸﻜﻞ ﺑﺪﻳﻞ ﺃﻥ ﺗﻌﺎﻣﻞ ﻫﺬﻩ ﺍﻟﺜﻤﺎﻥ‬
‫ﺑﺘﺎﺕ ﻋﻠﻰ ﺃ‪‬ﺎ ﺃﻋﺪﺍﺩ ﺑﺈﺷﺎﺭﺓ ﻋﻦ ﻃﺮﻳﻖ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺘﻤﻢ ﺍﻟﺜﻨﺎﺋﻲ ﻭﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺳﻴﻜﻮﻥ ﺍ‪‬ﺎﻝ ﻣﻦ‬
‫‪ -128‬ﻭﺣﱴ ‪.+127‬‬
‫‪8‬‬ ‫ﺇﺫﺍﹰ‪ ،‬ﻓﺄﺣﺪ ﳏﺪﺩﺍﺕ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﻫﻮ ﺃﻥ ﺣﺠﻢ ﺍﳌﻌﺎﻣﻞ ﺻﻐﲑ‪ ،‬ﻭﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﻳﺘﻢ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻦ‬
‫ﺣﱴ ‪ 12‬ﺑﺘﹰﺎ ﻟﺘﻤﺜﻴﻞ ﻣﻌﺎﻣﻼﺕ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ‪.‬‬
‫ﺗﻨﻔﺬ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﺑﺸﻜﻞ ﺳﺮﻳﻊ ﻭﻫﺬﺍ ﻋﺎﺋﺪ ﻟﻜﻮﻥ ﺍﳌﻌﻄﻴﺎﺕ ﲡﻠﺐ ﻣﻊ‬
‫ﺍﻟﺘﻌﻠﻴﻤﺔ‪ .‬ﻭﺑﺼﺮﻑ ﺍﻟﻨﻈﺮ ﻋﻦ ﻛﻮﻥ ﺣﺠﻢ ﺍﳌﻌﻄﻴﺎﺕ ﳏﺪﻭﺩ ﻓﺈﻧﻪ ﺗﻮﺟﺪ ﺳﻠﺒﻴﺔ ﺃﺧﺮﻯ ﰲ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ‪ .‬ﻟﻨﻔﺘﺮﺽ ﺑﺄﻧﻨﺎ ﻧﻘﻮﻡ ﺑﺘﺠﻤﻴﻊ ﺑﺮﻧﺎﻣﺞ ﳛﻮﻱ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ MOv CX, 7‬ﻣﻦ ﺃﺟﻞ ﺗﻄﺒﻴﻖ‬
‫ﻣﻌﲔ ﻭﺑﻌﺪ ﻓﺘﺮﺓ ﻣﺎ ﺃﺭﺩﻧﺎ ﺃﻥ ﻧﻐﲑ ﺍﻟﻘﻴﻤﺔ ‪ 7‬ﻟﺘﺼﺒﺢ ‪ ،3‬ﻫﺬﺍ ﻳﻌﲏ ﺃﻧﻪ ﳚﺐ ﺃﻥ ﻧﻐﲑ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻟﺘﺼﺒﺢ‬
‫‪ MOV CX, 3‬ﻭﻧﻌﻴﺪ ﲡﻤﻴﻊ ﺍﻟﱪﻧﺎﻣﺞ‪ .‬ﻭﻫﺬﺍ ﻟﻦ ﻳﻜﻮﻥ ﻗﻀﻴﺔ ﺃﺳﺎﺳﻴﺔ ﻋﻨﺪ ﺍﻟﻌﻤﻞ ﻣﻊ ﺑﺮﺍﻣﺞ ﺻﻐﲑﺓ‪،‬‬
‫ﻭﻟﻜﻦ ﻣﺮﻭﻧﺔ ﺍﻟﱪﻧﺎﻣﺞ ﺗﺼﺒﺢ ﻣﻔﻘﻮﺩﺓ ﻫﻨﺎ‪.‬‬
‫ﺍﻹﳚﺎﺑﻴﺔ ﺍﻷﺧﺮﻯ ﻟﻠﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﺃ‪‬ﺎ ﲢﺴﻦ ﻣﻦ ﺇﻣﻜﺎﻧﻴﺔ ﻗﺮﺍﺀﺓ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻓﻔﻲ ﺳﻠﺴﻠﺔ ﺍﳌﻌﺎﳉﺎﺕ‬
‫‪ 80×86‬ﳜﺼﺺ ﺍﳌﺴﺠﻞ ‪ CX‬ﻛﻌﺪﺍﺩ ﳐﺼﺺ ﻟﺘﻌﻠﻴﻤﺎﺕ ‪ ،LOOP‬ﻓﻌﻨﺪﻣﺎ ﻳﺮﻯ ﺍﻟﻘﺎﺭﺉ ﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫‪ MOV CX, 7‬ﻣﺘﺒﻮﻋﺔ ﺑﺘﻌﻠﻴﻤﺔ ‪ LOOP‬ﺳﻴﻔﻬﻢ ﺍﻟﻘﺎﺭﺉ ﺑﺴﻬﻮﻟﺔ ﺑﺄﻥ ﺍﳊﻠﻘﺔ ﺳﺘﺘﻜﺮﺭ ﺳﺒﻊ ﻣﺮﺍﺕ‪.‬‬
‫‪X‬‬ ‫ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺍﻟﻌﺒﺎﺭﺓ ‪ SUM = SUM+X‬ﺑﺸﻜﻞ ﻣﺘﻜﺮﺭ ﰲ ﺣﻠﻘﺔ ﳊﺴﺎﺏ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﺮﺍﻛﻤﻴﺔ ﻟﻠﻤﺘﻐﲑ‬
‫ﻓﻤﻦ ﺍﻷﺳﺎﺳﻴﺎﺕ ﺃﻥ ﺗﺆﺳﺲ ﻗﻴﻤﺔ ﺍﳌﺘﻐﲑ ‪ SUM‬ﺇﱃ ﺍﻟﺼﻔﺮ ﻗﺒﻞ ﺑﺪﺀ ﺗﻨﻔﻴﺬ ﺍﳊﻠﻘﺔ‪ ،‬ﺣﻴﺚ ﺇﻥ ﳕﻂ‬
‫ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﻣﻨﺎﺳﺐ ﺟﺪﹰﺍ ﳍﺬﺍ ﺍﻟﺘﺄﺳﻴﺲ‪ .‬ﲤﺘﻠﻚ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳌﻴﺰﺍﺕ ﺍﳌﺘﻘﺪﻣﺔ‬
‫ﻻﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﺑﺸﻜﻞ ﻓﻌﺎﻝ‪ ،‬ﻭﺇﺣﺪﻯ ﻫﺬﻩ ﺍﳋﺼﺎﺋﺺ ﻣﻌﻄﺎﺓ ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻮﺟﻴﻪ ﺍﳌﺴﻤﻰ‬
‫‪ .EQU‬ﺗﺴﻤﺢ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻟﻠﻤﱪﻣﺞ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﺳﻢ ﺭﻣﺰﻱ ﻟﺜﺎﺑﺖ ﻭﻣﻦ ﰒ ﳚﺮﻱ ﺍﺳﺘﺨﺪﺍﻣﻪ ﰲ‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪72‬‬

‫ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳌﻮﺍﻗﻊ ﰲ ﺍﻟﱪﻧﺎﻣﺞ‪ ،‬ﻭﺳﻴﻘﻮﻡ ﺍ‪‬ﻤ‪‬ﻊ ﺑﺎﻟﺘﺴﻮﻳﺔ ﻣﺎ ﺑﲔ ﺍﻻﺳﻢ ﺍﻟﺮﻣﺰﻱ ﻭﺍﻟﺜﺎﺑﺖ ﺍﳌﻘﺎﺑﻞ‬
‫ﻭﻳﺴﺘﺒﺪﻝ ﺍﻻﺳﻢ ﺑﺎﻟﺜﺎﺑﺖ ﺧﻼﻝ ﻋﻤﻠﻴﺔ ﺍﻟﺘﺠﻤﻴﻊ‪ ،‬ﻛﻤﺎ ﰲ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ‪:‬‬
‫‪Maxint‬‬ ‫‪EQU‬‬ ‫; ‪32767‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪MOV‬‬ ‫‪BX, maxint‬‬ ‫;‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪MOV‬‬ ‫‪DI, maxint‬‬ ‫;‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫ﻳﺘﻢ ﺗﻌﻴﲔ ﺍﻟﻘﻴﻤﺔ ‪ 32767‬ﰲ ﻛﻞ ﻣﻦ ﺍﳌﺴﺠﻠﲔ ‪ BX‬ﻭ‪ .DI‬ﻋﻨﺪ ﺗﻐﻴﲑ ﺍﻟﻘﻴﻤﺔ ﰲ ‪ Maxint‬ﻓﺈﻥ ﺍﳌﱪﻣﺞ‬
‫ﲝﺎﺟﺔ ﻓﻘﻂ ﻟﺘﻐﻴﲑﻫﺎ ﰲ ﻣﻜﺎﻥ ﻭﺍﺣﺪ ﻓﻘﻂ ﻭﺫﻟﻚ ﰲ ﻋﺒﺎﺭﺓ ‪.EQU‬‬
‫ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺍﳌﻌﻄﻴﺎﺕ ﺍﻟﻔﻮﺭﻳﺔ ﻗﻴﻤﺔ ﺻﺤﻴﺤﺔ ﺃﻭ ﳏﺮﻑ ﺁﺳﻜﻲ‪ ،‬ﺣﻴﺚ ﻳﺘﻢ ﻭﺿﻊ ﺍﶈﺮﻑ ﺿﻤﻦ‬
‫ﻋﻼﻣﱵ ﺍﻗﺘﺒﺎﺱ ﻣﻔﺮﺩﺗﲔ ﻛﻤﺎ ﻫﻮ ﻣﺒﲔ‪:‬‬
‫'‪MOV AX, 'a‬‬

‫اﻟﻌﻨﻮﻧﺔ اﻟﻤﺴﺠﻠﻴﺔ ﻏﻴﺮ اﻟﻤﺒﺎﺷﺮة‬ ‫‪4.3‬‬


‫ﺗﺴﺘﺨﺪﻡ ﳏﺘﻮﻳﺎﺕ ﺍﳌﺴﺠﻼﺕ )‪ BX‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ( ﻛﻤﻌﻄﻴﺎﺕ ﺃﻭ ﻛﻌﻨﻮﺍﻥ )ﻣﺸﲑ ﹰﺓ ﺇﱃ ﻣﻮﻗﻊ ﰲ‬
‫ﺍﻟﺬﺍﻛﺮﺓ ‪ (RAM‬ﻟﺒﻌﺾ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﻮﺟﻮﺩﺓ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪ .‬ﻳﺴﻤﻰ ﺍﻟﺸﻜﻞ ﺍﻷﻭﻝ ﺑﺎﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ‬
‫ﺍﳌﺒﺎﺷﺮﺓ ﻭﻳﺴﻤﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺜﺎﱐ ﺑﺎﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‪ .‬ﺍﻧﻈﺮ ﺇﱃ ﺍﳌﺜﺎﻝ ﺍﳌﺒﲔ ﰲ ﺍﻟﺸﻜﻞ )‪،(4-1‬‬
‫ﺇﻥ ﺍﳌﻮﺍﻗﻊ ﺍﻟﺬﺍﻛﺮﻳﺔ ﻣﻦ ‪ 200‬ﻭﺣﱴ ‪ 207‬ﲢﺘﻮﻱ ﻋﻠﻰ ﺳﻠﺴﻠﺔ ﻣﻦ ﲦﺎﻥ ﺃﺣﺮﻑ ﻭﻫﻲ ‪.GOOD-DAY‬‬
‫ﺳﻮﻑ ﻧﻨﻔﺬ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫; ‪MOV BX, 200‬‬ ‫‪ 200‬ﻫﻲ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ‬
‫; ‪ADD BX, 6‬‬ ‫ﳛﺘﻮﻱ ‪ BX‬ﺍﻵﻥ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ‪206‬‬
‫; ]‪MOV DL, [BX‬‬ ‫] [ ﻳﺴﺘﺨﺪﻣﺎﻥ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‬

‫‪G‬‬ ‫‪O‬‬ ‫‪O‬‬ ‫‪D‬‬ ‫‪-‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪Y‬‬

‫‪Address:‬‬ ‫‪200‬‬ ‫‪201‬‬ ‫‪202‬‬ ‫‪203‬‬ ‫‪204‬‬ ‫‪205‬‬ ‫‪206‬‬ ‫‪207‬‬

‫اﻟﺸﻜﻞ )‪ :(4-1‬ﻣﺤﺘﻮﻳﺎت اﻟﺬاآﺮة ‪RAM‬‬


‫‪73‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺜﻼﺙ ﺍﻟﺴﺎﺑﻘﺔ ﺳﻴﺤﺘﻮﻱ ﺍﳌﺴﺠﻞ ‪ DL‬ﻋﻠﻰ ﳏﺘﻮﻳﺎﺕ ﺍﳌﻮﻗﻊ ﺍﻟﺬﺍﻛﺮﻱ ﺫﻱ‬
‫ﺍﻟﻌﻨﻮﺍﻥ ‪ 206‬ﻭﺍﳊﺎﻭﻱ ﻋﻠﻰ ﺍﳊﺮﻑ ‪ ،A‬ﺇﻥ ﺍﻷﻗﻮﺍﺱ ﺍﳌﺮﺑﻌﺔ ] [ ﺍﶈﻴﻄﺔ ﺑﺎﻟﺮﻣﺰ ‪ BX‬ﺗﺴﺘﺨﺪﻡ ﻹﻋﻼﻡ‬
‫ﺍ‪‬ﻤ‪‬ﻊ ﺑﺄﻥ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻫﻲ ﻋﻨﻮﻧﺔ ﻣﺴﺠﻴﻠﺔ ﻏﲑ ﻣﺒﺎﺷﺮﺓ‪ .‬ﻓﺈﺫﺍ ﰎ ﻛﺘﺎﺑﺔ ‪ MOV DL, BX‬ﺑﺪ ﹰﻻ‬
‫ﻣﻦ ]‪ MOV DL, [BX‬ﻓﺈﻧﻪ ﺳﻴﺘﻢ ﲣﺰﻳﻦ ﺍﻟﺮﻗﻢ ‪ 206‬ﰲ ﺍﳌﺴﺠﻞ ‪ .DL‬ﺇﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ MOV DL, BX‬ﻏﲑ‬
‫ﺻﺤﻴﺤﺔ ﻗﻮﺍﻋﺪﻳﹰﺎ ﺣﻴﺚ ﺃﻥ ‪ BX‬ﻣﺴﺠﻞ ﺑﻄﻮﻝ ‪ 16‬ﺑﺘﹰﺎ ﻭ‪ DL‬ﻣﺴﺠﻞ ﺑﻄﻮﻝ ‪ 8‬ﺑﺘﺎﺕ‪.‬‬
‫ﻳﺘﻜﻮﻥ ﺍﳌﺴﺠﻞ ‪ BX‬ﰲ ﺍﻟﻌﺎﺋﻠﺔ ‪ 80×86‬ﻣﻦ ‪ 16‬ﺑﺘﹰﺎ ﻭﺑﺈﻣﻜﺎﻧﻪ ﻋﻨﻮﻧﺔ ‪ (64K) 2‬ﻣﻮﻗﻌﹰﺎ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.RAM‬‬
‫‪16‬‬

‫ﻭﺍﻋﺘﻤﺎﺩﹰﺍ ﻋﻠﻰ ﺍﻟﻮﺟﻬﺔ ﻟﺘﻌﻠﻴﻤﺔ ‪) MOV‬ﻭﺍﻟﱵ ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ‪ 8‬ﺑﺘﺎﺕ ﺃﻭ ‪ 16‬ﺑﺘﹰﺎ ﺃﻭ ‪ 32‬ﺑﺘﹰﺎ ﰲ‬
‫ﺍﳌﻌﺎﳉﺎﺕ ﺑﻴﻨﺘﻴﻮﻡ( ﻓﺈﻧﻪ ﺑﺎﻹﻣﻜﺎﻥ ﺍﺳﺘﺨﺪﺍﻡ ﻣﻌﻄﻴﺎﺕ ﺑﻄﻮﻝ ﺃﻛﱪ ﻣﻦ ‪ 8‬ﺑﺘﺎﺕ‪ .‬ﻭﻫﻜﺬﺍ ﻓﺈﻥ ﺣﺠﻢ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﻭﳎﺎﻝ ﺍﻟﻌﻨﻮﻧﺔ ﳝﻜﻦ ﺯﻳﺎﺩ‪‬ﻤﺎ ﻣﻦ ﺧﻼﻝ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‪ .‬ﺧﻼﻝ‬
‫ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ ]‪ ،MOV DL, [BX‬ﻳﺘﻢ ﺍﻟﺪﺧﻮﻝ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ﳉﻠﺐ ﺍﳌﻌﺎﻣﻞ ﺍﻟﺬﻱ ﺳﻴﺘﻢ ﻧﻘﻠﻪ ﻭﺑﺎﻟﺘﺎﱄ‬
‫ﺳﺘﻜﻮﻥ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺃﺑﻄﺄ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﻣﺴﺠﻠﲔ ﻭﻋﻨﻮﻧﺔ ﻓﻮﺭﻳﺔ‪.‬‬
‫ﺇﻥ ﺍﻟﻌﻨﻮﻧﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ ﻏﲑ ﻣﻘﻴﺪﺓ ﰲ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺴﺠﻼﺕ ﻓﻘﻂ‪ ،‬ﺇﺫ ﻳﻮﺟﺪ ﺃﻳﻀﹰﺎ ﻋﻨﻮﻧﺔ ﻏﲑ ﻣﺒﺎﺷﺮﺓ‬
‫ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺍﻟﺬﺍﻛﺮﺓ‪ ،‬ﻭﰲ ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﻳﺘﻢ ﺍﻟﺮﺟﻮﻉ ﺇﱃ ﺍﳌﻮﻗﻊ ﺍﻟﺬﺍﻛﺮﻱ ﺍﻟﺬﻱ ﺳﻴﺤﺘﻮﻱ ﻋﻠﻰ ﻋﻨﻮﺍﻥ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﻭﻟﻴﺲ ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﻄﻠﻮﺑﺔ‪ .‬ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﻨﻮﻉ ﻣﻦ ﺍﻟﻌﻨﻮﻧﺔ ﺳﻴﺰﺩﺍﺩ ﺯﻣﻦ ﺍﻟﺘﻨﻔﻴﺬ ﻷﻧﻪ‬
‫ﻣﻦ ﺍﻟﻮﺍﺟﺐ ﺍﻟﺪﺧﻮﻝ ﻟﻠﺬﺍﻛﺮﺓ ‪ RAM‬ﻣﺮﺗﲔ‪ ،‬ﻣﺮﺓ ﳉﻠﺐ ﻋﻨﻮﺍﻥ ﺍﳌﻌﺎﻣﻞ ﻭﺍﳌﺮﺓ ﺍﻷﺧﺮﻯ ﳉﻠﺐ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﻣﻦ ﻫﺬﺍ ﺍﻟﻌﻨﻮﺍﻥ‪.‬‬
‫ﺳﻨﻮﺿﺢ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ ﻣﻦ ﺧﻼﻝ ﺍﳌﺜﺎﻝ ﺍﳌﺒﲔ ﰲ ﺍﻟﺸﻜﻞ )‪ (4-2‬ﻭﺍﻟﺬﻱ ﻳﺒﲔ‬
‫ﻭﺿﻌﻴﺔ ﺍﻟﺬﺍﻛﺮﺓ ﺧﻼﻝ ﺛﻼﺙ ﻓﺘﺮﺍﺕ ﺯﻣﻨﻴﺔ ﻣﺘﻼﺣﻘﺔ ‪ .t ،t ،t‬ﻻﺣﻆ ﺑﺄﻥ ﺍﻟﱪﻧﺎﻣﺞ )‪ +‬ﺍﳌﻌﻄﻴﺎﺕ(‬
‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬

‫‪ P‬ﺃﻋﻴﺪ ﺗﻮﺿﻴﻌﻬﺎ ﺩﻳﻨﺎﻣﻴﻜﻴﹰﺎ ﺑﺪﺀﹰﺍ ﻣﻦ ﺍﻟﻌﻨﺎﻭﻳﻦ ‪ 1500 ،9000 ،1000‬ﻋﻠﻰ ﺍﻟﺘﺘﺎﱄ ﻭﻫﺬﺍ ﳝﻜﻦ ﺃﻥ‬
‫ﳛﺪﺙ ﻛﻨﺘﻴﺠﺔ ﻟﻠﻌﺪﻳﺪ ﻣﻦ ﺍﻷﺳﺒﺎﺏ‪ .‬ﻋﻨﺪ ﺇﻋﺎﺩﺓ ﲢﻤﻴﻞ ‪ P‬ﻓﺈﻥ ﻋﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﺓ ﺳﻮﻑ ﳛﻔﻆ‬
‫ﺍﻟﺘﻐﻴﲑﺍﺕ‪ .‬ﻭﰲ ﺍﻟﺸﻜﻞ ﺍﻟﺴﺎﺑﻖ ﰎ ﺍﺧﺘﻴﺎﺭ ﺍﻟﻌﻨﻮﺍﻥ ‪ 2000‬ﲝﻴﺚ ﺃﻥ ﻋﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﺓ ﺍﳌﺘﻐﲑ ﺩﻳﻨﺎﻣﻴﻜﻴﹰﺎ‬
‫ﳝﻜﻦ ﲢﻤﻴﻠﻪ ﻣﻦ ﻗﺒﻞ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ‪ .‬ﻳﺴﺘﻄﻴﻊ ﺍﳌﱪﻣﺞ ﻣﻦ ﺧﻼﻝ ﺍﻟﻌﻨﻮﻧﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ ﲢﻤﻴﻞ ﻋﻨﻮﺍﻥ‬
‫ﺍﻟﻘﺎﻋﺪﺓ ﺍﳊﺎﱄ ﰲ ﺍﳌﺴﺠﻞ ‪ BX‬ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻌﻠﻴﻤﺔ ]‪ .MOV BX, [2000‬ﻻﺣﻆ ﺑﺄﻧﻪ ﻻ ﺗﻮﺟﺪ‬
‫ﻣﺸﻜﻠﺔ ﻋﻨﺪ ﻣﻜﺎﻥ ﻭﺟﻮﺩ ‪ P‬ﺣﻴﺚ ﺃﻧﻪ ﺳﻴﺘﻢ ﲢﻤﻴﻞ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﰲ ﺍﳌﺴﺠﻞ ‪ BX‬ﻣﻦ ﺧﻼﻝ‬
‫ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻭﻳﻜﻮﻥ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﻗﺎﺩﺭﹰﺍ ﻋﻠﻰ ﺍﺳﺘﺒﺪﺍﻝ ﺍﻟﻌﻨﻮﺍﻥ ‪ 2000‬ﺑﺎﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﺍﳊﺎﱄ‪.‬‬
‫ﺇﻥ ﻋﻤﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺍﻟﺘﻮﺿﻴﻊ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻴﺔ ﻟﻠﱪﻧﺎﻣﺞ ‪ P‬ﻻ ﺗﻐﲑ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ ،MOV‬ﻭﳍﺬﺍ ﺍﻟﺴﺒﺐ ﺣﺎﳌﺎ ﻳﺘﻢ‬
‫ﲡﻤﻴﻊ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺬﻱ ﳛﺘﻮﻱ ﻋﻠﻰ ﻫﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻓﺈﻧﻪ ﻣﻦ ﻏﲑ ﺍﳌﻄﻠﻮﺏ ﺇﻋﺎﺩﺓ ﲡﻤﻴﻌﻪ‪ .‬ﻟﻘﺪ ﰎ ﰲ ﻫﺬﺍ‬
‫ﺍﳌﺜﺎﻝ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺬﺍﻛﺮﻳﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‪ .‬ﺳﻴﻜﻮﻥ ﻣﻦ ﺍﳌﺴﺘﺤﺴﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ‬
‫ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ ﻭﺫﻟﻚ ﻋﻨﺪ ﺗﻮﻓﺮ ﻋﺪﺩ ﻛﺎﻑ ﻣﻦ ﺍﳌﺴﺠﻼﺕ ﰲ ﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ‪.‬‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪74‬‬

‫اﻟﺸﻜﻞ )‪ :(4-2‬اﺳﺘﺨﺪام اﻟﻌﻨﻮﻧﺔ ﻏﻴﺮ اﻟﻤﺒﺎﺷﺮة‪.‬‬

‫اﻟﻌﻨﻮﻧﺔ اﻟﻨﺴﺒﻴﺔ‬ ‫‪4.4‬‬


‫ﻻﺣﻆ ﺍﳌﺴﺄﻟﺔ ﺍﻟﺘﺎﻟﻴﺔ‪ :‬ﺍﻗﺮﺃ ﳏﺮﻓﲔ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ )ﳏﺮﻑ ﰲ ﻛﻞ ﻣﺮﺓ( ﰒ ﻗﺎﺭ‪‬ﻤﺎ‪ ،‬ﻓﺈﺫﺍ ﻛﺎﻧﺎ‬
‫ﻣﺘﺴﺎﻭﻳﲔ ﺃﻛﺘﺐ ‪ Equal‬ﻭﺇﻻ ﺃﻛﺘﺐ ‪ NOT Equal‬ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ‪ ،‬ﻛﺮﺭ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﺛﻼﺙ ﻣﺮﺍﺕ‪.‬‬
‫ﺇﻥ ﺑﺮﻧﺎﻣﺞ ﺍﻟﺘﺠﻤﻴﻊ ﺍﻟﺬﻱ ﻳﻨﺠﺰ ﻫﺬﻩ ﺍﻟﻮﻇﻴﻔﺔ ﻣﺒﲔ ﰲ ﺍﻟﺸﻜﻞ )‪ .(3-1‬ﰎ ﺗﻐﻴﲑ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ ﺑﺸﻜﻞ‬
‫ﺑﺴﻴﻂ ﻟﻴﺒﺪﻭ ﻛﻤﺎ ﰲ ﺍﻟﺸﻜﻞ )‪ .(4-3‬ﻳﺘﻢ ﲣﺰﻳﻦ ﺃﻭﻝ ﺑﺎﻳﺖ ﻣﻘﺮﻭﺀ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪ RAM‬ﰲ ﺍﳌﻮﻗﻊ‬
‫ﺍﳌﺴﻤﻰ ‪ ،temp‬ﻭﳜﺰﻥ ﺍﻟﺒﺎﻳﺖ ﺍﻟﺜﺎﱐ ﰲ ﺍﳌﺴﺠﻞ ‪ ،AL‬ﺣﻴﺚ ﺗﺘﺮﻙ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ INT 21h‬ﺍﻟﺒﺎﻳﺖ‬
‫ﺍﳌﻘﺮﻭﺀ ﻣﻦ ﻟﻮﺣﺔ ﺍﳌﻔﺎﺗﻴﺢ‪ .‬ﺍﳋﻄﻮﺓ ﺍﻟﺜﺎﻧﻴﺔ ﰲ ﺍﻟﱪﻧﺎﻣﺞ ﻫﻲ ﻣﻘﺎﺭﻧﺔ ﻫﺬﻳﻦ ﺍﻟﺒﺎﻳﺘﲔ ﻭﻋﺮﺽ ﺇﻣﺎ ﻛﻠﻤﺔ‬
‫‪ Equal‬ﺃﻭ ﻛﻠﻤﺔ ‪ Not Equal‬ﻓﺈﺫﺍ ﻛﺎﻥ ﺍﻟﺒﺎﻳﺘﺎﻥ ﻣﺘﺴﺎﻭﻳﲔ ﻓﺈﻧﻪ ﺳﻴﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻷﺳﻄﺮ ‪15 ،14 ،13 ،8 ،7‬‬
‫ﻭﺇﺫﺍ ﱂ ﻳﻜﻮﻧﺎ ﻣﺘﺴﺎﻭﻳﲔ ﻓﺴﻴﺘﻢ ﺗﻨﻔﻴﺬ ﺍﻷﺳﻄﺮ ‪ .12 ،11 ،10 ،9 ،8 ،7‬ﺗﺘﻜﺮﺭ ﻫﺬﻩ ﺍﻟﻌﻤﻠﻴﺔ ﺛﻼﺙ‬
‫ﻣﺮﺍﺕ ﻣﻦ ﺧﻼﻝ ﺗﻌﻠﻴﻤﺔ ‪ .Loop‬ﰲ ﺍﻟﺴﻄﺮ ‪ 8‬ﺗﻮﺟﺪ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ JE Equal‬ﻭﰲ ﺍﻟﺴﻄﺮ ‪ 12‬ﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫‪ ،JMP Next‬ﻭﻛﻠﺘﺎ ﻫﺎﺗﲔ ﺍﻟﺘﻌﻠﻴﻤﺘﲔ ﺗﺴﺘﺨﺪﻣﺎﻥ ﻻﻓﺘﺎﺕ ﻋﻨﻮﻧﺔ ﻣﻦ ﺃﺟﻞ ﺍﻟﺘﻔﺮﻳﻊ‪.‬‬
‫ﺳﻮﻑ ﻧﺴﺘﺨﺪﻡ ﺍﳌﺼﻄﻠﺢ "ﻋﻨﻮﺍﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﻟﺬﺍﰐ" ﻣﻦ ﺃﺟﻞ ﻣﻮﺿﻊ ﺍﻟﺘﻌﻠﻴﻤﺔ ﻭﻧﺸﲑ ﺇﻟﻴﻪ ﺑﺎﻟﺮﻣﺰ *‪.‬‬
‫ﻧﻼﺣﻆ ﰲ ﺗﻌﻠﻴﻤﺎﺕ ﺍﻟﻘﻔﺰ ﺍﻟﺴﺎﺑﻘﺔ ﺃﻥ ﻻﻓﺘﺎﺕ ﺍﻟﻌﻨﺎﻭﻳﻦ ﺍﻟﻔﺮﻋﻴﺔ ﻗﺮﻳﺒﺔ ﻣﻦ ﺗﻌﻠﻴﻤﺎﺕ ﺍﻟﻘﻔﺰ ﻧﻔﺴﻬﺎ‪.‬‬
‫‪75‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﺮﻣﺰ * ﻫﻮ ﻋﻨﻮﺍﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪) JE Equal‬ﺍﻟﺴﻄﺮ ‪ (8‬ﻓﺈﻥ ‪ +10) *+10‬ﺇﺫﺍ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻥ ﻛﻞ ﻣﻦ‬
‫ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﳋﻤﺲ ﺍﻟﺘﺎﻟﻴﺔ ﺑﻄﻮﻝ ‪ 2‬ﺑﺎﻳﺖ( ﺳﻴﻌﻄﻲ ﻋﻨﻮﺍﻥ ﺍﻟﻼﻓﺘﺔ ‪ Equal‬ﰲ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ .13‬ﺇﻥ‬
‫ﺍﻟﻘﻴﻤﺔ ﺍﻟﺮﻗﻤﻴﺔ ﻟﻠﺮﻣﺰ * ﻫﻲ ﻧﻔﺴﻬﺎ ﳏﺘﻮﻳﺎﺕ ﻋﺪﺍﺩ ﺍﻟﱪﻧﺎﻣﺞ ‪ PC‬ﻋﻨﺪ ﺍﻟﻮﺻﻮﻝ ﳍﺬﻩ ﺍﻟﺘﻌﻠﻴﻤﺔ‪.‬‬
‫ﻭﺑﺸﻜﻞ ﻣﺸﺎﺑﻪ ﻟﻜﻲ ﳓﺼﻞ ﻋﻠﻰ ﻋﻨﻮﺍﻥ ﺍﻟﻼﻓﺘﺔ ‪) next‬ﰲ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ (16‬ﻣﻦ ﺗﻌﻠﻴﻤﺔ ‪JMP Next‬‬
‫)ﰲ ﺍﻟﺴﻄﺮ ‪ (12‬ﻓﻨﺤﻦ ﲝﺎﺟﺔ ﺇﱃ ‪ *+8‬ﻭﺫﻟﻚ ﺑﻔﺮﺽ ﺃﻥ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻷﺭﺑﻊ ﺍﻟﺘﺎﻟﻴﺔ ﺍﻟﱵ ﺗﺘﺒﻊ ﺍﻟﺴﻄﺮ ‪12‬‬
‫ﺑﻄﻮﻝ ‪ 2‬ﺑﺎﻳﺖ‪ .‬ﻫﻨﺎﻙ ﺗﻌﻠﻴﻤﺎﺕ ﳏﺪﺩﺓ ﰲ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ ﻟﻠﻤﻌﺎﳉﺎﺕ ‪ 80×86‬ﻭﻫﻲ ﻟﻴﺴﺖ ﺑﻄﻮﻝ ‪2‬‬
‫ﺑﺎﻳﺖ‪ .‬ﺳﻮﻑ ﻳﺴﺘﺨﺪﻡ ﺍ‪‬ﻤﻊ ﺍﻟﻄﻮﻝ ﺍﻟﺼﺤﻴﺢ ﻟﻜﻞ ﺗﻌﻠﻴﻤﺔ ﻭﺫﻟﻚ ﳊﺴﺎﺏ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ‪ .‬ﳝﻜﻦ‬
‫ﻟﻠﻌﻨﻮﻧﺔ ﺍﻟﻨﺴﺒﻴﺔ ﺃﻥ ﺗﻜﻮﻥ ﺗﻔﺮﻳﻌﹰﺎ ﻟﻸﻣﺎﻡ )‪ + (positive‬ﻭﻗﺪ ﺗﻜﻮﻥ ﺗﻔﺮﻳﻌﹰﺎ ﻟﻠﺨﻠﻒ )‪ .- (negative‬ﺇﻥ‬
‫ﻻﻓﺘﺔ ﺍﻟﻌﻨﻮﻧﺔ ‪ firstchar‬ﺍﳌﺸﺎﺭ ﺇﻟﻴﻬﺎ ﰲ ﺗﻌﻠﻴﻤﺔ ‪ loop‬ﰲ ﺍﻟﺴﻄﺮ ‪ 16‬ﺗﻮﺟﺪ ﰲ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ 2‬ﻭﰲ‬
‫ﻫﺬﻩ ﺍﳊﺎﻟﺔ ﺳﻴﻜﻮﻥ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ ‪ .-28‬ﻭﻫﻜﺬﺍ ﻓﺈﻥ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻨﺴﺒﻴﺔ ﺍﻟﻼﺯﻣﺔ ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﻫﺬﻩ‬
‫ﺍﻟﻼﻓﺘﺔ ﻻﺑﺪ ﺃﻥ ﺗﻜﻮﻥ ﻋﺪﺩﹰﺍ ﺻﺤﻴﺤﹰﺎ ﳝﻜﻦ ﺃﻥ ﻳﺄﺧﺬ ﻗﻴﻤﺔ ﻣﻮﺟﺒﺔ ﺃﻭ ﺳﺎﻟﺒﺔ‪ ،‬ﻭﻫﺬﺍ ﺍﻟﺜﺎﺑﺖ ﳜﺰﻥ‬
‫ﻛﺠﺰﺀ ﻣﻦ ﺗﻌﻠﻴﻤﺔ ﺍﻟﺘﻔﺮﻳﻊ‪.‬‬
‫ﻳﺴﺘﺨﺪﻡ ﰲ ﻋﺎﺋﻠﺔ ﺍﳌﻌﺎﳉﺎﺕ ‪ 80×86‬ﲦﺎﻧﻴﺔ ﺑﺘﺎﺕ ﻟﺘﺨﺰﻳﻦ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ‪ ،‬ﻓﻌﻨﺪ ﻣﻌﺎﻣﻠﺘﻬﺎ ﻋﻠﻰ ﺃ‪‬ﺎ‬
‫ﻻ ﻣﻦ ‪-128‬‬ ‫ﻋﺪﺩ ﺑﺈﺷﺎﺭﺓ ﻣﻦ ﺧﻼﻝ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺘﻤﻢ ﺍﻟﺜﻨﺎﺋﻲ ﻓﺈﻥ ﻫﺬﻩ ﺍﻟﺒﺘﺎﺕ ﺍﻟﺜﻤﺎﻥ ﺳﺘﻀﻢ ﳎﺎ ﹰ‬
‫ﻭ‪ .+127‬ﻭﻧﺆﻛﺪ ﻫﻨﺎ ﺃﻥ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺮﻗﻤﻴﺔ ﻟﻠﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ ﻻ ﲢﺴﺐ ﻣﻦ ﻗﺒﻞ ﺍﳌﱪﻣﺞ ﻭﺇﳕﺎ ﻣﻦ ﻗﺒﻞ‬
‫ﺑﺮﻧﺎﻣﺞ ﺍ‪‬ﻤ‪‬ﻊ ﺣﻴﺚ ﻳﻨﺒﻐﻲ ﻋﻠﻰ ﺍﳌﱪﻣﺞ ﺃﻥ ﻳﺸﲑ ﻓﻘﻂ ﺇﱃ ﻣﺪﻯ ﺑﻌﺪ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﱵ ﺳﻴﺘﻢ ﺍﻟﻘﻔﺰ ﺇﻟﻴﻬﺎ‬
‫ﻋﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﳊﺎﻟﻴﺔ‪ .‬ﻓﻌﻨﺪﻣﺎ ﺗﻘﻊ ﺍﻟﻌﻨﺎﻭﻳﻦ ﺍﻟﻔﺮﻋﻴﺔ ﺿﻤﻦ ﺍ‪‬ﺎﻝ )‪ (PC-value-128‬ﺇﱃ )‪(PC-value+127‬‬
‫ﻓﺈ‪‬ﺎ ﺗﺴﻤﻰ ﻻﻓﺘﺔ ﻗﺼﲑﺓ ‪ ،SHORT‬ﻭﺍﻟﺘﻘﻠﻴﺪ ﺍﳌﺴﺘﺨﺪﻡ ﻣﻦ ﻗﺒﻞ ﳎﻤﻌﺎﺕ ﺷﺮﻛﺔ ﻣﺎﻳﻜﺮﻭﺳﻮﻓﺖ‬
‫ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ ﻫﺬﺍ ﺍﻟﺘﻔﺮﻳﻎ ﻳﺄﺧﺬ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄ‪:‬‬
‫;‪JMP SHORT label‬‬

‫ﻋﻨﺪﻣﺎ ﻻ ﺗﺬﻛﺮ ‪ SHORT‬ﻓﺈﻧﻪ ﻳﺘﻢ ﺍﻋﺘﺒﺎﺭ ﺍﻟﻼﻓﺘﺔ ‪ label‬ﻗﺼﲑﺓ‪ .‬ﺃﻣﺎ ﺍﻟﺼﻔﺎﺕ ﺍﻷﺧﺮﻯ ﺍﳌﻤﻜﻨﺔ‬
‫ﻟﻼﻓﺘﺔ ﻫﻲ ‪ NEAR PTR‬ﻭ‪ FAR PTR‬ﻭﺍﻟﱵ ﺳﺘﺘﻢ ﻣﻨﺎﻗﺸﺘﻬﺎ ﻻﺣﻘﹰﺎ ﰲ ﻫﺬﺍ ﺍﻟﻜﺘﺎﺏ‪.‬‬
‫‪.data‬‬
‫‪temp‬‬ ‫‪DB‬‬ ‫' '‬
‫‪eql‬‬ ‫‪DB‬‬ ‫'‪'Equal', '$‬‬ ‫;‬
‫‪noteql‬‬ ‫‪DB‬‬ ‫'‪'Not-Equal', '$‬‬ ‫;‬
‫‪.code‬‬
‫‪1‬‬ ‫‪MOV‬‬ ‫‪CX 3h‬‬ ‫;‬ ‫‪To DO 3 times‬‬
‫‪2‬‬ ‫‪firstchar:‬‬ ‫‪MOV‬‬ ‫‪AH, 01h‬‬ ‫;‬ ‫‪code for Read‬‬
‫‪3‬‬ ‫‪INT‬‬ ‫‪21h‬‬ ‫;‬ ‫‪First Byte‬‬
‫‪4‬‬ ‫‪MOV‬‬ ‫‪temp, AL‬‬ ‫;‬ ‫‪save in temp‬‬
‫‪5‬‬ ‫‪MOV‬‬ ‫‪AH,‬‬ ‫‪01h‬‬ ‫;‬
‫‪6‬‬ ‫‪INT‬‬ ‫‪21h‬‬ ‫;‬ ‫‪For second byte‬‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪76‬‬

‫‪7‬‬ ‫‪CMP AL, temp‬‬ ‫;‬


‫‪8‬‬ ‫‪JE equal‬‬
‫‪9‬‬ ‫‪MOV AH, 9h‬‬ ‫‪; code for output‬‬
‫‪10‬‬ ‫; ‪MOV DX, offset noteql‬‬
‫‪11‬‬ ‫‪INT 21h‬‬ ‫;‬
‫‪12‬‬ ‫‪JMP next‬‬
‫‪13‬‬ ‫‪equal:‬‬ ‫‪MOV AH, 9h‬‬ ‫;‬
‫‪14‬‬ ‫;‪MOV DX, offset eql‬‬
‫‪15‬‬ ‫‪INT 21h‬‬
‫‪16‬‬ ‫‪next:‬‬ ‫‪LOOP firstchar‬‬ ‫‪; next iteration‬‬
‫‪17‬‬ ‫‪INT 20h‬‬ ‫‪; end program execution‬‬

‫اﻟﺸﻜﻞ )‪ :(4-3‬ﺑﺮﻧﺎﻣﺞ ﻟﻤﻘﺎرﻧﺔ ﻣﺤﺮﻓﻴﻦ‬

‫اﻟﻌﻨﻮﻧﺔ اﻟﻤﻮﺟﻬﺔ ﺑﺎﻹزاﺣﺔ‬ ‫‪4.5‬‬


‫ﺗﻨﺘﻤﻲ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ )‪ (indexed addressing‬ﻭﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ )‪ (base addressing‬ﺇﱃ ﻫﺬﺍ‬
‫ﺍﻟﻨﻤﻂ ﻣﻦ ﺍﻟﻌﻨﻮﻧﺔ‪ ،‬ﺣﻴﺚ ﻳﻮﺟﺪ ﻋﻨﻮﺍﻥ ﻣﺮﺟﻌﻲ ﻭﻫﻮ ﻣﺎ ﻳﺴﻤﻰ ﺑﺎﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ )‪.(Base address‬‬
‫ﺗﺴﻤﻰ ﺍﳌﺴﺎﻓﺔ ﻣﺎ ﺑﲔ ﻫﺬﺍ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﻭﺍﻟﻌﻨﻮﺍﻥ ﺍﳌﻄﻠﻮﺏ ﺍﻟﻮﺻﻮﻝ ﺇﻟﻴﻪ ﺑﺎﻹﺯﺍﺣﺔ‬
‫)‪ .(displacment‬ﺗﻀﺎﻑ ﻫﺬﻩ ﺍﻹﺯﺍﺣﺔ ﺇﱃ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﻣﺎ ﻳﺴﻤﻰ "ﺑﺎﻟﻌﻨﻮﺍﻥ‬
‫ﺍﻟﻔﻌﺎﻝ" ‪ ،(effective address) EA‬ﺣﻴﺚ ﻳﺸﲑ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ﺇﱃ ﻣﻮﻗﻊ ﲣﺰﻳﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺃﻭ‬
‫ﺍﳌﻌﻄﻴﺎﺕ ﺍﳌﻄﻠﻮﺑﺔ‪.‬‬
‫ﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ ﻭﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﺗﺴﺘﺨﺪﻣﺎﻥ ﻧﻔﺲ ﺍﻟﻘﺎﻋﺪﺓ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ‬
‫ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ‪ EA‬ﺇﻻ ﺃ‪‬ﻤﺎ ﺗﺴﺘﺨﺪﻣﺎﻥ ﻷﻏﺮﺍﺽ ﺑﺮﳎﻴﺔ ﳐﺘﻠﻔﺔ ﻛﻠﻴﹰﺎ‪ .‬ﻳﻮﺟﺪ ﰲ ﻋﺎﺋﻠﺔ ﺍﳌﻌﺎﳉﺎﺕ ‪80×86‬‬
‫ﻧﻮﻋﲔ ﻣﻦ ﺍﳌﺴﺠﻼﺕ ﳘﺎ ﻣﺴﺠﻼﺕ ﺍﻟﻘﺎﻋﺪﺓ ‪ (base registers) BX‬ﻭﻣﺴﺠﻼﺕ ﺍﻟﺪﻟﻴﻞ ‪DI, SI‬‬
‫)‪ .(index register‬ﻳﺴﺘﺨﺪﻡ ﻣﺴﺠﻞ ﺍﻟﺪﻟﻴﻞ ﳌﻌﺎﳉﺔ ﻣﺼﻔﻮﻓﺎﺕ ﺍﻷﺭﻗﺎﻡ ﻭﻣﺼﻔﻮﻓﺎﺕ ﺍﶈﺎﺭﻑ‪ ،‬ﺇﺫ‬
‫ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﻫﺬﻩ ﺍﳌﺼﻔﻮﻓﺎﺕ ﺑﺒﻌﺪ ﻭﺣﻴﺪ )ﺷﻌﺎﻉ( ﻭﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺑﺒﻌﺪﻳﻦ )ﻣﺼﻔﻮﻓﺔ(‪ .‬ﻋﻨﺪ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ )ﺍﻟﻔﻬﺮﺳﺔ( ﻓﺈﻥ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﺳﻴﻜﻮﻥ ﻋﻨﻮﺍﻥ ﺃﻭﻝ ﻋﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ‬
‫ﻭﺳﻴﺘﻢ ﻭﺿﻊ ﺍﻹﺯﺍﺣﺔ ﰲ ﻣﺴﺠﻞ ﺍﻟﺪﻟﻴﻞ‪ ،‬ﻭﻣﻦ ﺧﻼﻝ ﺯﻳﺎﺩﺓ ﳏﺘﻮﻳﺎﺕ ﻣﺴﺠﻞ ﺍﻟﺪﻟﻴﻞ ﳝﻜﻦ ﺗﻐﻴﲑ‬
‫ﻗﻴﻤﺔ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ‪ EA‬ﻟﻌﻨﻮﻧﺔ ﻛﻞ ﻋﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ‪ .‬ﺗﻔﻴﺪ ﻛﻞ ﻣﻦ ﺗﻌﻠﻴﻤﺔ ‪) INC‬ﺯﻳﺎﺩﺓ ﳏﺘﻮﻯ‬
‫ﻣﺴﺠﻞ( ﻭﺗﻌﻠﻴﻤﺔ ‪ Loop‬ﰲ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﺼﻔﻮﻓﺎﺕ‪.‬‬
‫ﻣﻦ ﺟﻬﺔ ﺃﺧﺮﻯ‪ ،‬ﺗﻔﻴﺪ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﰲ ﻋﻤﻠﻴﺔ ﺇﻋﺎﺩﺓ ﺗﻮﺿﻴﻊ ﺍﻟﱪﺍﻣﺞ ﺃﻭ ﺍﳌﻌﻄﻴﺎﺕ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪،‬‬
‫ﺣﻴﺚ ﺭﺃﻳﻨﺎ ﰲ ﺍﻟﻔﺼﻞ ﺍﻟﺜﺎﻟﺚ ﺍﳊﺎﺟﺔ ﻹﻋﺎﺩﺓ ﺗﻮﺿﻴﻊ ﺍﻟﱪﺍﻣﺞ ﰲ ﺃﻧﻈﻤﺔ ﺍﻟﺘﺸﻐﻴﻞ ﺫﺍﺕ ﺍﻟﱪﳎﺔ ﺍﳌﺘﻌﺪﺩﺓ‪.‬‬
‫ﻓﻌﻨﺪ ﺇﻋﺎﺩﺓ ﺗﻮﺿﻴﻊ ﺍﻟﱪﻧﺎﻣﺞ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ﺳﻴﺘﻢ ﲣﺰﻳﻦ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﺍﳉﺪﻳﺪ ﰲ ﻣﺴﺠﻞ ﺍﻟﻘﺎﻋﺪﺓ‪.‬‬
‫‪77‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﻼ ﺑﺸﻜﻞ ﺩﺍﺋﻢ ﻣﻦ‬ ‫ﻻ ﻳﻮﺟﺪ ﰲ ﺍﳊﻮﺍﺳﺐ ‪ 80×86‬ﻋﺪﺩ ﻛﺎﻑ ﻣﻦ ﺍﳌﺴﺠﻼﺕ ﻟﻜﻲ ﳔﺼﺺ ﻣﺴﺠ ﹰ‬
‫ﺃﺟﻞ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ‪ ،‬ﻭﻋﻠﻰ ﻛﻞ ﺣﺎﻝ‪ ،‬ﻓﺈﻥ ﻃﻮﻝ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﰲ ﺍﳌﻌﺎﳉﺎﺕ ‪ 80×86‬ﺳﻴﺒﻘﻰ ﺻﻐﲑﹰﺍ‬
‫ﻃﺎﳌﺎ ﺃ‪‬ﺎ ﱂ ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻣﻊ ﻛﻞ ﺗﻌﻠﻴﻤﺔ‪ .‬ﻓﺨﻼﻝ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻣﺼﻔﻮﻓﺔ ﺑﺒﻌﺪﻳﻦ ﻳﺘﻢ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﻣﺴﺠﻞ ﺍﻟﻘﺎﻋﺪﺓ ﻣﻦ ﺃﺟﻞ ﻋﻤﻠﻴﺔ ﺍﻟﻔﻬﺮﺳﺔ‪ ،‬ﻭﻫﺬﺍ ﻣﺒﲔ ﰲ ﺍﻟﺸﻜﻞ )‪ (4-4‬ﺣﻴﺚ ﰎ ﺗﻌﺮﻳﻒ‬
‫ﻣﺼﻔﻮﻓﺔ ﺑﺜﻼﺛﺔ ﺃﺳﻄﺮ ﻭﺃﺭﺑﻌﺔ ﺃﻋﻤﺪﺓ ﻭﺍﲰﻴﻨﺎﻫﺎ ‪ .miles‬ﻭﻟﻠﺘﻮﺿﻴﺢ ﻓﻘﻂ ﺍﻓﺘﺮﺿﻨﺎ ﺃﻥ ﺍﻟﻌﻨﻮﺍﻥ‬
‫ﺍﻟﻘﺎﻋﺪﻱ ﻟﻠﻤﺼﻔﻮﻓﺔ ‪ miles‬ﻫﻮ ‪ 200‬ﻭﺃﻥ ﻛﻞ ﻋﻨﺼﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ ﻳﺸﻐﻞ ﺑﺎﻳﺘﹰﺎ ﻭﺍﺣﺪﹰﺍ ﰲ ﺍﻟﺬﺍﻛﺮﺓ ‪.RAM‬‬

‫‪Address‬‬ ‫‪200‬‬ ‫‪201‬‬ ‫‪202‬‬ ‫‪203‬‬ ‫‪204‬‬ ‫‪205‬‬ ‫‪206‬‬ ‫‪207‬‬ ‫‪208‬‬ ‫‪209‬‬ ‫‪210‬‬ ‫‪211‬‬

‫‪miles‬‬ ‫‪18‬‬ ‫‪28‬‬ ‫‪38‬‬ ‫‪48‬‬ ‫‪16‬‬ ‫‪26‬‬ ‫‪36‬‬ ‫‪46‬‬ ‫‪14‬‬ ‫‪14‬‬ ‫‪34‬‬ ‫‪44‬‬

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


‫ﺗﺸﲑ إﱃ ﺁﺧﺮ ﻋﻨﺼﺮ وهﻮ ‪[2*BX+SI] = 208+3 = 211 : 44‬‬

‫اﻟﺸﻜﻞ )‪ :(4-4‬ﺗﺨﺰﻳﻦ ﻣﺼﻔﻮﻓﺔ ﻓﻲ اﻟﺬاآﺮة‬

‫ﺍﻧﻈﺮ ﺇﱃ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ 4‬ﰲ ﺍﻟﺸﻜﻞ )‪ ،(4-5‬ﻓﻤﻦ ﺧﻼﻝ ﻭﺿﻊ ﺍﻟﻘﻴﻤﺔ ‪) 4‬ﻋﺪﺩ ﺃﻋﻤﺪﺓ ﺍﳌﺼﻔﻮﻓﺔ( ﰲ‬
‫ﺍﳌﺴﺠﻞ ‪ BX‬ﳓﺼﻞ ﻋﻠﻰ ﻋﻨﻮﺍﻥ ﻓﻌﺎﻝ ﻣﻦ ﺧﻼﻝ ﺍﻟﺘﻌﺒﲑ ]‪ miles [2*BX‬ﻣﺸﲑﹰﺍ ﺇﱃ ﺍﻟﻌﻨﺼﺮ ﺍﻷﻭﻝ ﻣﻦ‬
‫ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﻟﺚ ﻟﻠﻤﺼﻔﻮﻓﺔ ‪ miles‬ﻭﺍﳌﺴﺎﻭﻱ ﺇﱃ ‪ .208‬ﳛﺘﻮﻱ ﻣﺴﺠﻞ ﺍﻟﺪﻟﻴﻞ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ‪ 3‬ﻛﻤﺎ ﻫﻮ‬
‫ﻣﺒﲔ ﰲ ﺍﻟﺴﻄﺮ ‪.5‬‬

‫‪1‬‬ ‫‪miles DB‬‬ ‫‪18,‬‬ ‫‪28,‬‬ ‫‪38,‬‬ ‫‪48‬‬ ‫;‬ ‫‪row‬‬ ‫‪-1‬‬
‫‪2‬‬ ‫‪DB‬‬ ‫‪16,‬‬ ‫‪26,‬‬ ‫‪36,‬‬ ‫‪46‬‬ ‫;‬ ‫‪row‬‬ ‫‪-2‬‬
‫‪3‬‬ ‫‪DB‬‬ ‫‪14,‬‬ ‫‪24,‬‬ ‫‪34,‬‬ ‫‪44‬‬ ‫;‬ ‫‪row‬‬ ‫‪-3‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪MOV‬‬ ‫;‬
‫‪4‬‬ ‫‪MOV‬‬ ‫‪BX,‬‬ ‫‪4‬‬ ‫;‬
‫‪5‬‬ ‫‪MOV‬‬ ‫‪SI,‬‬ ‫‪3‬‬ ‫;‬
‫‪6‬‬ ‫‪MOV‬‬ ‫‪AL, miles‬‬ ‫;]‪[2*BX+SI‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬

‫اﻟﺸﻜﻞ )‪ :(4-5‬ﺷﻴﻔﺮة ﺑﺮﻣﺠﻴﺔ ﻟﻌﻨﻮﻧﺔ ﻋﻨﺼﺮ ﻓﻲ ﻣﺼﻔﻮﻓﺔ‪.‬‬

‫ﻳﺘﻢ ﰲ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ 6‬ﺩﻣﺞ ﻛﻞ ﻣﻦ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ ﻭﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻣﻊ ﺑﻌﻀﻬﺎ ﻛﻘﻴﻤﺔ ﺇﺯﺍﺣﺔ‬
‫ﺍﻋﺘﺒﺎﺭﹰﺍ ﻣﻦ ﺍﻟﻌﻨﻮﺍﻥ ‪ ،200‬ﻟﻴﺼﺒﺢ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ‪ 208+3‬ﻭﺍﳌﺴﺎﻭﻱ ﺇﱃ ‪ .211‬ﺗﺬﻛﺮ ﺃﻥ ﺍﻟﺮﻣﺰ ‪miles‬‬
‫ﻳﻘﺎﺑﻞ ﺍﻟﻘﻴﻤﺔ ‪ 200‬ﺍﻟﱵ ﻫﻲ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ ﻟﻠﻤﺼﻔﻮﻓﺔ‪.‬‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪78‬‬

‫‪EA = Effective Address = 2* contents of BX + contents of SI +‬‬


‫‪displacement value‬‬
‫)‪= 8+3+200 = 211 (in the example discussed‬‬

‫ﻟﻠﻮﺻﻮﻝ ﺇﱃ ﺍﻟﻌﻨﺼﺮ )‪ (i, j‬ﰲ ﻫﺬﻩ ﺍﳌﺼﻔﻮﻓﺔ‪ ،‬ﺃﻱ ﺍﻟﻌﻨﺼﺮ ﺍﳌﻮﺟﻮﺩ ﰲ ﺍﻟﺴﻄﺮ ﺭﻗﻢ ‪ i‬ﻭﺍﻟﻌﻤﻮﺩ ﺭﻗﻢ ‪،j‬‬
‫ﻧﺴﺘﺨﺪﻡ ﺍﻟﻌﺒﺎﺭﺓ ])‪miles [200+(i-1)*4+(j-1‬‬

‫‪211‬‬ ‫ﻳﺸﲑ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ﻟﻠﻤﺜﺎﻝ ﺍﳌﺬﻛﻮﺭ ﺳﺎﺑﻘﹰﺎ ﺇﱃ ﺍﻟﻌﻨﺼﺮ ﺍﻟﺮﺍﺑﻊ ﰲ ﺍﻟﺴﻄﺮ ﺍﻟﺜﺎﻟﺚ‪ ،‬ﺃﻱ ﺍﳌﻮﻗﻊ‬
‫ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ ﻭﺍﳊﺎﻭﻱ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ‪ .44‬ﻓﻤﻦ ﺧﻼﻝ ﺯﻳﺎﺩﺓ ‪ BX‬ﺑﺄﺭﺑﻌﺔ ‪ 4‬ﰲ ﻛﻞ ﻣﺮﺓ ﻧﺴﺘﻄﻴﻊ ﺍﺧﺘﻴﺎﺭ‬
‫ﺃﺳﻄﺮ ﳐﺘﻠﻔﺔ‪ ،‬ﻭﻣﻦ ﺧﻼﻝ ﺯﻳﺎﺩﺓ ‪ SI‬ﺑﻮﺍﺣﺪ ‪ 1‬ﻧﺴﺘﻄﻴﻊ ﺍﺧﺘﻴﺎﺭ ﻋﻤﻮﺩ ﰲ ﺍﻟﺴﻄﺮ ﺍﳌﺨﺘﺎﺭ‪ .‬ﻭﻫﻜﺬﺍ‬
‫ﻓﺈﻥ ﺍﻟﻌﻨﻮﻧﺔ ﺫﺍﺕ ﺍﻟﺒﻌﺪﻳﻦ ﻷﺳﻄﺮ ﻭﺃﻋﻤﺪﺓ ﺍﳌﺼﻔﻮﻓﺔ ‪ miles‬ﻗﺪ ﺣﻮﻟﺘﻬﺎ ﺇﱃ ﳎﺎﻝ ﻋﻨﺎﻭﻳﻦ ﺧﻄﻲ ﰲ‬
‫ﺍﻟﺬﺍﻛﺮﺓ ‪.RAM‬‬
‫ﺳﻨﻮﺿﺢ ﺍﻵﻥ ﻣﻦ ﺧﻼﻝ ﺑﺮﻧﺎﻣﺞ ﺁﺧﺮ ﻋﻤﻠﻴﺔ ﺍﻟﻔﻬﺮﺳﺔ ﺑﺒﻌﺪ ﻭﺍﺣﺪ‪.‬‬
‫‪.RAM‬‬ ‫ﻣﺴﺄﻟﺔ‪ :‬ﻣﺼﻔﻮﻓﺔ ﺍﲰﻬﺎ ‪ seq‬ﺑﺴﺒﻌﺔ ﻋﻨﺎﺻﺮ ﻛﻞ ﻣﻨﻬﺎ ﺑﻄﻮﻝ ﺑﺎﻳﺖ ﻭﺍﺣﺪ ﳐﺰﻧﺔ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‬
‫ﳚﺐ ﻋﻠﻰ ﺍﻟﱪﻧﺎﻣﺞ ﺃﻥ ﻳﻔﺤﺺ ﻣﺎ ﺇﺫﺍ ﻛﺎﻧﺖ ﻫﺬﻩ ﺍﳌﺼﻔﻮﻓﺔ ﻣﺮﺗﺒﺔ ﺣﺴﺐ ﺍﳊﺮﻭﻑ ﺍﻷﲜﺪﻳﺔ‪ ،‬ﻓﺈﺫﺍ‬
‫ﻛﺎﻧﺖ ﻣﺮﺗﺒﺔ ﻳﻌﺮﺽ ﺍﳊﺮﻑ ‪ (true) T‬ﻭﺇﻻ ﻓﺈﻧﻪ ﺳﻴﻌﺮﺽ ‪ .(false) F‬ﺳﻨﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ‬
‫)ﺍﻟﻔﻬﺮﺳﺔ( ﳊﻞ ﻫﺬﻩ ﺍﳌﺴﺄﻟﺔ‪ .‬ﺗﺬﻛﺮ ﺃﻥ ﺷﻴﻔﺮﺓ ﺍﻷﺳﻜﻲ ﻟﻠﺤﺮﻭﻑ ﻣﻦ ‪ A‬ﻭﰲ ‪ Z‬ﻣﺮﺗﺒﺔ ﺗﺼﺎﻋﺪﻳﺎﹰ‪،‬‬
‫ﻭﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﺬﻱ ﻳﻘﻮﻡ ‪‬ﺬﺍ ﻣﻌﻄﻰ ﰲ ﺍﻟﺸﻜﻞ )‪.(4-6‬‬
‫‪.data‬‬
‫‪seq‬‬ ‫‪DB‬‬ ‫; '‪'ADEPSWZ‬‬
‫‪.code‬‬
‫‪MOV‬‬ ‫‪CX,‬‬ ‫‪6‬‬ ‫;‬ ‫‪Loop count (n-1) where n‬‬
‫;‬ ‫‪is the array size‬‬
‫‪MOV‬‬ ‫‪SI,‬‬ ‫‪0‬‬ ‫;‬ ‫‪initialize index to 0‬‬
‫‪next: MOV‬‬ ‫‪AL,‬‬ ‫; ]‪seq [SI‬‬ ‫‪load ith value of seq in AL‬‬
‫‪MOV‬‬ ‫‪BL,‬‬ ‫;]‪seq [SI+1‬‬ ‫‪load (i+1) value of seq in BL‬‬
‫‪CMP‬‬ ‫‪AL,‬‬ ‫‪BL‬‬ ‫;‬ ‫‪compare characters‬‬
‫‪JG notseq‬‬ ‫;‬ ‫‪JG is jump if greater‬‬
‫‪INC‬‬ ‫‪SI‬‬
‫‪LOOP, next‬‬ ‫;‬ ‫‪LOOP back to check next‬‬
‫;‬ ‫‪element‬‬
‫‪MOV‬‬ ‫‪AH,‬‬ ‫‪2‬‬ ‫;‬ ‫‪code for display‬‬
‫‪MOV‬‬ ‫‪DL,‬‬ ‫'‪'T‬‬ ‫;‬ ‫‪T for True‬‬
‫‪INT‬‬ ‫‪21h‬‬ ‫;‬ ‫‪Display T‬‬
‫‪INT‬‬ ‫‪20h‬‬ ‫;‬ ‫‪Halt execution‬‬
‫‪notseq:MOV‬‬ ‫‪AH,‬‬ ‫‪2‬‬ ‫;‬
‫‪MOV‬‬ ‫‪DL,‬‬ ‫'‪'F‬‬ ‫;‬ ‫‪F for false‬‬
‫‪INT‬‬ ‫‪21h‬‬ ‫;‬ ‫‪Display F‬‬
‫‪INT‬‬ ‫‪20h‬‬ ‫;‬ ‫‪Halt execution‬‬

‫اﻟﺸﻜﻞ )‪ :(4-6‬ﺑﺮﻧﺎﻣﺞ ﻟﻔﺤﺺ اﻟﺘﺮﺗﻴﺐ اﻟﺘﺼﺎﻋﺪي ﻟﻠﺒﺎﻳﺘﺎت‬


‫‪79‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﺗﺼﻤﻴﻢ اﻟﺒﺮﻧﺎﻣﺞ‬
‫ﻗﺒﻞ ﻛﺘﺎﺑﺔ ﺍﻟﱪﻧﺎﻣﺞ ﻻﺑﺪ ﻣﻦ ﲢﻠﻴﻞ ﺍﳌﺸﻜﻠﺔ‪ ،‬ﻭﺗﺼﻤﻴﻢ ﺍﳋﻮﺍﺭﺯﻣﻴﺔ ﻭﺑﻌﺪﺋ ٍﺬ ﺍﻟﺘﺨﻄﻴﻂ ﻟﻜﻴﻔﻴﺔ ﺗﻄﻮﻳﺮ‬
‫ﺷﻴﻔﺮﺓ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ‪ .‬ﺇﻧﻪ ﻟﻌﻤﻞ ﺟﻴﺪ ﺃﻥ ﺗﻘﻮﻡ ﺑﺘﻮﺛﻴﻖ ﺫﻟﻚ ﺑﻮﺿﻮﺡ‪ ،‬ﻭﻫﺬﻩ ﺍﻟﻮﺛﺎﺋﻖ ﳚﺐ ﺇﻋﺎﺩﺓ‬
‫ﻛﺘﺎﺑﺘﻬﺎ ﺇﺫﺍ ﻏﲑﻧﺎ ﺍﻟﺸﻴﻔﺮﺓ ﻣﺮﺓ ﺃﺧﺮﻯ‪.‬‬
‫ﺳﻨﻘﺪﻡ ﺍﻵﻥ ﻣﺜﺎ ﹰﻻ ﻳﺒﲔ ﻛﻴﻔﻴﺔ ﺗﻮﺛﻴﻖ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﻌﻄﻰ ﺑﺎﻟﺸﻜﻞ )‪:(4-6‬‬
‫ﺗﺴﻤﻰ ﻣﺼﻔﻮﻓﺔ ﺍﳌﻌﻄﻴﺎﺕ ﺑﺎﻻﺳﻢ ‪ seq‬ﻭﻫﻲ ﻣﺼﻔﻮﻓﺔ ﺑﺒﻌﺪ ﻭﺣﻴﺪ ﻭﲢﻮﻱ ﺳﺒﻌﺔ ﻋﻨﺎﺻﺮ ﻛﻞ‬ ‫●‬
‫ﻣﻨﻬﺎ ﺑﻄﻮﻝ ﺑﺎﻳﺖ ﻭﺍﺣﺪ‪.‬‬
‫ﻧﻘﺎﺭﻥ ﺍﻟﻘﻴﻤﺔ ﺭﻗﻢ ‪ i-th‬ﻣﻦ ﺍﳌﺼﻔﻮﻓﺔ ﻣﻊ ﺍﻟﻘﻴﻤﺔ ﺫﺍﺕ ﺍﻟﺮﻗﻢ )‪ (i+1‬ﻓﺈﺫﺍ ﻛﺎﻧﺖ ﺍﻟﻘﻴﻤﺔ ﺫﺍﺕ ﺍﻟﺮﻗﻢ‬ ‫●‬
‫‪ i-th‬ﺃﻛﱪ ﻣﻦ ﺍﻟﻘﻴﻤﺔ ﺫﺍﺕ ﺍﻟﺮﻗﻢ )‪ (i+1‬ﻓﺈﻥ ﺍﳌﺼﻔﻮﻓﺔ ﻏﲑ ﻣﺮﺗﺒﺔ ﻭﺑﺎﻟﺘﺎﱄ ﻧﻮﻗﻒ ﺍﳊﻠﻘﺔ‬
‫ﻭﻧﻌﺮﺽ ﻛﻠﻤﺔ ‪ False‬ﰒ ﻳﺘﻮﻗﻒ ﺍﻟﱪﻧﺎﻣﺞ‪.‬‬
‫ﺇﺫﺍ ﺍﻧﺘﻬﺖ ﺣﻠﻘﺔ ﺍﳌﻘﺎﺭﻧﺔ ﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﻓﻬﺬﺍ ﻳﻌﲏ ﺃﻥ ﺍﳌﺼﻔﻮﻓﺔ ﻣﺮﺗﺒﺔ ﺑﺸﻜﻞ ﺻﺤﻴﺢ‪.‬‬ ‫●‬

‫ﺇﻥ ﺗﻌﻠﻴﻤﺔ ﺍﳌﻘﺎﺭﻧﺔ ‪ CMP‬ﺗﺴﻤﺢ ﲟﺮﺟﻌﻴﺔ ﻭﺣﻴﺪﺓ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ‪ RAM‬ﻭﻟﺬﻟﻚ ﻳﺘﻢ ﻧﻘﻞ ﺍﻟﻌﻨﺼﺮ‬ ‫●‬
‫ﺭﻗﻢ ‪ i-th‬ﺇﱃ ﺍﳌﺴﺠﻞ ‪.AL‬‬
‫ﻳﺘﻢ ﺗﻜﺮﺍﺭ ﺣﻠﻘﺔ ﺍﳌﻘﺎﺭﻧﺔ )‪ (n-1‬ﻣﺮﺓ‪ ،‬ﺣﻴﺚ ﺃﻥ ‪ n‬ﳝﺜﻞ ﻋﺪﺩ ﺍﻟﻌﻨﺎﺻﺮ ﰲ ﺍﳌﺼﻔﻮﻓﺔ‪.‬‬ ‫●‬

‫ﻣﺒﲏ ﻋﻠﻰ ﺍﻟﺘﺼﻤﻴﻢ ﺍﳌﺬﻛﻮﺭ ﻭﻫﻮ ﻳﻮﺿﺢ ﻧﻔﺴﻪ ﺑﻨﻔﺴﻪ )ﺍﻧﻈﺮ‬ ‫)‪(4-6‬‬ ‫ﺇﻥ ﺍﻟﱪﻧﺎﻣﺞ ﺍﳌﺒﲔ ﰲ ﺍﻟﺸﻜﻞ‬
‫ﺍﳌﻠﺤﻖ ‪ 3‬ﻣﻦ ﺃﺟﻞ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﻜﺎﻣﻠﺔ(‪.‬‬

‫ﻣﻠﺨﺺ‬ ‫‪4.6‬‬
‫ﺟﺮﻯ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﺗﻮﺿﻴﺢ ﺃﺭﺑﻌﺔ ﺃﳕﺎﻁ ﻋﻨﻮﻧﺔ ﺃﺣﺪﻫﺎ )ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﻮﺟﻬﺔ ﺑﺎﻹﺯﺍﺣﺔ( ﳝﺜﻞ ﻧﻮﻋﹰﺎ ﻋﺎﻣﹰﺎ‬
‫ﻭﻳﻮﺿﺢ ﻧﻮﻋﲔ ﻟﻠﻌﻨﻮﻧﺔ ﳘﺎ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻭﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ‪ .‬ﺗﻌﺘﱪ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ ﻟﻠﻤﻮﺍﻗﻊ‬
‫ﺍﻟﺬﺍﻛﺮﻳﺔ ﺃﻭ ﻟﻠﻤﺴﺠﻼﺕ ﺇﺣﺪﻯ ﻃﺮﻕ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺸﻬﻮﺭﺓ ﻭﱂ ﻧﻌﺘﱪﻫﺎ ﺇﺣﺪﻯ ﻃﺮﻕ ﺍﻟﻌﻨﻮﻧﺔ ﰲ ﻫﺬﺍ‬
‫ﺍﻟﻔﺼﻞ‪ .‬ﺇﻥ ﺍﻟﺘﻌﻠﻴﻤﺔ ‪ MOV AX, BX‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ﺗﻮﻇﻒ ﻋﻨﻮﻧﺔ ﻣﺒﺎﺷﺮﺓ ﻣﺴﺠﻠﻴﺔ‪ ،‬ﻭﺍﻟﺘﻌﻠﻴﻤﺔ‬
‫‪ MOV AX, SUM‬ﺗﻮﻇﻒ ﻋﻨﻮﻧﺔ ﻣﺒﺎﺷﺮﺓ ﺫﺍﻛﺮﻳﺔ‪.‬‬
‫ﺗﻔﻴﺪ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﻣﱪﻣﺞ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ ﰲ ﻃﺮﻕ ﻋﺪﻳﺪﺓ‪ ،‬ﻓﻬﻲ ﺗﺴﺎﻋﺪ ﰲ ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻗﺎﺑﻞ ﻟﻠﻘﺮﺍﺀﺓ‬
‫ﻭﺍﻟﺼﻴﺎﻧﺔ ﺑﺴﻬﻮﻟﺔ‪ ،‬ﻛﻤﺎ ﺃ‪‬ﺎ ﺗﺴﺎﻋﺪ ﰲ ﺍﺳﺘﺨﺪﺍﻡ ﳎﺎﻝ ﻋﻨﻮﻧﺔ ﺃﻛﱪ ﺑﺪﻭﻥ ﲢﻤﻴِﻞ ﺯﻳﺎﺩﺓ ﻛﺒﲑﺓ ﻋﻠﻰ‬
‫ﻃﻮﻝ ﺍﻟﺘﻌﻠﻴﻤﺔ‪ .‬ﲢﺴﻦ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ)ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ( ﰲ ﺑﻌﺾ ﺍﳊﺎﻻﺕ ﻣﻦ ﺯﻣﻦ ﺍﻟﺘﻨﻔﻴﺬ ﻭﺫﻟﻚ ﻋﻠﻰ‬
‫ﺣﺴﺎﺏ ﺍﳌﺮﻭﻧﺔ‪ ،‬ﻭﰲ ﺃﺣﻴﺎﻥ ﺃﺧﺮﻯ )ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ( ﲢﺴﻦ ﻣﻦ ﺍﳌﺮﻭﻧﺔ ﻋﻠﻰ ﺣﺴﺎﺏ ﺯﻳﺎﺩﺓ ﺯﻣﻦ ﺍﻟﺘﻨﻔﻴﺬ‪.‬‬
‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪80‬‬

‫ﺗﻤﺎرﻳﻦ‬
‫ﺿﻊ ﺍﻹﺟﺎﺑﺔ ﺍﻟﺼﺤﻴﺤﺔ ﰲ ﺍﻟﻔﺮﺍﻍ ‪:‬‬
‫ﻳﺴﺘﺨﺪﻡ ﳕﻂ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺒﺎﺷﺮﺓ ﻋﻨﺪﻣﺎ‬ ‫‪4.1‬‬

‫‪ (b‬ﻳﻄﻠﺐ ﺣﺠﻢ ﻋﻨﻮﻧﺔ ﻛﺒﲑ‬ ‫‪ (a‬ﺗﻜﻮﻥ ﺍﻟﺴﺮﻋﺔ ﻫﺎﻣﺔ‬


‫‪ (d‬ﻳﻄﻠﺐ ﻛﻞ ﻣﺎ ﺫﻛﺮ‬ ‫‪ (c‬ﻳﻄﻠﺐ ﻛﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ ﻣﻌﻘﺪ‬
‫ﻟﺪﻳﻨﺎ ﺣﺎﺳﻮﺑﹰﺎ ﺑﺬﺍﻛﺮﺓ ‪ .32 MB‬ﻳﻠﺰﻡ ‪ .............‬ﺑﺘﹰﺎ ﰲ ﺣﻘﻞ ﺍﻟﻌﻨﻮﺍﻥ ﻟﻠﺘﻌﻠﻴﻤﺔ ﻭﺫﻟﻚ‬ ‫‪4.2‬‬
‫ﻟﻌﻨﻮﻧﺔ ﻫﺬﻩ ﺍﻟﺬﺍﻛﺮﺓ ﺑﻌﻨﻮﻧﺔ ﻣﺒﺎﺷﺮﺓ‪.‬‬
‫‪25 (d‬‬ ‫‪32 (c‬‬ ‫‪20 (b‬‬ ‫‪16 (a‬‬
‫ﻳﺰﺩﺍﺩ ﺍﳊﺠﻢ ﺍﻟﺬﻱ ﻳﺸﻐﻠﻪ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻨﺪﻣﺎ‪:‬‬ ‫‪4.3‬‬

‫‪ (a‬ﺗﺘﻄﻠﺐ ﺻﻴﻐﺔ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺑﺘﺎﺕ ﺃﻛﺜﺮ‪.‬‬


‫‪ (b‬ﻳﻠﺰﻡ ﻣﻌﺎﳉﺔ ﻣﺼﻔﻮﻓﺎﺕ ﻣﻌﻄﻴﺎﺕ ﲝﺠﻢ ﻛﺒﲑ‪.‬‬
‫‪ (c‬ﻛﻼ ﺍﻟﺴﺒﺒﲔ ﺍﳌﺬﻛﻮﺭﻳﻦ‪.‬‬
‫ﺗﻌﻨﻮﻥ ﺍﳌﺴﺠﻼﺕ ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ ﻋﻨﺪﻣﺎ‪:‬‬ ‫‪4.4‬‬

‫‪ (b‬ﻳﻘﻞ ﻋﺪﺩ ﺍﳌﺴﺠﻼﺕ ﰲ ﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ‬ ‫‪ (a‬ﺗﺰﺩﺍﺩ ﺳﺮﻋﺔ ﺍﳌﻌﺎﳉﺔ‬


‫‪ (d‬ﻻ ﺷﻲﺀ ﻣﻦ ﻫﺬﺍ‪.‬‬ ‫‪ (c‬ﻳﻜﻮﻥ ﻃﻮﻝ ﺍﳌﺴﺠﻼﺕ ‪ 16‬ﺑﺘﹰﺎ‬
‫ﺍﻟﺰﻣﻦ ﺍﻟﻼﺯﻡ ﳉﻠﺐ ﺍﳌﻌﻄﻴﺎﺕ ﰲ ﳕﻂ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﻳﺴﺎﻭﻱ ﺍﻟﺼﻔﺮ‪.‬‬ ‫‪4.5‬‬

‫ﺧﻄﺄ‬ ‫●‬ ‫● ﺻﺢ‬


‫ﻋﺪﺩ ﺍﻟﺒﺘﺎﺕ ﺍﻟﻼﺯﻡ ﻟﻌﻨﻮﻧﺔ ﻓﻮﺭﻳﺔ ﻣﺴﺎﻭﻳﺔ ‪ ±1024‬ﻫﻮ‪ .....‬ﺑﺖ‪.‬‬ ‫‪4.6‬‬

‫‪20 (d‬‬ ‫‪12 (c‬‬ ‫‪11 (b‬‬ ‫‪10 (a‬‬


‫ﺇﺣﺪﻯ ﻣﻴﺰﺍﺕ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﻫﻲ‪...........‬‬ ‫‪4.7‬‬

‫‪ (b‬ﺳﻬﻮﻟﺔ ﻓﻚ ﺗﺸﻔﲑ ﺍﳌﻌﺎﻣﻼﺕ‬ ‫‪ (a‬ﺍﻟﻮﺿﻮﺡ ﺧﻼﻝ ﻗﺮﺍﺀﺓ ﺍﻟﱪﻧﺎﻣﺞ‬


‫‪ (d‬ﻻ ﺣﺎﺟﺔ ﳉﻠﺐ ﺍﳌﻌﺎﻣﻞ ﻣﻦ ﺍﻟﺬﺍﻛﺮﺓ‬ ‫‪ (c‬ﺍﻟﺘﻨﻔﻴﺬ ﺍﻟﻔﻮﺭﻱ ﻟﻠﺘﻌﻠﻴﻤﺔ‬
‫‪81‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﻋﺪﺩ ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ﺍﳌﻄﻠﻮﺏ ﳉﻠﺐ ﺍﳌﻌﺎﻣﻞ ﺍﻟﻔﻮﺭﻱ ﻳﺴﺎﻭﻱ‪..........‬‬ ‫‪4.8‬‬

‫‪3 (d‬‬ ‫‪2 (c‬‬ ‫‪1 (b‬‬ ‫‪0 (a‬‬


‫ﺳﻴﺌﺔ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻔﻮﺭﻳﺔ ﻫﻲ‪:‬‬ ‫‪4.9‬‬

‫‪ (a‬ﻋﺪﻡ ﺇﻣﻜﺎﻧﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺴﺎﻟﺒﺔ‬


‫‪ (b‬ﺿﺮﻭﺭﺓ ﺇﻋﺎﺩﺓ ﲡﻤﻴﻊ ﺍﻟﱪﻧﺎﻣﺞ ﻋﻨﺪ ﺗﻐﻴﲑ ﻗﻴﻤﺔ ﺍﳌﻌﺎﻣﻞ ﺍﻟﻔﻮﺭﻱ‬
‫‪ (c‬ﺿﻌﻒ ﰲ ﻭﺿﻮﺡ ﺍﻟﱪﻧﺎﻣﺞ‬
‫ﳝﻜﻦ ﻟﻠﻤﻌﺎﻣﻞ ﺍﻟﻔﻮﺭﻱ ﺃﻥ ﻳﻜﻮﻥ ﳏﺮﻑ ﺃﺳﻜﻲ‬ ‫‪4.10‬‬

‫● ﺧﻄﺄ‬ ‫● ﺻﺢ‬
‫ﺗﺘﻄﻠﺐ ﻋﻨﻮﻧﺔ ﺍﻟﺬﺍﻛﺮﺓ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‪ ..........‬ﺩﺧﻮ ﹰﻻ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ﳉﻠﺐ ﺍﳌﻌﻄﻴﺎﺕ‬ ‫‪4.11‬‬

‫‪3 (d‬‬ ‫‪2 (c‬‬ ‫‪1 (b‬‬ ‫‪0 (a‬‬

‫ﲢﺘﺎﺝ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‪ ...........‬ﺩﺧﻮ ﹰﻻ ﺇﱃ ﺍﻟﺬﺍﻛﺮﺓ ﳉﻠﺐ ﺍﳌﻌﻄﻴﺎﺕ‬ ‫‪4.12‬‬

‫‪3 (d‬‬ ‫‪2 (c‬‬ ‫‪1 (b‬‬ ‫‪0 (a‬‬


‫ﻋﺪﺩ ﺍﳌﻮﺍﻗﻊ ﺍﳌﻤﻜﻦ ﻋﻨﻮﻧﺘﻬﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﺴﺠﻠﻴﺔ ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ ﰲ ﺍﳊﻮﺍﺳﺐ‬ ‫‪4.13‬‬
‫ﺍﻟﺸﺨﺼﻴﺔ ﻳﺴﺎﻭﻱ‪ ..........‬ﻣﻮﻗﻌﹰﺎ‪.‬‬
‫‪256K (d‬‬ ‫‪64K (c‬‬ ‫‪1024 (b‬‬ ‫‪256 (a‬‬

‫ﻳﻔﻴﺪ ﳕﻂ ﺍﻟﻌﻨﻮﻧﺔ‪ ........‬ﰲ ﺇﻋﺎﺩﺓ ﺗﻮﺿﻴﻊ ﺍﳌﻌﻄﻴﺎﺕ ﻭﺍﻟﱪﺍﻣﺞ ﰲ ﺍﻟﺬﺍﻛﺮﺓ‪.‬‬ ‫‪4.14‬‬

‫)‪(PC-relative‬‬ ‫‪ (d‬ﺍﻟﻨﺴﺒﻴﺔ‬ ‫‪ (c‬ﺍﻟﻔﻮﺭﻳﺔ‬ ‫‪ (b‬ﻏﲑ ﺍﳌﺒﺎﺷﺮﺓ‬ ‫‪ (a‬ﺍﳌﺒﺎﺷﺮﺓ‬


‫ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻨﺴﺒﻴﺔ ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺍﳌﺴﺠﻞ ‪ ..........‬ﻛﻌﻨﻮﺍﻥ ﻣﺮﺟﻌﻲ‪.‬‬ ‫‪4.15‬‬

‫‪SI (d‬‬ ‫‪IP (c‬‬ ‫‪DS (b‬‬ ‫‪DX (a‬‬


‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻨﺴﺒﻴﺔ ﻛﻞ ﻣﻦ ﺍﻷﻋﺪﺍﺩ ﺍﻟﺴﺎﻟﺒﺔ ﻭﺍﳌﻮﺟﺒﺔ‪.............‬‬ ‫‪4.16‬‬

‫‪ (b‬ﻟﻌﻨﻮﻧﺔ ﻛﻞ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﻭﺍﳌﻌﻄﻴﺎﺕ‬ ‫‪ (a‬ﻟﺘﻜﻮﻥ ﻋﺎﻣﺔ ﺑﻄﺒﻴﻌﺘﻬﺎ‬


‫‪ (c‬ﻟﻠﺘﻔﺮﻳﻊ ﻟﻸﻣﺎﻡ ﻭﺍﳋﻠﻒ‪.‬‬
‫ﺗﺴﺘﺨﺪﻡ‪ .......‬ﺑﺘﺎﺕ ﰲ ﺳﻠﺴﻠﺔ ﺍﳌﻌﺎﳉﺎﺕ ‪ 80×86‬ﻟﺘﺨﺰﻳﻦ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ‪.‬‬ ‫‪4.17‬‬

‫‪10 (d‬‬ ‫‪32 (c‬‬ ‫‪8 (b‬‬ ‫‪16 (a‬‬


‫اﻟﻔﺼﻞ اﻟﺮاﺑﻊ‬ ‫‪82‬‬

‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻨﺴﺒﻴﺔ ﺑﺸﻜﻞ ﺃﻭﱄ ﰲ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ‪...........‬‬ ‫‪4.18‬‬

‫‪ (c‬ﺍﻟﻨﻘﻞ‬ ‫‪ (b‬ﺍﻟﻘﻔﺰ‬ ‫‪ (a‬ﺍﳊﺴﺎﺑﻴﺔ‬


‫ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺗﻌﻠﻴﻤﺎﺕ ﺍﻟﻘﻔﺰ ﺍﻟﻨﺴﱯ ﰲ ﺍﳌﻌﺎﳉﺎﺕ ‪ 80×86‬ﻓﻘﻂ ﻋﻨﺪ ﻧﻘﻞ ﺍﻟﺘﺤﻜﻢ‪........‬‬ ‫‪4.19‬‬
‫ﺑﺎﻳﺘﹰﺎ ﺑﺪﺀﹰﺍ ﻣﻦ ﺍﻟﺘﻌﻠﻴﻤﺔ ﺍﳊﺎﻟﻴﺔ‪.‬‬
‫‪±1024 (d‬‬ ‫‪±512 (c‬‬ ‫‪±128 (b‬‬ ‫‪±256 (a‬‬

‫ﳚﺐ ﲢﺪﻳﺪ‪........‬ﰲ ﺍﻟﻌﻨﻮﻧﺔ ﺍﳌﻮﺟﻬﺔ ﺑﺎﻹﺯﺍﺣﺔ‪.‬‬ ‫‪4.20‬‬

‫‪ (c‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻮﺭﻱ‬ ‫‪ (b‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ‬ ‫‪ (a‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﳌﻄﻠﻖ‬


‫ﺍﻹﺯﺍﺣﺔ ﻫﻲ‪ .........‬ﻳﺴﺘﺨﺪﻡ ﳊﺴﺎﺏ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ‪.‬‬ ‫‪4.21‬‬

‫‪ (c‬ﻋﺪﺩ‬ ‫‪ (b‬ﺩﻟﻴﻞ‬ ‫‪ (a‬ﻋﻨﻮﺍﻥ‬


‫ﻳ‪‬ﺤﺴ‪‬ﺐ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ ﻣﻦ ﺧﻼﻝ ﺇﺿﺎﻓﺔ ﺃﻭ ﻃﺮﺡ ﻗﻴﻤﺔ ﺍﻹﺯﺍﺣﺔ ﺇﱃ‪..........‬‬ ‫‪4.22‬‬

‫‪ (b‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻮﺭﻱ‬ ‫‪ (a‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻘﺎﻋﺪﻱ‬


‫‪ (d‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﳌﻄﻠﻖ‬ ‫‪ (c‬ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻨﺴﱯ‬
‫ﺗﺴﺘﺨﺪﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ ﻭﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻃﺮﻕ ‪ ...........‬ﳊﺴﺎﺏ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ‪.‬‬ ‫‪4.23‬‬

‫‪ (c‬ﻣﺘﺸﺎ‪‬ﺔ‬ ‫‪ (b‬ﻣﺘﻄﺎﺑﻘﺔ‬ ‫‪ (a‬ﳐﺘﻠﻔﺔ‬


‫ﺗﺘﻄﻠﺐ ﺇﺯﺍﺣﺔ ﺍﻟﻌﻨﺎﻭﻳﻦ ﰲ ﺣﺴﺎﺏ ﺍﻟﻌﻨﻮﺍﻥ ﺍﻟﻔﻌﺎﻝ‪..........‬‬ ‫‪4.24‬‬

‫‪ (c‬ﻛﻞ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﳊﺴﺎﺑﻴﺔ‬ ‫‪ (b‬ﺿﺮﺏ‪/‬ﻗﺴﻤﺔ‬ ‫‪ (a‬ﲨﻊ‪/‬ﻃﺮﺡ‬


‫ﻻ ﳝﻜﻦ ﺩﻣﺞ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻭﺍﻟﺪﻟﻴﻠﻴﺔ ﻣﻊ ﺑﻌﻀﻬﺎ ﺍﻟﺒﻌﺾ‪.‬‬ ‫‪4.25‬‬

‫● ﺧﻄﺄ‬ ‫● ﺻﺢ‬
‫ﻳﻌﺘﱪ ﻭﺟﻮﺩ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﻣﺴﺠﻼﺕ ﺍﻟﺪﻟﻴﻞ ﰲ ﻭﺣﺪﺓ ﺍﳌﻌﺎﳉﺔ ﺍﳌﺮﻛﺰﻳﺔ ﺃﻓﻀﻞ ﻣﻦ ﺃﺟﻞ ﻣﻌﺎﳉﺔ‬ ‫‪4.26‬‬

‫‪ (b‬ﺍﻟﺴﻼﺳﻞ‬ ‫‪ (a‬ﺍﳌﺼﻔﻮﻓﺎﺕ ﺍﳌﺘﻌﺪﺩﺓ ﺍﻷﺑﻌﺎﺩ‬


‫‪ (d‬ﺍﻷﺷﺠﺎﺭ‬ ‫‪ (c‬ﺍﻟﻘﻮﺍﺋﻢ‬
‫ﺇﻥ ﻋﺪﺩ ﻣﺴﺠﻼﺕ ﺍﻟﺪﻟﻴﻞ ﰲ ﺍﳌﻌﺎﰿ ‪ 8086‬ﻳﺴﺎﻭﻱ‬ ‫‪4.27‬‬

‫‪4 (d‬‬ ‫‪3 (c‬‬ ‫‪2 (b‬‬ ‫‪1 (a‬‬


‫‪83‬‬ ‫‪ : 4‬أﻧﻤﺎط اﻟﻌﻨﻮﻧﺔ اﻷرﺑﻌﺔ‬

‫ﺇﻥ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﺪﻟﻴﻠﻴﺔ ﺃﻭ ﺍﻟﻌﻨﻮﻧﺔ ﺍﻟﻘﺎﻋﺪﻳﺔ ﻻ ﻳﺰﻳﺪ ﻣﻦ ﺯﻣﻦ ﺗﻨﻔﻴﺬ ﺍﻟﺘﻌﻠﻴﻤﺔ‪.‬‬ ‫‪4.28‬‬

‫● ﺧﻄﺄ‬ ‫● ﺻﺢ‬
‫ﺇﻥ ﻭﺟﻮﺩ ﻋﺪﺩ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﰲ ﺍﳊﺎﺳﻮﺏ ﺳﻮﻑ‪..........‬‬ ‫‪4.29‬‬

‫‪ (b‬ﻳﺼﻌﺐ ﻋﻤﻞ ﺍ‪‬ﻤ‪‬ﻊ )ﺃﻭ ﺍﳌﺘﺮﺟﻢ(‬ ‫‪ (a‬ﻳﺒﺴﻂ ﺍﻟﺘﻜﻮﻳﻦ ﺍﳌﺎﺩﻱ‬


‫‪ (c‬ﻳﺒﺴﻂ ﻛﺘﺎﺑﺔ ﺑﺮﺍﻣﺞ ﻟﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ‬
‫ﺑﺸﻜﻞ ﻋﺎﻡ‪ ،‬ﺗﺴﺎﻋﺪ ﺃﳕﺎﻁ ﺍﻟﻌﻨﻮﻧﺔ ﰲ ﺯﻳﺎﺩﺓ ‪ .........‬ﻛﺘﺎﺑﺔ ﺍﻟﱪﺍﻣﺞ ﺑﻠﻐﺔ ﺍﻟﺘﺠﻤﻴﻊ‬ ‫‪4.30‬‬

‫‪ (c‬ﺻﻌﻮﺑﺔ‬ ‫‪ (b‬ﻣﺮﻭﻧﺔ‬ ‫‪ (a‬ﻓﻌﺎﻟﻴﺔ‬

Você também pode gostar