2012/04/25

MIPS Ассемблер Хичээл 2: Эхний програм

Өмнөх хичээлийг орчуулах гэж бөөн юм болоод байсан аль хэдийн орчуулчихсан юмнууд зөндөө байдаг юм байна ш дээ. Тэгээд КтМС-ын хичээлийг тавилаа.


Ойлгохгүй зүйл байвал асуугаарай! Хамтдаа суралцъя!

За, хамгийн эхний програмаа бичиж үзэцгээе! Кодоо бичихдээ ямар ч хамаагүй засварлагч (editor) програм бичиж болно.

.text            
.globl main                 

main:
    ori        $8, $0, 2
    ori        $9, $0, 3
    add      $10, $8, $9
  
    ori        $2, $0, 10
    syscall

Бяцхан тайлбар: 8-р регистрт 2 гэсэн утга хадгалаад, 9-р регистрт 3 гэсэн утга хадгалаад 10-р регистрт 8-р регистр, 9-р регистрийн утгуудын нийлбэрийг хадгалах програм.

Үр дүн: 10-р регистрт 5 гэсэн утга хадгалагдсан байна.

Дээрх програмыг хуулаад add.asm гэж хадгаллаа. Тэгээд QtSpim програмаа нээлээ. Жаахан тохиргоо хийе.

Simulator -> Settings -> MIPS гэж ороод бүгдийг нь идэвхжүүлчих.

Тэгээд бичсэн програмаа оруулж ирье.

File -> Load File гээд add.asm-г зааж өгнө.


User Text Segment гэсэн хэсэг дээр програм чинь орж ирнэ. Тэгээд Simulator -> Run/Continue гэдгийг дарах юм ногоон гурвалжин товчийг дарна. Тэгээд R8, R9, R10 -р регистрүүдийн утгыг хардаа. 2, 3, 5 болсон байх ёстой.

Одоо кодоо жаахан тайлбарлая!


Эхний .text гэдэг нь програм маань ажиллахын тулд эхлээд санах ойд ачаалах хэрэгтэй. Санах ойн аль хэсэгт ачаалах вэ? гэдгийг нь .text гэж зааж өгч байна. .text-д програмын код ачаалах ёстой байдаг.
Дээрх зургаас харвал User Text Segment нь санах ойн 0х004000000 - 0х004400000 хаягт оршдог байх нь.

.globl нь бусад файлуудад нээлттэй хэсгийг зааж өгч байна. Си++ хэлний public гэдэгтэй адилхан. Тэгэхээр main гэдэг хаягийг global-аар зарлаж байна. Тэгэхээр main гэсэн хаягаас програм ажиллаж эхлэх юм.

MIPS-н команд маань дараах 3 төрөлтэй байна.
  •    R төрлийн команд: опкод    регистр    регистр    регистрт
  •     I төрлийн команд:  опкод    регистр    регистр    тоо
  •     J төрлийн команд:  опкод    хаяг
Тэгэхээр эхний команд бол

ori $8, $0, 2

Энэ бол I төрлийн команд байна. Опкод нь ori. ori бол Or immediate гэсэн утгатай. $0 регистрийн утгыг 2 гэсэн тоотой OR үйлдэл хийгээд $8 регистрт хадгална гэсэн команд юм.  

$0 регистр бол зөвхөн 0 гэсэн утгатай байдаг онцгой регистр. Энэ регистрт утга хадгалж болохгүй. Тэгэхээр $0 OR 2 гэсэн үйлдлийн үр дүн нь 2 юм. Тэгээд 2 гэсэн утга $8-т хадгалагдана.

Дараачийн команд болох

ori $9, $0, 3 нь мөн адилхан $93 гэсэн утга хадгална. Эндээс харахад or, $0-г ашиглан регистрт утга олгож болохыг харсан байх.

add $10, $8, $9 команд бол R төрлийн команд юм. Опкод нь add. $8, $9 регистрүүд дэх утгуудыг нэмээд $10 регистрт хадгална.

Харин сүүлийн хоёр команд

ori $2, $0, 10
syscall

бол ерөнхийдөө програмыг дуусгах командууд юм. Дараа нь жич үзье.

No comments:

Post a Comment