+ All Categories

corel

Date post: 25-Jun-2015
Category:
Upload: asralt-tulga
View: 997 times
Download: 6 times
Share this document with a friend
Description:
corel
Popular Tags:
24
КОМПЬЮТЕРИЙН ЗОХИОН БАЙГУУЛАЛТ, АССЕМБЛЕР ХЭЛ Код : HW200 Улирал : Хавар 2009 Багш : С. Байгалтөгс /проф, доктор/ Монгол Улсын Шинжлэх Ухаан Технологийн Их Сургууль
Transcript
Page 1: corel

КОМПЬЮТЕРИЙН

ЗОХИОН

БАЙГУУЛАЛТ,

АССЕМБЛЕР ХЭЛ

Код : HW200

Улирал : Хавар 2009

Багш : С. Байгалтөгс /проф, доктор/

Монгол Улсын Шинжлэх Ухаан Технологийн Их

Сургууль

Page 2: corel

Өргөтгөсөн Ассемблер

Үндсэн ассемблер хэл нь машин кодоос нэг түвшин илүүтэйгээр процессорын харагдацыг бий болгоно. Машин үйлдэл, регистр, хаягуудыг тодорхойлохдоо машин код нь бит төлөвүүдийг ашиглана. Үндсэн ассемблерт эдгээрийг тодорхойлоход симболуудыг мөн ашигладаг. Үндсэн ассемблерийн команд бүр нэг машин командтай шууд зохицдог. Өргөтгөсөн ассемблер нь энгийн MIPS процессороос илүү олон тооны командуудтай абстракт маши үйлдлийг хэрэгжүүлдэг. Эдгээр үйлдлүүдийн олонх нь хэд хэдэн машин командтай зохицдог.

Бүлгийн сэдвүүд :

Регистрийн mnemonic нэрс.

Псевдо (хуурамч) командууд ба псевдо компьютер.

move псевдо команд.

li псевдо команд.

la псевдо команд.

lw псевдо команд.

sw псевдо команд.

nop псевдо команд. [www.cdeq.mn/hw200]

Page 3: corel

Mnemonic регистрүүд

Регистрүүдийг “ерөнхий зориулалтын” гэж нэрлэнэ. Энэ нь програм хангамжийн хувьд олон янзын зорилго бүхий регистрүүдийг тодорхойлоход тохирмжтой юм. Ингэж нэрлэх нь программистуудад будлихаас сэргийлж хоорондоо тохиролцоо бий болгоход дөхөм байдаг юм. Өргөтгөсөн ассемблер нь регистрүүдэд mnenomic нэрс ашиглаж тэдгээр нь хэрхэн ашиглагддагыг үзүүлдэг.

Жишээ нь, регистр $8-аас $15 хүртэл регистрүүд түр зуурын утга хадгалах зориулалттай.Эдгээрийн регистрийн mnemonic нэрс нь $t0-аас $t7 хүртэл байна.

[www.cdeq.mn/hw200]

Page 4: corel

Mnemonic регистрүүд

Зөвхөн регистр $0-ээс $31 хүртэлх нь өөр байдаг ($0 нь үргэлж тэгээр дүүрэн харин $31 буцах хаягыг автоматаар хадгалах үүрэгтэй). Үлдсэн регистрүүд нь үндсэндээ ижил.

[www.cdeq.mn/hw200]

Page 5: corel

Өргөтгөсөн Ассемблер

Өргөтгөсөн ассемблер нь регистрийн дугааруудын оронд mnemonic нэрс ашиглах боломж олгоно. Ингэснээр тухайн регистрээр юу хийж байгааг мөрдөхөд тус болдог.

Өргөтгөсөн ассемблерийг ашигласнаарMIPS-д байхгүй нэмэлт боломжуудыг SPIM хэрэгжүүлдэг. Өргөтгөсөн ассемлбер нь өргөтгөл бүхий эх кодуудыг хүлээн авдаг. Эх код дах өргөтгөлүүд нь үндсэн ассемблер хэлэнд орлуулагдах ба дараа нь машин код руу хөрвүүлэгдэнэ.

[www.cdeq.mn/hw200]

Page 6: corel

Өргөтгөсөн Ассемблер

Өргөтгөсөн ассемблер хэл хэрхэн үндсэн ассемблер хэл рүү хөрвүүлэгдэж байгааг зурган дээр үзүүлэв. Дараа нь үндсэн ассемблер код машин код руу хөрвүүлэгдэнэ.

[www.cdeq.mn/hw200]

Page 7: corel

Өргөтгөсөн Ассемблер

[www.cdeq.mn/hw200]

Page 8: corel

Регистер дэх түр зуурын утга

Ихэнх ассемблер програмууд нь дээд түвшний програмчлалын хэлний адил subroutine-н цуглуулга байдаг.

Subroutine нь дотоод хувьсагчдыг (local variables) ашиглах ба эдгээр хувьсагчид нь зөвхөн subroutine-д өөрт нь ашиглагдана. Түр зуурын регистрүүд болон $t0-$t7,$t8,ба $t9 мөн хадгалагдсан регистрүүд болох $s0-$s7 нь дотоод хувьсагчдад ашиглагдана.

[www.cdeq.mn/hw200]

Page 9: corel

Регистер дэх түр зуурын утга

Програм бичих явцад түр зуурын болон хадгалагдсан регистрүүдийг хэдийд ч ашиглах боломжтой байдаг. Харин subroutine дуудах үед түр зуурын регистрүүд өөрчлөгдөж болзошгүй.Хадгалагдсан регистрүүдийн хувьд ямар ч subroutine дуудалтын үед утгаа өөрчлөхгүй. Жишээ програмыг үзүүлэв:

[www.cdeq.mn/hw200]

Page 10: corel

Регистер дэх түр зуурын утга

ori $t0,$0,32 # load 32 into a temp register

ori $s0,$0,13 # load 13 into a saved register

jal subrout # subroutine call (don't worry about # the details of this, now).

sll $0,$0,0 # delay slot

back: addu $s0,$s0,$t0 # return from subroutine;

# temp register $t0 may have changed.

# saved register $s0 has not changed.

[www.cdeq.mn/hw200]

Page 11: corel

Регистер дэх түр зуурын утга

back дээрх илэрхийлэл нь алдаатай илэрхийлэл юм. Энэ тохиолдолд түр зуурын регистр $t0 нь subrout нэртэй subroutine дуудалтаар өөрчлөгдөж болзошгүй юм.

[www.cdeq.mn/hw200]

Page 12: corel

Бусад регистрүүд

Регистрүүд нь хувьсагчид болон аргументуудад, мөн бусад зориулалтаар ашиглагдах хэлбэрээрээ групп болж хуваагсдан байдаг.($0, $v0-$v1, $a0-$a3, $t0-$t9, $s0-$s7).

Үйлдлийн системийн хамгийн тулгуур хэсэг нь kernelбайдаг. Үйлдлийн системийн бусад хэсгүүд нь kernel-ийн функцуудаар биелэгддэг. $k0 ба $k1 регистрүүд нь kernel-д зориулагдан нөөцлөгдсөн байдаг. Хэрэглээний програмууд эдгээрийг оролдох шаадлагагүй юм.

SPIM нь үйлдлийн системтэй цуг ирдэггүй боловч хэрэв хүсэлт гарвал $k0 ба $k1 ийн ашиглагдаг trap handler-г ачаалдаг.

Регистр $gp, $sp, ба $fp ууд нь үндсэн регистр хэлбэрээр ашиглагдаж санах ойн хэсгүүд рүү хандалт хийдэг.

[www.cdeq.mn/hw200]

Page 13: corel

Псевдо командууд

addu команд нь бит төлөвийг регистрүүдийн хооронд хуулна. Үүнийг ихэвчлэн move буюу шилжүүлэх үйлдэл гэж нэрлэдэг бөгөөд энэ үйлдэл нь эх регистрийн утга өөрчилдөггүй.

Псевдо команд нь нэг болон түүнээс олон үндсэн ассемблер командын оронд хэрэглэгдэх өргөтгөсөн ассемблерийн команд юм.

[www.cdeq.mn/hw200]

Page 14: corel

Псевдо командууд

Өргөтгөсөн ассемблер нь хэд хэдэн псевдо команд хэрэгжүүлдэг. move псевдо командын жишээ:

move d,s # эх регистр s-н утгыг зорьсон регистр d-д шилжүүлнэ.

d ба s регистрүүд mnemonic нэрээр тодорхойлогдож болно( $t5 эсвэл $zeroг.м). Эсвэл регистрийн дугаараар тодорхойлогдоно( $13 эсвэл $0).

[www.cdeq.mn/hw200]

Page 15: corel

“Дамжуулах Илэрхийлэл"

move команд нь дээд түвшний хэлэн дэх дамжуулах илэрхийлэлтэй адил уншигдана:

j = val; val –н утгыг j хувьсагчид хуулна.

move $s1,$t3

$t3-ын утгыг регистр $s1 руу хуулна.

[www.cdeq.mn/hw200]

Page 16: corel

Шуурхай ачаалах

Дээр үзүүлсэн ori команд нь бит төлөвийг командаас регистр рүү хуулна. (16 битийн тэг өргөтгөлтэй шуурхай операндыг 32 бит рүүдуудна.) Энэ үйлдлийг ихэвчлэн шуурхай ачаалах үйлдэл гэж нэрлэдэг. Энэ нь шуурхай боломжтой утга агуулсан регистрийг ачаалдаг. (санах ой руу зөөлгүйгээр)

Энэ үйлдлийн ассемблер хэл дэх mnemonicнэр нь li юм. Ассемблер энэ псевдо командыг тохирох үндсэн команд руу хөрвүүлдэг

li d,value # Регистр $d-г value утгатай ачаална (Утга нь 16 эсвэл 32 бит байж болно)

[www.cdeq.mn/hw200]

Page 17: corel

Хэд хэдэн хөрвүүлэлт

Шуурхай ачаалах псевдо команд нь бүхэл тоон утгатай регистрийг ачаалахад хэрэглэгддэг.Өөр нэг жишээ:

li $t2,-156

Дээрх команд нь -15610 -ийн 2-тын гүйцээлтийг регистр $t2 руу оруулна. Энэ үйлдлийг ori командаар хийж болох боловч тухайн командын шуурхай талбар нь 16 битийн тэгээс их бүхэл тоо байх учиртай юм. li-ийн шуурхай утга нь хасах ба ялгаатай хөрвүүлэлтийг ашиглана:

[www.cdeq.mn/hw200]

Page 18: corel

Хэд хэдэн хөрвүүлэлт

li $v2,-156 == addiu $v2,$0,-156 (addiu команд нь нэмэгдэхүүний үйлдэл хийхээс өмнө шуурхай операндаа тэмдэгтэн өргөтгөл хийнэ. addiu команд нь хасах утгатай бүхэл тоотой хамт ашиглагдаж болно. Өргөтгөсөн ассемлбер нь li командыг шуурхай утгын тэмдэгээс хамаарч ялгаатай үндсэн команд руу хөрвүүлнэ.

[www.cdeq.mn/hw200]

Page 19: corel

Хоёр үндсэн команд

Шуурхай операндууд нь үргэлж 16 бит хэмжээтэй байна. Хоёр машин командуудыг 32 битийн регистрийг 32 битийн бүхэл тоотой ачаалах боломжтой:

li $v2,0x12345678 == lui $v2,0x1234

ori $v2,$v2,0x5678

[www.cdeq.mn/hw200]

Page 20: corel

Хоёр үндсэн команд

Энд li нь хоёр үндсэн команд руу хөрвүүлэгдсэн байна. Эхнийх нь $v2-ийн дээд хагас (top half)-г ачаална. Хоёр дах нь ori үйлдэл ашиглан доод хагасыг (bottom half) ачаална. Үүнийг нэмэх, хасах дурын бүхэл тооны хувьд хийж болно:

[www.cdeq.mn/hw200]

Page 21: corel

Хоёр үндсэн команд

li d,value # Регистр $d-г нэмэх эсвэл хасах утга "value“-тай ачаална. Утга нь 32 бит хүртэл дурын бүхэл тоо байна.

Өргөтгөсөн ассемблер нь автоматаар энэхүү псевдокомандыг бодит командын хамгийн ашигтай дараалал руу хөрвүүлнэ.

[www.cdeq.mn/hw200]

Page 22: corel

Жишээ програм

Шуурхай ачаалах үйлдлийг ашигласан жишээ програмыг үзүүллээ.

[www.cdeq.mn/hw200]

Page 23: corel

Жишээ програм

## liEg.asm

##

.text

.globl main

main: li $t0,43 # first value

li $t1,-96 # second value

li $t7,-16772555 # third value

addu $t0,$t0,$t1 # add the values

addu $t0,$t0,$t7 # leave result in $t0

## end of liEg.asm

[www.cdeq.mn/hw200]

Page 24: corel

Жишээ програм

li команд бүр ялгаатай үндсэн командууд руу хөрвүүлэгдэнэ. SPIM дээр програмыг ажиллуулахад эхлээд settings цэсийг харна. "allow pseudo instructions" хэсгийг чагтлаад "bare machine“ хэсгээс чагтыг авна.

[www.cdeq.mn/hw200]


Recommended