Internet Windows Android
Kengaytirish

Assembler operatsion tizimi. Assembler maktabi: operatsion tizimni ishlab chiqish

Yaqinda men assemblerni o'rganishga qaror qildim, lekin kod satrlarini isrof qilish menga qiziq emas edi. Assemblerni o'rganar ekanman, qaysidir fan sohasini o'zlashtiraman deb o'yladim. Shunday qilib, mening tanlovim bootloader yozishga to'g'ri keldi. Mening topilmalarim natijasi bu blogda.

Darhol aytmoqchimanki, men nazariyani amaliyot bilan uyg'unlashtirishni yaxshi ko'raman, shuning uchun boshlaylik.

Birinchidan, men sizga eng oddiyini qanday yaratishni ko'rsataman MBR eng qisqa vaqt ichida natijadan bahramand bo'lishimiz uchun. Amaliy misollarni murakkablashtirganimiz uchun men nazariy ma'lumotlarni taqdim etaman.

Birinchidan, keling, USB flesh-disk uchun yuklovchi yarataylik!

Diqqat!!! Bizning birinchi assembler dasturimiz USB flesh-disk uchun ham, Floppy - disk yoki qattiq disk kabi boshqa qurilmalar uchun ham ishlaydi. Keyinchalik, barcha misollar to'g'ri ishlashi uchun men kodning turli qurilmalarda qanday ishlashiga oid bir qator tushuntirishlar beraman.

Biz yozamiz Fasm, chunki u yuklovchilarni yozish uchun eng yaxshi kompilyator hisoblanadi, ya'ni MBR. Fasmni tanlashning ikkinchi sababi shundaki, u fayllarni kompilyatsiya qilish jarayonini sezilarli darajada osonlashtiradi. Hech qanday buyruq qatori ko'rsatmalari yo'q va hokazo. Assemblerni o'rganishdan butunlay voz kechishi va maqsadlarimizga erishishi mumkin bo'lgan bema'nilik.Demak, dastlabki bosqichda bizga ikkita dastur va bir nechta dastur kerak. keraksiz Minimal o'lchamdagi USB flesh haydovchi. Men o'zim 1 Gb qazib oldim (u tez formatlanadi va achinarli emas, agar shunday bo'lsa). Yuklagichimiz ishlagandan so'ng, flesh-disk normal ishlashini to'xtatadi. mening windows 7 tayoqimni formatlashdan bosh tortadi. Fleshli drayverni yordamchi dastur bilan hayotga qaytarishingizni maslahat beraman HP USB Disk Storage Format Tool ( HPUSBFW.EXE) yoki flesh-disklarni formatlash uchun boshqa yordamchi dasturlar.

Biz ularni o'rnatamiz va ish stolida yoki xohlagan joyda tegishli yorliqlarni tashlaymiz.

Tayyorgarlik tugadi, keling harakatga o'tamiz

Fasmw.exe faylini oching va u yerga quyidagilarni yozing. Natijani ko'rish uchun biz minimal kodni chizamiz. Keyinchalik bu erda nima issiq ekanligini tahlil qilamiz. Qisqasi, sharhlar beraman.

FASM kodi: ============== boot.asm ==============

org 7C00h; dasturimizning manzillari ushbu direktivani hisobga olgan holda hisoblanadi

foydalanish16; o'n oltilik kod hosil bo'ladi

cli; segment registrlarida manzillarni o'zgartirish uchun uzilishlarni o'chiring

harakat bolta, 0

mov sp, 7C00h

sti; uzilishlarni yoqish (manzillarni o'zgartirgandan keyin)

mov ax, 0003h; ekranga chiziqni ko'rsatish uchun video rejimini o'rnatish

int 10 soat

mov ax, 1301h; aslida 13h int 10h qator funksiyasining chiqishi (keyinroq batafsilroq)

mov bp, stroka; chiqish liniyasining manzili

mov dx, 0000h; matn ko'rsatiladigan satr va ustun

mov cx, 15; chiqish satrining belgilar soni

mov bx, 000eh; 00-video sahifa raqami (tegmaslik yaxshiroq) 0e-belgi atributlari (rang, fon)

int 10 soat

jmp $; vaqtni belgilang (dasturni shu nuqtada aylantiradi)

stroka db "Yaxshi, MBR yuklandi!"

marta 510 - ($ - $$) db 0; oldingi bayt va oxirgi bayt orasidagi bo'shliqni nol bilan to'ldirish

db 0x55, 0xAA; oxirgi ikki bayt

Ushbu kodni (Ctrl + F9) fasm "e" da kompilyatsiya qiling va natijada olingan ikkilik faylni boot.bin sifatida qulay joyda saqlang. Ikkilik faylimizni USB flesh-diskga yozishdan oldin, bir oz nazariya.

USB flesh-diskini kompyuterga ulaganingizda, USB flesh-diskidan yuklashni xohlayotganingiz BIOS tizimi uchun mutlaqo aniq emas, shuning uchun BIOS sozlamalarida siz yuklashni xohlagan qurilmani tanlashingiz kerak. USB dan yuklashni tanladi (buni qanday qilishni o'zingiz aniqlashingiz kerak bo'ladi, chunki BIOS interfeysi turli xil o'zgarishlarga ega ... siz anakartingiz uchun BIOS sozlamalarini google orqali topishingiz mumkin. Qoida tariqasida, hech qanday murakkab narsa yo'q).

Endi BIOS flesh-diskdan yuklashni xohlayotganingizni bilganidan so'ng, flesh-diskdagi nol sektor yuklanishi mumkinligiga ishonch hosil qilishi kerak. Buning uchun BIOS-ga qaraydi nol sektorining oxirgi ikki bayti va agar ular 0x55 0xAA ga teng bo'lsa, u holda u RAMga yuklanadi. Aks holda, BIOS flesh-diskingizdan o'tib ketadi. Ushbu ikkita sehrli baytni topib, u nol sektorni 0000: 7C00h manzilidagi RAMga yuklaydi va keyin USB flesh-diskini unutadi va boshqaruvni ushbu manzilga o'tkazadi. Endi kompyuterdagi barcha quvvat yuklash qurilmangizga tegishli va u RAMdan allaqachon harakat qilib, flesh-diskdan qo'shimcha kodni yuklashi mumkin. Endi biz ushbu sektor DMDE dasturida qanday ko'rinishini ko'rib chiqamiz.

1. USB flesh-diskini kompyuterga joylashtiring va unda kerakli ma'lumotlar yo'qligiga ishonch hosil qiling.

2. DMDE dasturini oching. Rasmlardagi barcha keyingi harakatlarni o'qing:

Ushbu komiksni tomosha qilgandan so'ng, siz MBR-ni USB flesh-diskiga yuklab olish qobiliyatiga ega bo'lasiz. Va bizning yuklovchimiz ishining uzoq kutilgan natijasi shunday ko'rinadi:


Aytgancha, agar minimal yuklash kodi haqida gapiradigan bo'lsak, u quyidagicha ko'rinishi mumkin:

Org 7C00h
jmp $
db 508 dup (0)
db 0x55,0xAA

Bunday yuklagich boshqaruvni qabul qilib, bitta ma'nosiz jmp $ buyrug'ini tsiklda bajarib, kompyuterni o'chirib qo'yadi. Men uni belgilash vaqtini chaqiraman.

Sizga yordam berishi mumkin bo'lgan YouTube-da video joylashtirdim:

Va nihoyat, bootloader haqida bir necha tezkor faktlar:

1. Bootloader, shuningdek, MBR sifatida ham tanilgan bootloader, hajmi 512 bayt. Tarixiy jihatdan,
eski ommaviy axborot vositalari va qurilmalarni qo'llab-quvvatlash uchun ushbu shart bajarilishi kerak.
2. Yuklagich har doim DMDE dasturi yoki qurilmalar bilan ishlash imkonini beruvchi olti burchakli tahrirlovchilar nuqtai nazaridan flesh-disk, floppi, qattiq diskning nol sektorida joylashgan. Ikkilik faylni (bizning boot.bin) sanab o'tilgan qurilmalardan biriga yuklab olish uchun biz ularning ichki jismoniy tuzilishi haqida o'ylashimiz shart emas. DMDE dasturi ushbu qurilmalardagi sektorlarni qanday o'qishni biladi va ularni LBA rejimida ko'rsatadi (ularni faqat 0 dan oxirgi sektorgacha raqamlaydi). LBA haqida o'qishingiz mumkin
3. Yuklovchi har doim ikki bayt 0x55 0xAA bilan tugashi kerak.
4. Yuklovchi har doim 0000: 7C00h manzilidagi xotiraga yuklanadi.
5. Operatsion tizim yuklovchidan boshlanadi.


Darhol aytaman, maqolani “Jin ursin, boshqa Popov” degan fikrlar bilan yopmang. Uning shunchaki yalagan Ubuntusi bor va menda hamma narsa noldan, jumladan yadro va ilovalar ham bor. Shunday qilib, kesma ostidagi davomi.

OS guruhi: Bu yerga.
Avval sizga bitta skrinshot beraman.

Ularning boshqasi yo'q va endi nima uchun yozayotganim haqida batafsilroq.

Issiq aprel oqshomi, payshanba edi. Bolaligimdan OS yozishni orzu qilardim, birdan: "Endi men ijobiy va salbiy tomonlarini bilaman, nega orzuimni ro'yobga chiqarmayman?" Ushbu mavzu bo'yicha Google saytlarini qidirib topdi va Habrdan maqola topdi: "Qanday qilib OS yozishni boshlash va to'xtatmaslik kerak". Quyidagi OSDev Wiki-ga havola uchun muallifga rahmat. U yerga borib ish boshladim. Bitta maqolada minimal OS bo'yicha barcha ma'lumotlar mavjud edi. Men cross-gcc va binutils qurishni boshladim va keyin hamma narsani u erdan qayta yozdim. “Salom, yadro dunyosi!” degan yozuvni ko‘rib, xursandchiligimni ko‘rgan bo‘lsangiz kerak. Men stuldan sakrab tushdim va tushundim - taslim bo'lmayman. Men "konsol" deb yozdim (tirnoq ichida, men klaviaturaga kirish imkonim yo'q edi), lekin keyin men oyna tizimini yozishga qaror qildim. Natijada, u ishladi, lekin men klaviaturadan foydalana olmadim. Va keyin men X Window System asosida nom topishga qaror qildim. Googled Y oyna tizimi - bu. Natijada, men OS365 pre-alpha 0.1 tarkibiga kiritilgan Z Window System 0.1 deb nom berdim. Ha, uni mendan boshqa hech kim ko'rmadi. Keyin men klaviaturani qo'llab-quvvatlashni qanday amalga oshirishni tushundim. Birinchi versiyaning skrinshoti, hali hech narsa bo'lmaganida, hatto deraza tizimi ham:

Ko'rib turganingizdek, matn kursori uning ichida harakat qilmadi. Keyin men bir nechta oddiy Z-ga asoslangan ilovalarni yozdim.Va bu erda 1.0.0 alfa versiyasi chiqdi. Ko'p narsa bor edi, hatto tizim menyusi ham. Va fayl menejeri va kalkulyator shunchaki ishlamadi.

Meni faqat go'zallik haqida qayg'uradigan do'stim to'g'ridan-to'g'ri dahshatga soldi (Mitrofan, uzr). U shunday dedi: “Biz uni VBE-rejimi 1024 * 768 * 32 ga tushirdik, biz uni tushirdik, biz uni tushirdik! Xo'sh, iching! ” Xo'sh, men uni tinglashdan allaqachon charchagan edim, lekin men uni yuvdim. Quyida amalga oshirish haqida.

Men hamma narsani o'zimning yuklovchim qildim, ya'ni GRUB.U bilan Multiboot sarlavhasiga bir nechta sehrli chiziqlar qo'shish orqali grafik rejimni asoratsiz o'rnatishingiz mumkin.

ALIGN ni o‘rnating, 1<<0 .set MEMINFO, 1<<1 .set GRAPH, 1<<2 .set FLAGS, ALIGN | MEMINFO | GRAPH .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .long MAGIC .long FLAGS .long CHECKSUM .long 0, 0, 0, 0, 0 .long 0 # 0 = set graphics mode .long 1024, 768, 32 # Width, height, depth
Va keyin Multiboot ma'lumot strukturasidan men ramka bufer manzilini va ekran o'lchamlarini olaman va u erda piksellarni yozaman. VESA hamma narsani juda chalkashtirib yubordi - RGB ranglarini teskari tartibda kiritish kerak (R G B emas, balki B G R). Bir necha kun davomida men tushunmadim - nega piksellar ko'rsatilmaydi !? Natijada, men 16 rang konstantasining qiymatlarini 0 ... 15 dan RGB ekvivalentlariga o'zgartirishni unutganimni angladim. Natijada, men ozod qildim, bir vaqtning o'zida gradient fonni yuvdim. Keyin men konsol, 2 ta dastur yaratdim va 1.2 ni chiqardim. Ha, men deyarli unutdim - siz OSni yuklab olishingiz mumkin

Asl: AsmSchool: Operatsion tizim yarating
Muallif: Mayk Sonders
Nashr qilingan sana: 2016 yil 15 aprel
Tarjimasi: A. Panin
O'tkazish sanasi: 2016 yil 16 aprel

4-qism: Seriyadagi oldingi maqolalardan o'rgangan ko'nikmalaringiz bilan siz o'z operatsion tizimingizni ishlab chiqishni boshlashingiz mumkin!

Bu nima uchun?

  • Kompilyatorlar qanday ishlashini tushunish uchun.
  • CPU ko'rsatmalarini tushunish uchun.
  • Ishlash uchun kodingizni optimallashtirish uchun.

Bir necha oy davomida biz Linux uchun assembler tilida oddiy dasturlarni ishlab chiqish bilan boshlangan va seriyaning oxirgi maqolasida shaxsiy kompyuterda ishlaydigan o'zini o'zi ta'minlaydigan kodni ishlab chiqish bilan yakunlangan qiyin yo'lni bosib o'tdik. operatsion tizimsiz kompyuter. Xo'sh, endi biz barcha ma'lumotlarni birgalikda to'plashga va haqiqiy operatsion tizimni yaratishga harakat qilamiz. Ha, biz Linus Torvaldsning izidan boramiz, lekin birinchi navbatda quyidagi savollarga javob berishga arziydi: "Operatsion tizim nima? Uning qaysi funktsiyalarini qayta yaratishimiz kerak?"

Ushbu maqolada biz faqat operatsion tizimning asosiy funktsiyalariga e'tibor qaratamiz: dasturlarni yuklash va bajarish. Murakkab operatsion tizimlar virtual xotirani boshqarish va tarmoq paketlarini qayta ishlash kabi boshqa ko'plab funktsiyalarni bajaradi, ammo ular to'g'ri amalga oshirish uchun yillar davomida uzluksiz ishlashni talab qiladi, shuning uchun ushbu maqolada biz faqat har qanday operatsion tizimda mavjud bo'lgan asosiy funktsiyalarni ko'rib chiqamiz. O'tgan oy biz floppi diskning 512 baytli sektoriga (uning birinchi sektori) mos keladigan kichik dasturni ishlab chiqdik va endi diskdan qo'shimcha ma'lumotlarni yuklash funktsiyasini qo'shish uchun uni biroz o'zgartiramiz.

Boot Loader ishlab chiqish

Biz operatsion tizimimizning ikkilik kodini disketning BIOS orqali yuklangan birinchi 512 baytli sektoriga joylashtirish uchun imkon qadar hajmini kamaytirishga harakat qilishimiz mumkin edi, lekin bunda. biz hech qanday qiziqarli funksiyalarni amalga oshira olmaymiz. Shuning uchun biz ushbu 512 baytdan OS yadrosining ikkilik kodini RAMga yuklaydigan va uni bajaradigan oddiy yuklovchining ikkilik kodini joylashtirish uchun foydalanamiz. (Shundan so'ng biz OS yadrosini o'zi ishlab chiqamiz, u diskdan boshqa dasturlarning ikkilik kodini yuklaydi va uni bajaradi, ammo bu haqda birozdan keyin muhokama qilinadi.)

Ushbu maqolada muhokama qilingan misollar uchun manba kodini www.linuxvoice.com/code/lv015/asmschool.zip manzilidan yuklab olishingiz mumkin. Va bu bizning boot.asm nomli fayldan yuklovchi kodimiz:

BITS 16 jmp qisqa ishga tushirish; Yorliqga o'tish disk tavsifini o'tkazib yuborish nop; Disk tavsifidan oldingi qo'shimcha% "bpb.asm" boshlanishini o'z ichiga oladi: mov ax, 07C0h; Yuklash manzili mov ds, ax; Ma'lumotlar segmenti mov ax, 9000h; Stack mov ss, ax mov sp, 0FFFFh tayyorlang; Stack pastga o'sadi! cld; Yo'nalish bayrog'ini sozlash mov si, kern_filename chaqiruvi load_file jmp 2000h: 0000h; kern_filename db "MYKERNELBIN"% faylidan yuklangan OS yadrosi ikkilik kodiga o'tish "disk.asm" marta 510 - ($ - $$) db 0; Ikkilik kodni 510 baytgacha bo'lgan nollar bilan to'ldirish dw 0AA55h; Bootloader ikkilik kodini tugatish yorlig'i buferi:; Disk tarkibi uchun buferni ishga tushirish

Ushbu kodda birinchi protsessor ko'rsatmasi jmp ko'rsatmasi bo'lib, u BITS direktivasidan keyin NASM assembleriga 16 bitli rejimdan foydalanishni buyuradi. Seriyaning oldingi maqolasidan eslaganingizdek, diskdan BIOS orqali yuklangan 512 baytli ikkilik kodning bajarilishi eng boshidan boshlanadi, ammo biz maxsus ma'lumotlar to'plamini o'tkazib yuborish uchun yorliqga o'tishimiz kerak. Shubhasiz, o'tgan oy biz kodni diskning boshiga yozdik (dd yordam dasturidan foydalanib) va qolgan disk maydonini bo'sh qoldirdik.

Endi biz mos MS-DOS fayl tizimi (FAT12) bo'lgan floppi diskdan foydalanishimiz kerak va bu fayl tizimi bilan to'g'ri ishlash uchun sektor boshiga yaqin maxsus ma'lumotlar to'plamini qo'shishimiz kerak. Ushbu to'plam BIOS parametr bloki (BPB) deb ataladi va disk yorlig'i, sektorlar soni va boshqalar kabi ma'lumotlarni o'z ichiga oladi. Bu bosqichda bizni qiziqtirmasligi kerak, chunki bunday mavzularga bir nechta maqolalar turkumi bagʻishlanishi mumkin, shuning uchun biz barcha tegishli koʻrsatmalar va maʼlumotlarni bpb.asm nomli alohida manba kod fayliga joylashtirdik.

Yuqoridagilarga asoslanib, bizning kodimizdagi ushbu ko'rsatma juda muhim:

% "bpb.asm" ni o'z ichiga oladi

Bu NASM direktivasi bo'lib, yig'ish paytida belgilangan manba faylining mazmunini joriy manba fayliga kiritish imkonini beradi. Shunday qilib, biz BIOS parametr blokini amalga oshirishning barcha tafsilotlarini alohida faylda olib chiqib, yuklovchimiz kodini iloji boricha qisqa va tushunarli qilishimiz mumkin. BIOS parametr bloki sektor boshlangandan keyin uch baytdan keyin joylashgan bo'lishi kerak va jmp buyrug'i atigi ikki baytni oladi, biz nop ko'rsatmasidan foydalanishimiz kerak (uning nomi "hech qanday operatsiya" degan ma'noni anglatadi - bu hech narsa qilmaydigan ko'rsatma chiqindi protsessor davrlaridan tashqari ) qolgan baytni to'ldirish uchun.

Stack bilan ishlash

Keyinchalik, registrlar va stekni tayyorlash uchun oldingi maqolada muhokama qilingan ko'rsatmalarga o'xshash ko'rsatmalardan, shuningdek, ma'lum ko'rsatmalar uchun yo'nalish bayrog'ini o'rnatishga imkon beruvchi cld ko'rsatmasi ("aniq yo'nalish" degan ma'noni anglatadi) foydalanishimiz kerak, masalan, lodsb ko'rsatmasi, u bajarilgandan keyin SI registridagi qiymatni kamaytirmaydi, balki oshiradi.

Shundan so'ng biz SI registriga satrning manzilini joylashtiramiz va load_file funksiyamizni chaqiramiz. Ammo bir daqiqa o'ylab ko'ring - biz hali bu xususiyatni ishlab chiqmaganmiz! Ha, bu to'g'ri, lekin uni amalga oshirishni disk.asm deb nomlangan boshqa manba faylida topish mumkin.

MS-DOS-da formatlangan floppi disklarda qo'llaniladigan FAT12 fayl tizimi mavjud bo'lgan eng oddiy fayl tizimlaridan biri bo'lib, lekin uning mazmuni bilan ishlash uchun juda ko'p kod talab qilinadi. load_file pastki dasturi taxminan 200 qatordan iborat va ushbu maqolada taqdim etilmaydi, chunki biz ma'lum bir fayl tizimi uchun drayverni emas, balki operatsion tizimni ishlab chiqish jarayonini ko'rib chiqamiz, shuning uchun bo'sh joyni behuda sarflash juda oqilona emas. jurnalning sahifalari shu tarzda. Umuman olganda, biz disk.asm manba faylini joriy manba faylining oxirigacha deyarli qo'shdik va bu haqda unutishimiz mumkin. (Agar siz hali ham FAT12 fayl tizimining tuzilishi bilan qiziqsangiz, http://tinyurl.com/fat12spec saytida ajoyib sharhni ko'rishingiz mumkin, keyin disk.asm manba fayliga qarang - undagi kod yaxshi sharhlangan. .)

Har qanday holatda, load_file pastki dasturi ikkilik kodni SI registrida ko'rsatilgan nomli fayldan 0 ofset bilan 2000 segmentiga yuklaydi, shundan so'ng biz bajarish uchun uning boshlanishiga o'tamiz. Va bu hammasi - operatsion tizim yadrosi yuklandi va yuklash moslamasi o'z vazifasini bajardi!

Bizning kodimiz MYKERNEL.BIN o'rniga MYKERNELBIN dan operatsion tizim yadro fayli nomi sifatida foydalanilganini payqagan bo'lsangiz kerak, bu DOS floppi disklarida qo'llaniladigan 8 + 3 nomlash sxemasiga juda mos keladi. Aslida, FAT12 fayl tizimi fayl nomlarining ichki ko'rinishidan foydalanadi va biz fayl nomidan foydalanib bo'sh joyni tejaymiz, bu esa nuqta belgisini topish va fayl nomini o'zgartirish uchun load_file pastki dasturimiz ichida mexanizmni amalga oshirishni talab qilmasligi kafolatlanadi. ichki fayl tizimining ko'rinishiga.

Disk.asm manba kodi faylini ulash direktivasi bilan qatordan so'ng, yuklash moslamasining ikkilik kodini noldan 512 baytgacha to'ldirish va uning ikkilik kodining so'nggi belgisini o'z ichiga olgan ikkita satr mavjud (bu maqolada muhokama qilingan. oxirgi maqola). Nihoyat, kodning eng oxirida "bufer" yorlig'i joylashgan bo'lib, u load_file pastki dasturi tomonidan qo'llaniladi. Umuman olganda, load_file pastki dasturi diskdagi faylni qidirish jarayonida ba'zi oraliq bosqichlarni bajarish uchun RAMda bo'sh joy talab qiladi va yuklovchini yuklaganimizdan so'ng bizda etarli bo'sh joy bor, shuning uchun biz buferni bu erga joylashtiramiz.

Yuklash moslamasini yig'ish uchun quyidagi buyruqdan foydalaning:

Nasm -f bin -o boot.bin boot.asm

Endi biz MS-DOS formatida virtual floppi disk tasvirini yaratishimiz va quyidagi buyruqlar yordamida yuklovchimizning ikkilik kodini uning birinchi 512 baytiga qo'shishimiz kerak:

Mkdosfs -C floppy.img 1440 dd konv = notrunc, agar = boot.bin of = floppy.img

Bu bootloaderni ishlab chiqish jarayonini yakunlaydi! Endi bizda mykernel.bin nomli fayldan operatsion tizim yadrosi binarini yuklash va uni bajarish imkonini beruvchi yuklash floppi diski tasviri mavjud. Keyinchalik, bizni ishning yanada qiziqarli qismi kutmoqda - operatsion tizim yadrosining o'zini ishlab chiqish

Operatsion tizim yadrosi

Biz operatsion tizim yadromiz ko'plab muhim vazifalarni bajarishini xohlaymiz: salomlashishni ko'rsatish, foydalanuvchi kiritgan ma'lumotni qabul qilish, kiritish qo'llab-quvvatlanadigan buyruq yoki yo'qligini aniqlash va foydalanuvchi nomlarini ko'rsatgandan so'ng dasturlarni diskdan bajarish. Bu mykernel.asm faylidagi operatsion tizim yadro kodi:

Mov ax, 2000h mov ds, ax mov es, ax loop: mov si, tezkor chaqiruv lib_print_string mov si, user_input call lib_input_string cmp byte, 0 je loop cmp word, "ls" je list_files mov ax, si mov cx, 32768 call jc load_fail call 32768 jmp loop load_fail: mov si, load_fail_msg call lib_print_string jmp loop list_files: mov si, file_list qo‘ng‘iroq lib_get_file_list qo‘ng‘iroq lib_print_string jmp loop prompt db 13, 10, "_b1g" user, "_b1g>M10, 03, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17. 256 db 0 file_list marta 1024 db 0% "lib.asm" ni o'z ichiga oladi

Kodni ko'rib chiqishdan oldin, bizning veb-saytimizning asmschool.zip arxivida joylashgan lib.asm manba kod faylini kiritish uchun ko'rsatma bilan oxirgi qatorga e'tibor berishingiz kerak. Bu siz ham foydalanishingiz mumkin bo'lgan ekran, klaviatura, satrlar va disklar bilan ishlash uchun foydali tartiblar kutubxonasi - bu holda biz ushbu manba kod faylini operatsion tizim yadrosining asosiy manba faylining eng oxiriga joylashtiramiz. ikkinchisini iloji boricha ixcham va chiroyli qilish uchun ... Barcha mavjud tartiblar haqida qoʻshimcha maʼlumot olish uchun “lib.asm Routines” boʻlimiga qarang.

Operatsion tizim yadro kodining dastlabki uchta satrida biz segment registrlarini ikkilik kod yuklangan 2000 segmentini ko'rsatish uchun ma'lumotlar bilan to'ldiramiz. Bu lodsb kabi ko'rsatmalar to'g'ri ishlashini ta'minlash uchun muhim, ular boshqa segmentdan emas, balki joriy segmentdagi ma'lumotlarni o'qishi kerak. Shundan so'ng biz segmentlar bilan qo'shimcha operatsiyalarni bajarmaymiz; Bizning operatsion tizimimiz 64 KB operativ xotira bilan ishlaydi!

Keyinchalik kodda tsiklning boshiga mos keladigan yorliq mavjud. Avvalo, salomlashishni chop etish uchun lib.asm kutubxonasi tartiblaridan biri lib_print_string dan foydalanamiz. Salomlash satri oldidagi 13 va 10 baytlar yangi satr belgilaridir, shuning uchun salomlashish har qanday dastur chiqqandan keyin darhol ko'rsatilmaydi, lekin har doim yangi satrda.

Keyin biz lib_input_string deb nomlangan boshqa lib.asm pastki dasturidan foydalanamiz, u klaviatura yordamida foydalanuvchi kiritgan belgilarni oladi va ularni SI registrida ko'rsatilgan buferda saqlaydi. Bizning holatda, bufer operatsion tizim yadro kodining oxirida quyidagicha e'lon qilinadi:

Foydalanuvchining kiritish vaqti 256 db 0

Bu deklaratsiya sizga nollar bilan to'ldirilgan 256 belgidan iborat buferni yaratishga imkon beradi - bu biznikiga o'xshash oddiy operatsion tizim uchun buyruqlarni saqlash uchun etarlicha uzun bo'lishi kerak!

Keyinchalik, foydalanuvchi kiritishini tasdiqlaymiz. Agar user_input buferining birinchi bayti nolga teng bo'lsa, u holda foydalanuvchi hech qanday buyruq kiritmasdan Enter tugmasini bosdi; barcha satrlar null bilan yakunlanganligini unutmang. Shunday qilib, bu holda, biz faqat tsiklning boshiga o'tishimiz va salomni yana chop etishimiz kerak. Biroq, foydalanuvchi biron-bir buyruqni kiritgan taqdirda, biz birinchi navbatda u ls buyrug'ini kiritganligini tekshirishimiz kerak. Hozirgacha siz bizning assembler tillari dasturlarida faqat individual baytlarni solishtirishni ko'rgansiz, lekin shuni unutmangki, ikki baytli qiymatlarni yoki mashina so'zlarini solishtirish ham mumkin. Ushbu kodda biz user_input buferidagi birinchi mashina so'zini ls qatoriga mos keladigan mashina so'zi bilan taqqoslaymiz va agar ular bir xil bo'lsa, quyidagi kod blokiga o'tamiz. Ushbu kod blokida biz diskdagi fayllarning vergul bilan ajratilgan ro'yxatini olish uchun (u file_list buferida saqlanishi kerak) lib.asm dan boshqa pastki dasturdan foydalanamiz, ushbu ro'yxatni ko'rsatamiz va foydalanuvchi kiritishini qayta ishlash uchun tsiklga qaytamiz. .

Uchinchi tomon dasturlarini bajarish

Agar foydalanuvchi ls buyrug'ini kiritmasa, biz dastur nomini diskdan kiritgan deb taxmin qilamiz, shuning uchun uni yuklashga harakat qilish mantiqan. Bizning lib.asm kutubxonamiz diskdagi FAT12 fayl tizimi jadvallarini tahlil qiluvchi foydali lib_load_file quyi dasturining amalga oshirilishini o'z ichiga oladi: u AX registridan foydalangan holda fayl nomiga ega bo'lgan satr boshiga ko'rsatgichni, shuningdek, ofset qiymatini qabul qiladi. CX registridan foydalangan holda dastur faylidan ikkilik kodni yuklash uchun. Biz allaqachon SI registridan ko'rsatgichni foydalanuvchi kiritish satriga saqlash uchun foydalanmoqdamiz, shuning uchun biz bu ko'rsatgichni AX registriga ko'chiramiz va keyin dastur faylidan ikkilik faylni yuklash uchun ofset sifatida ishlatiladigan 32768 qiymatini CXga qo'yamiz. ro'yxatdan o'tish.

Lekin nima uchun biz ushbu qiymatdan ikkilik kodni dastur faylidan yuklash uchun ofset sifatida foydalanamiz? Xo'sh, bu bizning operatsion tizimimiz uchun xotira xaritasi variantlaridan biri. Biz bitta 64 KB segmentda ishlayotganimiz va yadromizning ikkilik kodi ofset 0 da yuklanganligi sababli, yadro ma'lumotlari uchun birinchi 32 KB xotiradan, qolgan 32 KB esa ma'lumotlar uchun foydalanishimiz kerak. yuklangan dasturlardan. Shunday qilib, ofset 32768 bizning segmentimizning o'rtasidir va operatsion tizim yadrosi va yuklangan dasturlar uchun etarli RAM bilan ta'minlashga imkon beradi.

Shundan so'ng, lib_load_file pastki dasturi juda muhim operatsiyani bajaradi: agar u diskda ko'rsatilgan nomga ega faylni topa olmasa yoki biron sababga ko'ra uni diskdan o'qiy olmasa, u shunchaki chiqadi va maxsus tashish bayrog'ini o'rnatadi. Bu markaziy protsessor holatining bayrog'i bo'lib, u ba'zi matematik operatsiyalarni bajarish jarayonida o'rnatiladi va hozirda bizni qiziqtirmasligi kerak, lekin ayni paytda tezkor qarorlar qabul qilish uchun ushbu bayroq mavjudligini aniqlashimiz mumkin. Agar lib_load_asm tashish bayrog'ini o'rnatsa, xato xabarini chop etadigan va foydalanuvchi kiritish siklining boshiga qaytadigan kod blokiga o'tish uchun jc ko'rsatmasidan foydalanamiz (agar olib o'tish bo'lsa).

Xuddi shu holatda, agar tashish bayrog'i o'rnatilmagan bo'lsa, biz lib_load_asm quyi dasturi ikkilik kodni 32768 manzilidagi RAMga dastur faylidan muvaffaqiyatli yuklagan degan xulosaga kelishimiz mumkin. ushbu manzilga yuklangan kod , ya'ni foydalanuvchi tomonidan belgilangan dasturni bajarishni boshlang! Va bu dastur ret ko'rsatmasidan foydalangandan so'ng (qo'ng'iroq kodiga qaytish uchun), biz faqat foydalanuvchi kiritishni qayta ishlash tsikliga qaytishimiz kerak. Shunday qilib, biz operatsion tizimni yaratdik: u lib.asm kutubxonasidagi kichik dasturlarning ko'p yordami bilan bo'lsa-da, 40 ga yaqin montaj kodida amalga oshirilgan buyruqlarni tahlil qilish va dasturlarni yuklashning eng oddiy mexanizmlaridan iborat.

Operatsion tizim yadro kodini yig'ish uchun quyidagi buyruqdan foydalaning:

Nasm -f bin -o mykernel.bin mykernel.asm

Shundan so'ng, qandaydir tarzda mykernel.bin faylini floppi disk tasvir fayliga qo'shishimiz kerak bo'ladi. Agar siz orqaga qaytish qurilmalari yordamida diskdagi tasvirlarni o'rnatishni yaxshi bilsangiz, uning yordamida floppy.img disk tasviri tarkibiga kirishingiz mumkin, ammo osonroq yo'li bor, ya'ni GNU Mtools asboblar to'plamidan (www.gnu.org/software) foydalanish. / mtools). Bu MS-DOS / FAT12 fayl tizimlaridan foydalanadigan floppi disklar bilan ishlash uchun dasturlar to'plami bo'lib, barcha mashhur Linux distributivlarining dasturiy ta'minot to'plamidan foydalanish mumkin, shuning uchun siz shunchaki apt-get, yum, pacman yoki yordam dasturidan foydalanishingiz kerak. tarqatishda dasturiy ta'minot paketlarini o'rnatish uchun foydalaniladigan har qanday boshqa yordamchi dastur.

Tegishli dasturiy ta'minot paketini o'rnatganingizdan so'ng, mykernel.bin faylini floppy.img disk tasvir fayliga qo'shish uchun quyidagi buyruqni bajarishingiz kerak bo'ladi:

Mcopy -i floppy.img mykernel.bin :: /

Buyruqning oxiridagi kulgili belgilarga e'tibor bering: yo'g'on nuqta, ikki nuqta va chiziq. Endi biz operatsion tizimimizni ishga tushirishga deyarli tayyormiz, lekin hali u uchun ilovalar mavjud bo'lmasa, buning nima keragi bor? Keling, bu tushunmovchilikni juda oddiy dastur ishlab chiqish orqali tuzataylik. Ha, endi siz o'zingizning operatsion tizimingiz uchun dastur ishlab chiqasiz - bir tasavvur qiling-a, sizning obro'ingiz geekslar safida qanchalik ko'tariladi. Quyidagi kodni test.asm deb nomlangan faylga saqlang:

Org 32768 mov ah, 0Eh mov al, "X" int 10h ret

Ushbu kod oddiygina BIOS funksiyasidan foydalanib, ekranda "X" belgisini ko'rsatadi va keyin boshqaruvni uni chaqirgan kodga qaytaradi - bizning holatlarimizda bu kod operatsion tizim kodi hisoblanadi. Ilovaning manba kodi boshlanadigan org liniyasi markaziy protsessorning ko'rsatmasi emas, balki NASM assemblerining direktivasi bo'lib, unga ikkilik kod 32768 ofsetda RAMga yuklanishini aytadi, shuning uchun qayta hisoblash kerak. ushbu holatni hisobga olgan holda barcha kompensatsiyalar.

Ushbu kodni ham yig'ish kerak va natijada olingan ikkilik fayl floppi disk tasvir fayliga qo'shilishi kerak:

Nasm -f bin -o test.bin test.asm mcopy -i floppy.img test.bin :: /

Endi chuqur nafas oling, o'zingizning ishingizning ajoyib natijalari haqida o'ylashga tayyor bo'ling va Qemu yoki VirtualBox kabi kompyuter emulyatori yordamida floppi disk tasvirini yuklang. Masalan, bu maqsadda quyidagi buyruqdan foydalanish mumkin:

Qemu-system-i386 -fda floppy.img

Voila: biz disk tasvirining birinchi sektoriga birlashtirgan boot.img yuklash moslamasi salomlash xabarini ko'rsatadigan mykernel.bin operatsion tizimining yadrosini yuklaydi. Diskda joylashgan ikkita fayl nomini (mykernel.bin va test.bin) olish uchun ls buyrug'ini kiriting va keyin uni bajarish uchun oxirgi fayl nomini kiriting va ekranda X belgisini ko'rsating.

Bu zo'r, shunday emasmi? Endi siz operatsion tizimingiz qobig'ini sozlashni boshlashingiz, yangi buyruq ilovalarini qo'shishingiz va diskka qo'shimcha dastur fayllarini qo'shishingiz mumkin. Agar siz ushbu operatsion tizimni haqiqiy shaxsiy kompyuterda ishlatmoqchi bo'lsangiz, seriyaning oldingi maqolasidan "Haqiqiy apparat platformasida yuklash moslamasini ishga tushirish" bo'limiga murojaat qilishingiz kerak - sizga aynan bir xil buyruqlar kerak bo'ladi. Kelgusi oy biz yuklab olinadigan dasturlarga tizim funksiyalaridan foydalanishga ruxsat berish va shu tariqa takrorlanishni kamaytirish uchun kod almashish kontseptsiyasini amalga oshirish orqali operatsion tizimimizni yanada kuchliroq qilamiz. Ishning katta qismi hali oldinda.

Lib.asm kutubxonasi tartiblari

Yuqorida aytib o'tilganidek, lib.asm operatsion tizim yadrolari va individual dasturlarda foydalanish uchun foydali tartiblarning katta to'plamini taqdim etadi. Ulardan ba'zilari ushbu seriyaning maqolalarida hali ko'rib chiqilmagan ko'rsatmalar va tushunchalardan foydalanadi, boshqalari (masalan, disklar bilan ishlash tartiblari) fayl tizimlarining tuzilishining o'ziga xos xususiyatlari bilan chambarchas bog'liq, ammo agar siz o'zingizni malakali deb hisoblasangiz. Ushbu masalalarda siz o'zingiz o'qishingiz mumkin. ularning amalga oshirilishi bilan va ish printsipini tushunishingiz mumkin. Aytgancha, ularni o'z kodingizdan qanday qilib chaqirishni aniqlash muhimroqdir:

  • lib_print_string - SI registri orqali null tugallangan satrga ko'rsatgichni oladi va bu qatorni ekranga chop etadi.
  • lib_input_string - SI registri orqali buferga ko'rsatgichni qabul qiladi va bu buferni klaviatura yordamida foydalanuvchi kiritgan belgilar bilan to'ldiradi. Foydalanuvchi Enter tugmasini bosgandan so'ng, buferdagi chiziq null tugatiladi va boshqaruv qo'ng'iroq qiluvchi dastur kodiga qaytadi.
  • lib_move_cursor - ekrandagi kursorni DH (satr raqami) va DL (ustun raqami) registrlari orqali o'tgan koordinatalari bo'lgan joyga olib boradi.
  • lib_get_cursor_pos - bu pastki dastur mos ravishda DH va DL registrlari orqali joriy satr va ustun raqamlarini olish uchun chaqirilishi kerak.
  • lib_string_uppercase - AX registr orqali null bilan tugallangan satr boshiga ko'rsatgichni oladi va satrdagi belgilarni bosh harfga o'zgartiradi.
  • lib_string_length - AX registr orqali null bilan tugatilgan satr boshiga ko'rsatgichni oladi va uning uzunligini AX registr orqali qaytaradi.
  • lib_string_compare - SI va DI registrlari orqali ikkita null bilan tugatilgan satrning boshiga ko'rsatgichlar oladi va satrlarni taqqoslaydi. Agar chiziqlar bir xil bo'lsa, tashish bayrog'ini o'rnatadi (jc transport bayrog'iga qarab filial yo'riqnomasidan foydalanish uchun) yoki chiziqlar boshqacha bo'lsa, bu bayroqni o'chiradi (jnc ko'rsatmasidan foydalanish uchun).
  • lib_get_file_list - SI registri orqali buferning boshiga ko'rsatgichni oladi va diskdagi fayl nomlarining vergul bilan ajratilgan ro'yxatini o'z ichiga olgan buferga null bilan yakunlangan qatorni joylashtiradi.
  • lib_load_file - AX registr orqali fayl nomini o'z ichiga olgan qator boshiga ko'rsatgichni oladi va fayl tarkibini CX registridan o'tgan ofsetda yuklaydi. BX registr yordamida xotiraga ko‘chirilgan baytlar sonini (ya’ni fayl hajmini) qaytaradi yoki berilgan nomli fayl topilmasa, tashish bayrog‘ini o‘rnatadi.

Bugun bizning Qiziqishlar kabinetida qiziq bir misol bor - bu sof assemblerda yozilgan operatsion tizim. Drayvlar, grafik qobiq, o'nlab oldindan o'rnatilgan dasturlar va o'yinlar bilan birgalikda u bir yarim megabaytdan kamroq vaqtni oladi. Tezkor va asosan rus tilidagi "Kolibri" operatsion tizimi bilan tanishing.

"Kolibri" ning rivojlanishi 2009 yilgacha juda tez ketdi. Qush turli xil qurilmalarda uchishni o'rgandi, birinchi Pentium minimal va sakkiz megabayt operativ xotira talab qilinadi. Hummingbird uchun minimal tizim talablari:

  • Protsessor: Pentium, AMD 5x86 yoki Cyrix 5x86 MMX @ 100 MGts;
  • RAM: 8 MB;
  • video karta: VGA rejimini qo'llab-quvvatlaydigan VESA-mos keladi (640 × 480 × 16).

Zamonaviy "Hummingbird" - bu 2009 yil oxirida chiqarilgan oxirgi rasmiy versiyaning muntazam yangilanadigan "tungi qurilishi". Biz 2017-yil 20-avgustdan boshlab 0.7.7.0+ qurilishini sinovdan o‘tkazdik.

OGOHLANTIRISH

Standart sozlamalarda KolibriOS BIOS orqali ko'rinadigan disklarga kirish imkoniga ega emas. Ushbu sozlamani o'zgartirishdan oldin yaxshilab o'ylab ko'ring va zaxira nusxasini yarating.

Tungi qurilishlardagi o'zgarishlar, garchi kichik bo'lsa-da, yillar davomida etarlicha to'plangan. Yangilangan "Kolibri" FAT16–32 / ext2 - ext4 bo'limlariga yozishi mumkin va o'qish rejimida boshqa mashhur fayl tizimlarini (NTFS, XFS, ISO-9660) qo'llab-quvvatlaydi. U USB va tarmoq kartalarini qo'llab-quvvatladi, TCP / IP stekini va audio kodeklarni qo'shdi. Umuman olganda, siz allaqachon biror narsa qilishingiz mumkin va shunchaki GUI-ga ega ultra yengil operatsion tizimni bir marta ko'rib chiqishingiz va ishga tushirish tezligidan hayratda qolmaysiz.



Oldingi versiyalar singari, so'nggi "Kolibri" tekis assemblerda (FASM) yozilgan va bitta floppi diskni egallaydi - 1,44 MB. Buning yordamida uni butunlay maxsus xotiraga joylashtirish mumkin. Misol uchun, hunarmandlar KolibriOS-ni to'g'ridan-to'g'ri Flash BIOS-ga yozdilar. Ish paytida u butunlay ba'zi protsessorlarning keshida joylashgan bo'lishi mumkin. Tasavvur qiling: barcha operatsion tizimlar, dasturlar va drayverlar bilan birga keshlangan!

MA'LUMOT

Kolibrios.org veb-saytiga tashrif buyurganingizda, brauzeringiz sizni xavf haqida ogohlantirishi mumkin. Buning sababi tarqatishdagi assembler dasturlari kabi ko'rinadi. VirusTotal endi saytni butunlay xavfsiz deb belgilaydi.

"Kolibri" ni floppi, qattiq disk, flesh-disk, Live CD yoki virtual mashinadan osongina yuklab olish mumkin. Emulyatsiya uchun "boshqa" OS turini belgilash, unga bitta protsessor yadrosi va bir oz RAM ajratish kifoya. Diskni ulash shart emas va DHCP bilan routeringiz bo'lsa, "Kolibri" bir zumda Internet va mahalliy tarmoqqa ulanadi. Yuklangandan so'ng darhol tegishli bildirishnomani ko'rasiz.


Muammolardan biri shundaki, HTTPS protokoli o'rnatilgan Kolibri brauzeri tomonidan qo'llab-quvvatlanmaydi. Shuning uchun, undagi saytga qarash, shuningdek, Google, Yandex, Vikipediya, "Sberbank" sahifalarini ochish mumkin emas edi ... aslida tanish manzil yo'q. Har bir inson uzoq vaqt oldin xavfsiz protokolga o'tdi. Men uchratgan eski maktabdagi sof HTTP-ga ega yagona sayt - bu "Rossiya hukumati portali", ammo u matn brauzerida ham eng yaxshi ko'rinmasdi.



Hummingbird-dagi tashqi ko'rinish sozlamalari yillar davomida yaxshilandi, ammo hali ham idealdan uzoq. Qo'llab-quvvatlanadigan video rejimlar ro'yxati lotin harfi a bo'lgan tugmani bosish orqali "Hummingbird" yuklash ekranida ko'rsatiladi.



Mavjud variantlar ro'yxati cheklangan va kerakli piksellar soni ko'rinmasligi mumkin. Agar sizda AMD (ATI) GPU-ga ega video kartangiz bo'lsa, darhol maxsus sozlamalarni qo'shishingiz mumkin. Buning uchun ATIKMS yuklagichiga -m parametrini o'tkazish kerak x x , masalan:

/ RD / 1 / DRIVERLAR / ATIKMS -m1280x800x60 -1

Bu erda / RD / 1 / DRIVERS / ATIKMS - yuklovchiga (RD - RAM Disk) yo'l.

Tizim ishlayotganida, tanlangan video rejimini vmode buyrug'i bilan ko'rish va (nazariy jihatdan) qo'lda almashtirish mumkin. Agar Kolibri virtual mashinada ishlayotgan bo'lsa, bu oyna bo'sh qoladi, ammo toza yuklash bilan Intel video drayverlarini i915 dan Skylake inklyuziviga qo'shish mumkin.

Ajablanarlisi shundaki, bir qator o'yinlar KolibriOS-ga mos keladi. Ular orasida mantiqiy va arkada o'yinlari, teg, ilon, tanklar (yo'q, WoT emas) - butun "O'yin markazi" bor! Hatto Doom va Quake ham Hummingbird-ga ko'chirildi.



Yana bir muhim narsa FB2READ o'quvchi edi. U kirill alifbosi bilan to'g'ri ishlaydi va matnni ko'rsatish sozlamalariga ega.



Men barcha foydalanuvchi fayllarini USB flesh-diskida saqlashni tavsiya qilaman, lekin u USB 2.0 porti orqali ulangan bo'lishi kerak. NTFS fayl tizimiga ega 16 GB sig'imli USB 3.0 flesh-diskimiz (USB 2.0 portida) darhol aniqlandi. Agar siz fayllarni yozishingiz kerak bo'lsa, USB flesh-diskini FAT32 bo'limiga ulashingiz kerak.



Kolibri distributiviga uchta fayl boshqaruvchisi, tasvir va hujjatlarni ko'rish uchun yordamchi dasturlar, audio va video pleerlar va boshqa maxsus ilovalar kiradi. Biroq, u assembler tilini rivojlantirishga qaratilgan.



O'rnatilgan matn muharriri ASM sintaksisini ajratib ko'rsatishga ega va hatto terilgan dasturlarni darhol ishga tushirishga imkon beradi.



Ishlab chiqish vositalari orasida i386 Windows, Linux va KolibriOS uchun Oberon-07/11 kompilyatori, shuningdek, past darajadagi emulyatorlar mavjud: E80 - ZX Spectrum emulyatori, FCE Ultra - eng yaxshi NES emulyatorlaridan biri, DOSBox v.0.74 va boshqalar. Ularning barchasi Hummingbirdga maxsus ko'chirilgan.

Agar siz KolibriOSni bir necha daqiqaga qoldirsangiz, ekran pardasi ishga tushadi. Ekranda kod satrlari ishlaydi, unda siz MenuetOS-ga havolani ko'rishingiz mumkin.

Davom etish faqat ishtirokchilar uchun mavjud

Variant 1. Saytdagi barcha materiallarni o'qish uchun "sayt" jamoasiga qo'shiling

Belgilangan muddatda hamjamiyatga a'zo bo'lish sizga BARCHA Hacker materiallariga kirish imkoniyatini ochib beradi, shaxsiy jami chegirmangizni oshiradi va professional Xakep ballini to'plash imkonini beradi!

Assembler

Assembler(ingliz tilidan. assemble - yig'moq) - assembler tilidan mashina tili buyruqlariga kompilyator.
Har bir protsessor arxitekturasi va har bir OT yoki OT oilasi uchun assembler mavjud. Xuddi shu arxitekturaga ega bo'lgan mashinalarda (yoki bitta OT muhitida) boshqa maqsadli arxitektura yoki boshqa OT uchun dasturlarni yig'ish va kerakli formatda bajariladigan kodni olish imkonini beradigan "o'zaro faoliyat yig'uvchilar" ham mavjud. maqsadli arxitekturada yoki maqsadli muhitda bajarilishi.OS.

X86 arxitekturasi

DOS uchun montajchilar

DOS operatsion tizimining eng mashhur assemblerlari Borland Turbo Assembler (TASM) va Microsoft Macro Assembler (MASM) hisoblanadi. Oddiy A86 assembler ham bir vaqtlar mashhur edi.
Dastlab, ular faqat 16-bitli ko'rsatmalarni qo'llab-quvvatladilar (Intel 80386 protsessorining kelishidan oldin). TASM va MASM ning keyingi versiyalari 32 bitli ko'rsatmalarni, shuningdek, yangi protsessorlarda va arxitekturaga oid ko'rsatmalar to'plamlarida (masalan, MMX, SSE, 3DNow! Va hokazo) kiritilgan barcha ko'rsatmalarni qo'llab-quvvatlaydi ...

Microsoft Windows

Microsoft Windows operatsion tizimining paydo bo'lishi bilan TASM32 deb nomlangan TASM kengaytmasi paydo bo'ldi, bu esa Windows muhitida ishlash uchun dasturlar yaratish imkonini berdi. Tasmning eng soʻnggi maʼlum boʻlgan versiyasi MMX koʻrsatmalarini qoʻllab-quvvatlaydigan 5.3 versiyasi boʻlib, hozirda Turbo C++ Explorer-ga kiritilgan. Ammo rasmiy ravishda dasturni ishlab chiqish butunlay to'xtatildi.
Microsoft o'zining Microsoft Macro Assembler deb nomlangan mahsulotini saqlab qoladi. U hozirgi kungacha rivojlanishda davom etmoqda, eng so'nggi versiyalari DDK-larga kiritilgan. Ammo dasturning DOS uchun dasturlar yaratishga qaratilgan versiyasi ishlab chiqilmayapti. Bundan tashqari, Stiven Xatchesson "MASM32" nomli MASM dasturlash paketini yaratdi.

GNU va GNU / Linux

GNU operatsion tizimi Intel sintaksisidan foydalanadigan boshqa mashhur assemblerlardan farqli o'laroq, AT&T sintaksisidan foydalanadigan gaz assemblerini (GNU Assembler) o'z ichiga olgan gcc kompilyatorini o'z ichiga oladi.

Portativ montajchilar

Bundan tashqari, ochiq kodli assembler loyihasi mavjud bo'lib, uning versiyalari turli xil operatsion tizimlar uchun mavjud va bu tizimlar uchun ob'ekt fayllarini olish imkonini beradi. Ushbu assembler NASM (Netwide Assembler) deb ataladi.
YASM - NASM ning noldan qayta yozilgan BSD litsenziyalangan versiyasi (ba'zi istisnolardan tashqari).
FASM (Flat Assembler) - qayta litsenziyalashni taqiqlash uchun o'zgartirilgan BSD litsenziyasi ostidagi yosh assembler (shu jumladan GNU GPL bo'yicha). KolibriOS, GNU / Linux, MS-DOS va Microsoft Windows versiyalari mavjud, Intel sintaksisidan foydalanadi va AMD64 ko'rsatmalarini qo'llab-quvvatlaydi.

RISC arxitekturalari


MCS-51
AVR
Ayni paytda Atmel'dan 2 ta kompilyator mavjud (AVRStudio 3 va AVRStudio4). Ikkinchi versiya - unchalik muvaffaqiyatli bo'lmagan birinchisini tuzatishga urinish. WinAVR da assembler ham mavjud.
ARM
AVR32
MSP430
PowerPC

Yig'ish va kompilyatsiya qilish

Assemblar tilidagi dasturni obyekt kodiga tarjima qilish jarayoni odatda assembly deb ataladi. Kompilyatsiyadan farqli o'laroq, yig'ish ko'proq yoki kamroq aniq va teskari. Assemblar tilida har bir mnemonika bitta mashina ko'rsatmasiga to'g'ri keladi, yuqori darajadagi dasturlash tillarida esa har bir ifoda orqasida juda ko'p turli xil ko'rsatmalar yashirin bo'lishi mumkin. Asosan, bu bo'linish o'zboshimchalik bilan amalga oshiriladi, shuning uchun ba'zida montaj dasturlarini tarjima qilish kompilyatsiya deb ham ataladi.

Assambleya tili

Assambleya tili- past darajadagi dasturlash tilining bir turi bo'lib, u odam o'qishi mumkin bo'lgan mashina ko'rsatmalarini yozib olish formatidir. U ko'pincha qisqalik uchun assembler deb ataladi, bu to'g'ri emas.

Assembly tilining ko'rsatmalari protsessor ko'rsatmalari bilan birma-bir mos keladi va aslida buyruqlar va ularning argumentlarini belgilashning qulay ramziy shaklini (mnemonik kodini) ifodalaydi. Shuningdek, assembler tili dasturning asosiy abstraktsiyalarini taqdim etadi: dastur qismlari va ma'lumotlarni yorliqlar orqali ramziy nomlar bilan bog'lash (yig'ish paytida har bir yorliq uchun manzil hisoblab chiqiladi, shundan so'ng yorliqning har bir paydo bo'lishi ushbu manzil bilan almashtiriladi) va direktivalar.
Assembler direktivalari dasturga ma'lumotlar bloklarini (aniq tasvirlangan yoki fayldan o'qilgan) kiritish imkonini beradi; ma'lum bir parchani ma'lum bir necha marta takrorlash; fragmentni shartli ravishda tuzish; xotiradagi joylashuv manzilidan farqli bo'lgan fragmentning bajarilish manzilini o'rnatish [ko'rsating!]; kompilyatsiya paytida teglar qiymatlarini o'zgartirish; parametrlarga ega makrolardan foydalaning va hokazo.
Har bir protsessor modeli, asosan, o'ziga xos ko'rsatmalar to'plamiga va mos keladigan montaj tiliga (yoki dialektga) ega.

Afzalliklari va kamchiliklari

Assemblar tilining fazilatlari

Ortiqcha kodning minimal miqdori, ya'ni kamroq ko'rsatmalar va xotiraga kirishdan foydalanish dastur tezligini oshirish va hajmini kamaytirish imkonini beradi.
To'liq muvofiqlikni ta'minlash va kerakli platformaning imkoniyatlarini maksimal darajada oshirish: ushbu platformaning maxsus ko'rsatmalari va texnik xususiyatlaridan foydalanish.
Assemblar tilida dasturlashda maxsus xususiyatlar mavjud bo'ladi: apparat, kiritish-chiqarish portlari va protsessorning maxsus registrlariga to'g'ridan-to'g'ri kirish, shuningdek, o'z-o'zini o'zgartiruvchi kodni yozish qobiliyati (ya'ni, metadasturlash va hech qanday ehtiyoj sezmasdan. dasturiy ta'minot tarjimoni).
Operatsion tizimlarda joriy qilingan so'nggi xavfsizlik texnologiyalari o'z-o'zini o'zgartiruvchi kodni yaratishga imkon bermaydi, chunki ular bir vaqtning o'zida ko'rsatmalarni bajarish va bir xil xotira maydonida yozishni istisno qiladi (BSD tizimlarida W ^ X texnologiyasi, Windowsda DEP).

Assembler tilining kamchiliklari

Katta hajmdagi kodlar va ko'p sonli qo'shimcha kichik vazifalar, bu kodni o'qish va tushunish juda qiyin bo'lishiga olib keladi va shuning uchun dasturni disk raskadrovka qilish va takomillashtirish, shuningdek, dasturlash paradigmalarini amalga oshirish qiyinligi va boshqa konventsiyalar. hamkorlikdagi rivojlanishning murakkabligiga olib keladi.
Kamroq mavjud kutubxonalar, ularning bir-biriga mosligi past.
Boshqa platformalarga o'tkazilmasligi (ikkilik moslashuvdan tashqari).

Ilova

To'g'ridan-to'g'ri afzalliklari va kamchiliklaridan kelib chiqadi.
Assembler tilida katta hajmdagi dasturlarni yozish nihoyatda noqulay bo'lgani uchun ular yuqori darajadagi tillarda yoziladi. Assambleya tilida ular juda muhim bo'lgan kichik qismlar yoki modullarni yozadilar:
tezlik (haydovchilar);
kod hajmi (yuklash sektorlari, cheklangan resurslarga ega mikrokontrollerlar va protsessorlar uchun dasturiy ta'minot, viruslar, dasturiy ta'minot himoyasi);
maxsus xususiyatlar: to'g'ridan-to'g'ri apparat yoki mashina kodi, ya'ni operatsion tizim yuklagichlari, drayverlar, viruslar, himoya tizimlari bilan ishlash.

Assambleya kodini boshqa tillarga ulash

Ko'pincha dastur bo'laklari montajda yozilganligi sababli, ular boshqa tillardagi boshqa qismlar bilan bog'lanishi kerak. Bunga 2 asosiy usulda erishiladi:
Kompilyatsiya vaqtida- dasturga inline assembler fragmentlarini maxsus til direktivalari, shu jumladan assembler tilida yozish protseduralari bilan kiritish. Usul oddiy ma'lumotlarni o'zgartirish uchun qulay, ammo to'liq yig'ish kodi, ma'lumotlar va pastki dasturlar, shu jumladan yuqori darajadagi tillar tomonidan qo'llab-quvvatlanmaydigan ko'plab kirish va chiqishlarga ega bo'lgan pastki dasturlarni amalga oshirish mumkin emas.
Qurilish bosqichida, yoki alohida kompilyatsiya. Bog'langan modullarning o'zaro ta'siri uchun ulanish funktsiyalari kerakli chaqiruv konventsiyalari va ma'lumotlar turlarini qo'llab-quvvatlashi etarli. Individual modullar har qanday tilda, shu jumladan assemblerda ham yozilishi mumkin.

Sintaksis

Assembly tillari sintaksisi uchun umume'tirof etilgan standart mavjud emas. Biroq, montaj tilini ishlab chiquvchilarning ko'pchiligi amal qiladigan standartlar mavjud. Bunday asosiy standartlar Intel sintaksisi va AT&T sintaksisidir.

Ko'rsatmalar

Ko'rsatmalar yozishning umumiy formati ikkala standart uchun ham bir xil:

[label:] opcode [operands] [; comment]

bu erda opcode protsessorga yo'riqnomaning haqiqiy mnemonikidir. Unga prefikslar (takrorlashlar, manzillash turini o'zgartirish va hokazo) qo'shilishi mumkin.
Operandlar konstantalar, registr nomlari, operativ xotiradagi manzillar va hokazo bo'lishi mumkin. Intel va AT&T standartlari o'rtasidagi farqlar asosan operandlarni sanab o'tish tartibi va turli adreslash usullari uchun ularning sintaksisi bilan bog'liq.
Amaldagi mnemonika odatda bir xil arxitektura yoki arxitektura oilasining barcha protsessorlari uchun bir xil bo'ladi (keng ma'lum bo'lganlar orasida Motorola, ARM, x86 protsessorlari va kontrollerlarining mnemonikalari bor). Ular protsessor spetsifikatsiyasida tasvirlangan. Mumkin bo'lgan istisnolar:
Assembler o'zaro platformali AT&T sintaksisidan foydalansa (asl mnemonika AT&T sintaksisiga majburlangan)
Agar dastlab mnemonikani yozish uchun ikkita standart mavjud bo'lsa (buyruqlar tizimi boshqa ishlab chiqaruvchining protsessoridan meros bo'lib o'tgan).
Masalan, Zilog Z80 protsessori Intel i8080 ko'rsatmalar to'plamini meros qilib oldi, uni kengaytirdi va mnemonikani (va ro'yxatga olish belgilarini) o'ziga xos tarzda o'zgartirdi. Misol uchun, men Intelning movini ld ga o'zgartirdim. Motorola Fireball protsessorlari Z80 ko'rsatmalar to'plamini meros qilib oldi va uni biroz qisqartirdi. Shu bilan birga, Motorola rasmiy ravishda Intel mnemonikasiga qaytdi. Va hozirda Fireball uchun assemblerlarning yarmi Intel mnemonikasi bilan, yarmi esa Zilog mnemonikasi bilan ishlaydi.

Direktivlar

Ko'rsatmalarga qo'shimcha ravishda, dasturda direktivalar bo'lishi mumkin: to'g'ridan-to'g'ri mashina ko'rsatmalariga tarjima qilinmaydigan, lekin kompilyatorning ishlashini boshqaradigan ko'rsatmalar. Ularning to'plami va sintaksisi sezilarli darajada farq qiladi va apparat platformasiga emas, balki foydalaniladigan kompilyatorga bog'liq (bir xil arxitektura oilasidagi tillarning dialektlarini keltirib chiqaradi). "Jentlmenlar to'plami" sifatida quyidagilarni ajratib ko'rsatish mumkin:
ma'lumotlar ta'rifi (konstantalar va o'zgaruvchilar)
dasturni xotirada tashkil qilishni va chiqish fayli parametrlarini boshqarish
kompilyator rejimini sozlash
barcha turdagi abstraktsiyalar (ya'ni yuqori darajadagi tillarning elementlari) - protseduralar va funktsiyalarni loyihalashdan (protsessual dasturlash paradigmasini amalga oshirishni soddalashtirish uchun) shartli konstruktsiyalar va tsikllargacha (tuzilgan dasturlash paradigmasi uchun)
makroslar

Dastur namunasi

TASM dialektidagi x86 arxitekturasi uchun MS-DOS uchun Hello world dasturiga misol:

.MODEL TINY KOD SEGMENTI TASARLAYING CS: KOD, DS: KOD ORG 100 soat START: mov ah, 9 mov dx, OFFSET Msg int 21h int 20h Msg DB “Hello World”, 13,10, “$” KOD TUGAYISH

"Assemble tili" atamasining kelib chiqishi va tanqidi

Ushbu turdagi tillar o'z nomini ushbu tillardan tarjimon (kompilyator) - assembler (ingliz assembler) nomidan oldi. Ikkinchisining nomi birinchi kompyuterlarda yuqori darajadagi tillar bo'lmaganligi va assembler yordamida dasturlarni yaratishning yagona muqobilligi to'g'ridan-to'g'ri kodlarda dasturlash bo'lganligi bilan bog'liq.
Rus tilidagi assambleya tili ko'pincha "assembler" deb ataladi (va u bilan bog'liq bo'lgan narsa - "assembler"), bu so'zning inglizcha tarjimasiga ko'ra, noto'g'ri, lekin rus tilining qoidalariga mos keladi. Biroq, assemblerning (dasturning) o'zi "assembler tilini kompilyator" emas, balki oddiygina "assembler" deb ham ataladi.
“Assembly tili” atamasini qo‘llash ham bitta past darajadagi til yoki hech bo‘lmaganda bunday tillar uchun standart mavjud degan noto‘g‘ri tasavvurga olib kelishi mumkin. Muayyan dastur yoziladigan tilni nomlashda u qanday arxitektura uchun mo`ljallanganligini va tilning qaysi shevasida yozilganligini ko`rsatish maqsadga muvofiqdir.