Transcript HW200_9
Монгол Улсын Шинжлэх Ухаан Технологийн Их
Сургууль
Компьютерийн зохион
байгуулалт, ассемблер
хэл
Код : HW200
Улирал : Хавар 2009
Багш : С. Байгалтөгс /проф, доктор/
Сэдэв 9 :Бүтэцлэгдсэн програмчлал
[www.cdeq.mn/hw200]
Бүтэцлэгдсэн програмчлал
Энэ сэдвээр компьютерийн шинжлэх ухаан дахь хоёр чухал
ач холболгдолтой зүйл буюу ямар машин командууд
процессорт хэрэглэгддэг мөн програмыг хэрхэн бэлдэж
бүтээх талаар судлах болно. Бүтэцлэгдсэн програмчлалын
арга нь найдвартай програмыг бүтээхэд хэрэглэгддэг.
Агуулга :
Хүчин чадлын тооцоолол
Машин командын хамгийн бага цогц
Throughput
CISC vs RISC
Бүтэцлэгдсэн програмчлал
Удирдлагын бүтцийн хамгийн бага цогц
[www.cdeq.mn/hw200]
Хүчин чадлын тооцоолол
Өмнө үзсэн сэдвүүдээр командын тодорхой хэдэн төрлийг
үзсэн :
Бит дээрх логик командууд
Бүхэл тооны арифметикийн командууд
Санах ойд хандах командууд
Програмын урсгалыг өөрчлөх нөхцөлт командууд
Мэдээж нэг процессор хүчирхэг байхын тулд хэдэн төрлийн
командуудтай байх ёстой вэ гэсэн асуулт гарч ирнэ. Үүний
хариулт нь : командын дээрх цогц нь хангалттай юм. Харин
компьютерийн хүчин чадлын тодорхойлолт нь тодорхой биш
байдаг. Заримдаа хүмүүс үүнийг тодорхойлохдоо “хурд” бас
“процессорын тооцолол” гэдэг. Мэдээж энэ хоёрын хослол
байх хэрэгтэй. Одоо дараагийн тодорхойлолтыг авч үзье
[www.cdeq.mn/hw200]
Хүчин чадлын тооцоолол
Хүчин чадлын тооцоолол : Хоёр процессор нь ижилхэн
тооцоолох хүчин чадалтай. Үүнд хэрвээ тэдгээрт ижилхэн
програмууд ачаалагдаж(процессор бүрийн машин хэлдэх
хөрвүүлэлтийн дараах) мөн ижилхэн үр дүнд боловсруулах
үед юм.
Энэ нь бүх програмын(процессор бүр дэх машин хэл дээрх
хөрвүүлэлтийн дараах) хувьд үнэн байх ёстой. Програмын
үр дүн нь компайлераас хамаарч боловсруулагддаг. Жишээ
нь, С хэлний компайлер нь int өгөгдлийн төрлийн хувьд
битүүдийн ялгаатай дугаарлалтыг хийдэг. Харин энэ
процессорынх биш компайлераас болж байгаа хэрэг юм.
[www.cdeq.mn/hw200]
Ижилхэн чадалтай процессорууд
16 битийн INTEL микропроцессор нь 64 бит бүхэл тооны
арифметикийг хэрэглэсэн програмыг ажлуулж чадна. Энэ нь
64 битийн үйлдэл бүрт 16 битийн машины үйлдлийг хийдэг
гэсэн үг.
Орчин үеийн процессоруудын жишээ нь : Pentium1 болон
Pentium4 процессорууд нь ижилхэн програмуудыг ажлуулж
чадна. P – 4 процессорууд нь бусдыгаа бодвол машин
циклүүд нь хурдан мөн машин командын олон хэлбэр
байдаг. С дээрх програмыг хоёр процессор дээр ажлуулахад
үр дүн нь ижил гарах болно. Харин програмын ажиллах
хугацаа нь Р – 1 нь Р – 4 – ийг бодвол урт буюу удаан
ажиллах болно. 1952 онд SWAC дижитал компьютер нь төгс
тоонуудыг олоход програмчлагдсан байсан. Төгс тоо гэдэг
нь бүхэл тоо бөгөөд хуваагч тоонуудых нь нийлбэр тэр тоо
[www.cdeq.mn/hw200]
өөрөө гардаг тоо юм.
Ижилхэн чадалтай процессорууд
Жишээ нь : 6 нь төгс тоо бөгөөд учир нь 6 – г хуваагч
тоонууд нь 1, 2, 3 ба 6 = 1 + 2 + 3 юм. Өөр төгс тоонууд нь
28, 496, 8128 юм.
SWAC – ын маш их тооцоололын дараа олсон төгс тоо нь
33550336 юм.
[www.cdeq.mn/hw200]
Командын цогц
Хүчин чадлын тооцооллын тодорхойлолт ёсоор миний маш
хурдтай процессор нь SWAC – аас илүү хүчин чадалтай биш
болж байгаа юм.
Процессорууд нь гадаад төхөөрөмжүүдээ удирдаж
тэдгээрийн хооронд мэдээлэл дамжуулж, тэдгээрээс
мэдээлэл хүлээн авч байх ёстой. Эдгээрийг хийхдээ
системийн түгээгүүрээр дамжуулан мөн санах ойгоос унших
болон бичих үйлдэл хийн гадаад төхөөрөмжүүдээ удирддаг.
Бүх процессорууд нь санах ойд бичилт хийх, ойгоос унших,
хатуу диск болон график картыг удирдах зэрэг үйлдлүүдийг
хийдэг. Мөн мультимедиа командууд өнөө үеийн шинэ
процессорын чипт нэмэгдсэн.
Ямар машин команд процессорт заавал байдаг вэ?
[www.cdeq.mn/hw200]
Командын цогц
Бүх процессорууд нь бит дээрх үйлдлийн үндсэн машин
командууд, нөхцөл салаалах, болон санах ойд хандахыг
дэмждэг ба ижилхэн тооцоолох хүчин чадалтай байдаг.
Бүхэл болон хөвөх таслалтай тоон дээрх арифметик
үйлдлүүд нь бит дээрх үйлдлийн командуудаар хийгддэг
учир арифметик командууд нь үндсэн команд биш юм. Дээрх
тодорхой командын цогц болон нэмэлт шинэ командууд нь
процессорын тооцоолох хүчин чадалд нэмэгддэггүй.
Throughput гэдэг нь нэгж хугацаанд процессорын гүйцэтгэж
чадах тооцооллын хэмжээ юм. Процессор нь нэг секундэд 50
сая командыг гүйцэтгэж чаддаг.
[www.cdeq.mn/hw200]
CISC
CISC ( Complex Instruction Set Computer ) процессор нь олон
командуудтай бөгөөд тэдгээр комплекс командуудын зарим
нь машин цикл бүрт олон ачаалагдаж ажилладаг. INTEL
процессорууд нь CISC архитектуртай. RISC ( Reduced
Instruction Set Computer ) процессор нь цөөх хэдэн командаас
тогтох бөгөөд тэдгээр командууд нь энгийн байдаг. Зарим
хэдэн команд нь CISC командтай эквивалент ажилладаг.
MIPS процессорууд нь RISC юм. Хэрвээ командууд бүх
зүйлүүд нь ижилхэн бол CISC нь маш өргөн throughput – тэй
байх болно. Ялангуяа том хэмжээтэй цахиуран чип нь олон
тооны комплекс командыг хэрэгжүүлэхэд хэрэглэгддэг. Энэ
нь өгөгдөл нь хол зайд зөөгдөж арай их хугацааг зарцуулах
болно. Тиймээс машин цикл нь удаан байх ба гүйцэтгэлийн
хугацаа нь илүү их болно.
[www.cdeq.mn/hw200]
CISC
Энгийн командууд нь нэг комплекс командтай тэнцдэг.
Харин энгийн команд нь олон дахин давтагдаж
гүйцэтгэгддэг. CISC – ийн сул тал нь комплекс командыг
хэрэглэх нь компайлерт хүнд байдаг. Энэ нь програмыг
компайлдахад олон дахин давтагдаж зөвхөн энгийн
командуудыг хэрэглэх машин програм руу хөрвүүлэгддэг.
Сүүлд Pentium чипт MMX (multi-media extension) командууд
нэмэгдсэн.
[www.cdeq.mn/hw200]
RISC
Цөөрүүлсэн командын цогцтой компьютер буюу RISC нь
цөөхөн командуудаас бүрддэг. RISC – ийн гол төсөөлөл нь
комплекс командыг бодвол цөөхөн командын цогцтой
байснаар команд нь хурдан биелэгдэж сайжрах давуу талтай.
Хэрвээ чип дээр цөөхөн командын цогцыг хэрэгжүүлснээр
чип нь илүү олон ерөнхий зориулалтын регистрт зориулсан
сул зайтай болох ба мөн чип дээр кэш санах ой, командын
pipeline багтаж хурд нэмэгддэг.
Сүүлийн арван жилд RISC чип нь CISC чипийн түрүүнд
байдаг байсан. Харин орчин үеийн CISC чип нь RISC – ийн
олон (cache, pipelining гэх мэт) онцлог шинжүүдийг агуулах
болсон. Мөн хуучин RISC чипийг бодвол илүү их throughput
буюу тооцоолох хэмжээ ихэссэн.
[www.cdeq.mn/hw200]
RISC
Хэрэглэгч болон оффисийн компьютерууд нь windows
програм хангамжийн хамт CISC чипийг хэрэглэх нь эвтэйхэн
болсон.
Embedded system буюу суурьлагдсан системд RISC – ийг
хэрэглэдэг.
[www.cdeq.mn/hw200]
Bug-free Software
Гүйцэтгэл нь start – аас эхлэх болно. Хэрвээ addu командаас
гүйцэтгэл нь эхлэх бол ямар байх вэ? Регистр $9 болон $8 нь
магадгүй ялгаатай тоог агуулах болно.
start нь эхний командын ажиллах хаягийг заах тэмдэгт хаяг
юм. Start + 8 нь 8 байтын хаягийг илэрхийлнэ. Jump команд
нь тэр хаягруу удирдлагыг шилжүүлнэ.
[www.cdeq.mn/hw200]
Bug-free Blocks
Кодын нэг блокын дунд хэсэгрүү удирдлага үсрэхэд bug бий
болно. Хэрвээ тэр блок нь эхлэлээс төгсгөл хүртэл
биелэгдэхээр бичигдсэн бол эхлэлийн цэгээсээ эхэлнэ эсвэл
алдаа үүсэх болно.
Энэ нь бүтэцлэгдсэн програмчлалын нэг
ойлголт юм. Кодын нэг блок нь нэг entry
point (гүйцэтгэл эхлэх цэг) ба нэг exit point
(төгсөх цэг) агуулах командуудын нэг
дарааллыг хэлнэ. Entry point болон exit point
нь эхлэх болон төгсөх нөхцөлүүдээр тодорхойлогдоно. Блок
зөв биелэгдэх үед гүйцэтгэл нь entry point – оос эхлэх ёстой
ба эхлэх нөхцөл үнэн болно. Харин гүйцэтгэл дуусах үед
гарах нөхцөл true болно.
[www.cdeq.mn/hw200]
Бүтцийн дүрэм 1 : Кодын блок
Хэрвээ эхлэх нөхцөл зөв, дуусах нөхцөл нь худал үед bug
блокт байх ёстой. Энэ нь хэрвээ биелэлт нь нэг блок руу
үсрэхээр бол худал байх болно.
Бүтэцлэгдсэн програмчлалын дүрэм 1 : Кодын блок нь
бүтэцлэгдсэн. Бүтцийн схемд нэг эхлэх цэгтэй, нэг дуусах
цэгтэй тэгш өнцөгт нь бүтэцлэгдсэн байх болно.
[www.cdeq.mn/hw200]
Дүрэм 1 – ийн хэрэгжүүлэлт
Дараалал дахь командууд нь нэг нэгээрээ биелэгдэнэ.
[www.cdeq.mn/hw200]
Дараалал
Паскаль, С, Java нь бүтэцлэгдсэн хэл юм. Эдгээр хэлэндэх
командуудын нэг блок нь нэг эхлэх болон төгсөх цэгтэй.
Блок 1 – ийн төгсөх нөхцөлүүд нь үнэн
бол блок 2 дох эхлэх нөхцөлүүдэд
шилжинэ. Ингэж хоёр блок дарааллын
дагуу биелэнэ.
[www.cdeq.mn/hw200]
Бүтцийн дүрэм 2 : Дараалал
Хэрвээ блок бүрийн төгсөх нөхцөл нь дараагийн блокын
эхлэлийг зааж байвал блокуудын дараалал нь зөв байх болно.
Програмын биелэлт нь блокын эхлэлийн цэгт нэвтэрч
блокын төгсгөлийн цэгт хүрнэ.
Бүтэцлэгдсэн програмчлалын дүрэм 2 :
Дараалсан хоёр эсвэл түүнээс дээш кодын
блок нь бүтэцлэгдсэн байх болно. Энэ дүрмийн
ассемблер хэлний хэрэгжүүлэлт нь эхний
дүрэмтэй ижилхэн байх болно.
[www.cdeq.mn/hw200]
Бүтцийн дүрэм 3 : Сэлгэлт
If – then – else нь заримдаа сэлгэлт гэж нэрлэгддэг. Учир нь
сэлгэх сонголт юм. Бүтэцлэгдсэн програмчлалд сонголт бүр
нь нэг кодын блок байдаг. Хэрвээ сэлгэлт нь бүтцийн
схемийн дагуу бол энд нэг эхлэлийн цэг, нэг төгсгөлийн цэг
байх болно.
Бүтэцлэгдсэн програмчлалын дүрэм 3 :
Хоёр кодын блокын сэлгэлт нь бүтэцлэгдсэн
байх болно.
Сэлгэлтийн бүтцийн эхлэлийн нөхцөлийн
жишээ нь : регистр $8 нь тэмдэгтэй бүхэл
тоог агуулдаг. Гарах нөхцөл нь : регистр $8 нь
тэмдэгтэй бүхэл тооны абсолют утга агуулах
болно.
[www.cdeq.mn/hw200]
Сэлгэлтийн хэрэгжүүлэлт
Салаалах бүтэц
хэрэглэгдэнэ.
нь
гарах
нөхцөлийг
[www.cdeq.mn/hw200]
биелүүлэхэд
Бүтцийн дүрэм 4 : Давталт
Давталт (while – loop) нь дүрмийн дагуу тодорхойлогдох
болно. Энд нэг эхлэх цэг болон нэг төгсөх цэгтэй байх болно.
Эхлэлийн нөхцөл нь хангагдсан байх бөгөөд төгсөх нөхцөл
нь биелэгдэх боломжтой байх болно. Мөн кодын гаднах өөр
цэгээс бүтэцрүү үсрэлт байхгүй.
Бүтэцлэгдсэн програмчлалын дүрэм 4 :
Нэг кодын блокын давталт нь
бүтэцлэгдсэн байдаг.
[www.cdeq.mn/hw200]
Кодын блок
Доорх бүх бүтцүүдийн хувьд : эхлэлийн цэг нь оройд нь,
төгсгөлийн цэг нь доор байрлах болно. Мөн бүтцийн гадна
тал руу үсрэлт байхгүй. Бүтэц бүр нь кодын блок бүрийг
илэрхийлнэ.
[www.cdeq.mn/hw200]
Бүтцийн дүрэм 5 : Nesting structures
Бүтцийн схемийн дагуу кодын блок бүрийг бүтцүүдийн аль
нэгрүү өргөтгөж болно.
Бүтэцлэгдсэн програмчлалын дүрэм 5 : Нэг эхлэлийн цэг
болон нэг төгсгөлийн цэгтэй бүтэц нь нэг кодын блоктой
эквивалент байх болно.
[www.cdeq.mn/hw200]
Top – down дизайн
Абсолют утгыг олох нь Top – down бүтэцлэгдсэн дизайны
нэг жишээ юм. Энэ дизайны
хэрэглээ нь нэг програмын
блок эхлэх ба дараа нь дараалал,
сэлгэлт, эсвэл давталтын бүтцийн
блок байрлах болно.
Жишээ нь хэрэглэгчийн
оруулсан бүхэл тооны
нийлбэрийг олох програмын
дизайныг гаргая. Эхний дизайн нь :
[www.cdeq.mn/hw200]
Давталт болон салаалах жишээ
Энэ сэдвээр давталт болон салаалах үйлдлийн зураг
хавсаргаж тайлбарласан бүтэцлэгдсэн програмчлалын хоёр
жишээ програмыг үзэх болно. Ассемблер хэлэнд бүхэл
тооны массив, тэмдэгт бичвэрийг тодорхойлох болно.
Агуулга :
[www.cdeq.mn/hw200]
Null-terminated String
Бичвэр нь ASCII тэмдэгтүүдийн дараалал бөгөөд нэг нь нэг
байт байдаг. Бичвэр нь С болон С++ хэлний хувьд ерөнхий
байх ба энд ассемблер хэлэндэх зарлагааг үзүүлье.
Тэмдэгтүүд нь санах ойд ‘T’ – ээс эхлэн дарааллаараа
байрлах болно. Зурагт үүнийг үзүүлэв. Хоосон байт нь ASCII
хоосон зай (0x20) байх болно. Сүүлийн байт нь 0х00 байх
буюу ташуу зураасаар үзүүлсэн.
Харин одоо Windows PC – д ажиллаж буй SPIM програмын
data display – г үзүүлэв.
[www.cdeq.mn/hw200]
Null-terminated String
space буюу хоосон зай (0x20) – г ‘_’ – ээр үзүүлсэн ба энэ null
байтын хаяг нь 0x1000001B
[www.cdeq.mn/hw200]
Бичвэрийн урт
Бичвэрийн урт нь null – ыг тоолохгүй ба тэмдэгтүүдийн
тоогоор тодорхойлогдоно. Уртыг тооцоолохдоо 0 – ээс эхлэн
тоолно. Null байт биш л бол тоолуур нэгээр нэмэгдэх ба null
тааралдвал тоололтыг зогсоох болно. Энэ процедурыг
үзүүлсэн бүтцийн схем нь бүтэцлэгдсэн. Програмын
бүдүүвчийг үзүүлвэл :
[www.cdeq.mn/hw200]
Бичвэрийн урт
[www.cdeq.mn/hw200]
Program continued
Диаграмын дараагийн хэсэг
нь "point at the first
character" гэж нэрлэгдэх
болно. Одоо өгөгдлийн хэсэг
нь 0x10000000 хаягаас
эхлэдэг. Үүний эхний 16 бит
нь 0x1000 байна. Үүнийг lui
команд ашиглан бааз
регистрт ачаалах болно.
[www.cdeq.mn/hw200]
Давталтын бие
lbu команд дахь байтын хаяг
нь шилжилт + $9 өөр
тооцоологдох болно. Lbu
команд нь регистр $10 – ын
бага байтад тэмдгийг ачаалах
болно. Эхний гурван байт нь
тэг байна. Beq команд нь
регистр нь тэг байхыг
шалгана.
[www.cdeq.mn/hw200]
Complete Program
[www.cdeq.mn/hw200]
Бүхэл тоон массив
Бүхэл тоон массив нь санах ойн дараалсан 32 битийн бүхэл
тоон дараалал юм. Массив дахь бүхэл тоонуудын тоо нь
санах ойд хадгалагдах утга байх болно.
Ассемблер хэлэнд бүхэл тоон массивыг зарлахдаа бүхэл
тоонуудыг таслалаар тусгаарлан .word директивийг
ашигладаг.
.word директив нь зэрэгцүүлсэн байрлалд өгөгдлийг хийх
болно.
[www.cdeq.mn/hw200]
Жишээ програм : массивын нийлбэр
Жишээ програмд бүхэл тоон массивыг хэрэглэнэ. Массивын
урт өгөгдөх ба програм нь 3 нийлбэрийг олно :
Магадгүй энэ жишээг өмнө нь Java болон C хэл дээр хийж
байсан байх.
[www.cdeq.mn/hw200]
Бүтцийн схем
Бүтцийн схем нь ямар ч хэлний хувьд ижилхэн байх болно.
[www.cdeq.mn/hw200]
Массивын хэмжээг ачаалах
Массивын хэмжээг авах хэрэгтэй. Хэмжээ нь өгөгдлийн
хэсгийн (data section) эхний 32 бит байна. 0x10000000
хаягнаас өгөгдлийн хэсэг эхлэх ба бааз регистрт хаягийн
эхний хагасыг
ачаалах болно.
Дараа нь
хэмжээг
регистр $15 – д
ачаалах болно.
[www.cdeq.mn/hw200]
Building the Loop
beq команд нь массивын төгсгөлд count очвол давталтаас
гарч салаалахад хэрэглэгдэж байгаа.
[www.cdeq.mn/hw200]
Add Entry to Sum
Давталтын
төгсгөлд count
нь нэгээр
нэмэгдэж байгаа.
Мөн заагч
дөрвөөр ихсэж
байгаа. Харин
давталтын биеийн
голд массивын
элементийг авч
бүх бүхэл
тоонуудын
нийлбэр дээр нэмж [www.cdeq.mn/hw200]
байгаа.
Is the Entry Negative?
[www.cdeq.mn/hw200]
Complete Program
[www.cdeq.mn/hw200]