Transcript Lab10
LAB 10 MIPS ПРОЦЕССОРЫН ХӨВӨГЧ ТАСЛАЛТАЙ ТООН ДЭЭРХ АРИФМЕТИК ҮЙЛДЛҮҮД 32 болон 64 битийн MIPS процессорууд хөвөгч таслалтай тооны IEEE 754 стандартыг баримталдаг. Бид энэ удаагийн ажлаар зөвхөн 32 битийн командуудыг судлах болно. 64 битийн хувилбар нь 32 биттэйгээ төстэй байдаг. ЛАБОРАТОРЫН АЖЛЫН ЗОРИЛГО Хөвөгч таслалтай тооны регистрүүд Хөвөгч таслалтай тооны регистрт ачаалах, хадгалах Дан болон давхар нарийвчлалтай тооны арифметик үйлдлүүд Өгөгдөл дамжуулах командууд Хөвөгч таслалтай тоог унших, бичих SPIM ПРОГРАМЫН ТОХИРГОО Allow SPIM pseudoinstructions Disable branch delays Disable load delays АСУУЛТ 64 битийн (давхар нарийвчлалтай) хөвөгч таслалтай тоонууд 32 битийн (дан нарийвчлалтай) хөвөгч таслалтай тооноос илүү. Юугаараа илүү вэ? Илүү нарийвчлалтай? Илүү өргөн мужид тоог дүрслэнэ? Аль аль нь? ХАРИУЛТ Аль аль нь. Давхар нарийвлалтай тоонд илүү олон битээр экспонент (дүрслэх тооны мужийн өргөн ихсэнэ), мантис (дүрслэх тооны нарийвчлал ихсэнэ) илэрхийлнэ. MIPS ХӨВӨГЧ ТАСЛАЛТАЙ ТОО MIPS процессорын хөвөгч таслалтай тоон дээрх үйлдлүүд анхандаа coprocessor 1 эсвэл FPA (Floating Point Accelerator) гэж нэрлэгддэг MIPS процессорын гадна байрлах тусгай чип дээр хийгддэг байжээ. Харин сүүлийн үеийн MIPS процессорууд өөрийн үндсэн чип дотроо хөвөгч таслалтай тоон дээрх үйлдлүүдийг хийдэг логик байгууламжтай үйлдвэрлэгддэг болсон. Хэдийгээр MIPS процессор дотроо хөвөгч таслалтай тооны үйлдлийг хийдэг болсон ч хөвөгч таслалтай тоотой ажилладаг командууд MIPS процессорын гадна орших чиптэй харьцаж ажиллаж байгаа мэтээр ашиглагддаг. MIPS процессорт 32 ширхэг дан нарийвчлалтай (32 бит) хөвөгч таслалтай тооны регистр байдаг. Регистрүүдийн нэр нь $f0 - $f31 $f0 регистр $zero регистр шиг тусгай зориулалтын биш. Тэгээс ялгаатай битийн төлвүүдийг хадгалж болно. Дан нарийвчлалтай хөвөгч таслалтай тооны ачаалах, хадгалах, арифметик, болон бусад үйлдлүүд эдгээр регистрүүд дээр хийгдэнэ. АСУУЛТ Яагаад $f0 регистр $0 регистр шиг зөвхөн тэгүүдийг агуулдаг байхаар хатуу хийгдээгүй бэ? ХАРИУЛТ Хөвөгч таслалтай тэг нь бүхэл тооны тэг –тэй адилхан 32 бит тэгүүдээр дүрслэгддэг тул $0 регистр бүхэл тооны тэгтэй адилхан хөвөгч таслалтай тооны тэгийн үүргийг ч адилхан биелүүлж чадна. ДАВХАР НАРИЙВЧЛАЛ MIPS процессорт 64 битийн давхар нарийвчлалтай хөвөгч таслалтай тооны үйлдлийг гүйцэтгэх техник хангамж байдаг. Үүний тулд дан нарийвчлалтай 32 битийн регистрүүдийн хосыг ашиглан үйлдэлд оролцох операндуудыг хадгалдаг. Нийт 16 хос регистрүүд байх ба тэдгээрийг $f0, $f2, - , $f30 гэж нэрлэнэ. Зөвхөн сондгой дугаартай регистрүүд давхар нарийвчлалтай тооны командад бичигдэх ба тэгш дугаартай регистрүүд автоматаар үйлдэлд оролцоно. Зарим MIPS процессорууд зөвхөн тэгш дугаартай регистрүүд ($f0, $f2,…) –ийг дан нарийвчлалтай командад хэрэглэгдэхийг зөвшөөрдөг. Харин SPIM симуляторын хувьд бүх 32 регистрүүдийг командад оролцохыг зөвшөөрдөг. АСУУЛТ Санах ойгоос бүхэл тоон өгөгдлийг MIPS процессорын ерөнхий зориулалтын регистр рүү ачаалах командын хойно нэмэлт машин цикл саатуулах load delay дагалдаж явдаг билээ. Тэгвэл хөвөгч цэгтэй тоог санах ойгоос ачаалах хөвөгч таслалтай тоог регистрт ачаалах командын дараа load delay байх шаардлагатай юу? ХАРИУЛТ Тийм. ДАН НАРИЙВЧЛАЛТАЙ ТООГ АЧААЛАХ Бодит техник хангамжийн хувьд ачаалах команд биелэсний дараа өгөгдөл санах ойгоос регистрт орж ирэхэд тодорхой хугацаа шаардагддаг. Энэ хугацааг load delay гэж нэрлэгдэх ачаалах командын дараа биелэх командын биелэх хугацаагаар хүлээдэг. Харин SPIM програмын хувьд load delay –г тооцохгүйгээр програмаа бичиж ажиллуулж болно. Дараах псевдо командаар санах ойгоос хөвөгч таслалтай бутархай тоог регистрт ачаалж болно. l.s fd,addr # load register fd from addr # (pseudoinstruction) Энэ команд нь санах ойн addr гэдэг хаягнаас өгөгдлийг хөвөг таслалтай тооны $fd (энд d нь 0, 1 , 2, ...,31 ) –т ачаална. ДАН НАРИЙВЧЛАЛТАЙ ТООГ ХАДГАЛАХ Зарим тохиолдолд хөвөгч таслалтай тооны регистрүүдийг бүхэл тооны регистрийн утгыг түр хадгалуулахаар ашиглаж болдог. Тухайлбал бүхэл тооны регистрийн утгыг санах ойд түр хадгалахын оронд програмд хэрэглэгдэхгүй байгаа хөвөгч таслалтай тооны регистрт түр хадгалж болно. Дараах команд нь дан нарийвчлалтай тооны регистрийн утгыг санах ойд хадгална. s.s fd,addr # store register fd to addr # (pseudoinstruction) fd регистрийн утгыг addr гэсэн санах ойд хадгална. Аль ч командын хувьд addr гэдэг хаяг нь санах ойн симбол хаяг, эсвэл индекс хаяг байж болно. АСУУЛТ Яагаад бүхэл тоон утгыг хөвөгч таслалтай тооны регистр түр хадгалахыг хүсээд байна вэ? ХАРИУЛТ Ерөнхий зориулалтын регистрийг түр чөлөөлөн програмд өөр зориулалтаар дахин хэрэглэхийн тулд. ХӨВӨГЧ ЦЭГТЭЙ ТООГ ШУУД АЧААЛАХ Дараах команд нь хөвөгч цэгтэй тоог хөвөгч регистрт шууд ачаална. li.s fd,val # load register $fd with val # (pseudoinstruction) ЖИШЭЭ КООД li.s $f1,1.0 i.s $f2,2.0 li.s $f10,1.0e-5 # $f1 = constant 1.0 # $f2 = constant 2.0 # $f10 = 0.00001 АСУУЛТ Өмнөх жишээний эхний командыг li.s $f1,1 бичиж болох уу? ХАРИУЛТ Болохгүй. Тогтмол тоонд аравтын таслал шаардлагатай. ЖИШЭЭ ПРОГРАМ Дараах програм хөвөгч таслалтай valA ба valB тоонуудын утгыг хооронд нь солино. АСУУЛТ Ерөнхий зориулалтын регистр хөвөгч таслалтай тоог хадгалж чадах уу? ХАРИУЛТ Тийм. Ерөнхий зориулалтын ямар ч 32 битийн төлвийг хадгалж чадна. ЖИШЭЭ ПРОГРАМ 2 Дараах програм нь өмнөх жишээ програмын адилаар хөвөгч таслалтай valA ба valB хувьсагчуудын утгыг ерөнхий зориулалтын регистрүүдээр дамжуулан солих болно. АСУУЛТ SPIM –ын бүхэл тоог дэлгэцэнд хэвлэх дэд програмыг хэрэглэн хөвөгч таслалтай тоог дэлгэцэнд хэвлэж болох уу? ХАРИУЛТ Үгүй. Хэвлэх дэд програм зөвхөн 32 бит хоёрын гүйцээлт дүрслэлийг л зөв хэвлэнэ. ХӨВӨГЧ ТАСЛАЛТАЙ ТООНЫ СЕРВИСҮҮД Хөвөгч цэгтэй тоог дэлгэцэнд хэвлэхийн тулд сервис 2(дан нарийвчлалтай үед), эсвэл сервис 3 (давхар нарийвчлалтай үед) –ийг хэрэглэнэ. Хөвөгч таслалтай тоог гарнаас уншихдаа сервис 6(дан нарийвчлалтай үед), эсвэл сервис 7 (давхар нарийвчлалтай үед) –ийг хэрэглэнэ. АСУУЛТ Syscall командын урд ямар регистрт сервисийн дугаарыг ачаалдаг вэ? ХАРИУЛТ $v0 регистрт сервисийн дугаарыг ачаалдаг. Тухайн сервисээс хамааран сервисийн аргументыг өөр өөр регистрүүдэд хадгалдаг. Дараах жишээ нь хөвөгч таслалтай тоог хэвлэх ба ингэхдээ эхний удаад сервис 2 –ыг ашиглан зөв хийнэ. Харин дараа бүхэл тоог хэвлэх сервис 1 –ыг ашиглан хийнэ. Дээрх 2 тохиолдолд програмын үр дүн ямар байхыг сонирхоцгооё. АСУУЛТ Дээрх програмын алдааг ассемблер илрүүлж чадах уу? ХАРИУЛТ Ассемблер дээрх алдааг илрүүлж чадахгүй. Харин програмын үр дүн худал байна. ТӨРӨЛ ШАЛГАЛТ Дээрх төрлийн алдаанууд C хэлээр програм бичиж байх үед ихэнхдээ тохиолдолд. Учир нь зарим C хөрвүүлэгчид төрөл шалгалтыг сул хийдэгтэй холбоотой юм. Тухайлбал printf функц руу буруу төрөлтэй аргумент дамжуулах тохиолдолд иймэрхүү төрлийн алдаа гарч болно. Харин Java гэх зэрэг зарим програмчлалын хэлүүдэд төрөлт шалгалт маш хүчтэй байдаг. Ассемблер хэл нь төрөл шалгалтын хувьд маш сул юм. ӨМНӨХ ЖИШЭЭНИЙ ҮР ДҮН АСУУЛТ Өмнөх програмын үр дүн зөв үү? Өмнөх хуудсыг хар. ХАРИУЛТ Магадгүй буруу. Програмын эх код -8.32 гэсэн тоог дэлгэц рүү хэвлэж байхад дэлгэцэнд 8.31999969 тоо хэвлэгдсэн. АСУУЛТ Java –ийн float төрөл хичнээн оронтой вэ? C хэлний float төрөл хичнээн оронтой вэ? ХАРИУЛТ Аль аль нь MIPS –тэй адилхан 7 эсвэл 8 оронгоор илэрхийлдэг. Эд бүгд адилхан IEEE стандартыг мөрддөг. Гэвч зарим C хөрвүүлэгчид хөвөгч цэгтэй тоог хэрэглээнээс нь хамааруулан өөр өөр тооны битээр дүрслэх боломж олгодог. ДАН НАРИЙВЧЛАЛТАЙ АРИФМЕТИК Энд зарим нэг хөвөгч таслалтай тооны арифметик үйлдлүүдийг авч үзье. Эдгээр командууд бүрийн цаана нэг машины команд харгалзана. Мөн энд яригдах команд бүрт харгалзах давхар нарийвчлалтай тооны командууд байдаг. Жишээлбэл add.s командад харгалзах давхар нарийвчлалтай тооны команд нь add.d команд юм. Энд abs.s fd,fs команд нь $fs регистр дэх тооны абсолютийг $fd регистрт ачаална. АСУУЛТ ABS.S команд ямар зарчмаар 32 бит хөвөгч таслалтай тооны абсолютыг боддог вэ? ХАРИУЛТ ABS.S команд нь тэмдгийн бит, 31-р бит, -ийг тэглэдэг. Үлдсэн бүх битүүдийг хэвээр үлдэнэ. ӨГӨГДӨЛ ДАМЖУУЛАХ Процессорын регистрүүдийн утгыг хооронд дамжуулдаг 3 команд байдаг. Команд Үйлдэл mov.s fd, fs $fs регистрийн утгыг $fd регистр хуулна. mtc1 rs, fd move to coprocessor 1 Ерөнхий регистр $rs –ийн 32 бит утгыг $fd регистрт хуулна. Төрөл хувиргалт хийгдэхгүй. mfc1 rd, fs move from coprocessor 1 Хөвөгч таслалтай 32 битийн регистр $fs – ийн утгыг ерөнхий регистр $rd –руу хуулна. Төрөл хувиргалт хийгдэхгүй. АСУУЛТ Neg.s fd,fs команд $fs регистрийн утгыг сөрөг болгоод $fd регистрт хадгалдаг. Уг команд энэ үйлдлийг яаж гүйцэтгэдэг вэ? ХАРИУЛТ neg.s fd,fs команд $fs регистр дэх тооны тэмдгийн битийг нэглээд үр дүнг $fd регистр рүү хадгалдаг. ЖИШЭЭ ПРОГРАМ Хэрэглэгчийн оруулсан х утгын дагуу ax^2 + bx + c дараах илэрхийллийг бодно. ҮР ДҮН ЛАБОРАТОРЫН ДААЛГАВАР 0,56 + 3,54 = 5.84565 + 55.64 = Фарангет цельсийн хөрвүүлэгч програмыг хөвөгч таслалтай тоог ашиглан бод.