Transcript HW200_8

Монгол Улсын Шинжлэх Ухаан Технологийн Их
Сургууль
Компьютерийн зохион
байгуулалт, ассемблер
хэл
Код : HW200
Улирал : Хавар 2009
Багш : С. Байгалтөгс /проф, доктор/
Сэдэв 8 :Үсрэх болон салаалах командууд
[www.cdeq.mn/hw200]
Үсрэх болон салаалах командууд
Компьютерийн хүчин чадал нь өгөгдлөөс хамаарч үйлдлийг
өөрчлөх болон үйлдэлээ дахин давтах зэрэг чадвараас
хамаардаг.
Орчин үеийн програмчлалын хэл нь бүтцийн удирдлагыг
хэрэглэн тэдгээрийг шийддэг болсон. Үйлдэл давтахыг while
бүтцээр ба удирдлага сонгох замыг if – then – else бүтцээр
хийдэг. Харин процессорын машин команд болон ассемблер
хэлэнд эдгээр бүтэц байдаггүй. Тиймээс ассемблер хэл дээр
програмаа бичихдээ эдгээр бүтцийг үндсэн ассемлер
командуудыг ашиглан бий болгож ашигладаг.
Эдгээр үндсэн командууд нь jump(үсрэх) болон нөхцөл
салаалах командууд юм.
[www.cdeq.mn/hw200]
Үсрэх болон салаалах командууд


Агуулга :
Үсрэх команд
- j команд (jump – үсрэх)
Нөхцөлт салаалах команд
- beq команд (тэнцүү бол)
- bne команд (тэнцүү биш бол)
[www.cdeq.mn/hw200]
Машин цикл (эргэн санавал)
Програм ажиллаж байх явцад түүнд ашиглагдах өгөгдлүүд
нь үндсэн санах ойд байрладаг. Нэг командын хаяг нь 4 байт
командын эхний байтын хаяг байдаг. Машин цикл бүр нэг
машин командыг биелүүлдэг.
Машин цикл эхэнд PC буюу program counter нь санах ойгоос
биелэх командын хаягийг барин агуулж байдаг.
Ингээд команд нь процессороор орон гүйцэтгэлд
бэлэн болно. Машин циклийн дунд үед PC нь 4 – өөр
нэмэгдэж командыг заах болно. Ингэж барьсан
командаа гүйцэтгэж машин цикл нь автоматаар
дарааллын дагуу командыг гүйцэтгэх болно.
[www.cdeq.mn/hw200]
Үргэлжлэл
Харин jump команд биелэгдэх үед Program counter – т шинэ
хаяг орох бөгөөд ингэснээр машин цикл эхнээсээ эхлэн
(зурагт үзүүлсэн) шинэ хаягандахь командыг барих болно.
Ингэж командыг гүйцэтгэхийн оронд санах ой дох jump
командын дагуу процессор нь санах ой дох өөр хаягандахь
командыг биелүүлдэг. PC өөрчлөгдөхийн өмнө санах ой дох
jump командын дагуу команд нь биелэгдэх болно. Команд нь
биелэгдсний дараа үсэрсэн хаягнаас эхлэн дараагийн команд
нь биелэгддэг. Санах ой дох jump командын дагуу өөр
хаягандахь командруу үсрэхийг салаалах дэлээ (delay) гэж
нэрлэдэг. Энэ дэлээ нь MIPS – ын pipeline – аас шалтгаалдаг.
Энгийн үед командууд нь дарааллын дагуу биелэгддэг.
Машин цикл нь эдгээр командыг гүйцэтгэхээр дуудах үед
гүйцэтгэл нь альхэдийн эхлэсэн байдаг. Үүнийг командын
pipe гэдэг.
[www.cdeq.mn/hw200]
PC – ын өөрчлөлт
Энд командын дарааллыг үзүүлжээ. “load” болон “add” нь
энгийн команд бөгөөд “jump” команд нь PC – т орох хаягийг
үзүүлжээ. Сүүлийн команд no – op нь Program counter
өөрчлөгдөх хугацааг олгох салаалах дэлээг нөхөж байна.
Програм эхлэхэд дараах 4 команд нь төгсгөлгүй давтагдах
болно.
Давталтын бүтэц нь
jump командаас
бүтэж байна. Энэ
jump командын
зорилго нь PC – т
0x00400000 хаягийг
хийх юм.
[www.cdeq.mn/hw200]
Дадлага
Энд өөр програмын схемийг үзүүлжээ. Командууд нь
дараалан биелэгдэх ба эдгээрт анхаарал хандуулалгүй jump
команд болон зорилгыг нь анхаарах хэрэгтэй.
jump командын үсрэх хаяг 0x00450000
[www.cdeq.mn/hw200]
Jump команд
Өмнө үзсэнээр jump команд нь program counter – т 32 битийн
хаягийг ачаалж байна. Ингэхээр 32 битийн команд нь хэрхэн
32 битийн хаягийг заах вэ? Зарим командын битүүд нь
зөвхөн opcode – д хэрэглэгддэг. Энэ нь jump командын
ассемблер хэлний хэлбэр юм.
Командын машин хэлний бичиглэл нь :
Энэ командад 26 битийн хаяг агуулагдаж байна. Харин энэ
үсрэх 26 битийн хаяг нь 32 бит хаягруу хувирдаг.
[www.cdeq.mn/hw200]
Jump команд
Энэ нь үсрэх команд биелэгдэх ажиллагааны үед хийгддэг.
Командууд нь үргэлж тухайн хаягнаас эхлэх бөгөөд 32 бит
командын хаягийн хамгийн бага 2 бит нь үргэлж “00”
байдаг. 26 бит хаяг нь зүүн тийшээ 2 бит шилжин үр дүнд нь
28 бит хаяг бий болно. Харин шилжүүлэх үйлдлийн дараа
хаягийн ахлах 4 битийг нөхөх хэрэгтэй болох бөгөөд энэ 4
бит нь PC – аас ирэх болно. Энэ нь 28 бит хаягийн ахлах
оронг төгсгөж 32 бит хаяг болох болно.
Жишээ нь дараагийн хуудсанд 0x5B145188 хаягруу үсрэх
командын машин хэлийг үзүүлжээ. Тухайн команд нь санах
ойн 0x56767250 хаягт байрших болно.
[www.cdeq.mn/hw200]
Jump команд
[www.cdeq.mn/hw200]
Jump команд
Jump болон салаалах команд нь ижилхэн, хаягруу хандах
болно. Jump командын үсрэх хаяг болон jump командын
дараагийн команд нь санах ойд хамт байж болно. Үрсэх
хаягийн эхний 4 – н бит нь ижилхэн байдаг.
Компайлер нь source program – ыг машин хэлрүү хөрвүүлэх
үед хаягийг анхаарах болно. Jump команд нь 32 битийн
хаяглалын орон зай доторх дурын байрлал руу үсэрдэггүй.
Дараах хязгаар доторх хаягруу үсэрч болдог.
Энд wxyz нь PC – ын ахлах 4 битийг илэрхийлж байна.
[www.cdeq.mn/hw200]
Jump команд(дадлага)
Дараах зурагт jump командыг хэрхэн ашигладгийг үзүүлжээ.
Jump командаас бусад командууд нь операндгүй бөгөөд
програмын эхний команд руу jump команд нь үсрэх болно.
Сүүлийн команд нь дэлээ болж байна.
j машин командын ахлах 6 – н бит нь опкод.
[www.cdeq.mn/hw200]
Тэмдэгт хаяг
Jump командын 26 битийн талбар нь 32 битийн хаягийг
илэрхийлдэг. Харин энэ нь бодож гаргахад төвөгтэй байдаг.
Хэрвээ машин хэлдээр програмчлах байвал үүнийг гараараа
хийх болно. Харин одоо үүнийг ассемблер хийх болно.
Дараах програмыг харуулвал :
main тэмдэгт хаяг нь эхний командын
хаягийг илэрхийлнэ. J команд нь машин
командын 26 битийг тооцон удирдлага
main – рүү шилжих болно. Регистр $8-ыг
нэгээр нэмэгдүүлж байгаа команд дэлээ
болж өгөх болно.
[www.cdeq.mn/hw200]
Програмын ажиллагаа
Програмын SPIM дах хэлбэрийг харуулжээ. Ажлуулахдаа
мэдээж PC – ын утгыг 0x400000 гэж тохируулна.
[www.cdeq.mn/hw200]
Нөхцөл шалгах команд
Нөхцөл шалгах команд нь хэрвээ нөхцөл нь үнэн бол шинэ
хаяг руу салаалдаг. Нөхцөл нь хоёр регистрийн утгыг
харьцуулж ажилладаг. Энд beq командыг харуулав.
Хоёр регистрийн битүүдийг харьцуулах бөгөөд хэрвээ
битүүд нь ижилхэн бол PC нь салаалах хаягийн утгаар
өөрчлөгдөнө.
[www.cdeq.mn/hw200]
Ifs ба whiles
Нөхцөл шалгах команд нь давталт болон нөхцөл салаалах
үйлдлийг хоёуланг нь хэрэгжүүлэхэд хэрэглэгддэг. Блок
диаграмаар мөн үзүүлжээ.
Мөн ассемблер хэлдээр :
bne команд нь :
True & false
True ба false нь ассемблер хэл дээр нөхцөл салаалах болон
jump командад хэрэглэгддэг. Дараах жишээг харцгаая.
Ассемблер командуудын үндсэн удирдлагын бүтцийг
үзүүлжээ.
Хэрвээ үнэн бол эхний хаягруу эсвэл худал бол дараагийн
тэмдэгт хаягруу үсрэх болно. (энэ нь java болон C хэлдээрх
if-then-else юм.)
[www.cdeq.mn/hw200]
Абсолют утга
Дараах ассемблер
кодыг харъя.Энэ нь
дээд түвшний
хэлдээрх бүтцийг
хэрэгжүүлсэн бөгөөд
блок диаграмын
дагуух энэ
програм нь “А”
тэмдэгт хаяг дахь
утгын абсолют утгыг
тооцоолох болно.
[www.cdeq.mn/hw200]
Абсолют утга
“А” нь 0x10000000 хаягнаас эхлэх болно.
Блок диаграм :
Тэмдгийн битийг шилжүүлэх
“А” нь сөрөг эсэхийг шийдэхдээ тэмдгийн бит нь 1 байна уу
гэж шалгах болно. Үүнийг хийхдээ логик шилжүүлэх
үйлдлээр тэмдгийн битийг регистрийн 0 битийн байрлалд
шилжүүлэх болно.
Регистр нь 0 байвал “А”
нь эерэг байх болно.
[www.cdeq.mn/hw200]
Store -A
Тэмдгийн бит нь баруун тийшээ 31 бит шилжинэ. Регистр $9
– ын бага битэд орох бөгөөд 0 байна эсэхийг шалгана.
[www.cdeq.mn/hw200]
Бүрэн програм нь
[www.cdeq.mn/hw200]
Set Instructions
Энэ сэдвээр хоёр нэмэлт салаалах команд болон нөхцөлт set
командыг үзэх болно. Set командууд нь нөхцөл нь true эсвэл
false эсэхээс хамааран регистрт 1 эсвэл 0 – ыг тавих болно.
Агуулга :
[www.cdeq.mn/hw200]
Bltz & bgez
bltz болон bgez команд нь регистрийг 0 – той харьцуулдаг.
[www.cdeq.mn/hw200]
Set on Less Than
Set командууд нь удирдлагын урсгалыг өөрчлөдөг бөгөөд
регистр 1 эсвэл 0 утгыг тавьдаг. Slt команд нь хоёртын
гүйцээлтийг хэрэглэдэг.
Харин sltu команд нь тэмдэггүй бүхэл тоог хэрэглэдэг.
[www.cdeq.mn/hw200]
Set on Less Than Immediate
Энд операнд регистрийг шууд утгатай харьцуулах хоёр
командыг үзүүлжээ. Slti нь хоёртын гүйцээлт ашиглах болно.
sltiu нь тэмдэггүй бүхэл тоог хэрэглэдэг.
[www.cdeq.mn/hw200]
Температурын тестер
Одоо температурын тестерийн удирдлагын програмыг бичье.
Температурийн хязгаар нь цельсийн 30 – 55 градус байх ба
температурийн мэдрүүрийн төхөөрөмж нь температурыг
регистр $2 – т орох болно.
Тус програм нь регистр $2 дох тэмдэггүй бүхэл
тоог тус хязгаарт байгааг шалгах ба хэрвээ хязгаарт
байвал регистр $3 – т 1 – ийг тавина, харин эсрэг
тохиолдолд 0 – ыг тавина.
[www.cdeq.mn/hw200]
Програмын эхлэл
[www.cdeq.mn/hw200]
Програмын эхлэл
Set командад хэрэглэгдэх шууд операнд нь “55 – тай тэнцүү
эсвэл бага” бол 56 болж өөрчлөгдөх болно.
[www.cdeq.mn/hw200]
Complete Program
[www.cdeq.mn/hw200]
Delay Slot Bug
Програм дахь операндгүй команд нь эхний delay slot – ыг
нөхөж байгаа.
Дараагийн операндгүй команд нь чухал бөгөөд хэрвээ
байхгүй бол дараагийн команд болох ori нь 0 төлвийг тавих
болно.
[www.cdeq.mn/hw200]
Давталтын тоолуур



Програмын давталтын ерөнхий хэлбэр нь эхний утгаас эхлэн
хязгаарын утга хүртэл тоолон удирдагдах болно. Үүнийг
давталтын тоолуур гэж нэрлэх бөгөөд тоолуурын утга нь
давталтын удирдлагын хувьсагч байх болно. Давталт нь
нөхцөл шалгах, үсрэх зэрэг командуудаар хийгдэнэ.
Давталт нь 3 хэсгээс бүрдэнэ :
Counter инициализаци хийгдэнэ
Давталтын төгсгөлийг шалгана
Counter нэгээр нэмэгдэнэ
[www.cdeq.mn/hw200]
Ассемблер хэлний давталт
[www.cdeq.mn/hw200]
Complete Loop
Энд давталтыг delay slot – той хамт хэрэглэсэн. endLp нь
delay slot биш бөгөөд SPIM – дахь програмын ажиллагааг
эвтэйхэн болгодог.
[www.cdeq.mn/hw200]
Summing Program
[www.cdeq.mn/hw200]