Компьютерын зохион байгуулалт (Computer architecture) гэж компьютерын дотоод эд ангиудын харилцан хамаарлыг хэлнэ.
Жинхэнэ ассемблер хэл (Pure assembly language) нь компьютерын процессор дээр хийгддэг үйлдлүүдээр програм бичдэг хэл юм. Жинхэнэ ассемблер хэлийг төдийлөн хэрэглэдэггүй бөгөөд програмчлахад арай хялбар болгосон ассемблер хэлээ өргөтгөсөн (extended) ассемблер хэл гэдэг.
Ассемблер хэл нь цэвэр процессороос хамаарсан хэл юм. Компьютерын дотоод зохион байгуулалт, командуудаа (instructions) мэдэхгүй бол програмчлах боломжгүй юм.
Процессоруудын зохион байгуулалт
Процессорын зохион байгуулалт гэж процессорын дотоод бүтэц, тэдгээрийн харилцан хамаарлыг хэлнэ.
Процессорын бүл (Processor family) бүр өөрийн гэсэн зохион байгуулалттай. Энэ зохион байгуулалт бүрд нь тохирсон ассемблер хэл гэж байдаг. Өөрөөр хэлбэл процессор бүр өөрийн гэсэн ассемблер хэлтэй гэсэн үг. Тиймээс ассемблер хэл сурна гэдэг нь тухай процессорынхоо дотоод зохион байгуулалтыг ойлгох шаардлагатай.
MIPS процессор
MIPS процессорын зохион байгуулалт нь сайн хийгдсэн. 1985 онд анхны MIPS процессор гарсан байдаг. MIPS нь компьютер хэрхэн ажиллаж байгааг ойлгоход их дөхөм процессор юм.
Дээд түвшний програмчлалын хэлээр програмчлалын хэлээр програмчлахад компьютерын зохион байгуулалтыг мэдэх шаардлагагүй байдаг бол ассемблер хэл дээр заавал шаардагддаг.
Машины үндсэн давталт (Basic Machine Cycle)
Ихэнх процессорууд энэ гурван үйлдлийг төгсгөлгүй давтдаг. Машины нэг давталт нь машины нэг команд (instruction)-ыг биелүүлдэг. Процессорын хурдыг нэг секундэд хэдэн машины давталттайгаар нь үнэлдэг. Жишээ нь процессорын хурд нь 2ГГц (2GHz~2 Гега Герц) гэвэл нэг секундэд процессор 2'000'000'000 машины давталтыг хийдэг гэсэн үг.
Давт:
1. Програмын тоолуур (Program Counter) дахь хаяг дээрх командыг дууд
2. Програм тоолуурыг нэмэгдүүлэх
3. Командыг биелүүлэх
4. "Давт"-руу оч
Машины команд
Машины команд нь процессорт битийн хэлбэртэй орж машины нэг үйлдлээр биелэгддэг. Жишээ нь MIPS процессор дээр 32 битийн хоёр регистрийг (регистр гэж процессорын битүүд хадгалах хэсэг) нэмэх машины команд нь:
0000 0001 0010 1011 1000 0000 0010 0000
ийм байна. Команд 32 бит байна. Бит бүр нь 0 юм уу 1 байна. Дээрх командыг 4, 4-н битээр бүлэглэсэн байгаа ч процессортоо бол ямар ч зайгүй дараалсан 32 бит байна.
Ассемблер хэлний код
Процессор бүрд өөрийн гэсэн машины командын хүснэгт гэж байдаг. Үүнийг мэдэхгүйгээр машин командыг ойлгож чадахгүй юм. Дээрх баахан тэг, нэгийг ойлгож байна уу? Би л лав үгүй. Тэр командын хүснэгтийг мэддэг байлаа ч машины командыг бичих тун хэцүү юм. Бөөн л тэг нэг бичнэ л гэсэн үг шүү дээ.
Тэгвэл ассемблер хэлэнд машин команд бүрд харгалзсан код байдаг. Тийм болохоор ассемблер хэл нь машин хэлнээс илүү амархан бичигддэг юм. Энэ дээрх машин командын ассемблер код нь:
Машин команд | Ассемблер хэлний код |
0000 0001 0010 1011 1000 0000 0010 0000 | add $t0,$t1,$t2 |
Одоо арай ойлгомжтой болж байна уу?
Энэ команд нь: $t1, $t2 гэсэн хоёр регистр дэх тоог нэмээд $t0 гэсэн регистрт хадгалж гэж байна. Ассемблерын кодоос машин команд руу хөрвүүлэгчийг ассемблер (assembler) гэдэг.
Хүмүүс машины хэлээс илүү Ассемблер хэлийг илүү хэрэглэх болсон нь:
- 0,1-үүдийг бичиж, ойлгоход төвөгтэй
- Тэмдэг үсэг ашигласан учраас илүү ойлгомжтой
- Илүү бага бичиглэлтэй
Ассемблер хэл нь үйлдлийн
систем, хөрвүүлэгч, доод түвшний график болон бусад процессорын зохион
байгуулалттай харьцсан програмуудад хэрэглэгддэг. Ихэнхдээ чухал чухал
хэсгүүдийг нь ассемблер хэл дээр хийгээд бусдыг нь Си хэл дээр хийдэг.
Ихэнхдээ ассемблер хэлийг өөр бусадтай хэлтэй нэгтгэж хэрэглэдэг.
Програмын хөрвүүлэлт
Ассемблер хэл нь машин командтай яг адилхан юм байна. Гэвч манай машин гэдэг найз маань ганц л 0,1-ийг л ойлгодог гэж байгаа. Тийм болохоор бид ассемблер хэл дээр бичсэн програмаа машин команд руу хөрвүүлэх шаардлагатай байх нь. Үүнийг ассемблер хийдэг гэж өмнө нь дурдсан. За, доор ассемблер хэл дээрх програмыг 0,1-рүү хөрвүүлсэн байгаа нь:
Машин команд | Ассемблер хэлний код |
0011 0100 0000 0001 0000 0000 0000 1001 | ori $1, $0, 9 |
0000 0000 0100 0001 0000 0000 0001 1000 | mult $2, $1 |
0000 0000 0000 0000 0100 0000 0001 0010 | mflo $8 |
0011 0100 0000 0001 0000 0000 0000 1001 | ori $1, $0, 5 |
0000 0000 0100 0000 0000 0000 0100 1000 | div $8, $1 |
Ялгаатай хөрвүүлэлт
Дээд түвшний програмчлалын хэл дээр бичигдсэн програм нь ажиллахаасаа өмнө машин команд руу хөрвүүлэгддэг. Энэ ажлыг тухай процессорын зохион байгуулалтад нь тохирсон машин команд руу хөрвүүлдэг Хөрвүүлэгч програм (Translator/Compiler) хийдэг. Өөрөөр хэлбэл процессор бүр дэх тухайн хэлний хөрвүүлэгч програм нь ялгаатай гэсэн үг.
Ихэнх дээд түвшний програмчлалын хэлний хөрвүүлэгчид шууд машин команд руу хөрвүүлдэг ч зарим хэлнүүд ассемблер хэл рүү хөрвүүлэгдээд, дараа машин команд руу хөрвүүлэгддэг. Жишээ нь: Fortran хэл.
Доорх Fortran дахь код нь:
result = 6*alpha+beta
MIPS-ын ассемблер хэлэнд хөрвүүлэгдэхдээ:
lw $t0,alpha # copy alpha to register $t0 lw $t1,beta # copy beta to register $t1 mul $t2,$t0,6 # multiply $t0 times 6; result in $t2 add $t2,$t2,$t1 # add $t2 and $t1; result in $t2 sw $t2,result # copy answer to result
Digital Equipment Corporation-ны VAX процессорын ассемблер хэлэнд:
MULL3 #6,ALPHA,R5 ADDL3 R5,BETA,RESULT
Ингэж хөрвүүлэгдэж байна.
Машин хэл
Ассемблер хэл гэж ганц хэл байдаггүй. Процессорын бүл бүр өөрсдийн гэсэн машин командтай, тэдгээртэй нь харгалзсан ассемблер хэлтэй. MIPS-ын ассемблер хэл зөвхөн MIPS процессорт, Intel-ын ассемблер хэл зөвхөн Intel процессорт.
Дээд түвшний хэл нь бодлого бодох, асуудлыг шийдэх тооцооллыг хийдэг бол ассемблер хэл нь техник хангамжийн түвшинд тооцоолол хийдэг.
Үндсэн санах ой (Main Memory)
Үндсэн санах ой нь ялгаатай хаягуудтай байна. 32 битийн процессор 2^32 буюу 4 тэрбум гаруй хаягтай байна. Гэхдээ MIPS процессорт програм, өгөгдөл нь эхний 2 тэрбум хаягаар хязгаарлагдсан байдаг.
No comments:
Post a Comment