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 =
 Фарангет цельсийн хөрвүүлэгч програмыг
хөвөгч таслалтай тоог ашиглан бод.
