Windows.  Viruslar.  Noutbuklar.  Internet.  idora.  Utilitalar.  Haydovchilar

1. Haqiqiy vaqt hisoblagichi yoqilgan bo'lishi kerak (1); Agar soat asosiy soatdan bo'lmasa, soat manbasini tanlash biti tozalanadi (2).

2. Bitta yoki ikkala uzilish hodisasini tanlash bitlari (3) o'rnatilishi kerak. Va qaysi hodisalar uzilish so'rovini ishga tushirishi tanlanadi (5).

3. Interrupt hodisasi maskalari (4, 7) o'rnatilishi kerak.

2.5 ARM7 ni assemblerda dasturlash haqida

ARM7 ko'rsatmalar to'plami (1.4-bo'lim) faqat 45 ta ko'rsatmalarni o'z ichiga oladi, ular turli xil adreslash usullari, shartli maydonlar va modifikatorlar tufayli juda murakkab. Assembler tili dasturi og'ir va

Bilan o'qish qiyin. Shuning uchun, assembler ARM7 arxitekturasi uchun dasturlashda kamdan-kam qo'llaniladi.

Biroq, yuqori darajadagi C tili dasturchidan ko'plab me'moriy xususiyatlarni yashiradi. Dasturchi yadro rejimini tanlash, stek uchun xotira ajratish va uzilishlarni qayta ishlash kabi protseduralarga deyarli tegmaydi. Ushbu protseduralarni o'rganish uchun kamida bittasini tuzish foydalidir oddiy dastur assemblerda.

Bundan tashqari, C dan foydalanganda ham, assembly tiliga murojaat qilish kerak.

1. Nazorat qilinishi kerak C kompilyatori optimallashtirish paytida muhim ko'rsatmalarni chiqarib tashlagan-yo'qligini kuzatib boradi, ularni keraksiz deb hisoblaydi. Kompilyator optimallashtirishning etarli emasligi sababli nisbatan oddiy operatsiya uchun juda samarasiz kod ishlab chiqaradimi? Kompilyator haqiqatan ham ma'lum bir algoritm samaradorligini oshirish uchun mo'ljallangan apparat resurslaridan foydalanishiga ishonch hosil qilish uchun.

2. Xatolar yoki istisnolar sabablarini qidirishda (2.4.1-bo'lim).

3. Ishlash yoki xotira iste'moli nuqtai nazaridan mutlaqo optimal kodni olish uchun (2.2.20, 3.1.5-bo'limlar).

Assemblerda dasturni kompilyatsiya qilishning asosiy usullarini ko'rib chiqing

Bilan mikrokontroller tomonidan bajarilgan barcha kodlarni vositachisiz ko'rsatish maqsadi C kompilyatori.

Assemblerga asoslangan loyihani yaratish tartibi C dasturlari bilan deyarli bir xil (2.3.1-2.3.3-bo'limlar). Faqat ikkita istisno mavjud:

a) manba matn fayliga *.S kengaytmasi tayinlangan;

b) bu ​​yerda STARTUP.S fayli dasturga ulanmagan deb taxmin qilinadi.

2.5.1 Assemblerda dasturlar yozishning asosiy qoidalari

Assemblerda dastur matnini to'rtta ustunga joylashtirish odatiy holdir. Aytishimiz mumkinki, har bir satr to'rtta maydondan iborat, ya'ni: teglar, operatsiyalar, operandlar, sharhlar maydonlari. Maydonlar bir-biridan yorliqlar yoki bo'shliqlar bilan ajratilgan.

Asosiy sohalar operatsiyalar va operandlardir. Amaldagi amallar va ularning sintaksisi (1.4.2) jadvalda keltirilgan.

Yorliq - bu buyruq manzilining ramziy ko'rinishi. Hamma joyda yorliq o'rniga yorliq oldidagi buyruq manzili almashtiriladi. Ko'pincha teglar boshqaruvni uzatish buyruqlarida qo'llaniladi. Har bir yorliq noyob bo'lishi va ixtiyoriy bo'lishi kerak. Ko'pgina boshqa versiyalardan farqli o'laroq, RealView assemblerda teglar ikki nuqta (":") bilan tugamaydi.

Izohlar ixtiyoriy ravishda satr oxiriga joylashtiriladi va nuqtali vergul ("; ") bilan ajratiladi.

Keling, oddiy misolni olaylik.

2.5.2 Pseudo buyruqlar

RealView assembler psevdo-buyruqlar deb ataladigan narsalarni qo'llab-quvvatlaydi. Pseudo-buyruq - bu mnemonik belgi, bu aslida protsessorning ko'rsatmalar to'plamiga mos kelmaydi, lekin bir yoki (kamdan-kam hollarda) bir nechta ko'rsatmalar bilan almashtiriladi. Pseudo-buyruqlar makrolarning bir turi bo'lib, sintaksisni soddalashtirish uchun xizmat qiladi. Qo'llab-quvvatlanadigan psevdo-buyruqlar ro'yxati (2.5.1) jadvalda keltirilgan.

2.5.3 Yig'ilish bo'yicha ko'rsatmalar

Ko'rsatmalardan farqli o'laroq, direktivalar mikrokontroller xotirasiga yuklangan bajariladigan kodni yaratmaydi. Direktivlar assemblerga ko'rsatmalar bo'lib, ular bajariladigan kodning shakllanishini nazorat qiladi.

Keling, tez-tez ishlatiladigan RealView 4 assembler direktivalarini ko'rib chiqaylik.

EQU nomi doimiy

Konstantaga nom belgisini belgilaydi, u doimiyning sinonimiga aylanadi. Asosiy maqsad - nazorat registrlarining nomlarini kiritish,

AREA nomi, Options

Berilgan Ism bilan xotira hududini belgilaydi. Parametrlar xotira maydonining maqsadini belgilaydi, masalan, DATA (ma'lumotlar) yoki CODE (kod). Belgilangan hududning manzillari tanlangan manzilga bog'liq. KOD maydoni 0x00000000 manzilidan, DATA maydoni 0x40000000 manzilidan boshlab joylashgan. Dasturda RESET deb nomlangan KOD hududi bo'lishi kerak. Dastur xotirasida ajratilgan konstantalar CODE, READONLY parametr juftligi bo'lgan bo'limda e'lon qilinishi kerak.

Dasturga kirish nuqtasini belgilaydi, uning "boshlanishi" ni ko'rsatadi. Bunday direktivalardan biri har doim dasturda bo'lishi kerak. Odatda AREA RESET, CODE direktivasidan so'ng darhol joylashtiriladi.

2.5.1-jadval - RealView 4 assembler tomonidan qo'llab-quvvatlanadigan psevdo-buyruqlar

Mnemonik belgi

Operatsiya

Haqiqiy amalga oshirish

va sintaksis

ADR (shart)

ro'yxatdan o'tish

Kompyuterdan doimiyni qo'shish yoki ayirish

QO'SHISH yoki SUB buyruqlari

ADRL(Shart)

ro'yxatdan o'tish

Kompyuter bilan ikki marta qo'shish yoki SUB

(kengaytirilgan manzil diapazoni)

ASR(Cond)(S)

Arifmetik o'ngga siljish

ASR(Cond)(S)

siljish operand

LDR(Shart)

ro'yxatdan o'tish

adreslash (kompyuter + to'g'ridan-to'g'ri ofset)

Konstantani joylashtirish

dastur xotirasida

LDR(indeks manzilidan -

tion. Ofset kompyuterdir.

LSL(Cond)(S)

Chapga mantiqiy siljish

LSL(Cond)(S)

siljish operand

LSR(Cond)(S)

Mantiqiy o'ngga siljish

LSR(Cond)(S)

siljish operand

POP(konv)

Registrlarni stekdan tiklang

Qayta tiklash

registrlar

jamoa

LDMIA R13!,(...)

PUSH(Cond)

Saqlash

registrlar

jamoa

STMDB R13!,(...)

ROR(Cond)(S)

O'ngga aylantiring

ROR(Cond)(S)

siljish operand

RRX(Konv)(S)

To'g'ridan-to'g'ri aylantiring

1 raqamga o'tkazish

siljish operand

SPACE hajmini nomlang

Berilgan o'lchamdagi ma'lumotlarni saqlash uchun xotirani zaxiralaydi. Ism ajratilgan joyning manzili bilan sinonimga aylanadi. Manzil maydonining birligi ushbu direktivani ham doimiy, ham foydalanish uchun ishlatishga imkon beradi tasodifiy kirish xotirasi. Asosiy maqsad RAMda (DATA sohasida) global o'zgaruvchilarni yaratishdir.

Yorliq DCB/DCW/DCD doimiy

Dastur xotirasida ma'lumotlarni (raqamli konstantalar) "tikish". Yorliq ma'lumotlar yoziladigan manzil bilan sinonimga aylanadi. Turli o'lchamdagi ma'lumotlar uchun turli xil direktivalar (DCB, DCW va DCD) qo'llaniladi: bayt, 16 bitli so'z, 32 bitli so'z (mos ravishda).

Fayl oxiri belgisi sifatida xizmat qiladi. Ushbu direktivadan keyingi barcha matn assembler tomonidan e'tiborga olinmaydi.

2.5.4 Makroslar

Makros - bu qandaydir umumiy operatsiyalarni bajaradigan dasturning oldindan belgilangan qismi. Boshqaruv uzatish buyruqlari bilan chaqiriladigan kichik dasturlardan farqli o'laroq, makroslardan foydalanish unumdorlikni pasaytirmaydi, lekin dastur xotirasi sarfini kamaytirmaydi. Chunki har bir so‘l chaqiruvda assembler o‘zining butun matnini dasturga joylashtiradi.

Makrosni e'lon qilish uchun quyidagi konstruktsiyadan foydalaniladi

$Parameter1, $Parameter2, ...

Parametrlar makrosning matnini har safar chaqirilganda o'zgartirish imkonini beradi. Makrosning ichida (tanasida) oldingi "$" belgisi bilan parametrlar ham ishlatiladi. Ibratli tanadagi parametrlar o'rniga qo'ng'iroq paytida ko'rsatilgan parametrlar almashtiriladi.

Makro shunday deb ataladi:

Nomi Parametr1, Parametr2, ...

Vaziyatni tekshirish va dallanishni tashkil qilish mumkin.

AGAR "$Parameter" == "Qiymat"

E'tibor bering, bu qurilish olib kelmaydi dasturni tekshirish mikrokontroller sharoitlari. Vaziyat bajariladigan kodni shakllantirish jarayonida assembler tomonidan tekshiriladi.

Hozirgi vaqtda hatto juda oddiy mikrokontrollerlarni ham dasturlash uchun yuqori darajali tillar qo'llaniladi, ular odatda C yoki C++ tilining quyi to'plamlari hisoblanadi.

Biroq, protsessorlar arxitekturasini va uning xususiyatlarini o'rganishda, montaj tillaridan foydalanish tavsiya etiladi, chunki faqat shunday yondashuv o'rganilayotgan arxitektura xususiyatlarini aniqlashni ta'minlaydi. Shu sababli, keyingi taqdimot Assambleya tilidan foydalangan holda amalga oshiriladi.

ARM7 buyruqlarini ko'rib chiqishga o'tishdan oldin uning quyidagi xususiyatlarini ta'kidlash kerak:

    Ikkita ko'rsatmalar to'plamini qo'llab-quvvatlash: 32 bitli ko'rsatmalarga ega ARM va 16 bitli ko'rsatmalarga ega THUMB. Quyida 32-bitli ko'rsatmalar to'plami berilgan, ARM so'zi ushbu formatga tegishli ko'rsatmalarni va ARM7 so'zi - protsessorning o'zini anglatadi.

    Ikkita 32-bitli manzil formatlarini qo'llab-quvvatlash: bilan teskari tartib bitlar (katta-endian protsessor va kichik-endian protsessor). Birinchi holda, eng muhim bit (Most Significant Bit - MSB) so'zning eng kam ahamiyatli bitida, ikkinchi holatda esa eng muhim bitida joylashgan. Bu yuqori darajadagi tillardan foydalanganda 32-bitli protsessorlarning boshqa oilalari bilan moslikni ta'minlaydi. Biroq, ARM yadrosi bo'lgan bir qator protsessorlar oilalarida faqat kichik endian ishlatiladi (ya'ni, MSB manzilning eng muhim bitidir), bu protsessor bilan ishlashni sezilarli darajada osonlashtiradi. ARM7 uchun ishlatiladigan kompilyator ikkala formatdagi kod bilan ishlaganligi sababli, so'z formati to'g'ri o'rnatilganligiga ishonch hosil qilishingiz kerak, aks holda olingan kod "ichiga aylantiriladi".

    Amalga oshirish qobiliyati har xil turlari ALUda ishlatishdan oldin operandlardan birini "o'tishda" o'zgartirish

    Har qanday buyruqning shartli bajarilishini qo'llab-quvvatlash

    Operatsiya natijalarining bayroqlarini o'zgartirishni taqiqlash imkoniyati.

      1. Shartli buyruqni bajarish

ARM ko'rsatmalar to'plamining muhim xususiyatlaridan biri uning qo'llab-quvvatlashidir shartli bajarish har qanday jamoa. An'anaviy mikrokontrollerlarda yagona shartli ko'rsatmalar shartli sakrashlar va ehtimol boshqa bir qator, masalan, alohida bitlarning holatini tekshirish yoki o'zgartirish bo'yicha ko'rsatmalardir. ARM ko'rsatmalar to'plamida ko'rsatma kodining yuqori 4 biti doimo CPSR registridagi shart bayroqlari bilan taqqoslanadi. Agar ularning qiymatlari mos kelmasa, shifrni ochish bosqichidagi buyruq NOP (hech qanday operatsiya) buyrug'i bilan almashtiriladi.

Bu "qisqa" o'tishlar bilan dasturning bo'limlarini bajarish vaqtini sezilarli darajada qisqartiradi. Shunday qilib, masalan, haqiqiy koeffitsientli kvadrat tenglamalarni va manfiy diskriminantli ixtiyoriy ildizlarni echishda, hisoblashdan oldin kerak. kvadrat ildiz diskriminantning belgisini o'zgartiring va natijani javobning xayoliy qismiga belgilang.

Ushbu masalani an'anaviy yechishda shartli o'tish buyrug'ini kiritish kerak. Ushbu buyruqning bajarilishi kamida 2 tsiklni oladi - shifrni ochish va yangi manzil qiymatini dastur hisoblagichiga yuklash va buyruq quvurini yuklash uchun qo'shimcha tsikllar soni. Ijobiy diskriminant bilan shartli buyruq bajarilishidan foydalanilganda, belgini o'zgartirish buyrug'i bo'sh operatsiya bilan almashtiriladi. Bunday holda, ko'rsatma quvur liniyasi tozalanmaydi va yo'qotishlar bir soat tsiklidan ko'p emas. Shartli ko'rsatmalarni NOP ko'rsatmasi bilan almashtirish an'anaviy shartli tarmoq ko'rsatmalarini bajarishdan ko'ra samaraliroq bo'lgan chegara va bu bilan bog'liq bo'lgan quvur liniyasini to'ldirish uning chuqurligiga teng, ya'ni. uch.

Ushbu xususiyatni amalga oshirish uchun siz assembler ko'rsatmalarining asosiy mnemonik yozuviga (va C ham) shart bayroqlarining sinov holatini belgilaydigan o'n oltita prefiksdan birini qo'shishingiz kerak. Ushbu prefikslar Jadvalda keltirilgan. 3. Shunga ko'ra, har bir jamoa uchun 16 ta variant mavjud. Masalan, quyidagi buyruq:

MOVEQ R1, #0x008

0x00800000 raqamini R1 registriga yuklash faqat oxirgi ma'lumotlarni qayta ishlash buyrug'ining natijasi "teng" bo'lsa yoki 0 natija olinsa va CPSR registrining bayrog'i (Z) mos ravishda o'rnatilgan bo'lsagina amalga oshirilishini bildiradi.

3-jadval

Buyruq prefikslari

Ma'nosi

Z o'rnatilgan

Z tushib ketdi

O'rnatilgan holda

Katta yoki teng (imzosiz)

C qayta o'rnatish

Quyida (imzosiz)

N o'rnatilgan

Salbiy natija

N tushdi

Ijobiy natija yoki 0

V o'rnatilgan

To'lib ketish

V tushdi

To'lib ketish yo'q

O'rnatilgan holda,

Z tushib ketdi

Yuqorida (imzosiz)

Tushgan holda,

Z o'rnatilgan

Kichik yoki teng (imzosiz)

Kattaroq yoki teng (imzolangan)

N V ga teng emas

Kamroq (imzolangan)

Z qayta o'rnatish VA

(N ga teng V)

Batafsil (imzolangan)

Z o'rnatilgan OR

(N V ga teng emas)

Kichik yoki teng (imzolangan)

(e'tiborsiz)

Shartsiz bajarish

CISC protsessorlari bitta buyruqda ancha murakkab operatsiyalarni, shu jumladan xotira kataklari tarkibidagi arifmetik va mantiqiy operatsiyalarni bajaradi. CPU CISC ko'rsatmalari turli uzunliklarga ega bo'lishi mumkin.

Aksincha, RISC nisbatan ega oddiy tizim operatsiya turi bo'yicha aniq bo'linish bilan buyruqlar:

  • xotira bilan ishlash (xotiradan registrlarga o'qish yoki registrlardan xotiraga yozish),
  • registrlarda ma'lumotlarni qayta ishlash (arifmetik, mantiqiy, ma'lumotlarning chapga / o'ngga siljishi yoki registrda bit aylanishi),
  • boshqa manzillarga shartli yoki shartsiz o'tish uchun ko'rsatmalar.

Qoidaga ko'ra (lekin har doim ham emas va faqat dastur kodi kontroller kesh xotirasiga tushsa), bitta ko'rsatma bitta protsessor siklida bajariladi. ARM protsessorining ko'rsatma uzunligi belgilangan - 4 bayt (bitta kompyuter so'zi). Darhaqiqat, zamonaviy ARM protsessori boshqa ish rejimlariga, masalan, buyruq uzunligi 2 baytga aylanganda THUMB rejimiga o'tishi mumkin. Bu kodni yanada ixcham qilish imkonini beradi. Biroq, biz ushbu maqolada ushbu rejimni ko'rib chiqmaymiz, chunki u Amber ARM v2a protsessorida qo'llab-quvvatlanmaydi. Xuddi shu sababga ko'ra, biz Jazelle (Java kodini bajarish uchun optimallashtirilgan) kabi rejimlarni ko'rib chiqmaymiz va NEON buyruqlarini - bir nechta ma'lumotlar bilan ishlash buyruqlarini ko'rib chiqmaymiz. Shunga qaramay, biz sof ARM ko'rsatmalar to'plamini o'rganmoqdamiz.

ARM protsessor registrlari.

ARM protsessorida bir nechta registrlar to'plami mavjud, ulardan bu daqiqa dasturchiga atigi 16 marta mavjud.Protsessor ishining bir necha rejimlari mavjud, ishlash rejimiga qarab tegishli registrlar banki tanlanadi. Ushbu ish rejimlari:

  • dastur rejimi (USR, foydalanuvchi rejimi),
  • nazoratchi rejimi yoki operatsion tizim(SVC, nazoratchi rejimi),
  • uzilishlar bilan ishlash rejimi (IRQ, uzilish rejimi) va
  • ishlov berish rejimi "shoshilinch uzilish" (FIRQ, tez uzilish rejimi).

Ya'ni, masalan, uzilish sodir bo'lganda, protsessorning o'zi uzilishni qayta ishlash dasturining manziliga boradi va avtomatik ravishda registr banklarini "o'zgartiradi".

Eski ARM protsessorlari, yuqoridagi ish rejimlariga qo'shimcha ravishda, qo'shimcha rejimlarga ega:

  • Bekor qilish (xotiraga kirish istisnolarini boshqarish uchun ishlatiladi),
  • Aniqlanmagan (koprotsessorni amalga oshirish uchun ishlatiladi dasturiy jihatdan) Va
  • operatsion tizim tizimining imtiyozli vazifa rejimi.

Amber ARM v2a protsessorida bu qo'shimcha uchta rejim mavjud emas.

Amber ARM v2a uchun registrlar to'plami quyidagicha ifodalanishi mumkin:

r0-r7 registrlari barcha rejimlar uchun bir xil.
r8-r12 registrlari faqat USR, SVC, IRQ rejimlari uchun keng tarqalgan.
Register r13 - stek ko'rsatkichi. U barcha rejimlarda.
Register r14 - pastki dasturdan qaytish registrlari ham barcha rejimlarda o'ziga xosdir.
Register r15 - bajariladigan ko'rsatmalarga ko'rsatgich. Bu barcha rejimlar uchun umumiydir.

Ko'rinib turibdiki, FIRQ rejimi eng izolyatsiya qilingan, u o'zining eng ko'p registrlariga ega. Bu juda muhim bo'lgan uzilishlar registrlarni stekga saqlamasdan, vaqtni behuda sarflamasdan qayta ishlanishi uchun amalga oshiriladi.

r15 registriga alohida e'tibor berilishi kerak, shuningdek, kompyuter (Dastur hisoblagichi) sifatida ham tanilgan - bajariladigan buyruqlar uchun ko'rsatgich. Uning mazmuni ustida turli arifmetik va mantiqiy amallarni bajarish mumkin, shu bilan dasturning bajarilishi boshqa manzillarga o'tadi. Biroq, Amber tizimida joriy qilingan ARM v2a protsessorida ushbu registrning bitlarini talqin qilishda ba'zi nozikliklar mavjud.

Gap shundaki, ushbu protsessorda r15 registrida (kompyuter) bajariladigan buyruqlar uchun haqiqiy ko'rsatgichga qo'shimcha ravishda quyidagi ma'lumotlar mavjud:

Bitlar 31:28 - arifmetik yoki mantiqiy operatsiya natijasining bayroqlari
Bitlar 27 - Interrupt IRQ maskasi, bit o'rnatilganda uzilishlar o'chiriladi.
Bitlar 26 - FIRQ uzilish maskasi, bit o'rnatilganda tez uzilishlar o'chiriladi.
Bits 25:2 - dastur ko'rsatmalariga ko'rsatgichning o'zi atigi 26 bitni egallaydi.
Bitlar 1:0 - protsessorning joriy ish rejimi.
3-Nazoratchi
2 - uzilish
1-tezkor uzilish
0 - foydalanuvchi

Eski ARM protsessorlarida barcha bayroqlar va xizmat bitlari alohida registrlarda joylashgan. Joriy dastur holati registri( cpsr ) va Saved Program Status Register ( spsr ), ular uchun kirish uchun alohida maxsus buyruqlar mavjud. Bu dasturlar uchun mavjud manzil maydonini kengaytirish maqsadida amalga oshiriladi.

ARM assemblerni o'zlashtirishdagi qiyinchiliklardan biri bu ba'zi registrlarning muqobil nomlaridir. Shunday qilib, yuqorida aytib o'tilganidek, r15 bir xil kompyuterdir. Bundan tashqari, r13 mavjud - bu bir xil sp (Stack Pointer), r14 - lr (Link Register) - protseduradan qaytish manzili registri. Bundan tashqari, r12 bir xil IP (Intra-Procedure -call scratch Registri) bo'lib, C kompilyatorlari tomonidan stekdagi parametrlarga kirish uchun maxsus usulda foydalaniladi. Bunday muqobil nomlash ba'zan boshqa birovning dastur kodini ko'rib chiqayotganda chalkashlik tug'diradi - ikkalasi ham, registr belgilari ham mavjud.

Kodni bajarish xususiyatlari.

Ko'p turdagi protsessorlarda (masalan, x86) shart bo'yicha faqat boshqa dastur manziliga o'tish mumkin. ARM bilan bunday emas. Har bir ARM protsessor buyrug'i shart bo'yicha bajarilishi yoki bajarilmasligi mumkin. Bu dastur sakrash sonini minimallashtirish va shuning uchun protsessorning quvur liniyasidan (quvur liniyasidan) samarali foydalanish imkonini beradi.

Axir, quvur liniyasi nima? Hozirda dastur kodidan bitta protsessor ko'rsatmasi olinmoqda, oldingisi allaqachon dekodlanmoqda va oldingisi allaqachon bajarilmoqda. Bu biz Mars Rover2Rover2 platasi uchun loyihamizda foydalanadigan 3 bosqichli Amber A23 protsessor quvuriga tegishli. Amber A25 protsessorining modifikatsiyasi 5 bosqichli quvur liniyasiga ega, u yanada samaraliroq. Lekin, bitta katta BUT bor. O'tish ko'rsatmalari protsessorni quvur liniyasini tozalashga va uni to'ldirishga majbur qiladi. Shunday qilib, yangi buyruq tanlandi, lekin hali dekodlash uchun hech narsa yo'q, darhol bajarish uchun hech narsa yo'q. Kodni bajarish samaradorligi tez-tez o'tish bilan kamayadi. IN zamonaviy protsessorlar quvur liniyasini to'ldirishni qandaydir tarzda optimallashtiradigan barcha turdagi filiallarni bashorat qilish mexanizmlari mavjud, ammo bu bizning protsessorimizda emas. Qanday bo'lmasin, ARM har bir ko'rsatmani shartli ravishda bajarishga imkon berish uchun oqilona edi.

ARM protsessorida, har qanday turdagi ko'rsatmalarda ko'rsatmalarning bajarilishi shartining to'rt biti ko'rsatma kodining yuqori to'rt bitida kodlangan:

Protsessorda 4 ta holat belgisi mavjud:
. Salbiy - operatsiya natijasi salbiy,
. Nol - natija nolga teng,
. Tashish - imzosiz raqamlar bilan operatsiyani bajarishda tashish sodir bo'ldi,
. oVerflow - imzolangan raqamlar bilan operatsiyani bajarishda to'lib ketish sodir bo'ldi, natija registrga kiritilmaydi)

Ushbu 4 bayroq ko'plab mumkin bo'lgan shartlar kombinatsiyasini hosil qiladi:

Kod Suffiks Ma'nosi Bayroqlar
4"h0 ek Teng Z to'plami
4"h1 yo'q teng emas Z aniq
4"h2 cs/s O'rnatish to'plami / imzosiz yuqori yoki bir xil Cset
4"h3 cc/lo Aniq / imzosiz pastga olib boring C aniq
4"h4 mil minus/salbiy N to'plam
4"h5 pl Plyus/musbat yoki nol N aniq
4"h6 ga qarshi toshib ketish V to'plami
4"h7 vc toshib ketish yo'q V aniq
4"h8 salom Imzosiz yuqoriroq C to'plami va Z toza
4"h9 ls Imzosiz pastroq yoki bir xil C toza yoki Z to'plami
4 "ga ge Kattaroq yoki teng imzolangan N == V
4" hb lt dan kamroq imzolangan N != V
4" hc gt dan kattaroq imzolangan Z == 0,N == V
4 "hd le Kamroq yoki teng imzolangan Z == 1 yoki N != V
4" u al har doim (shartsiz)
4" soat - yaroqsiz holat

Endi ARM protsessor ko'rsatmalarini o'rganishdagi yana bir qiyinchilik shundan kelib chiqadi - ko'rsatmalar kodiga qo'shilishi mumkin bo'lgan ko'plab qo'shimchalar. Masalan, qo'shish, agar Z bayrog'i o'rnatilgan bo'lsa, addeq buyrug'i add + eq qo'shimchasi sifatida. Agar N=0 bayroq blpl + pl qo'shimchasi sifatida bo'lsa, pastki dasturga o'ting.

Bayroqlar (Salbiy, nol, tashish, oVerflow) har doim ham arifmetik yoki bilan bir xil o'rnatilmaydi mantiqiy operatsiyalar, bu sodir bo'lganidek, aytaylik, x86 protsessorida, lekin faqat dasturchi xohlaganida. Buning uchun mnemonika buyrug'iga yana bir qo'shimcha mavjud: "s" (buyruq kodida 20-bit bilan kodlangan). Shunday qilib, qo'shish buyrug'i bayroqlarni o'zgartirmaydi, lekin qo'shish buyrug'i bayroqlarni o'zgartiradi. Va shartli qo'shish buyrug'i ham bo'lishi mumkin, ammo bu bayroqlarni o'zgartiradi. Masalan: addgts . Ko'rinib turibdiki, turli shartli bajarish qo'shimchalari va sozlash bayroqlari bilan buyruq nomlarining mumkin bo'lgan kombinatsiyalari soni ARM protsessor yig'ish kodini juda o'ziga xos va o'qishni qiyinlashtiradi. Biroq, vaqt o'tishi bilan siz bunga ko'nikasiz va ushbu matnni tushunishni boshlaysiz.

Arifmetik va mantiqiy operatsiyalar (ma'lumotlarni qayta ishlash).

ARM protsessori turli arifmetik va mantiqiy amallarni bajarishi mumkin.

Haqiqiy to'rt bitli operatsiya kodi (Opcode) protsessor ko'rsatmalari bitlarida mavjud.

Har qanday operatsiya registrning mazmuni va shifter_operand deb ataladigan narsada amalga oshiriladi. Amaliyot natijasi registrga joylashtiriladi. To'rt bitli Rn va Rd protsessorning faol bankidagi registr indekslari.

I 25 bitiga qarab shifter_operand raqamli konstanta sifatida yoki operandning ikkinchi registrining indeksi va hatto ikkinchi operand qiymati bo'yicha siljish operatsiyasi sifatida qaraladi.

Assembler buyruqlarining oddiy misollari, masalan, quyidagicha ko'rinadi:

r0,r1,r2 @ qo'shing r0 registriga r1 va r2 registrlari qiymatlari yig'indisini kiriting
sub r5,r4,#7 @ farqni (r4-7) r5 registriga qo'ying

Amalga oshirilgan operatsiyalar quyidagicha kodlangan:

4"h0 va Mantiqiy VA Rd:= Rn VA shifter_operand
4"h1 e yoki XOR Rd:= Rn XOR shifter_operand
4"h2 sub Arifmetik ayirma Rd:= Rn - shifter_operand
4"h3 rsb Arifmetik orqaga ayirish Rd:= shifter_operand - Rn
4"h4 qo'shish Arifmetik qo'shish Rd:= Rn + shifter_operand
4"h5 adc Arifmetik qo'shish va tashish bayrog'i Rd:= Rn + shifter_operand + Carry Flag
4"h6 sbc Arifmetik ayirish Rd:= Rn - shifter_operand - EMAS(Carry Flag)
4"h7 rsc Arifmetik teskari ayirish Rd:= shifter_operand - Rn - EMAS (Bayroqni olib yurish)
4"h8 tst Mantiqiy VA, lekin natijani saqlamasdan, faqat bayroqlar Rn VA shifter_operand S bit har doim o'rnatiladi
4"h9 teq Mantiqiy eksklyuziv OR, lekin natijani saqlamasdan, faqat Rn EOR shifter_operand bayroqlari o'zgartiriladi
S bit har doim o'rnatiladi
4 "ha cmp Taqqoslash, aniqrog'i, natijani saqlamasdan arifmetik ayirish, faqat Rn bayroqlari o'zgaradi - shifter_operand S bit har doim o'rnatiladi
4 "hb cmn Natijani eslab qolmasdan teskari, aniqrog'i arifmetik qo'shishni taqqoslash, faqat Rn + shifter_operand bayroqlari har doim o'rnatilgan S bitlari o'zgartiriladi.
4"hc orr Mantiqiy OR Rd:= Rn YOKI shifter_operand
4"hd mov Rd qiymatini nusxalash:= shifter_operand (birinchi operand yo'q)
4"he bic Reset bit Rd:= Rn VA EMAS (o'zgartiruvchi_operand)
4"hf mvn Teskari qiymatni nusxalash Rd:= shifter_operand EMAS (birinchi operand yo'q)

barrel almashtirgich.

ARM protsessorida har qanday arifmetik yoki mantiqiy operatsiya oldidan operandlardan birini ma'lum miqdordagi bitlar bilan siljitish yoki aylantirish imkonini beruvchi maxsus "barrel o'tkazgich" sxemasi mavjud. Bu protsessorning juda qiziqarli xususiyati bo'lib, u sizga juda samarali kod yaratish imkonini beradi.

Masalan:

@ 9 ga ko'paytirish sonni 8 ga ko'paytirishdir
@ chapga 3 bit va boshqa raqamni siljitish orqali
r0, r1, r1, lsl #3 @ r0= r1+(r1) qo‘shing<<3) = r1*9

@ 15 ga ko'paytirish - bu sonni 16 ga ko'paytirish
rsb r0, r1, r1, lsl #4 @ r0= (r1<<4)-r1 = r1*15

@ 4 baytli so'zlar jadvaliga kirish, bu erda
@r1 - jadvalning asosiy manzili
@r2 - jadvaldagi elementning indeksi
ldr r0,

Mantiqiy chapga siljish lsl bilan bir qatorda mantiqiy o'ngga siljish lsr va arifmetik o'ngga siljish ham mavjud (belgini saqlaydigan siljish, siljish bilan bir vaqtda chapdan eng muhim bit ko'paytiriladi).

Bundan tashqari, ror bitlarining aylanishi ham mavjud - bitlar o'ngga suriladi va tashqariga surilganlari chapga suriladi.
C bayrog'i orqali bir bit siljish mavjud - bu rrx buyrug'i. Registr qiymati bir bitga o'ngga siljiydi. Chap tomonda C bayrog'i registrning yuqori bitiga yuklanadi

Shishish qat'iy belgilangan son-doimiy emas, balki uchinchi registr-operandning qiymati bo'yicha amalga oshirilishi mumkin. Masalan:

qo'shing r0, r1, r1, lsr r3 @ r0 = r1 + (r1>>r3);
qo'shing r0, r0, r1, lsr r3 @ r0 = r0 + (r1>>r3);

Shunday qilib shifter_operand biz assembler ko'rsatmalarida tasvirlangan narsadir, masalan "r1, lsr r3" yoki "r2, lsl #5".

Eng qizig'i shundaki, operatsiyalarda smenalardan foydalanish hech qanday xarajat qilmaydi. Ushbu siljishlar (odatda) qo'shimcha soat tsikllarini talab qilmaydi va tizim ishlashi uchun juda yaxshi.

Raqamli operandlardan foydalanish.

Arifmetik yoki mantiqiy amallar ikkinchi operand sifatida nafaqat registrning mazmunini, balki raqamli konstantani ham ishlatishi mumkin.

Afsuski, bu erda bitta muhim cheklov mavjud. Barcha buyruqlar qat'iy 4 bayt (32 bit) uzunligiga ega bo'lganligi sababli, undagi "har qanday" raqamni kodlash ishlamaydi. Operatsion kodida 4 bitni bajarish sharti kodi (Cond), operatsiya kodining o'zi uchun 4 bit (Opcode), so'ngra 4 bit - qabul qiluvchi registri Rd va yana 4 bit - birinchisining registrini egallaydi. operand Rn, shuningdek, boshqa turli bayroqlar I 25 (faqat operatsiya kodidagi raqamli doimiyni bildiradi) va S 20 (operatsiyadan keyin bayroqlarni o'rnatish). Hammasi bo'lib shifter_operand deb ataladigan mumkin bo'lgan konstanta uchun atigi 12 bit qoladi - biz buni yuqorida ko'rdik. 12 bit raqamlarni faqat tor diapazonda kodlashi mumkinligi sababli, ARM protsessorini ishlab chiquvchilar doimiyni quyidagicha kodlashga qaror qilishdi. Shift_operandning o'n ikki biti ikki qismga bo'linadi: to'rt bitli aylanish indeksi encode_imm va haqiqiy sakkiz bitli raqamli qiymati imm_8 .

ARM protsessorida konstanta 32 bitli son ichidagi 8 bitli son sifatida aniqlanadi, o'ngga juft sonli bit bilan aylantiriladi. Ya'ni:

imm_32 = imm_8 ROR (encode_imm *2)

Bu juda aqlli bo'lib chiqdi. Aniqlanishicha, assembler buyruqlarida har bir son konstantasidan foydalanish mumkin emas.

Yozishingiz mumkin

r0, r2, #255 @ kasr konstantasini qo'shing
r0, r3, # 0xFF @ doimiyni hexga qo'shing

chunki 255 8 bit oralig'ida. Bu buyruqlar quyidagicha kompilyatsiya qilinadi:

0: e28200ff r0, r2, #255 qo'shing; 0xff
4: e28300ff r0, r3, # 255 qo'shing; 0xff

Va hatto yozishingiz mumkin

r0, r4, #512 qo'shing
r0, r5, 0x650000 qo'shing

Kompilyatsiya qilingan kod quyidagicha ko'rinadi:

0: e2840c02 r0, r4, #512 qo'shing; 0x200
4: e2850865 r0, r5, #6619136 qo'shing; 0x650000

Bunday holda, 512 raqamining o'zi, albatta, baytga to'g'ri kelmaydi. Ammo boshqa tomondan, biz uni 32'h00000200 o'n oltilik ko'rinishda tasavvur qilamiz va bu 2 o'ngga 24 bit (1 ror 24) ga burilganligini ko'ramiz. Aylanish koeffitsienti 24 ning yarmini tashkil qiladi, ya'ni 12. Shunday qilib, shifter_operand = ( 4'hc , 8'h02 ) chiqadi - bular buyruqning o'n ikkita eng kam ahamiyatli bitlari. 0x650000 raqami bilan ham xuddi shunday. Buning uchun shifter_operand = (4'h8, 8'h65).

Biror kishi yoza olmasligi aniq

r0, r1, # 1234567 qo'shing

yoki yozolmaysiz

mov r0, #511

chunki bu erda raqamni imm_8 va encode_imm - aylanish omili sifatida ifodalab bo'lmaydi. Assembler kompilyatori xatoga yo'l qo'yadi.

Konstantani shifter_operand ga to'g'ridan-to'g'ri kodlash mumkin bo'lmaganda nima qilish kerak? Siz har xil nayranglarni qilishingiz kerak.
Masalan, siz avval 512 raqamini bepul registrga yuklashingiz va keyin bittasini ayirishingiz mumkin:

mov r0, #511
sub r0, r0, # 1

Muayyan raqamni registrga yuklashning ikkinchi usuli - uni xotirada maxsus ajratilgan o'zgaruvchidan o'qish:

ldr r7, my_var
.....
my_var: .word 0x123456

Yozishning eng oson yo'li quyidagicha:

ldr r2,=511

Bunday holda ("=" belgisiga e'tibor bering), agar doimiy imm_8 va encode_imm sifatida ifodalanishi mumkin bo'lsa, agar u 12 bitli shifter_operandga sig'ishi mumkin bo'lsa, assembler kompilyatori avtomatik ravishda ldr ni mov ko'rsatmalariga kompilyatsiya qiladi. Ammo agar raqamni bu tarzda ifodalash mumkin bo'lmasa, kompilyatorning o'zi dasturda ushbu konstanta uchun xotira katakchasini zahiraga oladi va o'zi bu xotira katakchasiga nom beradi va buyruqni ldr ga kompilyatsiya qiladi.

Mana nima yozdim:

ldr r7, my_var
ldr r8,=511
ldr r8,=1024
ldr r9,=0x3456
........
My_var: .word 0x123456

Kompilyatsiya qilgandan so'ng men buni oldim:

18: e59f7030 ldr r7, ; 50
1c: e59f8030 ldr r8, ; 54
20: e3a08b01 mov r8, # 1024; 0x400
24: e59f902c ldr r9, ; 58
.............
00000050 :
50:00123456 .word 0x00123456
54:000001ff .word 0x000001ff
58:00003456 .word 0x00003456

E'tibor bering, kompilyator kompyuter registriga (aka r15) nisbatan xotira manzilini ishlatadi.

Xotira katakchasini o'qish va xotiraga registr yozish.

Yuqorida yozganimdek, ARM protsessori faqat registrlar mazmunida arifmetik yoki mantiqiy amallarni bajarishi mumkin. Operatsiyalar uchun ma'lumotlar xotiradan o'qilishi va operatsiyalar natijasi xotiraga qayta yozilishi kerak. Buning uchun maxsus buyruqlar mavjud: o'qish uchun ldr (ehtimol "LoaD Register" birikmasidan) va yozish uchun str (ehtimol "Store Register").

Faqat ikkita jamoa borga o'xshaydi, lekin aslida ular juda ko'p farqlarga ega. L 20 , W 21 , B 22 , U 23 , P 24 , I 25 yordamchi bayroq bitlarini ko'rish uchun Amber ARM protsessorining ldr / str buyruqlari qanday kodlanganiga qarang va ular buyruqning o'ziga xos harakatini aniqlaydi. :

  • Bit L 20 yozish yoki o'qishni belgilaydi. 1 - ldr , o'qish, 0 - str , yozish.
  • B 22 bit 32 bitli so'zni yoki 8 bitli baytni o'qish/yozishni aniqlaydi. 1 bayt operatsiyasini bildiradi. Registrga bayt o'qilganda registrning yuqori bitlari nolga o'rnatiladi.
  • Bit I 25 Ofset maydonidan foydalanishni belgilaydi. Agar I 25 ==0 bo'lsa, Offset raqamli ofset sifatida talqin qilinadi, uni registrdan asosiy manzilga qo'shish yoki olib tashlash kerak. Lekin qo'shish yoki ayirish U 23 bitiga bog'liq.

(Cond) - operatsiyani bajarish sharti. U mantiqiy/arifmetik buyruqlar bilan bir xil tarzda talqin qilinadi - o'qish yoki yozish shartli bo'lishi mumkin.

Shunday qilib, assembler matnida siz shunday yozishingiz mumkin:

ldr r1, @ r1 registriga r0 registridagi manzildagi so'zni o'qing
ldrb r1, @ r1 registriga r0 registridagi manzilda baytni o'qiydi
ldreq r2, @ shartli so'zlarni o'qish
ldrgtb r2, @ shartli baytni o'qish
ldr r3, @ r4 registridagi manzilga nisbatan 8-manzildagi so'zni o'qing
ldr r4, @ r5 registridagi manzilga nisbatan -16 manzilidagi so'zni o'qing

Ushbu matnni tuzgandan so'ng, siz ushbu buyruqlarning haqiqiy kodlarini ko'rishingiz mumkin:

0: e5901000 ldr r1,
4: e5d01000 ldrb r1,
8: 05912000 ldreq r2,
c:c5d12000 ldrbgt r2,
10: e5943008 ldr r3,
14: e5154010 ldr r4,

Yuqoridagi misolda men faqat ldr dan foydalanaman, lekin str xuddi shu tarzda ishlatiladi.

Indeksdan oldingi va indeksdan keyin qayta yozish xotirasiga kirish usullari mavjud. Ushbu rejimlarda xotiraga kirish ko'rsatkichi buyruq bajarilishidan oldin yoki keyin yangilanadi. Agar siz C dasturlash tilini yaxshi bilsangiz, u holda siz (( *psource++;) yoki ( a=*++ manba;). ARM protsessorida xotiraga kirishning ushbu rejimi endigina amalga oshirilgan. O'qish buyrug'i bajarilganda bir vaqtning o'zida ikkita registr yangilanadi - qabul qiluvchi registr xotiradan o'qilgan qiymatni oladi va registr-ko'rsatgichdagi qiymat xotira katakchasiga oldinga yoki orqaga siljiydi.

Bu buyruqlarni yozish, menimcha, biroz mantiqsiz. Ko'nikish uchun uzoq vaqt kerak bo'ladi.

ldr r3, ! @psrc++; r3 = *psrc;
ldr r3, , #4 @ r3 = *psrc; psrc++;

Birinchi ldr buyrug'i birinchi navbatda ko'rsatkichni oshiradi, keyin uni o'qiydi. Ikkinchi buyruq avval o'qiydi, keyin ko'rsatkichni oshiradi. Psrc ko'rsatkichining qiymati r0 registrida joylashgan.

Yuqoridagi barcha misollar buyruq kodidagi I 25 bit qayta o'rnatilgan holat uchun edi. Lekin u hali ham o'rnatilishi mumkin! Keyin Ofset maydonining qiymati raqamli konstantani emas, balki operatsiyada ishtirok etadigan uchinchi registrni o'z ichiga oladi. Bundan tashqari, uchinchi registrning qiymati hali ham oldindan o'zgartirilishi mumkin!

Bu erda mumkin bo'lgan kod o'zgarishlariga misollar:

0: e7921003 ldr r1, @ o'qish manzili - r2 va r3 registrlari qiymatlari yig'indisi
4: e7b21003 ldr r1, ! @ bir xil, lekin r2 o'qilgach, r3 dan qiymatga oshiriladi
8: e6932004 ldr r2, , r4 @ avval r3 da o‘qiydi, keyin r3 r4 ga oshiriladi.
c: e7943185 ldr r3, @ o'qish manzili r4+r5*8
10: e7b43285 ldr r3, ! @ manzilni o'qish uchun r4+r5*32, o'qilgandan so'ng r4 ushbu manzil qiymatiga o'rnatiladi
14: e69431a5 ldr r3, , r5, lsr #3 @ r4 manzilini o‘qish, r4 buyrug‘i bajarilgandan so‘ng r4+r5/8 ga o‘rnatiladi.

Bu erda ARM v2a protsessoridagi o'qish/yozish buyruqlarining o'zgarishlari keltirilgan.

ARM protsessorlarining eski modellarida bu xilma-xil ko'rsatmalar yanada ko'proq.
Buning sababi, protsessor, masalan, nafaqat so'zlarni (32 bitli raqamlar) va baytlarni, balki yarim so'zlarni (16 bit, 2 bayt) o'qish imkonini beradi. Keyin ldr / str buyruqlariga yarim so'zdan "h" qo'shimchasi qo'shiladi. Buyruqlar ldrh yoki strh kabi ko'rinadi. Imzolangan raqamlar sifatida talqin qilinadigan ldrsh yarim so'zlari yoki ldrsb baytlarini yuklash buyruqlari ham mavjud. Bunday hollarda yuklangan tarmoqli so'z yoki baytning eng muhim biti maqsad registridagi butun so'zning eng muhim bitlariga ko'paytiriladi. Misol uchun, ldrsh buyrug'i bilan 0xff25 yarim so'zini yuklash maqsad registrida 0xffffff25 ga olib keladi.

Ko'p o'qish va yozish.

Ldr /str buyruqlari xotiraga kirish uchun yagona buyruqlar emas. ARM protsessorida blokni uzatishni amalga oshirish imkonini beruvchi buyruqlar ham mavjud - siz bir vaqtning o'zida bir nechta registrlarga bir nechta ketma-ket so'zlarning mazmunini xotiradan yuklashingiz mumkin. Shuningdek, xotiraga bir nechta registrlarning qiymatlarini ketma-ket yozish mumkin.

Blokni uzatish buyrug'i mnemonikasi ildiz ldm (LoaD Multiple ) yoki stm (Store Multiple ) bilan boshlanadi. Ammo keyin, odatdagidek, ARMda, hikoya qo'shimchalar bilan boshlanadi.

Umuman olganda, buyruq quyidagicha ko'rinadi:

op(cond)(rejim) Rd(, {Register list} !}

Qo'shimcha (Cond) tushunarli, bu buyruqni bajarish sharti. Suffiks (rejim) uzatish rejimi, bu haqda keyinroq. Rd - o'qish yoki yozish uchun xotiradagi asosiy manzilni ko'rsatuvchi registr. Undov belgisi registrdan keyin Rd o'qish/yozish operatsiyasidan keyin u o'zgartirilishini bildiradi. Xotiradan yuklangan yoki xotiraga tushirilgan registrlar ro'yxati (Ro'yxatga olish ro'yxati) .

Registrlar ro'yxati vergul bilan ajratilgan jingalak qavslarda yoki diapazon sifatida ko'rsatilgan. Masalan:

stm r0,(r3,r1, r5-r8)

Xotiraga yozish tartibsiz amalga oshiriladi. Ro'yxat oddiygina qaysi registrlar xotiraga yozilishini ko'rsatadi va tamom. Buyruq kodi, xuddi protsessor bankidagi registrlar soni kabi, Registrlar ro'yxati uchun ajratilgan 16 bitga ega. Bu sohadagi har bir bit operatsiyada qaysi registr ishtirok etishini bildiradi.

Endi o'qish/yozish rejimi uchun. Chalkashish uchun joy bor. Gap shundaki, bir xil harakat uchun turli rejim nomlaridan foydalanish mumkin.

Agar siz kichik lirik digressiya qilsangiz, unda siz ... stek haqida gapirishingiz kerak. Stack LIFO tipidagi ma'lumotlarga kirish usulidir - Oxirgi kiruvchi birinchi chiqadi (wiki) - oxirgi kiruvchi, birinchi chiqadi. Stek dasturlashda protseduralarni chaqirishda va funksiyalar kirishida registrlar holatini saqlashda va chiqishda ularni tiklashda, shuningdek chaqirilgan protseduralarga parametrlarni o'tkazishda keng qo'llaniladi.

Xotiradagi stek, kim o'ylagan bo'lsa, to'rt xil.

Birinchi tur - to'liq pasayish. Bu stek ko'rsatkichi band bo'lgan stek elementiga ishora qilganda va stek manzillar kamayishi yo'nalishida o'sadi. Stekga so'z qo'yish kerak bo'lganda, avval stek ko'rsatkichi kamayadi (Decrement Before), so'ngra so'z stek ko'rsatgichining manziliga yoziladi. Kompyuter so'zini stekdan olib tashlash kerak bo'lganda, so'z stek ko'rsatkichining joriy qiymatida o'qiladi, keyin ko'rsatgich yuqoriga ko'tariladi (Increment After).

Ikkinchi tur - to'liq ko'tarilish. Stack pastga emas, balki yuqoriga, katta manzillarga qarab o'sadi. Ko'rsatkich ham egallangan elementga ishora qiladi. Stakka so'z qo'yish kerak bo'lganda, avval stek ko'rsatkichi oshiriladi, so'ngra so'z ko'rsatkich orqali yoziladi (Increment Before). Qachonki stekdan olib tashlash kerak bo'lsa, avval stek ko'rsatkichi orqali o'qiymiz, chunki u egallangan elementga ishora qiladi, keyin stek ko'rsatkichi kamayadi (Decrement After).

Uchinchi tur - bo'sh pasayish. To'liq pasayish holatida bo'lgani kabi stek pastga qarab o'sadi, lekin farq shundaki, stek ko'rsatkichi band bo'lmagan hujayraga ishora qiladi. Shunday qilib, stekga so'z qo'yish kerak bo'lganda, darhol yozuv tuziladi, keyin stek ko'rsatkichi kamayadi (Decrement After). Stackdan olib tashlashda ko'rsatgich birinchi navbatda oshiriladi, so'ngra o'qiladi (Increment before).

To'rtinchi tur - Bo'sh ko'tarilish. Umid qilamanki, hamma narsa aniq - stek o'sadi. Stack ko'rsatkichi bo'sh elementga ishora qiladi. Stackni bosing - bu stek ko'rsatgichining manziliga so'z yozish va stek ko'rsatkichini oshirish (Increment After ). Stackdan oching - stek ko'rsatkichini kamaytiring va so'zni o'qing (Decrement Before ).

Shunday qilib, stek bilan operatsiyalar paytida ko'rsatkichni oshirish yoki kamaytirish kerak - (O'sish / kamaytirish ) stek turiga qarab xotiraga o'qish / yozishdan oldin yoki keyin (Oldin / keyin). IN Intel protsessorlari, masalan, stek bilan ishlash uchun PUSH (stekga so'z qo'yish) yoki POP (stekdan so'zni olib tashlash) kabi maxsus buyruqlar mavjud. ARM protsessorida maxsus buyruqlar mavjud emas, lekin ldm va stm buyruqlari ishlatiladi.

Agar siz stekni ARM protsessor ko'rsatmalari yordamida amalga oshirsangiz, quyidagi rasmni olasiz:

Nima uchun bitta jamoaga turli nomlar berish kerak edi? Men umuman tushunmadim... Bu yerda, albatta, shuni ta'kidlash kerakki, ARM uchun stek standarti hali ham To'liq pasaymoqda.

ARM protsessoridagi stek ko'rsatkichi sp yoki r13 registridir. Bu odatda shunday kelishuv. Albatta, stm yozish yoki ldmni o'qish boshqa asosiy registrlar bilan ham amalga oshirilishi mumkin. Biroq, sp registrining boshqa registrlardan qanday farq qilishini eslab qolishingiz kerak - u mavjud turli rejimlar protsessorning ishlashi (USR, SVC, IRQ, FIRQ) har xil bo'lishi mumkin, chunki ularning o'z registrlari banklari mavjud.

Va yana bir eslatma. ARM yig'ish kodiga o'xshash qatorni yozing surish(r0-r3), Albatta mumkin. Lekin aslida bu bir xil buyruq bo'ladi stmfd sp!,(r0-r3).

Nihoyat, men montaj kodi va uning tuzilgan demontaj matniga misol keltiraman. Bizda ... bor:


stmfd sp!,(r0-r3)
stmdb sp!,(r0-r3)
surish(r0-r3)

@bu uchta ko'rsatmalar bir xil va xuddi shu narsani qiladi
pop(r0-r3)
ldmia sp!,(r0-r3)
ldmfd r13!,(r0-r3)

Stmfd r4,(r0-r3,r5,r8)
stmea r4!,(r0-r3,r7,r9,lr,kompyuter)
ldm r5, (r0, kompyuter)

Biz kompilyatsiyadan keyin olamiz:

0: e92d000f surish (r0, r1, r2, r3)
4: e92d000f surish (r0, r1, r2, r3)
8: e92d000f surish (r0, r1, r2, r3)
c:e8bd000f pop(r0, r1, r2, r3)
10: e8bd000f pop (r0, r1, r2, r3)
14: e8bd000f pop (r0, r1, r2, r3)
18: e904012f stmdb r4, (r0, r1, r2, r3, r5, r8)
1c: e8a4c28f stmia r4!, (r0, r1, r2, r3, r7, r9, lr, kompyuter)
20: e8958001 ldm r5, (r0, kompyuter)

Dasturlardagi o'tishlar.

O'tishlarsiz dasturlash mumkin emas. Har qanday dasturlarda kodning tsiklik bajarilishi ham, protseduralar, funktsiyalarning chaqiruvlari ham mavjud, kod bo'limlarini shartli bajarish ham mavjud.

Amber ARM v2a protsessorida faqat ikkita buyruq mavjud: b (Branch - filial, o'tish so'zidan) va bl (Branch with Link - qaytish manzilini saqlash bilan o'tish).

Buyruqning sintaksisi juda oddiy:

b (cond) belgisi
bl (cond) belgisi

Ko'rinib turibdiki, har qanday o'tish shartli bo'lishi mumkin, ya'ni dasturda "b" va "bl" o'zagidan tuzilgan shunday g'alati so'zlar va shart qo'shimchalari ( Cond) , g'alati so'zlar bo'lishi mumkin:

beq, bne, bcs, bhs, bcc, blo, bmi, bpl, bvs, bvc, bhi, bls, bge, bgt, ble, bal, b

bleq, blne, blcs, blhs, blcc, bllo, blmi, blpl, blvs, blvc, blhi, blls, blge, blgt, blle, bla, bl

Turli xilligi ajoyib, shunday emasmi?

O'tish yo'riqnomasida 24 bitli ofset ofset mavjud. O'tish manzili kompyuter ko'rsatkichining joriy qiymatining yig'indisi sifatida hisoblanadi va 2 bitga chapga siljigan Ofset raqami imzolangan raqam sifatida talqin etiladi:

Yangi kompyuter = shaxsiy kompyuter + Ofset*4

Shunday qilib, sakrash oralig'i oldinga yoki orqaga 32 MB.

Keling, bl qaytish manzilini saqlaydigan filial nima ekanligini ko'rib chiqaylik. Bu buyruq subprogrammalarni chaqirish uchun ishlatiladi. Ushbu yo'riqnomaning qiziqarli xususiyati shundaki, protsedura chaqirilganda protseduradan qaytish manzili Intel protsessorlarida bo'lgani kabi stekda saqlanmaydi, lekin odatiy registrda r14 . Keyin, protseduradan qaytish uchun xuddi shu Intel protsessorlarida bo'lgani kabi, maxsus ret buyrug'i kerak emas, lekin siz shunchaki r14 qiymatini kompyuterga nusxalashingiz mumkin. Endi r14 registrida nima uchun borligi aniq muqobil sarlavha lr (Ro'yxatdan o'tish havolasi).

Amber SoC uchun salom-dunyo loyihasidan chiqish tartibini ko'rib chiqing.

000004a0<_outbyte>:
4a0: e59f1454 ldr r1, ; 8fc< адрес регистра данных UART >
4a4: e59f3454 ldr r3, ; 900< адрес регистра статуса UART >
4a8: e5932000 ldr r2, ; joriy holatni o'qing
4ac: e2022020 va r2, r2, #32
4b0: e3520000 cmp r2, #0; UART band emasligini tekshiring
4b4: 05c10000 strbeq r0, ; UART ga faqat band bo'lmasa, belgi yozing
4b8: 01b0f00e movseq kompyuter, lr; agar UART band bo'lmasa, protseduradan shartli qaytish
4bc: 1affff9 bne 4a8<_outbyte+0x8>; UART holatini tekshirish uchun pastadir

O'ylaymanki, ushbu parchaning sharhlaridan ushbu protsedura qanday ishlashi aniq.

O'tish haqida yana bir muhim eslatma. Register r15 (kompyuter) oddiy arifmetik yoki mantiqiy operatsiyalarda maqsad registr sifatida ishlatilishi mumkin. Shunday qilib, kompyuter, kompyuter, №8 qo'shish kabi buyruq boshqa manzilga o'tish uchun juda ko'rsatma.

O'tishlar haqida yana bir fikrni aytish kerak. Eski ARM protsessorlarida ko'proq narsa bor qo'shimcha buyruqlar o'tishlar bx, blx va blj. Bular boshqa buyruqlar tizimi bilan kod bo'laklariga o'tish uchun buyruqlardir. Bx /blx ARM protsessorlarining 16-bitli THUMB kodiga o'tish imkonini beradi. Blj - bu Jazelle buyruqlar tizimiga protsedura chaqiruvi (qo'llab-quvvatlash Java tili ARM protsessorlarida). Bizning Amber ARM v2a da bu buyruqlar mavjud emas.

Boshqa ARM protsessor ko'rsatmalari.

CISC protsessorlari bitta buyruqda ancha murakkab operatsiyalarni, shu jumladan xotira kataklari tarkibidagi arifmetik va mantiqiy operatsiyalarni bajaradi. CPU CISC ko'rsatmalari turli uzunliklarga ega bo'lishi mumkin.

Bundan farqli o'laroq, RISC nisbatan oddiy ko'rsatmalar to'plamiga ega bo'lib, operatsiya turi bo'yicha aniq taqsimlanadi:

  • xotira bilan ishlash (xotiradan registrlarga o'qish yoki registrlardan xotiraga yozish),
  • registrlarda ma'lumotlarni qayta ishlash (arifmetik, mantiqiy, ma'lumotlarning chapga / o'ngga siljishi yoki registrda bit aylanishi),
  • boshqa manzillarga shartli yoki shartsiz o'tish uchun ko'rsatmalar.

Qoidaga ko'ra (lekin har doim ham emas va faqat dastur kodi kontroller kesh xotirasiga tushsa), bitta ko'rsatma bitta protsessor siklida bajariladi. ARM protsessorining ko'rsatma uzunligi belgilangan - 4 bayt (bitta kompyuter so'zi). Darhaqiqat, zamonaviy ARM protsessori boshqa ish rejimlariga, masalan, buyruq uzunligi 2 baytga aylanganda THUMB rejimiga o'tishi mumkin. Bu kodni yanada ixcham qilish imkonini beradi. Biroq, biz ushbu maqolada ushbu rejimni ko'rib chiqmaymiz, chunki u Amber ARM v2a protsessorida qo'llab-quvvatlanmaydi. Xuddi shu sababga ko'ra, biz Jazelle (Java kodini bajarish uchun optimallashtirilgan) kabi rejimlarni ko'rib chiqmaymiz va NEON buyruqlarini - bir nechta ma'lumotlar bilan ishlash buyruqlarini ko'rib chiqmaymiz. Shunga qaramay, biz sof ARM ko'rsatmalar to'plamini o'rganmoqdamiz.

ARM protsessor registrlari.

ARM protsessorida bir nechta registrlar to'plami mavjud bo'lib, ulardan faqat 16 tasi hozirda dasturchi uchun mavjud.Protsessorning bir necha ish rejimlari mavjud, ishlash rejimiga qarab tegishli registrlar banki tanlanadi. Ushbu ish rejimlari:

  • dastur rejimi (USR, foydalanuvchi rejimi),
  • nazoratchi rejimi yoki operatsion tizim rejimi (SVC, supervayzer rejimi),
  • uzilishlar bilan ishlash rejimi (IRQ, uzilish rejimi) va
  • ishlov berish rejimi "shoshilinch uzilish" (FIRQ, tez uzilish rejimi).

Ya'ni, masalan, uzilish sodir bo'lganda, protsessorning o'zi uzilishni qayta ishlash dasturining manziliga boradi va avtomatik ravishda registr banklarini "o'zgartiradi".

Eski ARM protsessorlari, yuqoridagi ish rejimlariga qo'shimcha ravishda, qo'shimcha rejimlarga ega:

  • Bekor qilish (xotiraga kirish istisnolarini boshqarish uchun ishlatiladi),
  • Aniqlanmagan (koprotsessorni dasturiy tarzda amalga oshirish uchun foydalaniladi) va
  • operatsion tizim tizimining imtiyozli vazifa rejimi.

Amber ARM v2a protsessorida bu qo'shimcha uchta rejim mavjud emas.

Amber ARM v2a uchun registrlar to'plami quyidagicha ifodalanishi mumkin:

r0-r7 registrlari barcha rejimlar uchun bir xil.
r8-r12 registrlari faqat USR, SVC, IRQ rejimlari uchun keng tarqalgan.
Register r13 - stek ko'rsatkichi. U barcha rejimlarda.
Register r14 - pastki dasturdan qaytish registrlari ham barcha rejimlarda o'ziga xosdir.
Register r15 - bajariladigan ko'rsatmalarga ko'rsatgich. Bu barcha rejimlar uchun umumiydir.

Ko'rinib turibdiki, FIRQ rejimi eng izolyatsiya qilingan, u o'zining eng ko'p registrlariga ega. Bu juda muhim bo'lgan uzilishlar registrlarni stekga saqlamasdan, vaqtni behuda sarflamasdan qayta ishlanishi uchun amalga oshiriladi.

r15 registriga alohida e'tibor berilishi kerak, shuningdek, kompyuter (Dastur hisoblagichi) sifatida ham tanilgan - bajariladigan buyruqlar uchun ko'rsatgich. Uning mazmuni ustida turli arifmetik va mantiqiy amallarni bajarish mumkin, shu bilan dasturning bajarilishi boshqa manzillarga o'tadi. Biroq, Amber tizimida joriy qilingan ARM v2a protsessorida ushbu registrning bitlarini talqin qilishda ba'zi nozikliklar mavjud.

Gap shundaki, ushbu protsessorda r15 registrida (kompyuter) bajariladigan buyruqlar uchun haqiqiy ko'rsatgichga qo'shimcha ravishda quyidagi ma'lumotlar mavjud:

Bitlar 31:28 - arifmetik yoki mantiqiy operatsiya natijasining bayroqlari
Bitlar 27 - Interrupt IRQ maskasi, bit o'rnatilganda uzilishlar o'chiriladi.
Bitlar 26 - FIRQ uzilish maskasi, bit o'rnatilganda tez uzilishlar o'chiriladi.
Bits 25:2 - dastur ko'rsatmalariga ko'rsatgichning o'zi atigi 26 bitni egallaydi.
Bitlar 1:0 - protsessorning joriy ish rejimi.
3-Nazoratchi
2 - uzilish
1-tezkor uzilish
0 - foydalanuvchi

Eski ARM protsessorlarida barcha bayroqlar va xizmat bitlari alohida registrlarda joylashgan. Joriy dastur holati registri( cpsr ) va Saved Program Status Register ( spsr ), ular uchun kirish uchun alohida maxsus buyruqlar mavjud. Bu dasturlar uchun mavjud manzil maydonini kengaytirish maqsadida amalga oshiriladi.

ARM assemblerni o'zlashtirishdagi qiyinchiliklardan biri bu ba'zi registrlarning muqobil nomlaridir. Shunday qilib, yuqorida aytib o'tilganidek, r15 bir xil kompyuterdir. Bundan tashqari, r13 mavjud - bu bir xil sp (Stack Pointer), r14 - lr (Link Register) - protseduradan qaytish manzili registri. Bundan tashqari, r12 bir xil IP (Intra-Procedure -call scratch Registri) bo'lib, C kompilyatorlari tomonidan stekdagi parametrlarga kirish uchun maxsus usulda foydalaniladi. Bunday muqobil nomlash ba'zan boshqa birovning dastur kodini ko'rib chiqayotganda chalkashlik tug'diradi - ikkalasi ham, registr belgilari ham mavjud.

Kodni bajarish xususiyatlari.

Ko'p turdagi protsessorlarda (masalan, x86) shart bo'yicha faqat boshqa dastur manziliga o'tish mumkin. ARM bilan bunday emas. Har bir ARM protsessor buyrug'i shart bo'yicha bajarilishi yoki bajarilmasligi mumkin. Bu dastur sakrash sonini minimallashtirish va shuning uchun protsessorning quvur liniyasidan (quvur liniyasidan) samarali foydalanish imkonini beradi.

Axir, quvur liniyasi nima? Hozirda dastur kodidan bitta protsessor ko'rsatmasi olinmoqda, oldingisi allaqachon dekodlanmoqda va oldingisi allaqachon bajarilmoqda. Bu biz loyihamizda foydalanadigan 3 bosqichli Amber A23 protsessor quvurida. rover 2 rover 2 platalari. Amber A25 protsessorining modifikatsiyasi 5 bosqichli quvur liniyasiga ega, u yanada samaraliroq. Lekin, bitta katta BUT bor. O'tish ko'rsatmalari protsessorni quvur liniyasini tozalashga va uni to'ldirishga majbur qiladi. Shunday qilib, yangi buyruq tanlandi, lekin hali dekodlash uchun hech narsa yo'q, darhol bajarish uchun hech narsa yo'q. Kodni bajarish samaradorligi tez-tez o'tish bilan kamayadi. Zamonaviy protsessorlar qandaydir tarzda quvur liniyasini to'ldirishni optimallashtiradigan barcha turdagi filiallarni bashorat qilish mexanizmlariga ega, ammo bizning protsessorimizda bunday emas. Qanday bo'lmasin, ARM har bir ko'rsatmani shartli ravishda bajarishga imkon berish uchun oqilona edi.

ARM protsessorida, har qanday turdagi ko'rsatmalarda ko'rsatmalarning bajarilishi shartining to'rt biti ko'rsatma kodining yuqori to'rt bitida kodlangan:

Protsessorda 4 ta holat belgisi mavjud:
. Salbiy - operatsiya natijasi salbiy,
. Nol - natija nolga teng,
. Tashish - imzosiz raqamlar bilan operatsiyani bajarishda tashish sodir bo'ldi,
. oVerflow - imzolangan raqamlar bilan operatsiyani bajarishda to'lib ketish sodir bo'ldi, natija registrga kiritilmaydi)

Ushbu 4 bayroq ko'plab mumkin bo'lgan shartlar kombinatsiyasini hosil qiladi:

Kod Suffiks Ma'nosi Bayroqlar
4"h0 ek Teng Z to'plami
4"h1 yo'q teng emas Z aniq
4"h2 cs/s O'rnatish to'plami / imzosiz yuqori yoki bir xil Cset
4"h3 cc/lo Aniq / imzosiz pastga olib boring C aniq
4"h4 mil minus/salbiy N to'plam
4"h5 pl Plyus/musbat yoki nol N aniq
4"h6 ga qarshi toshib ketish V to'plami
4"h7 vc toshib ketish yo'q V aniq
4"h8 salom Imzosiz yuqoriroq C to'plami va Z toza
4"h9 ls Imzosiz pastroq yoki bir xil C toza yoki Z to'plami
4 "ga ge Kattaroq yoki teng imzolangan N == V
4" hb lt dan kamroq imzolangan N != V
4" hc gt dan kattaroq imzolangan Z == 0,N == V
4 "hd le Kamroq yoki teng imzolangan Z == 1 yoki N != V
4" u al har doim (shartsiz)
4" soat - yaroqsiz holat

Endi ARM protsessor ko'rsatmalarini o'rganishdagi yana bir qiyinchilik shundan kelib chiqadi - ko'rsatmalar kodiga qo'shilishi mumkin bo'lgan ko'plab qo'shimchalar. Masalan, qo'shish, agar Z bayrog'i o'rnatilgan bo'lsa, addeq buyrug'i add + eq qo'shimchasi sifatida. Agar N=0 bayroq blpl + pl qo'shimchasi sifatida bo'lsa, pastki dasturga o'ting.

Bayroqlar (Salbiy, nol, tashish, oVerflow) arifmetik yoki mantiqiy operatsiyalar paytida har doim ham xuddi shunday o'rnatilmaydi, masalan, x86 protsessorida bo'lgani kabi, lekin dasturchi xohlaganida. Buning uchun mnemonika buyrug'iga yana bir qo'shimcha mavjud: "s" (buyruq kodida 20-bit bilan kodlangan). Shunday qilib, qo'shish buyrug'i bayroqlarni o'zgartirmaydi, lekin qo'shish buyrug'i bayroqlarni o'zgartiradi. Va shartli qo'shish buyrug'i ham bo'lishi mumkin, ammo bu bayroqlarni o'zgartiradi. Masalan: addgts . Ko'rinib turibdiki, turli shartli bajarish qo'shimchalari va sozlash bayroqlari bilan buyruq nomlarining mumkin bo'lgan kombinatsiyalari soni ARM protsessor yig'ish kodini juda o'ziga xos va o'qishni qiyinlashtiradi. Biroq, vaqt o'tishi bilan siz bunga ko'nikasiz va ushbu matnni tushunishni boshlaysiz.

Arifmetik va mantiqiy operatsiyalar (ma'lumotlarni qayta ishlash).

ARM protsessori turli arifmetik va mantiqiy amallarni bajarishi mumkin.

Haqiqiy to'rt bitli operatsiya kodi (Opcode) protsessor ko'rsatmalari bitlarida mavjud.

Har qanday operatsiya registrning mazmuni va shifter_operand deb ataladigan narsada amalga oshiriladi. Amaliyot natijasi registrga joylashtiriladi. To'rt bitli Rn va Rd protsessorning faol bankidagi registr indekslari.

I 25 bitiga qarab shifter_operand raqamli konstanta sifatida yoki operandning ikkinchi registrining indeksi va hatto ikkinchi operand qiymati bo'yicha siljish operatsiyasi sifatida qaraladi.

Assembler buyruqlarining oddiy misollari, masalan, quyidagicha ko'rinadi:

r0,r1,r2 @ qo'shing r0 registriga r1 va r2 registrlari qiymatlari yig'indisini kiriting
sub r5,r4,#7 @ farqni (r4-7) r5 registriga qo'ying

Amalga oshirilgan operatsiyalar quyidagicha kodlangan:

4"h0 va Mantiqiy VA Rd:= Rn VA shifter_operand
4"h1 e yoki XOR Rd:= Rn XOR shifter_operand
4"h2 sub Arifmetik ayirma Rd:= Rn - shifter_operand
4"h3 rsb Arifmetik orqaga ayirish Rd:= shifter_operand - Rn
4"h4 qo'shish Arifmetik qo'shish Rd:= Rn + shifter_operand
4"h5 adc Arifmetik qo'shish va tashish bayrog'i Rd:= Rn + shifter_operand + Carry Flag
4"h6 sbc Arifmetik ayirish Rd:= Rn - shifter_operand - EMAS(Carry Flag)
4"h7 rsc Arifmetik teskari ayirish Rd:= shifter_operand - Rn - EMAS (Bayroqni olib yurish)
4"h8 tst Mantiqiy VA, lekin natijani saqlamasdan, faqat bayroqlar Rn VA shifter_operand S bit har doim o'rnatiladi
4"h9 teq Mantiqiy eksklyuziv OR, lekin natijani saqlamasdan, faqat Rn EOR shifter_operand bayroqlari o'zgartiriladi
S bit har doim o'rnatiladi
4 "ha cmp Taqqoslash, aniqrog'i, natijani saqlamasdan arifmetik ayirish, faqat Rn bayroqlari o'zgaradi - shifter_operand S bit har doim o'rnatiladi
4 "hb cmn Natijani eslab qolmasdan teskari, aniqrog'i arifmetik qo'shishni taqqoslash, faqat Rn + shifter_operand bayroqlari har doim o'rnatilgan S bitlari o'zgartiriladi.
4"hc orr Mantiqiy OR Rd:= Rn YOKI shifter_operand
4"hd mov Rd qiymatini nusxalash:= shifter_operand (birinchi operand yo'q)
4"he bic Reset bit Rd:= Rn VA EMAS (o'zgartiruvchi_operand)
4"hf mvn Teskari qiymatni nusxalash Rd:= shifter_operand EMAS (birinchi operand yo'q)

barrel almashtirgich.

ARM protsessorida har qanday arifmetik yoki mantiqiy operatsiya oldidan operandlardan birini ma'lum miqdordagi bitlar bilan siljitish yoki aylantirish imkonini beruvchi maxsus "barrel o'tkazgich" sxemasi mavjud. Bu protsessorning juda qiziqarli xususiyati bo'lib, u sizga juda samarali kod yaratish imkonini beradi.

Masalan:

@ 9 ga ko'paytirish sonni 8 ga ko'paytirishdir
@ chapga 3 bit va boshqa raqamni siljitish orqali
r0, r1, r1, lsl #3 @ r0= r1+(r1) qo‘shing<<3) = r1*9

@ 15 ga ko'paytirish - bu sonni 16 ga ko'paytirish
rsb r0, r1, r1, lsl #4 @ r0= (r1<<4)-r1 = r1*15

@ 4 baytli so'zlar jadvaliga kirish, bu erda
@r1 - jadvalning asosiy manzili
@r2 - jadvaldagi elementning indeksi
ldr r0,

Mantiqiy chapga siljish lsl bilan bir qatorda mantiqiy o'ngga siljish lsr va arifmetik o'ngga siljish ham mavjud (belgini saqlaydigan siljish, siljish bilan bir vaqtda chapdan eng muhim bit ko'paytiriladi).

Bundan tashqari, ror bitlarining aylanishi ham mavjud - bitlar o'ngga suriladi va tashqariga surilganlari chapga suriladi.
C bayrog'i orqali bir bit siljish mavjud - bu rrx buyrug'i. Registr qiymati bir bitga o'ngga siljiydi. Chap tomonda C bayrog'i registrning yuqori bitiga yuklanadi

Shishish qat'iy belgilangan son-doimiy emas, balki uchinchi registr-operandning qiymati bo'yicha amalga oshirilishi mumkin. Masalan:

qo'shing r0, r1, r1, lsr r3 @ r0 = r1 + (r1>>r3);
qo'shing r0, r0, r1, lsr r3 @ r0 = r0 + (r1>>r3);

Shunday qilib shifter_operand biz assembler ko'rsatmalarida tasvirlangan narsadir, masalan "r1, lsr r3" yoki "r2, lsl #5".

Eng qizig'i shundaki, operatsiyalarda smenalardan foydalanish hech qanday xarajat qilmaydi. Ushbu siljishlar (odatda) qo'shimcha soat tsikllarini talab qilmaydi va tizim ishlashi uchun juda yaxshi.

Raqamli operandlardan foydalanish.

Arifmetik yoki mantiqiy amallar ikkinchi operand sifatida nafaqat registrning mazmunini, balki raqamli konstantani ham ishlatishi mumkin.

Afsuski, bu erda bitta muhim cheklov mavjud. Barcha buyruqlar qat'iy 4 bayt (32 bit) uzunligiga ega bo'lganligi sababli, undagi "har qanday" raqamni kodlash ishlamaydi. Operatsion kodida 4 bitni bajarish sharti kodi (Cond), operatsiya kodining o'zi uchun 4 bit (Opcode), so'ngra 4 bit - qabul qiluvchi registri Rd va yana 4 bit - birinchisining registrini egallaydi. operand Rn, shuningdek, boshqa turli bayroqlar I 25 (faqat operatsiya kodidagi raqamli doimiyni bildiradi) va S 20 (operatsiyadan keyin bayroqlarni o'rnatish). Hammasi bo'lib shifter_operand deb ataladigan mumkin bo'lgan konstanta uchun atigi 12 bit qoladi - biz buni yuqorida ko'rdik. 12 bit raqamlarni faqat tor diapazonda kodlashi mumkinligi sababli, ARM protsessorini ishlab chiquvchilar doimiyni quyidagicha kodlashga qaror qilishdi. Shift_operandning o'n ikki biti ikki qismga bo'linadi: to'rt bitli aylanish indeksi encode_imm va haqiqiy sakkiz bitli raqamli qiymati imm_8 .

ARM protsessorida konstanta 32 bitli son ichidagi 8 bitli son sifatida aniqlanadi, o'ngga juft sonli bit bilan aylantiriladi. Ya'ni:

imm_32 = imm_8 ROR (encode_imm *2)

Bu juda aqlli bo'lib chiqdi. Aniqlanishicha, assembler buyruqlarida har bir son konstantasidan foydalanish mumkin emas.

Yozishingiz mumkin

r0, r2, #255 @ kasr konstantasini qo'shing
r0, r3, # 0xFF @ doimiyni hexga qo'shing

chunki 255 8 bit oralig'ida. Bu buyruqlar quyidagicha kompilyatsiya qilinadi:

0: e28200ff r0, r2, #255 qo'shing; 0xff
4: e28300ff r0, r3, # 255 qo'shing; 0xff

Va hatto yozishingiz mumkin

r0, r4, #512 qo'shing
r0, r5, 0x650000 qo'shing

Kompilyatsiya qilingan kod quyidagicha ko'rinadi:

0: e2840c02 r0, r4, #512 qo'shing; 0x200
4: e2850865 r0, r5, #6619136 qo'shing; 0x650000

Bunday holda, 512 raqamining o'zi, albatta, baytga to'g'ri kelmaydi. Ammo boshqa tomondan, biz uni 32'h00000200 o'n oltilik ko'rinishda tasavvur qilamiz va bu 2 o'ngga 24 bit (1 ror 24) ga burilganligini ko'ramiz. Aylanish koeffitsienti 24 ning yarmini tashkil qiladi, ya'ni 12. Shunday qilib, shifter_operand = ( 4'hc , 8'h02 ) chiqadi - bular buyruqning o'n ikkita eng kam ahamiyatli bitlari. 0x650000 raqami bilan ham xuddi shunday. Buning uchun shifter_operand = (4'h8, 8'h65).

Biror kishi yoza olmasligi aniq

r0, r1, # 1234567 qo'shing

yoki yozolmaysiz

mov r0, #511

chunki bu erda raqamni imm_8 va encode_imm - aylanish omili sifatida ifodalab bo'lmaydi. Assembler kompilyatori xatoga yo'l qo'yadi.

Konstantani shifter_operand ga to'g'ridan-to'g'ri kodlash mumkin bo'lmaganda nima qilish kerak? Siz har xil nayranglarni qilishingiz kerak.
Masalan, siz avval 512 raqamini bepul registrga yuklashingiz va keyin bittasini ayirishingiz mumkin:

mov r0, #511
sub r0, r0, # 1

Muayyan raqamni registrga yuklashning ikkinchi usuli - uni xotirada maxsus ajratilgan o'zgaruvchidan o'qish:

ldr r7, my_var
.....
my_var: .word 0x123456

Yozishning eng oson yo'li quyidagicha:

ldr r2,=511

Bunday holda ("=" belgisiga e'tibor bering), agar doimiy imm_8 va encode_imm sifatida ifodalanishi mumkin bo'lsa, agar u 12 bitli shifter_operandga sig'ishi mumkin bo'lsa, assembler kompilyatori avtomatik ravishda ldr ni mov ko'rsatmalariga kompilyatsiya qiladi. Ammo agar raqamni bu tarzda ifodalash mumkin bo'lmasa, kompilyatorning o'zi dasturda ushbu konstanta uchun xotira katakchasini zahiraga oladi va o'zi bu xotira katakchasiga nom beradi va buyruqni ldr ga kompilyatsiya qiladi.

Mana nima yozdim:

ldr r7, my_var
ldr r8,=511
ldr r8,=1024
ldr r9,=0x3456
........
My_var: .word 0x123456

Kompilyatsiya qilgandan so'ng men buni oldim:

18: e59f7030 ldr r7, ; 50
1c: e59f8030 ldr r8, ; 54
20: e3a08b01 mov r8, # 1024; 0x400
24: e59f902c ldr r9, ; 58
.............
00000050 :
50:00123456 .word 0x00123456
54:000001ff .word 0x000001ff
58:00003456 .word 0x00003456

E'tibor bering, kompilyator kompyuter registriga (aka r15) nisbatan xotira manzilini ishlatadi.

Xotira katakchasini o'qish va xotiraga registr yozish.

Yuqorida yozganimdek, ARM protsessori faqat registrlar mazmunida arifmetik yoki mantiqiy amallarni bajarishi mumkin. Operatsiyalar uchun ma'lumotlar xotiradan o'qilishi va operatsiyalar natijasi xotiraga qayta yozilishi kerak. Buning uchun maxsus buyruqlar mavjud: o'qish uchun ldr (ehtimol "LoaD Register" birikmasidan) va yozish uchun str (ehtimol "Store Register").

Faqat ikkita jamoa borga o'xshaydi, lekin aslida ular juda ko'p farqlarga ega. L 20 , W 21 , B 22 , U 23 , P 24 , I 25 yordamchi bayroq bitlarini ko'rish uchun Amber ARM protsessorining ldr / str buyruqlari qanday kodlanganiga qarang va ular buyruqning o'ziga xos harakatini aniqlaydi. :

  • Bit L 20 yozish yoki o'qishni belgilaydi. 1 - ldr , o'qish, 0 - str , yozish.
  • B 22 bit 32 bitli so'zni yoki 8 bitli baytni o'qish/yozishni aniqlaydi. 1 bayt operatsiyasini bildiradi. Registrga bayt o'qilganda registrning yuqori bitlari nolga o'rnatiladi.
  • Bit I 25 Ofset maydonidan foydalanishni belgilaydi. Agar I 25 ==0 bo'lsa, Offset raqamli ofset sifatida talqin qilinadi, uni registrdan asosiy manzilga qo'shish yoki olib tashlash kerak. Lekin qo'shish yoki ayirish U 23 bitiga bog'liq.

(Cond) - operatsiyani bajarish sharti. U mantiqiy/arifmetik buyruqlar bilan bir xil tarzda talqin qilinadi - o'qish yoki yozish shartli bo'lishi mumkin.

Shunday qilib, assembler matnida siz shunday yozishingiz mumkin:

ldr r1, @ r1 registriga r0 registridagi manzildagi so'zni o'qing
ldrb r1, @ r1 registriga r0 registridagi manzilda baytni o'qiydi
ldreq r2, @ shartli so'zlarni o'qish
ldrgtb r2, @ shartli baytni o'qish
ldr r3, @ r4 registridagi manzilga nisbatan 8-manzildagi so'zni o'qing
ldr r4, @ r5 registridagi manzilga nisbatan -16 manzilidagi so'zni o'qing

Ushbu matnni tuzgandan so'ng, siz ushbu buyruqlarning haqiqiy kodlarini ko'rishingiz mumkin:

0: e5901000 ldr r1,
4: e5d01000 ldrb r1,
8: 05912000 ldreq r2,
c:c5d12000 ldrbgt r2,
10: e5943008 ldr r3,
14: e5154010 ldr r4,

Yuqoridagi misolda men faqat ldr dan foydalanaman, lekin str xuddi shu tarzda ishlatiladi.

Indeksdan oldingi va indeksdan keyin qayta yozish xotirasiga kirish usullari mavjud. Ushbu rejimlarda xotiraga kirish ko'rsatkichi buyruq bajarilishidan oldin yoki keyin yangilanadi. Agar siz C dasturlash tilini yaxshi bilsangiz, u holda siz (( *psource++;) yoki ( a=*++ manba;). ARM protsessorida xotiraga kirishning ushbu rejimi endigina amalga oshirilgan. O'qish buyrug'i bajarilganda bir vaqtning o'zida ikkita registr yangilanadi - qabul qiluvchi registr xotiradan o'qilgan qiymatni oladi va registr-ko'rsatgichdagi qiymat xotira katakchasiga oldinga yoki orqaga siljiydi.

Bu buyruqlarni yozish, menimcha, biroz mantiqsiz. Ko'nikish uchun uzoq vaqt kerak bo'ladi.

ldr r3, ! @psrc++; r3 = *psrc;
ldr r3, , #4 @ r3 = *psrc; psrc++;

Birinchi ldr buyrug'i birinchi navbatda ko'rsatkichni oshiradi, keyin uni o'qiydi. Ikkinchi buyruq avval o'qiydi, keyin ko'rsatkichni oshiradi. Psrc ko'rsatkichining qiymati r0 registrida joylashgan.

Yuqoridagi barcha misollar buyruq kodidagi I 25 bit qayta o'rnatilgan holat uchun edi. Lekin u hali ham o'rnatilishi mumkin! Keyin Ofset maydonining qiymati raqamli konstantani emas, balki operatsiyada ishtirok etadigan uchinchi registrni o'z ichiga oladi. Bundan tashqari, uchinchi registrning qiymati hali ham oldindan o'zgartirilishi mumkin!

Bu erda mumkin bo'lgan kod o'zgarishlariga misollar:

0: e7921003 ldr r1, @ o'qish manzili - r2 va r3 registrlari qiymatlari yig'indisi
4: e7b21003 ldr r1, ! @ bir xil, lekin r2 o'qilgach, r3 dan qiymatga oshiriladi
8: e6932004 ldr r2, , r4 @ avval r3 da o‘qiydi, keyin r3 r4 ga oshiriladi.
c: e7943185 ldr r3, @ o'qish manzili r4+r5*8
10: e7b43285 ldr r3, ! @ manzilni o'qish uchun r4+r5*32, o'qilgandan so'ng r4 ushbu manzil qiymatiga o'rnatiladi
14: e69431a5 ldr r3, , r5, lsr #3 @ r4 manzilini o‘qish, r4 buyrug‘i bajarilgandan so‘ng r4+r5/8 ga o‘rnatiladi.

Bu erda ARM v2a protsessoridagi o'qish/yozish buyruqlarining o'zgarishlari keltirilgan.

ARM protsessorlarining eski modellarida bu xilma-xil ko'rsatmalar yanada ko'proq.
Buning sababi, protsessor, masalan, nafaqat so'zlarni (32 bitli raqamlar) va baytlarni, balki yarim so'zlarni (16 bit, 2 bayt) o'qish imkonini beradi. Keyin ldr / str buyruqlariga yarim so'zdan "h" qo'shimchasi qo'shiladi. Buyruqlar ldrh yoki strh kabi ko'rinadi. Imzolangan raqamlar sifatida talqin qilinadigan ldrsh yarim so'zlari yoki ldrsb baytlarini yuklash buyruqlari ham mavjud. Bunday hollarda yuklangan tarmoqli so'z yoki baytning eng muhim biti maqsad registridagi butun so'zning eng muhim bitlariga ko'paytiriladi. Misol uchun, ldrsh buyrug'i bilan 0xff25 yarim so'zini yuklash maqsad registrida 0xffffff25 ga olib keladi.

Ko'p o'qish va yozish.

Ldr /str buyruqlari xotiraga kirish uchun yagona buyruqlar emas. ARM protsessorida blokni uzatishni amalga oshirish imkonini beruvchi buyruqlar ham mavjud - siz bir vaqtning o'zida bir nechta registrlarga bir nechta ketma-ket so'zlarning mazmunini xotiradan yuklashingiz mumkin. Shuningdek, xotiraga bir nechta registrlarning qiymatlarini ketma-ket yozish mumkin.

Blokni uzatish buyrug'i mnemonikasi ildiz ldm (LoaD Multiple ) yoki stm (Store Multiple ) bilan boshlanadi. Ammo keyin, odatdagidek, ARMda, hikoya qo'shimchalar bilan boshlanadi.

Umuman olganda, buyruq quyidagicha ko'rinadi:

op(cond)(rejim) Rd(, {Register list} !}

Qo'shimcha (Cond) tushunarli, bu buyruqni bajarish sharti. Suffiks (rejim) uzatish rejimi, bu haqda keyinroq. Rd - o'qish yoki yozish uchun xotiradagi asosiy manzilni ko'rsatuvchi registr. Rd registridan keyingi undov belgisi o'qish/yozish operatsiyasidan keyin o'zgartirilishini bildiradi. Xotiradan yuklangan yoki xotiraga tushirilgan registrlar ro'yxati (Ro'yxatga olish ro'yxati) .

Registrlar ro'yxati vergul bilan ajratilgan jingalak qavslarda yoki diapazon sifatida ko'rsatilgan. Masalan:

stm r0,(r3,r1, r5-r8)

Xotiraga yozish tartibsiz amalga oshiriladi. Ro'yxat oddiygina qaysi registrlar xotiraga yozilishini ko'rsatadi va tamom. Buyruq kodi, xuddi protsessor bankidagi registrlar soni kabi, Registrlar ro'yxati uchun ajratilgan 16 bitga ega. Bu sohadagi har bir bit operatsiyada qaysi registr ishtirok etishini bildiradi.

Endi o'qish/yozish rejimi uchun. Chalkashish uchun joy bor. Gap shundaki, bir xil harakat uchun turli rejim nomlaridan foydalanish mumkin.

Agar siz kichik lirik digressiya qilsangiz, unda siz ... stek haqida gapirishingiz kerak. Stack LIFO tipidagi ma'lumotlarga kirish usulidir - Oxirgi kiruvchi birinchi chiqadi (wiki) - oxirgi kiruvchi, birinchi chiqadi. Stek dasturlashda protseduralarni chaqirishda va funksiyalar kirishida registrlar holatini saqlashda va chiqishda ularni tiklashda, shuningdek chaqirilgan protseduralarga parametrlarni o'tkazishda keng qo'llaniladi.

Xotiradagi stek, kim o'ylagan bo'lsa, to'rt xil.

Birinchi tur - to'liq pasayish. Bu stek ko'rsatkichi band bo'lgan stek elementiga ishora qilganda va stek manzillar kamayishi yo'nalishida o'sadi. Stekga so'z qo'yish kerak bo'lganda, avval stek ko'rsatkichi kamayadi (Decrement Before), so'ngra so'z stek ko'rsatgichining manziliga yoziladi. Kompyuter so'zini stekdan olib tashlash kerak bo'lganda, so'z stek ko'rsatkichining joriy qiymatida o'qiladi, keyin ko'rsatgich yuqoriga ko'tariladi (Increment After).

Ikkinchi tur - to'liq ko'tarilish. Stack pastga emas, balki yuqoriga, katta manzillarga qarab o'sadi. Ko'rsatkich ham egallangan elementga ishora qiladi. Stakka so'z qo'yish kerak bo'lganda, avval stek ko'rsatkichi oshiriladi, so'ngra so'z ko'rsatkich orqali yoziladi (Increment Before). Qachonki stekdan olib tashlash kerak bo'lsa, avval stek ko'rsatkichi orqali o'qiymiz, chunki u egallangan elementga ishora qiladi, keyin stek ko'rsatkichi kamayadi (Decrement After).

Uchinchi tur - bo'sh pasayish. To'liq pasayish holatida bo'lgani kabi stek pastga qarab o'sadi, lekin farq shundaki, stek ko'rsatkichi band bo'lmagan hujayraga ishora qiladi. Shunday qilib, stekga so'z qo'yish kerak bo'lganda, darhol yozuv tuziladi, keyin stek ko'rsatkichi kamayadi (Decrement After). Stackdan olib tashlashda ko'rsatgich birinchi navbatda oshiriladi, so'ngra o'qiladi (Increment before).

To'rtinchi tur - Bo'sh ko'tarilish. Umid qilamanki, hamma narsa aniq - stek o'sadi. Stack ko'rsatkichi bo'sh elementga ishora qiladi. Stackni bosing - bu stek ko'rsatgichining manziliga so'z yozish va stek ko'rsatkichini oshirish (Increment After ). Stackdan oching - stek ko'rsatkichini kamaytiring va so'zni o'qing (Decrement Before ).

Shunday qilib, stek bilan operatsiyalar paytida ko'rsatkichni oshirish yoki kamaytirish kerak - (O'sish / kamaytirish ) stek turiga qarab xotiraga o'qish / yozishdan oldin yoki keyin (Oldin / keyin). Masalan, Intel protsessorlarida stek bilan ishlash uchun PUSH (stekga so'z qo'yish) yoki POP (stekdan so'zni chiqarish) kabi maxsus buyruqlar mavjud. ARM protsessorida maxsus buyruqlar mavjud emas, lekin ldm va stm buyruqlari ishlatiladi.

Agar siz stekni ARM protsessor ko'rsatmalari yordamida amalga oshirsangiz, quyidagi rasmni olasiz:

Nima uchun bitta jamoaga turli nomlar berish kerak edi? Men umuman tushunmadim... Bu yerda, albatta, shuni ta'kidlash kerakki, ARM uchun stek standarti hali ham To'liq pasaymoqda.

ARM protsessoridagi stek ko'rsatkichi sp yoki r13 registridir. Bu odatda shunday kelishuv. Albatta, stm yozish yoki ldmni o'qish boshqa asosiy registrlar bilan ham amalga oshirilishi mumkin. Biroq, sp registrining boshqa registrlardan qanday farq qilishini eslab qolishingiz kerak - u turli protsessor ish rejimlarida (USR, SVC, IRQ, FIRQ) har xil bo'lishi mumkin, chunki ular o'zlarining registrlar banklariga ega.

Va yana bir eslatma. ARM yig'ish kodiga o'xshash qatorni yozing surish(r0-r3), Albatta mumkin. Lekin aslida bu bir xil buyruq bo'ladi stmfd sp!,(r0-r3).

Nihoyat, men montaj kodi va uning tuzilgan demontaj matniga misol keltiraman. Bizda ... bor:


stmfd sp!,(r0-r3)
stmdb sp!,(r0-r3)
surish(r0-r3)

@bu uchta ko'rsatmalar bir xil va xuddi shu narsani qiladi
pop(r0-r3)
ldmia sp!,(r0-r3)
ldmfd r13!,(r0-r3)

Stmfd r4,(r0-r3,r5,r8)
stmea r4!,(r0-r3,r7,r9,lr,kompyuter)
ldm r5, (r0, kompyuter)

Biz kompilyatsiyadan keyin olamiz:

0: e92d000f surish (r0, r1, r2, r3)
4: e92d000f surish (r0, r1, r2, r3)
8: e92d000f surish (r0, r1, r2, r3)
c:e8bd000f pop(r0, r1, r2, r3)
10: e8bd000f pop (r0, r1, r2, r3)
14: e8bd000f pop (r0, r1, r2, r3)
18: e904012f stmdb r4, (r0, r1, r2, r3, r5, r8)
1c: e8a4c28f stmia r4!, (r0, r1, r2, r3, r7, r9, lr, kompyuter)
20: e8958001 ldm r5, (r0, kompyuter)

Dasturlardagi o'tishlar.

O'tishlarsiz dasturlash mumkin emas. Har qanday dasturlarda kodning tsiklik bajarilishi ham, protseduralar, funktsiyalarning chaqiruvlari ham mavjud, kod bo'limlarini shartli bajarish ham mavjud.

Amber ARM v2a protsessorida faqat ikkita buyruq mavjud: b (Branch - filial, o'tish so'zidan) va bl (Branch with Link - qaytish manzilini saqlash bilan o'tish).

Buyruqning sintaksisi juda oddiy:

b (cond) belgisi
bl (cond) belgisi

Ko'rinib turibdiki, har qanday o'tish shartli bo'lishi mumkin, ya'ni dasturda "b" va "bl" o'zagidan tuzilgan shunday g'alati so'zlar va shart qo'shimchalari ( Cond) , g'alati so'zlar bo'lishi mumkin:

beq, bne, bcs, bhs, bcc, blo, bmi, bpl, bvs, bvc, bhi, bls, bge, bgt, ble, bal, b

bleq, blne, blcs, blhs, blcc, bllo, blmi, blpl, blvs, blvc, blhi, blls, blge, blgt, blle, bla, bl

Turli xilligi ajoyib, shunday emasmi?

O'tish yo'riqnomasida 24 bitli ofset ofset mavjud. O'tish manzili kompyuter ko'rsatkichining joriy qiymatining yig'indisi sifatida hisoblanadi va 2 bitga chapga siljigan Ofset raqami imzolangan raqam sifatida talqin etiladi:

Yangi kompyuter = shaxsiy kompyuter + Ofset*4

Shunday qilib, sakrash oralig'i oldinga yoki orqaga 32 MB.

Keling, bl qaytish manzilini saqlaydigan filial nima ekanligini ko'rib chiqaylik. Bu buyruq subprogrammalarni chaqirish uchun ishlatiladi. Ushbu yo'riqnomaning qiziqarli xususiyati shundaki, protsedura chaqirilganda protseduradan qaytish manzili Intel protsessorlarida bo'lgani kabi stekda saqlanmaydi, lekin odatiy registrda r14 . Keyin, protseduradan qaytish uchun xuddi shu Intel protsessorlarida bo'lgani kabi, maxsus ret buyrug'i kerak emas, lekin siz shunchaki r14 qiymatini kompyuterga nusxalashingiz mumkin. Endi r14 registrining nima uchun lr (Link Register) muqobil nomi borligi aniq.

Amber SoC uchun salom-dunyo loyihasidan chiqish tartibini ko'rib chiqing.

000004a0<_outbyte>:
4a0: e59f1454 ldr r1, ; 8fc< адрес регистра данных UART >
4a4: e59f3454 ldr r3, ; 900< адрес регистра статуса UART >
4a8: e5932000 ldr r2, ; joriy holatni o'qing
4ac: e2022020 va r2, r2, #32
4b0: e3520000 cmp r2, #0; UART band emasligini tekshiring
4b4: 05c10000 strbeq r0, ; UART ga faqat band bo'lmasa, belgi yozing
4b8: 01b0f00e movseq kompyuter, lr; agar UART band bo'lmasa, protseduradan shartli qaytish
4bc: 1affff9 bne 4a8<_outbyte+0x8>; UART holatini tekshirish uchun pastadir

O'ylaymanki, ushbu parchaning sharhlaridan ushbu protsedura qanday ishlashi aniq.

O'tish haqida yana bir muhim eslatma. Register r15 (kompyuter) oddiy arifmetik yoki mantiqiy operatsiyalarda maqsad registr sifatida ishlatilishi mumkin. Shunday qilib, kompyuter, kompyuter, №8 qo'shish kabi buyruq boshqa manzilga o'tish uchun juda ko'rsatma.

O'tishlar haqida yana bir fikrni aytish kerak. Eski ARM protsessorlarida qo'shimcha filial ko'rsatmalari bx, blx va blj mavjud. Bular boshqa buyruqlar tizimi bilan kod bo'laklariga o'tish uchun buyruqlardir. Bx /blx ARM protsessorlarining 16-bitli THUMB kodiga o'tish imkonini beradi. Blj - bu Jazelle buyruqlar tizimining protsedura chaqiruvi (ARM protsessorlarida Java tilini qo'llab-quvvatlash). Bizning Amber ARM v2a da bu buyruqlar mavjud emas.

Agar xatolikni sezsangiz, matn qismini tanlang va Ctrl + Enter tugmalarini bosing
ULOSING: