Ассемблер хэл

**Ассемблер хэл** нь компьютер, микроконтроллер, болон бусад програмчлагддаг төхөөрөмжүүдийг програмчилдаг, кодны мөр бүр нь нэг машин кодтой харгалздаг доод түвшний програмчлалын хэл юм. Компьютерын архитектур бүрд өөр өөр ассемблер хэл байдаг. 

Ассемблер хэл нь ассемблераар машин код уруу хөрвүүлэгддэг. Зарим опкод нь нэгээс олон операнд шаарддаг. 

## Тодорхойлолтууд
### Ассемблер
**Ассемблер** нь ассемблер кодыг объект код уруу хөрвүүлдэг. Ихэнх ассемблерууд макро хэрэглэдэг. 

1950-аад оноос ассемблер бий болсон бөгөөд машин програмчлах ажил нь хялбар болжээ. Ихэнх ассемблер RISC архитектуртай байдаг.

#### Хөрвүүлэлтийн төрөл
Хөрвүүлж байгаагаар нь хоёр ангилдаг:
* Нэг уншдаг ассемблер нь нэг удаагийн уншилтаараа кодоо хөрвүүлдэг.
* Олон уншдаг ассемблер нь эхний уншилтаараа тэмдэглэгээнүүдээ утгуудаар нь сольсны дараа хөрвүүлэх ажилдаа ордог.
Аль аль тохиолдолд ассемблер нь кодны хэмжээ, хаягуудыг тооцно. Хөрвүүлэлтийн хувьд нэг уншдаг ассемблер нь хурдан юм.

#### Дээд түвшний ассемблер
Дээд түвшний ассемблер нь илүү нарийн бүтцүүдтэй:
* Нарийн удирдлагын бүтцүүд
* Дээд түвшний процедур/функц
* Дээд түвшний хийсвэр өгөгдлийн бүтцүүд
* Нарийн макро боловсруулалт (Мөн 1950-аад оны сүүлээр гарсан IBM 700 цуврал, 1960-аад оны IBM/360, бас бусад машинуудын энгийн ассемблерт нарийн макро боловсруулалт орсон байдаг)
* Объект хандлагат програмчлалын чанарууд: класс, объект, хийсвэрлэл, олон хэлбэршил, удамшил

### Ассемблер хэл
Ассемблер хэлээр бичигдсэн програм нь цуварсан хийсвэр командууд, тайлбар, өгөгдлөөс тогтоно. 

Жишээ нь: доорх команд x86/IA-32 процессорт 8 битийн шууд утгыг регистрт хадгалах үйлдэл хийж байна. Энэхүү командын машин код дахь 10110-н дараах 3 бит нь регистрийг заадаг буюу 000 нь AL регистрийг илэрхийлж байна. Тиймээс дараах машин код нь AL регистрт нь 01100001 гэсэн өгөгдлийг хадгалах команд байна.
 10110000 01100001
Энэ машин кодыг хүнд арай уншигдам болгохын тулд бид 16-тын тооллын систем дээр дүрсэлдэг.
 B0 61
Дээрх код нь 2-тын 01100001 буюу 16-тын 61 буюу 10-тын 94 гэсэн тоог AL регистрт хуул гэсэн утгатай болно. Intel-ийн ассемблер хэлд хуулах үйлдлийг MOV гэсэн мнемоник хэрэглэдэг бөгөөд дээр кодыг зохих ассемблер хэл уруу хөрвүүлье. Одоо илүү хялбар ойлгогдож, цээжлэгддэг болсон байна. 

```asm
MOV AL, 61h       ; 97-г AL-д хуулах (16-таар 61)
```

Зарим ассемблер хэлд ганц мнемоник тухайлбал MOV хадгалах, өгөгдөл хуулах, шууд утга хуулах, регистрт утга хуулах, санах ойгоод регистрт өгөгдөл хуулах гэх мэт олон үйлдлийг хийдэг мнемоник байдаг. Харин бусад ассемблер хэлд ялгаатай опкодыг хэрэглэдэг.  Жишээ нь L - "санах ойгоос регистрт өгөгдөл хуулах", ST - "регистрийн өгөгдлийг санах ой уруу хуулах", LR - "Нэг регистрийн утгыг өөр регистр уруу хуулах", MVI - "санах ой уруу шууд утга хуулах", гэх мэт.

```asm
MOV AL, 1h        ; AL уруу 1-г хуулах
MOV CL, 2h        ; CL уруу 2-г хуулах
MOV DL, 3h        ; DL уруу 3-г хуулах
MOV EAX, [EBX]	  ; Санах ойн EBX дэх хаягаас 4 байтыг EAX уруу хуулах 
MOV [ESI+EAX], CL ; CL-н өгөгдлийг ESI+EAX хаяг дахь 1 байтад хуулах
```

Тохиолдол бүрд MOV ялгаатай опкод уруу хөрвөгдөнө.

Ассемблер кодыг машин код уруу хөрвүүлэх ажлыг ассемблер хийдэг бол эсрэгээр нь машин кодоос ассемблер код уруу хөрвүүлэгчийг урвуу ассемблер (disassembler) гэдэг. Дээд түвшний хэлээс ялгаатай нь кодоо мөр мөрөөр нь ихэвчлэн хөрвүүлдэг. Гэвч зарим тохиолдолд хийсвэр командууд (ялангуяа макро) хэд хэдэн энгийн ассемблер код юм уу машины код болдог.

Компьютерын архитектур бүр өөрсдийн гэсэн машин хэлтэй; хийдэг үйлдэл, регистрийн тоо, санах ойд өгөгдлийг хадгалах гэх мэт олон хүчин зүйлүүдээс болдог.

## Хэлний тухай
### Үндсэн бүтэц
Ассемблер хэлийг янз бүрээр зохиосон байдаг ч ерөнхийдөө дараа зүйлүүдэд ангилж болно:
*Опкодын мнемоник
*Өгөгдлийн хэсэг
*Хийсвэр опкод

#### Опкодын мнемоник болон өргөтгөсөн мнемоник
Өргөтгөсөн мнемоник нь хэд хэдэн команд болон задардаг.

#### Өгөгдлийн хэсэг
Хувьсагч болон элементүүдэд өгөгдөл олгох командууд юм. Өгөгдлийн хэмжээ, төрөл, байрлал зэргийг заадаг. Мөн өөр програмд ашиглаж болдог, эсвэл зөвхөн програм дотроо ашигладаг эсэхийг зааж өгдөг.

#### Кодны хэсэг
Кодны хэсэгт псевдо опкодууд байна. 

#### Макро
Ихэнх ассемблерүүд макротай байдаг. Макро гэдэг нь дараалалсан текст мөрүүд юм. Опкод ч агуулж болно. Макро нь нэг мнемоник нэрээр нэрлэгддэг. Ассемблер ассемблер кодоо хөрвүүлж эхлэхэд тодорхойлогдсон мнемоник нэр гарч ирвэл макро буюу текстээр нь сольж тавьдаг. 

Энд гарч буй "макро" нь өөр бусад хэлний макроноос ялгаатай юм. Си хэлний макро нь #define гэсэн хэсэгт ганц мөрөөр тодорхойлогддог бол энд гарч буй макро нь нэлээд урт "програм" байх бөгөөд хөрвүүлэлтийн үед ассемблер ажиллуулдаг. 

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

Макро нь ихэвчлэн параметер авдаг. Зарим ассемблерууд нэлээд нарийн макротай бөгөөд дээд түвшний хэл шиг нөхцөл шалгах, тэмдэгт мөр, арифметик үйлдэл, хувьсагч, параметеруудтай байдаг. 

#### Бүтэцлэгдсэн програмчлалд
Зарим ассемблерууд бүтэцлэгдсэн програмчлалын шинжүүдийг агуулсан байдаг.

## Холбоотой мэдээллүүд 
* Программчлалын хэл
* Компьютер программчлал
* Программчлалын хэлний жагсаалт

Ангилал:Ассемблер
Ангилал:Программчлалын хэлний сэдэв