Menu English Ukrainian Russia Laman Utama

Perpustakaan teknikal percuma untuk penggemar dan profesional Perpustakaan teknikal percuma


Informatik dan teknologi maklumat. Nota kuliah: secara ringkas, yang paling penting

Nota kuliah, helaian curang

Buku Panduan / Nota kuliah, helaian curang

Komen artikel Komen artikel

jadual kandungan

  1. Pengenalan kepada Sains Komputer (Informatik. Maklumat. Persembahan dan pemprosesan maklumat. Sistem nombor. Perwakilan nombor dalam komputer. Konsep formal algoritma)
  2. bahasa Pascal (Pengenalan kepada Pascal. Prosedur dan fungsi standard. Operator Pascal)
  3. Prosedur dan fungsi (Konsep algoritma tambahan. Prosedur dalam Pascal. Fungsi dalam Pascal. Penerangan jangkaan dan sambungan subrutin. Arahan)
  4. Subrutin (Parameter rutin. Jenis parameter subrutin. Jenis rentetan dalam Pascal. Prosedur dan fungsi untuk pembolehubah jenis rentetan. Rekod. Set)
  5. Fail (Fail. Operasi fail. Modul. Jenis modul)
  6. Memori dinamik (Jenis data rujukan. Memori dinamik. Pembolehubah dinamik. Bekerja dengan memori dinamik. Penunjuk tidak ditaip)
  7. Struktur data abstrak (Struktur data abstrak. Tindanan. Baris gilir)
  8. Struktur Data Pokok (Struktur data pokok. Operasi pada pokok. Contoh pelaksanaan operasi)
  9. Kiraan (Konsep graf. Kaedah mewakili graf. Perwakilan graf dengan senarai kejadian. Algoritma lintasan kedalaman pertama untuk graf. Perwakilan graf sebagai senarai senarai. Algoritma lintasan pertama kedalaman untuk graf )
  10. Jenis data objek (Jenis objek dalam Pascal. Konsep objek, penerangan dan penggunaannya. Warisan. Mencipta contoh objek. Komponen dan skop)
  11. Kaedah (Kaedah. Pembina dan pemusnah. Pemusnah. Kaedah maya. Medan data objek dan parameter kaedah formal)
  12. Keserasian Jenis Objek (Encapsulation. Objek boleh dipanjangkan. Keserasian jenis objek)
  13. Asembler (Mengenai pemasang. Model perisian mikropemproses. Daftar pengguna. Daftar tujuan umum. Daftar segmen. Daftar status dan kawalan)
  14. Daftar (Daftar sistem mikropemproses. Daftar kawalan. Daftar alamat sistem. Daftar nyahpepijat)
  15. Program perhimpunan (Struktur atur cara Assembler. Sintaks Assembler. Operator perbandingan. Operator dan keutamaannya. Arahan definisi segmen dipermudah. ​​Pengecam yang dibuat oleh arahan MODEL. Model memori. Pengubah model memori)
  16. Struktur Arahan Perhimpunan (Struktur arahan mesin. Kaedah untuk menentukan operan arahan. Kaedah menangani)
  17. Pasukan (Perintah pemindahan data. Perintah aritmetik)
  18. Perintah Pemindahan Kawalan (Perintah logik. Jadual kebenaran untuk penolakan logik. Jadual kebenaran untuk logik inklusif ATAU. Jadual kebenaran untuk logik DAN. Jadual kebenaran untuk logik eksklusif ATAU. Maksud singkatan dalam nama perintah jcc. Senarai perintah lompat bersyarat untuk perintah itu. Lompat bersyarat arahan dan bendera)

KULIAH Bil 1. Pengenalan kepada sains komputer

1. Sains komputer. Maklumat. Perwakilan dan pemprosesan maklumat

Informatik terlibat dalam perwakilan rasmi objek dan struktur hubungan mereka dalam pelbagai bidang sains, teknologi, dan pengeluaran. Pelbagai alat formal digunakan untuk memodelkan objek dan fenomena, seperti formula logik, struktur data, bahasa pengaturcaraan, dll.

Dalam sains komputer, konsep asas seperti maklumat mempunyai pelbagai makna:

1) pembentangan formal bentuk maklumat luaran;

2) makna abstrak maklumat, kandungan dalamannya, semantik;

3) hubungan maklumat dengan dunia sebenar.

Tetapi, sebagai peraturan, maklumat difahami sebagai makna abstraknya - semantik. Dengan mentafsir perwakilan maklumat, kita mendapat maknanya, semantik. Oleh itu, jika kita ingin bertukar maklumat, kita memerlukan pandangan yang konsisten agar ketepatan tafsiran tidak dicabuli. Untuk melakukan ini, tafsiran perwakilan maklumat dikenal pasti dengan beberapa struktur matematik. Dalam kes ini, pemprosesan maklumat boleh dilakukan dengan kaedah matematik yang ketat.

Salah satu huraian matematik maklumat ialah perwakilannya dalam bentuk fungsi y =f(x, t), di mana t ialah masa, x ialah titik dalam medan tertentu di mana nilai y diukur. Bergantung pada parameter fungsi chi (maklumat boleh dikelaskan.

Jika parameter adalah kuantiti skalar yang mengambil siri nilai berterusan, maka maklumat yang diperoleh dengan cara ini dipanggil berterusan (atau analog). Jika parameter diberi langkah perubahan tertentu, maka maklumat itu dipanggil diskret. Maklumat diskret dianggap universal, kerana untuk setiap parameter tertentu adalah mungkin untuk mendapatkan nilai fungsi dengan tahap ketepatan tertentu.

Maklumat diskret biasanya dikenal pasti dengan maklumat digital, yang merupakan kes khas maklumat simbolik perwakilan abjad. Abjad ialah set simbol terhingga dalam sebarang sifat. Selalunya dalam sains komputer situasi timbul apabila aksara satu abjad mesti diwakili oleh aksara yang lain, iaitu, untuk menjalankan operasi pengekodan. Jika bilangan aksara abjad pengekodan kurang daripada bilangan aksara abjad pengekodan, maka operasi pengekodan itu sendiri tidak rumit, jika tidak, perlu menggunakan set aksara tetap abjad pengekodan untuk pengekodan betul yang tidak jelas.

Seperti yang ditunjukkan oleh amalan, abjad paling mudah yang membolehkan anda mengekod abjad lain ialah binari, terdiri daripada dua aksara, yang biasanya dilambangkan dengan 0 dan 1. Menggunakan n aksara abjad binari, anda boleh mengekod aksara 2n, dan ini sudah cukup untuk mengekod mana-mana abjad.

Nilai yang boleh diwakili oleh simbol abjad binari dipanggil unit minimum maklumat atau bit. Urutan 8 bit - bait. Abjad yang mengandungi 256 jujukan 8-bit yang berbeza dipanggil abjad bait.

Sebagai standard hari ini dalam sains komputer, kod diterima pakai di mana setiap aksara dikodkan oleh 1 bait. Terdapat juga abjad lain.

2. Sistem nombor

Sistem nombor ialah satu set peraturan untuk menamakan dan menulis nombor. Terdapat sistem nombor kedudukan dan bukan kedudukan.

Sistem nombor dipanggil kedudukan jika nilai digit nombor bergantung pada lokasi digit dalam nombor itu. Jika tidak, ia dipanggil bukan kedudukan. Nilai nombor ditentukan oleh kedudukan digit ini dalam nombor.

3. Perwakilan nombor dalam komputer

Pemproses 32-bit boleh berfungsi dengan sehingga 232-1 RAM, dan alamat boleh ditulis dalam julat 00000000 - FFFFFFFF. Walau bagaimanapun, dalam mod sebenar, pemproses beroperasi dengan memori sehingga 220-1, dan alamat jatuh dalam julat 00000 - FFFFF. Bait memori boleh digabungkan ke dalam medan dengan panjang tetap dan berubah-ubah. Perkataan ialah medan panjang tetap yang terdiri daripada 2 bait, kata ganda ialah medan 4 bait. Alamat medan boleh genap atau ganjil, dengan alamat genap menjadi lebih pantas.

Nombor titik tetap diwakili dalam komputer sebagai nombor perduaan integer, dan saiznya boleh menjadi 1, 2, atau 4 bait.

Integer binari diwakili dalam pelengkap dua, dan nombor titik tetap diwakili dalam pelengkap dua. Lebih-lebih lagi, jika nombor menduduki 2 bait, maka struktur nombor itu ditulis mengikut peraturan berikut: digit yang paling penting diperuntukkan kepada tanda nombor, dan selebihnya - kepada digit binari nombor itu. Kod pelengkap bagi nombor positif adalah sama dengan nombor itu sendiri, dan kod pelengkap bagi nombor negatif boleh diperoleh menggunakan formula berikut: x = 10i - \x\, dengan n ialah kapasiti digit nombor itu.

Dalam sistem nombor binari, kod tambahan diperoleh dengan menyongsangkan bit, iaitu, menggantikan unit dengan sifar dan sebaliknya, dan menambah satu kepada bit yang paling tidak ketara.

Bilangan bit mantissa menentukan ketepatan perwakilan nombor, bilangan bit pesanan mesin menentukan julat perwakilan nombor titik terapung.

4. Konsep formal algoritma

Algoritma hanya boleh wujud jika, pada masa yang sama, beberapa objek matematik wujud. Konsep formal algoritma disambungkan dengan konsep fungsi rekursif, algoritma Markov biasa, mesin Turing.

Dalam matematik, fungsi dipanggil bernilai tunggal jika, untuk mana-mana set hujah, terdapat undang-undang yang mana nilai unik fungsi ditentukan. Algoritma boleh bertindak sebagai undang-undang sedemikian; dalam kes ini fungsi itu dikatakan boleh dikira.

Fungsi rekursif ialah subkelas fungsi boleh dikira, dan algoritma yang mentakrifkan pengiraan dipanggil algoritma fungsi rekursif pendamping. Pertama, fungsi rekursif asas ditetapkan, yang mana algoritma yang disertakan adalah remeh, tidak jelas; maka tiga peraturan diperkenalkan - pengendali penggantian, rekursi dan pengecilan, dengan bantuan fungsi rekursif yang lebih kompleks diperoleh berdasarkan fungsi asas.

Fungsi asas dan algoritma yang disertakan boleh:

1) fungsi bagi n pembolehubah tidak bersandar, sama sama dengan sifar. Kemudian, jika tanda fungsi ialah φn, maka tanpa mengira bilangan hujah, nilai fungsi hendaklah ditetapkan sama dengan sifar;

2) fungsi identiti bagi n pembolehubah tidak bersandar dalam bentuk ψni. Kemudian, jika tanda fungsi ialah ψni, maka nilai fungsi harus diambil sebagai nilai hujah ke-i, mengira dari kiri ke kanan;

3) Λ ialah fungsi satu hujah bebas. Kemudian, jika tanda fungsi ialah λ, maka nilai fungsi harus diambil sebagai nilai berikutan nilai hujah. Ulama yang berbeza telah mencadangkan pendekatan mereka sendiri kepada yang diformalkan

perwakilan algoritma. Sebagai contoh, Gereja saintis Amerika mencadangkan bahawa kelas fungsi boleh dikira terhad kepada fungsi rekursif dan, akibatnya, apa sahaja algoritma yang menukar satu set integer bukan negatif kepada yang lain, terdapat algoritma yang mengiringi fungsi rekursif yang setara dengan yang diberikan. Oleh itu, jika mustahil untuk membina fungsi rekursif untuk menyelesaikan masalah yang diberikan, maka tiada algoritma untuk menyelesaikannya. Seorang lagi saintis, Turing, membangunkan komputer maya yang memproses urutan input aksara ke dalam output. Dalam hal ini, beliau mengemukakan tesis bahawa mana-mana fungsi boleh dikira adalah boleh dikira Turing.

KULIAH № 2. Bahasa Pascal

1. Pengenalan kepada bahasa Pascal

Simbol asas bahasa - huruf, nombor dan aksara khas - membentuk abjadnya. Bahasa Pascal merangkumi set simbol asas berikut:

1) 26 huruf kecil Latin dan 26 huruf besar Latin:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz;

2) _ (garis bawah);

3) 10 digit: 0123456789;

4) tanda-tanda operasi:

+ - x / = <> < > <= >= := @;

5) penghad:

., ' ( ) [ ] (..) { } (* *).. : ;

6) penentu: ^ # $;

7) perkataan perkhidmatan (terpelihara):

MUTLAK, ASSEMBLER, DAN, ARRAY, ASM, BEGIN, CASE, CONST, CONSTRUCTOR, DESTRUCTOR, DIV, DO, DOWNTO, ELSE, END, EXPORT, LUAR, FAR, FAIL, UNTUK, HADAPAN, FUNGSI, GOTO, JIKA, PELAKSANAAN, DALAM, INDEKS, DIWARISKAN, DALAM TALIAN, ANTARA MUKA, GANGGUAN, LABEL, PERPUSTAKAAN, MOD, NAMA, TIADA, BERDEKATAN, BUKAN, OBJEK, DARI, ATAU, PACKED, SWASTA, PROSEDUR, PROGRAM, AWAM, REKOD, REPEAT, RESIDENT, SET, SHL, SHR, STRING, THEN, TO, TYPE, UNIT, HINGGA, USES, VAR, VIRTUAL, WHILE, WITH, XOR.

Sebagai tambahan kepada yang disenaraikan, set aksara asas termasuk ruang. Ruang tidak boleh digunakan dalam aksara berganda dan perkataan terpelihara.

Konsep taip untuk data

Dalam matematik, adalah kebiasaan untuk mengelaskan pembolehubah mengikut beberapa ciri penting. Perbezaan yang ketat dibuat antara pembolehubah sebenar, kompleks dan logik, antara pembolehubah yang mewakili nilai individu dan satu set nilai, dsb. Apabila memproses data pada komputer, pengelasan sedemikian adalah lebih penting. Dalam mana-mana bahasa algoritma, setiap pemalar, pembolehubah, ungkapan atau fungsi adalah daripada jenis tertentu.

Terdapat peraturan dalam Pascal: jenis dinyatakan secara eksplisit dalam pengisytiharan pembolehubah atau fungsi yang mendahului penggunaannya. Konsep jenis Pascal mempunyai sifat utama berikut:

1) sebarang jenis data mentakrifkan satu set nilai yang dimiliki oleh pemalar, yang boleh diambil oleh pembolehubah atau ungkapan, atau operasi atau fungsi yang boleh dihasilkan;

2) jenis nilai yang diberikan oleh pemalar, pembolehubah atau ungkapan boleh ditentukan oleh bentuk atau perihalannya;

3) setiap operasi atau fungsi memerlukan hujah jenis tetap dan menghasilkan hasil jenis tetap.

Ia berikutan bahawa pengkompil boleh menggunakan maklumat jenis untuk menyemak kebolehkiraan dan ketepatan pelbagai konstruk.

Jenis mentakrifkan:

1) kemungkinan nilai pembolehubah, pemalar, fungsi, ungkapan kepunyaan jenis tertentu;

2) bentuk dalaman persembahan data dalam komputer;

3) operasi dan fungsi yang boleh dilakukan pada nilai yang dimiliki oleh jenis tertentu.

Perlu diingatkan bahawa perihalan mandatori jenis membawa kepada redundansi dalam teks program, tetapi redundansi tersebut merupakan alat bantu yang penting untuk membangunkan program dan dianggap sebagai sifat yang diperlukan dalam bahasa algoritma peringkat tinggi moden.

Terdapat jenis data skalar dan berstruktur dalam Pascal. Jenis skalar termasuk jenis standard dan jenis yang ditentukan pengguna. Jenis standard termasuk integer, nyata, aksara, boolean dan jenis alamat.

Jenis integer mentakrifkan pemalar, pembolehubah, dan fungsi yang nilainya direalisasikan oleh set integer yang dibenarkan dalam komputer tertentu.

Jenis sebenar mentakrifkan data yang dilaksanakan oleh subset nombor nyata yang dibenarkan dalam komputer tertentu.

Jenis yang ditentukan pengguna ialah enum dan julat. Jenis berstruktur datang dalam empat perisa: tatasusunan, set, rekod dan fail.

Sebagai tambahan kepada yang disenaraikan, Pascal termasuk dua lagi jenis - prosedur dan objek.

Ungkapan bahasa terdiri daripada pemalar, pembolehubah, penunjuk fungsi, tanda pengendali dan kurungan. Ungkapan mentakrifkan peraturan untuk mengira beberapa nilai. Urutan pengiraan ditentukan oleh keutamaan (keutamaan) operasi yang terkandung di dalamnya. Pascal mempunyai keutamaan pengendali berikut:

1) pengiraan dalam kurungan;

2) pengiraan nilai fungsi;

3) operasi unary;

4) operasi *, /, div, mod, dan;

5) operasi +, -, atau, xor;

6) operasi hubungan =, <>, <, >, <=, >=.

Ungkapan adalah sebahagian daripada banyak pengendali bahasa Pascal dan juga boleh menjadi hujah kepada fungsi terbina dalam.

2. Prosedur dan fungsi standard

Fungsi aritmetik

1.Fungsi Abs(X);

Mengembalikan nilai mutlak parameter.

X ialah ungkapan jenis sebenar atau integer.

2. Fungsi ArcTan(X: Extended): Extended;

Mengembalikan tangen arka hujah.

X ialah ungkapan jenis sebenar atau integer.

3. Fungsi exp(X: Real): Real;

Mengembalikan eksponen.

X ialah ungkapan jenis sebenar atau integer.

4.Frac(X: Real): Nyata;

Mengembalikan bahagian pecahan hujah.

X ialah ungkapan jenis sebenar. Hasilnya ialah bahagian pecahan X, i.e.

Frac(X) = X-Int(X).

5. Fungsi Int(X: Real): Nyata;

Mengembalikan bahagian integer hujah.

X ialah ungkapan jenis sebenar. Hasilnya ialah bahagian integer X, iaitu X dibundarkan ke arah sifar.

6. Fungsi Ln(X: Nyata): Nyata;

Mengembalikan logaritma asli (Ln e = 1) bagi ungkapan jenis sebenar X.

7.Fungsi Pi: Dilanjutkan;

Mengembalikan nilai Pi, yang ditakrifkan sebagai 3.1415926535.

8.Fungsi Sin(X: Extended): Extended;

Mengembalikan sinus hujah.

X ialah ungkapan jenis sebenar. Sin mengembalikan sinus sudut X dalam radian.

9.Fungsi Sqr(X: Extended): Extended;

Mengembalikan kuasa dua hujah.

X ialah ungkapan titik terapung. Hasilnya adalah jenis yang sama seperti X.

10.Function Sqrt(X: Extended): Extended;

Mengembalikan punca kuasa dua hujah.

X ialah ungkapan titik terapung. Hasilnya ialah punca kuasa dua bagi X.

Prosedur dan Fungsi Penukaran Nilai

1. Prosedur Str(X [: Lebar [: Perpuluhan]]; var S);

Menukar nombor X kepada perwakilan rentetan mengikut

Pilihan pemformatan Lebar dan Perpuluhan. X ialah ungkapan jenis sebenar atau integer. Lebar dan Perpuluhan ialah ungkapan jenis integer. S ialah pembolehubah jenis String atau tatasusunan aksara yang ditamatkan nol jika sintaks lanjutan dibenarkan.

2. Fungsi Chr(X: Byte): Char;

Mengembalikan aksara dengan ordinal X dalam jadual ASCII.

3.Fungsi Tinggi(X);

Mengembalikan nilai terbesar dalam julat parameter.

4.FunctionLow(X);

Mengembalikan nilai terkecil dalam julat parameter.

5 FunctionOrd(X): Longint;

Mengembalikan nilai ordinal ungkapan jenis terhitung. X ialah ungkapan jenis terbilang.

6. Pusingan Fungsi(X: Dilanjutkan): Longint;

Membundarkan nilai sebenar kepada integer. X ialah ungkapan jenis sebenar. Pusingan mengembalikan nilai Longint, iaitu nilai X yang dibundarkan kepada nombor bulat terdekat. Jika X betul-betul separuh jalan antara dua integer, nombor dengan nilai mutlak terbesar dikembalikan. Jika nilai bulat X berada di luar julat Longint, ralat masa jalan dijana yang boleh anda kendalikan menggunakan pengecualian EInvalidOp.

7. Fungsi Trunc(X: Extended): Longint;

Memotong nilai jenis sebenar kepada integer. Jika nilai bulat X berada di luar julat Longint, ralat masa jalan dijana yang boleh anda kendalikan menggunakan pengecualian EInvalidOp.

8. Prosedur Val(S; var V; var Kod: Integer);

Menukar nombor daripada nilai rentetan S kepada nombor

perwakilan V. S - ungkapan jenis rentetan - urutan aksara yang membentuk integer atau nombor nyata. Jika ungkapan S tidak sah, indeks aksara tidak sah disimpan dalam pembolehubah Kod. Jika tidak Kod ditetapkan kepada sifar.

Prosedur dan Fungsi Nilai Ordinal

1. Prosedur Dis(varX [; N: LongInt]);

Menolak satu atau N daripada pembolehubah X. Dis(X) sepadan dengan X:= X - 1, dan Dis(X, N) sepadan dengan X:= X - N. X ialah pembolehubah jenis terhitung atau jenis PChar jika dilanjutkan sintaks dibenarkan, dan N ialah ungkapan jenis integer. Prosedur Dec menjana kod optimum dan amat berguna dalam gelung panjang.

2. Prosedur Inc(varX [; N: LongInt]);

Menambah satu atau N pada pembolehubah X. X ialah pembolehubah jenis terhitung atau jenis PChar jika sintaks lanjutan dibenarkan, dan N ialah ungkapan jenis kamiran. Inc (X) sepadan dengan arahan X:= X + 1, dan Inc (X, N) sepadan dengan arahan X:= X + N. Prosedur Inc menjana kod optimum dan amat berguna dalam gelung panjang.

3. FunctionOdd(X: LongInt): Boolean;

Mengembalikan Benar jika X ialah nombor ganjil, Salah sebaliknya.

4.FunctionPred(X);

Mengembalikan nilai parameter sebelumnya. X ialah ungkapan jenis terbilang. Hasilnya adalah jenis yang sama.

5 Fungsi Succ(X);

Mengembalikan nilai parameter seterusnya. X ialah ungkapan jenis terbilang. Hasilnya adalah jenis yang sama.

3. Pengendali bahasa Pascal

Operator bersyarat

Format pernyataan bersyarat lengkap ditakrifkan seperti berikut: Jika B maka SI lain S2; di mana B ialah keadaan bercabang (membuat keputusan), ungkapan logik atau hubungan; SI, S2 - satu pernyataan boleh laku, ringkas atau kompaun.

Apabila melaksanakan pernyataan bersyarat, pertama ungkapan B dinilai, kemudian hasilnya dianalisis: jika B adalah benar, maka pernyataan S1 dilaksanakan - cabang kemudian, dan pernyataan S2 dilangkau; jika B adalah palsu, maka pernyataan S2 - cabang lain dilaksanakan, dan pernyataan S1 dilangkau.

Terdapat juga bentuk singkatan pengendali bersyarat. Ia ditulis sebagai: Jika B maka S.

Pilih pernyataan

Struktur operator adalah seperti berikut:

kes S daripada

c1: arahan1;

c2: arahan2;

...

cn: arahanN;

arahan lain

akhir;

di mana S ialah ungkapan jenis ordinal yang nilainya sedang dikira;

с1, с2..., сп - pemalar jenis ordinal yang mana ungkapan dibandingkan

S; arahan1,..., arahanN - pengendali yang pemalarnya sepadan dengan nilai ungkapan S dilaksanakan;

arahan - pernyataan yang dilaksanakan jika nilai ungkapan Sylq tidak sepadan dengan pemalar c1, c2.... cn.

Operator ini adalah generalisasi operator If bersyarat untuk bilangan alternatif yang sewenang-wenangnya. Terdapat bentuk singkatan bagi pernyataan di mana tiada cawangan lain.

Penyataan gelung dengan parameter

Pernyataan gelung parameter yang bermula dengan perkataan untuk menyebabkan pernyataan, yang boleh menjadi pernyataan majmuk, dilaksanakan berulang kali manakala pembolehubah kawalan diberikan urutan nilai menaik.

Pandangan umum bagi pernyataan untuk:

untuk <loop counter> := <start value> to <end value> do <statement>;

Apabila pernyataan for mula dilaksanakan, nilai mula dan akhir ditentukan sekali, dan nilai ini dikekalkan sepanjang pelaksanaan pernyataan for. Pernyataan yang terkandung dalam badan pernyataan for dilaksanakan sekali untuk setiap nilai dalam julat antara nilai mula dan akhir. Pembilang gelung sentiasa dimulakan kepada nilai awal. Apabila pernyataan for berjalan, nilai pembilang gelung ditambah dengan setiap lelaran. Jika nilai mula lebih besar daripada nilai akhir, maka pernyataan yang terkandung dalam badan pernyataan for tidak akan dilaksanakan. Apabila kata kunci ke bawah digunakan dalam pernyataan gelung, nilai pembolehubah kawalan dikurangkan satu pada setiap lelaran. Jika nilai mula dalam pernyataan sedemikian adalah kurang daripada nilai akhir, maka pernyataan yang terkandung dalam badan pernyataan gelung tidak dilaksanakan.

Jika pernyataan yang terkandung dalam badan pernyataan for mengubah nilai pembilang gelung, maka ini adalah ralat. Selepas pelaksanaan pernyataan for, nilai pembolehubah kawalan menjadi tidak ditentukan, melainkan pelaksanaan pernyataan for telah diganggu oleh pernyataan lompat.

Penyataan gelung dengan prasyarat

Kenyataan gelung prasyarat (bermula dengan kata kunci while) mengandungi ungkapan yang mengawal pelaksanaan berulang pernyataan (yang boleh menjadi pernyataan majmuk). Bentuk kitaran:

Manakala B melakukan S;

di mana B ialah keadaan logik, kebenarannya diperiksa (ia adalah syarat untuk menamatkan gelung);

S - badan gelung - satu pernyataan.

Ungkapan yang mengawal pengulangan pernyataan mestilah jenis Boolean. Ia dinilai sebelum pernyataan dalaman dilaksanakan. Pernyataan dalaman dilaksanakan berulang kali selagi ungkapan bernilai Benar. Jika ungkapan menilai kepada False dari mula, maka pernyataan yang terkandung dalam pernyataan gelung prasyarat tidak dilaksanakan.

Penyataan gelung dengan postcondition

Dalam pernyataan gelung dengan postcondition (bermula dengan perkataan ulang), ungkapan yang mengawal pelaksanaan berulang jujukan pernyataan terkandung dalam pernyataan ulangan. Bentuk kitaran:

ulang S sehingga B;

di mana B ialah keadaan logik, kebenarannya diperiksa (ia adalah syarat untuk menamatkan gelung);

S - satu atau lebih pernyataan badan gelung.

Hasil ungkapan mestilah daripada jenis boolean. Pernyataan yang dilampirkan di antara ulangan dan sehingga kata kunci dilaksanakan secara berurutan sehingga hasil ungkapan dinilai kepada Benar. Urutan pernyataan akan dilaksanakan sekurang-kurangnya sekali kerana ungkapan dinilai selepas setiap pelaksanaan urutan pernyataan.

KULIAH № 3. Prosedur dan fungsi

1. Konsep algoritma bantu

Algoritma untuk menyelesaikan masalah direka bentuk dengan menguraikan keseluruhan masalah kepada subtugas yang berasingan. Biasanya, subtugas dilaksanakan sebagai subrutin.

Subrutin ialah beberapa algoritma tambahan yang berulang kali digunakan dalam algoritma utama dengan nilai yang berbeza bagi beberapa kuantiti masuk, dipanggil parameter.

Subrutin dalam bahasa pengaturcaraan ialah urutan pernyataan yang ditakrifkan dan ditulis hanya di satu tempat dalam program, tetapi ia boleh dipanggil untuk pelaksanaan dari satu atau lebih titik dalam program. Setiap subrutin dikenal pasti dengan nama yang unik.

Terdapat dua jenis subrutin dalam Pascal, prosedur dan fungsi. Prosedur dan fungsi ialah urutan pengisytiharan dan pernyataan yang dinamakan. Apabila menggunakan prosedur atau fungsi, program mesti mengandungi teks prosedur atau fungsi dan panggilan ke prosedur atau fungsi. Parameter yang dinyatakan dalam perihalan dipanggil formal, yang dinyatakan dalam panggilan ke subrutin dipanggil sebenar. Semua parameter formal boleh dibahagikan kepada kategori berikut:

1) parameter-pembolehubah;

2) parameter malar;

3) nilai parameter;

4) parameter prosedur dan parameter fungsi, iaitu parameter jenis prosedur;

5) parameter pembolehubah yang tidak ditaip.

Teks prosedur dan fungsi diletakkan di bahagian huraian prosedur dan fungsi.

Melepasi nama prosedur dan fungsi sebagai parameter

Dalam banyak masalah, terutamanya dalam matematik pengiraan, adalah perlu untuk lulus nama prosedur dan fungsi sebagai parameter. Untuk melakukan ini, TURBO PASCAL memperkenalkan jenis data baharu - prosedur atau berfungsi, bergantung pada perkara yang diterangkan. (Jenis prosedur dan fungsi diterangkan dalam bahagian pengisytiharan jenis.)

Fungsi dan jenis prosedur ditakrifkan sebagai tajuk prosedur dan fungsi dengan senarai parameter formal tetapi tiada nama. Adalah mungkin untuk menentukan fungsi atau jenis prosedur tanpa parameter, contohnya:

jenis

Proc = prosedur;

Selepas mengisytiharkan jenis prosedur atau fungsi, ia boleh digunakan untuk menerangkan parameter formal - nama prosedur dan fungsi. Di samping itu, adalah perlu untuk menulis prosedur atau fungsi sebenar yang namanya akan diluluskan sebagai parameter sebenar.

2. Prosedur dalam Pascal

Setiap penerangan prosedur mengandungi tajuk diikuti dengan blok program. Bentuk umum pengepala prosedur adalah seperti berikut:

Prosedur <nama> [(<senarai parameter formal>)];

Prosedur diaktifkan dengan pernyataan prosedur yang mengandungi nama prosedur dan parameter yang diperlukan. Pernyataan yang akan dilaksanakan apabila prosedur dijalankan terkandung dalam bahagian pernyataan modul prosedur. Jika pernyataan yang terkandung dalam prosedur menggunakan pengecam prosedur dalam modul prosedur, maka prosedur akan dilaksanakan secara rekursif, iaitu, ia akan merujuk kepada dirinya sendiri apabila dilaksanakan.

3. Fungsi dalam Pascal

Pengisytiharan fungsi mentakrifkan bahagian program di mana nilai dikira dan dikembalikan. Bentuk umum pengepala fungsi adalah seperti berikut:

Fungsi <nama> [(<senarai parameter formal>)]: <return type>;

Fungsi ini diaktifkan apabila ia dipanggil. Apabila fungsi dipanggil, pengecam fungsi dan sebarang parameter yang diperlukan untuk penilaiannya ditentukan. Panggilan fungsi boleh disertakan dalam ungkapan sebagai operan. Apabila ungkapan dinilai, fungsi dilaksanakan dan nilai operan menjadi nilai yang dikembalikan oleh fungsi.

Bahagian pengendali blok fungsi menentukan pernyataan yang mesti dilaksanakan apabila fungsi itu diaktifkan. Modul mesti mengandungi sekurang-kurangnya satu pernyataan tugasan yang memberikan nilai kepada pengecam fungsi. Hasil daripada fungsi ialah nilai terakhir yang diberikan. Jika tiada penyataan tugasan sedemikian, atau jika ia belum dilaksanakan, maka nilai pulangan fungsi itu tidak ditentukan.

Jika pengecam fungsi digunakan semasa memanggil fungsi dalam modul, maka fungsi itu dilaksanakan secara rekursif.

4. Penerangan ke hadapan dan sambungan subrutin. Arahan

Sesuatu program mungkin mengandungi beberapa subrutin, iaitu struktur program mungkin rumit. Walau bagaimanapun, subrutin ini boleh berada pada tahap bersarang yang sama, jadi pengisytiharan subrutin mesti didahulukan, dan kemudian panggilan kepadanya, melainkan pengisytiharan hadapan khas digunakan.

Pengisytiharan prosedur yang mengandungi arahan ke hadapan dan bukannya blok pernyataan dipanggil pengisytiharan ke hadapan. Di suatu tempat selepas pengisytiharan ini, prosedur mesti ditakrifkan oleh pengisytiharan yang menentukan. Pengisytiharan yang menentukan ialah pengisytiharan yang menggunakan pengecam prosedur yang sama tetapi mengetepikan senarai parameter formal dan termasuk blok pernyataan. Pengisytiharan hadapan dan pengisytiharan yang menentukan mesti muncul dalam bahagian yang sama dalam pengisytiharan prosedur dan fungsi. Di antara mereka, prosedur dan fungsi lain boleh diisytiharkan yang boleh merujuk kepada prosedur pengisytiharan ke hadapan. Oleh itu, rekursi bersama adalah mungkin.

Penerangan ke hadapan dan huraian yang menentukan ialah huraian lengkap prosedur. Prosedur ini dianggap diterangkan menggunakan huraian hadapan.

Jika program mengandungi banyak subrutin, maka program itu akan berhenti menjadi visual, sukar untuk menavigasi di dalamnya. Untuk mengelakkan ini, beberapa rutin disimpan sebagai fail sumber pada cakera, dan jika perlu, ia disambungkan ke program utama pada peringkat penyusunan menggunakan arahan kompilasi.

Arahan ialah ulasan khas yang boleh diletakkan di mana-mana dalam program, di mana komen biasa boleh diletakkan. Walau bagaimanapun, mereka berbeza kerana arahan itu mempunyai notasi khas: sejurus selepas kurungan penutup tanpa ruang, tanda S ditulis, dan kemudian, sekali lagi tanpa ruang, arahan itu ditunjukkan.

Contoh

1) {SE+} - meniru coprocessor matematik;

2) {SF+} - membentuk jenis panggilan prosedur dan fungsi yang jauh;

3) {SN+} - gunakan coprocessor matematik;

4) {SR+} - semak sama ada julat di luar sempadan.

Sesetengah suis kompilasi mungkin mengandungi parameter, contohnya:

{$1 nama fail} - masukkan fail bernama dalam teks program yang disusun.

KULIAH Bil 4. Subrutin

1. Parameter subprogram

Perihalan prosedur atau fungsi menentukan senarai parameter formal. Setiap parameter yang diisytiharkan dalam senarai parameter rasmi adalah setempat kepada prosedur atau fungsi yang diterangkan, dan boleh dirujuk oleh pengecamnya dalam modul yang dikaitkan dengan prosedur atau fungsi tersebut.

Terdapat tiga jenis parameter: nilai, pembolehubah dan pembolehubah tidak ditaip. Mereka dicirikan seperti berikut.

1. Sekumpulan parameter tanpa kata kunci sebelumnya ialah senarai parameter nilai.

2. Sekumpulan parameter yang didahului oleh kata kunci const dan diikuti dengan jenis ialah senarai parameter malar.

3. Sekumpulan parameter yang didahului oleh kata kunci var dan diikuti dengan jenis ialah senarai parameter pembolehubah yang tidak ditaip.

4. Sekumpulan parameter yang didahului oleh kata kunci var atau const dan tidak diikuti dengan jenis ialah senarai parameter pembolehubah yang tidak ditaip.

2. Jenis parameter subrutin

Parameter nilai

Parameter nilai formal dianggap sebagai pembolehubah setempat kepada prosedur atau fungsi, kecuali ia memperoleh nilai awalnya daripada parameter sebenar yang sepadan apabila prosedur atau fungsi itu digunakan. Perubahan yang dilalui oleh parameter nilai formal tidak menjejaskan nilai parameter sebenar. Nilai sebenar parameter nilai yang sepadan mestilah ungkapan dan nilainya bukan jenis fail atau sebarang jenis struktur yang mengandungi jenis fail.

Parameter sebenar mestilah daripada jenis yang serasi penetapan dengan jenis parameter nilai formal. Jika parameter adalah rentetan jenis, maka parameter formal akan mempunyai atribut saiz 255.

Parameter Malar

Parameter pemalar formal berfungsi dengan cara yang sama seperti pembolehubah tempatan baca sahaja yang mendapat nilainya apabila prosedur atau fungsi digunakan daripada parameter sebenar yang sepadan. Tugasan kepada parameter pemalar formal tidak dibenarkan. Parameter pemalar formal juga tidak boleh dihantar sebagai parameter sebenar kepada prosedur atau fungsi lain. Parameter malar sepadan dengan parameter sebenar dalam prosedur atau pernyataan fungsi mesti mengikut peraturan yang sama seperti nilai parameter sebenar.

Dalam kes di mana parameter formal tidak mengubah nilainya apabila prosedur atau fungsi dilaksanakan, parameter tetap harus digunakan dan bukannya parameter nilai. Parameter malar membenarkan pelaksanaan prosedur atau fungsi untuk melindungi daripada penetapan tidak sengaja kepada parameter formal. Selain itu, untuk parameter jenis struct dan rentetan, pengkompil boleh menjana kod yang lebih cekap apabila digunakan dan bukannya parameter nilai untuk parameter malar.

Parameter boleh ubah

Parameter pembolehubah digunakan apabila nilai mesti dihantar daripada prosedur atau fungsi kepada program panggilan. Parameter sebenar yang sepadan dalam pernyataan panggilan prosedur atau fungsi mestilah rujukan pembolehubah. Apabila prosedur atau fungsi digunakan, pembolehubah parameter formal digantikan dengan pembolehubah sebenar, sebarang perubahan dalam nilai pembolehubah parameter formal ditunjukkan dalam parameter sebenar.

Dalam prosedur atau fungsi, sebarang rujukan kepada parameter pembolehubah formal menghasilkan akses kepada parameter sebenar itu sendiri. Jenis parameter sebenar mesti sepadan dengan jenis parameter pembolehubah formal, tetapi sekatan ini boleh dielakkan dengan menggunakan parameter pembolehubah yang tidak ditaip).

Parameter Tidak Ditaip

Apabila parameter formal ialah parameter pembolehubah yang tidak ditaip, maka parameter sebenar yang sepadan boleh menjadi sebarang rujukan kepada pembolehubah atau pemalar, tanpa mengira jenisnya. Parameter yang tidak ditaip yang diisytiharkan dengan kata kunci var boleh diubah suai, manakala parameter yang tidak ditaip yang diisytiharkan dengan kata kunci const adalah baca sahaja.

Dalam prosedur atau fungsi, parameter pembolehubah yang tidak ditaip tidak mempunyai jenis, iaitu, ia tidak serasi dengan pembolehubah semua jenis sehingga ia diberikan jenis tertentu oleh penetapan jenis pembolehubah.

Walaupun parameter yang tidak ditaip memberikan lebih fleksibiliti, terdapat beberapa risiko yang berkaitan dengan penggunaannya. Pengkompil tidak boleh menyemak kesahihan operasi pada pembolehubah yang tidak ditaip.

pembolehubah prosedur

Selepas mentakrifkan jenis prosedur, ia menjadi mungkin untuk menerangkan pembolehubah jenis ini. Pembolehubah sedemikian dipanggil pembolehubah prosedur. Seperti pembolehubah integer yang boleh diberikan nilai jenis integer, pembolehubah prosedur boleh diberikan nilai jenis prosedur. Nilai sedemikian, sudah tentu, boleh menjadi pembolehubah prosedur lain, tetapi ia juga boleh menjadi pengecam prosedur atau fungsi. Dalam konteks ini, pengisytiharan prosedur atau fungsi boleh dilihat sebagai perihalan jenis pemalar khas yang nilainya ialah prosedur atau fungsi.

Seperti mana-mana tugasan lain, nilai pembolehubah di sebelah kiri dan di sebelah kanan mestilah serasi tugasan. Jenis prosedur, untuk serasi tugasan, mesti mempunyai bilangan parameter yang sama dan parameter dalam kedudukan yang sepadan mestilah daripada jenis yang sama. Nama parameter dalam pengisytiharan jenis prosedur tidak mempunyai kesan.

Di samping itu, untuk memastikan keserasian tugasan, prosedur atau fungsi, jika ia hendak ditugaskan kepada pembolehubah prosedur, mesti memenuhi keperluan berikut:

1) ia tidak sepatutnya menjadi prosedur atau fungsi standard;

2) prosedur atau fungsi sedemikian tidak boleh bersarang;

3) prosedur sedemikian mestilah bukan prosedur sebaris;

4) ia mestilah bukan prosedur gangguan.

Prosedur dan fungsi standard ialah prosedur dan fungsi yang diterangkan dalam modul Sistem, seperti Writeln, Readln, Chr, Ord. Prosedur dan fungsi bersarang dengan pembolehubah prosedur tidak boleh digunakan. Prosedur atau fungsi dianggap bersarang apabila ia diisytiharkan dalam prosedur atau fungsi lain.

Penggunaan jenis prosedur tidak terhad kepada pembolehubah prosedur sahaja. Seperti mana-mana jenis lain, jenis prosedur boleh mengambil bahagian dalam pengisytiharan jenis struktur.

Apabila pembolehubah prosedur diberikan nilai prosedur, apa yang berlaku pada lapisan fizikal ialah alamat prosedur disimpan dalam pembolehubah. Sebenarnya, pembolehubah prosedur adalah sangat serupa dengan pembolehubah penunjuk, hanya bukannya merujuk kepada data, ia menunjuk kepada prosedur atau fungsi. Seperti penunjuk, pembolehubah prosedur menduduki 4 bait (dua perkataan) yang mengandungi alamat memori. Perkataan pertama menyimpan offset, perkataan kedua menyimpan segmen.

Parameter Jenis Prosedur

Memandangkan jenis prosedur boleh digunakan dalam sebarang konteks, adalah mungkin untuk menerangkan prosedur atau fungsi yang mengambil prosedur dan fungsi sebagai parameter. Parameter jenis prosedur amat berguna apabila anda perlu melakukan tindakan biasa pada berbilang prosedur atau fungsi.

Jika prosedur atau fungsi hendak diluluskan sebagai parameter, ia mesti mengikut peraturan keserasian jenis yang sama seperti tugasan. Iaitu, prosedur atau fungsi sedemikian mesti disusun dengan arahan jauh, mereka tidak boleh menjadi fungsi terbina dalam, mereka tidak boleh bersarang, dan mereka tidak boleh diterangkan dengan atribut sebaris atau interrupt.

KULIAH # 5. Jenis data rentetan

1. Jenis rentetan dalam Pascal

Urutan aksara dengan panjang tertentu dipanggil rentetan. Pembolehubah jenis rentetan ditakrifkan dengan menyatakan nama pembolehubah, rentetan perkataan terpelihara, dan secara pilihan, tetapi tidak semestinya, menyatakan saiz maksimum, iaitu panjang rentetan, dalam kurungan segi empat sama. Jika anda tidak menetapkan saiz rentetan maksimum, maka secara lalai ia akan menjadi 255, iaitu rentetan akan terdiri daripada 255 aksara.

Setiap elemen rentetan boleh dirujuk dengan nombornya. Walau bagaimanapun, rentetan adalah input dan output secara keseluruhan, bukan elemen demi elemen, seperti yang berlaku dengan tatasusunan. Bilangan aksara yang dimasukkan mestilah tidak melebihi yang dinyatakan dalam saiz rentetan maksimum, jadi jika lebihan sedemikian berlaku, maka aksara "tambahan" akan diabaikan.

2. Prosedur dan fungsi untuk pembolehubah jenis rentetan

1. Salinan Fungsi(S: Rentetan; Indeks, Kiraan: Integer): Rentetan;

Mengembalikan subrentetan rentetan. S ialah ungkapan jenis String.

Indeks dan Kira ialah ungkapan jenis integer. Fungsi ini mengembalikan rentetan yang mengandungi aksara Kira bermula pada kedudukan Indeks. Jika Indeks lebih besar daripada panjang S, fungsi mengembalikan rentetan kosong.

2. Prosedur Padam(var S: Rentetan; Indeks, Kiraan: Integer);

Mengalih keluar subrentetan aksara panjang Kiraan daripada rentetan S, bermula pada Indeks kedudukan. S ialah pembolehubah jenis String. Indeks dan Kira ialah ungkapan jenis integer. Jika Indeks lebih besar daripada panjang S, tiada aksara dialih keluar.

3. Sisipan Prosedur(Sumber: Rentetan; var S: Rentetan; Indeks: Integer);

Menggabungkan subrentetan menjadi rentetan, bermula pada kedudukan yang ditentukan. Sumber ialah ungkapan jenis String. S ialah pembolehubah jenis String dengan sebarang panjang. Indeks ialah ungkapan jenis integer. Masukkan sumber sisipan ke dalam S, bermula pada kedudukan S[Indeks].

4. Panjang Fungsi(S: Rentetan): Integer;

Mengembalikan bilangan aksara yang sebenarnya digunakan dalam rentetan S. Ambil perhatian bahawa apabila menggunakan rentetan yang ditamatkan nol, bilangan aksara tidak semestinya sama dengan bilangan bait.

5. Fungsi Pos(Substr: Rentetan; S: Rentetan): Integer;

Mencari subrentetan dalam rentetan. Pos mencari Substr dalam S dan mengembalikan nilai integer yang merupakan indeks bagi aksara pertama Substr dalam S. Jika Substr tidak ditemui, Pos mengembalikan null.

3. Rakaman

Rekod ialah koleksi bilangan terhad komponen yang berkaitan secara logik yang dimiliki oleh jenis yang berbeza. Komponen rekod dipanggil medan, setiap satu daripadanya dikenal pasti dengan nama. Medan rekod mengandungi nama medan, diikuti dengan titik bertindih untuk menunjukkan jenis medan. Medan rekod boleh terdiri daripada sebarang jenis yang dibenarkan dalam Pascal, kecuali jenis fail.

Penerangan rekod dalam bahasa Pascal dijalankan menggunakan perkataan perkhidmatan RECORD, diikuti dengan penerangan komponen rekod. Penerangan entri berakhir dengan perkataan perkhidmatan TAMAT.

Sebagai contoh, buku nota mengandungi nama keluarga, inisial dan nombor telefon, jadi adalah mudah untuk mewakili baris berasingan dalam buku nota sebagai entri berikut:

taip Baris = Rekod

FIO: Rentetan[20];

TEL: Rentetan[7];

akhir;

var str: Baris;

Perihalan rekod juga boleh dilakukan tanpa menggunakan nama jenis, contohnya:

var str : Rekod

FIO : Rentetan[20];

TEL : Rentetan[7];

akhir;

Merujuk rekod secara keseluruhan dibenarkan hanya dalam penyata tugasan di mana nama rekod jenis yang sama digunakan di kiri dan kanan tanda tugasan. Dalam semua kes lain, medan rekod berasingan dikendalikan. Untuk merujuk kepada komponen rekod individu, anda mesti menentukan nama rekod dan, melalui titik, nyatakan nama medan yang dikehendaki. Nama sedemikian dipanggil nama majmuk. Komponen rekod juga boleh menjadi rekod, dalam hal ini nama yang dibezakan tidak akan mengandungi dua, tetapi lebih banyak nama.

Komponen rekod rujukan boleh dipermudahkan dengan menggunakan operator dengan append. Ia membolehkan anda menggantikan nama kompaun yang mencirikan setiap medan dengan hanya nama medan, dan mentakrifkan nama rekod dalam penyataan gabungan.

Kadangkala kandungan rekod individu bergantung pada nilai salah satu medannya. Dalam bahasa Pascal, perihalan rekod dibenarkan, yang terdiri daripada bahagian biasa dan varian. Bahagian varian ditentukan menggunakan kes P konstruk, di mana P ialah nama medan daripada bahagian biasa rekod. Nilai yang mungkin diterima oleh medan ini disenaraikan dengan cara yang sama seperti dalam pernyataan varian. Walau bagaimanapun, daripada menyatakan tindakan yang perlu dilakukan, seperti yang dilakukan dalam pernyataan varian, medan varian dinyatakan dalam kurungan. Penerangan bahagian varian berakhir dengan kata perkhidmatan tamat. Jenis medan P boleh dinyatakan dalam tajuk bahagian varian. Rekod dimulakan menggunakan pemalar ditaip.

4. Set

Konsep set dalam bahasa Pascal adalah berdasarkan konsep matematik set: ia adalah koleksi terhad elemen yang berbeza. Jenis data terbilang atau selang digunakan untuk membina jenis set konkrit. Jenis elemen yang membentuk set dipanggil jenis asas.

Pelbagai jenis diterangkan menggunakan Set perkataan fungsi, contohnya:

jenis M = Set B;

Di sini M ialah jenis jamak, B ialah jenis asas.

Kepunyaan pembolehubah kepada jenis majmuk boleh ditentukan secara langsung dalam bahagian perisytiharan pembolehubah.

Pemalar jenis set ditulis sebagai jujukan elemen atau julat kurungan jenis asas, dipisahkan dengan koma. Pemalar dalam bentuk [] bermaksud subset kosong.

Satu set termasuk satu set elemen jenis asas, semua subset set yang diberikan dan subset kosong. Jika jenis asas di mana set dibina mempunyai unsur K, maka bilangan subset yang termasuk dalam set ini adalah sama dengan 2 kuasa K. Susunan unsur-unsur jenis asas disenaraikan dalam pemalar adalah acuh tak acuh. . Nilai pembolehubah jenis berbilang boleh diberikan melalui pembinaan bentuk [T], di mana T ialah pembolehubah jenis asas.

Operasi tugasan (:=), kesatuan (+), persilangan (*), dan tolak (-) boleh digunakan untuk pembolehubah dan pemalar jenis set. Hasil daripada operasi ini ialah nilai jenis jamak:

1) ['A','B'] + ['A','D'] akan memberikan ['A','B','D'];

2) ['A'] * ['A','B','C'] akan memberikan ['A'];

3) ['A','B','C'] - ['A','B'] akan memberikan ['C'].

Operasi boleh digunakan untuk berbilang nilai: identiti (=), bukan identiti (<>), terkandung dalam (<=), mengandungi (>=). Hasil daripada operasi ini mempunyai jenis boolean:

1) ['A','B'] = ['A','C'] akan memberikan FALSE ;

2) ['A','B'] <> ['A','C'] akan memberikan BENAR;

3) ['B'] <= ['B','C'] akan memberikan BENAR;

4) ['C','D'] >= ['A'] akan memberikan FALSE.

Sebagai tambahan kepada operasi ini, untuk bekerja dengan nilai jenis set, operasi dalam digunakan, yang menyemak sama ada elemen jenis asas di sebelah kiri tanda operasi tergolong dalam set di sebelah kanan tanda operasi . Hasil daripada operasi ini ialah boolean. Operasi menyemak sama ada elemen tergolong dalam set sering digunakan dan bukannya operasi hubungan.

Apabila berbilang jenis data digunakan dalam atur cara, operasi dilakukan pada rentetan bit data. Setiap nilai pelbagai jenis dalam memori komputer sepadan dengan satu digit binari.

Nilai pelbagai jenis tidak boleh menjadi elemen senarai I/O. Dalam setiap pelaksanaan konkrit pengkompil dari bahasa Pascal, bilangan elemen jenis asas di mana set dibina adalah terhad.

Inisialisasi nilai berbilang jenis dilakukan menggunakan pemalar bertaip.

Berikut ialah beberapa prosedur untuk bekerja dengan set.

1. Prosedur Kecualikan(var S: Set T; I:T);

Mengalih keluar elemen I daripada set S. S ialah pembolehubah jenis "set" dan I ialah ungkapan jenis yang serasi dengan jenis asal S. Kecualikan(S, I) adalah sama dengan S : = S - [I], tetapi menjana kod yang lebih cekap.

2. Prosedur Sertakan(var S: Set T; I:T);

Menambah elemen I pada set S. S ialah pembolehubah jenis "set" dan I ialah ungkapan jenis yang serasi dengan jenis S. Konstruk Include(S, I) adalah sama dengan S : = S + [ I], tetapi menjana kod yang lebih cekap.

KULIAH Bil 6. Fail

1. Fail. Operasi fail

Pengenalan jenis fail ke dalam bahasa Pascal disebabkan oleh keperluan untuk menyediakan keupayaan untuk bekerja dengan peranti komputer persisian (luaran) yang direka untuk input, output dan penyimpanan data.

Jenis data fail (atau fail) mentakrifkan koleksi tertib bilangan arbitrari komponen daripada jenis yang sama. Sifat sepunya tatasusunan, set dan rekod ialah bilangan komponennya ditentukan pada peringkat penulisan atur cara, manakala bilangan komponen fail dalam teks atur cara tidak ditentukan dan boleh sewenang-wenangnya.

Apabila bekerja dengan fail, operasi I / O dilakukan. Operasi input bermaksud memindahkan data dari peranti luaran (dari fail input) ke memori utama komputer, operasi output ialah pemindahan data dari memori utama ke peranti luaran (ke fail output). Fail pada peranti luaran sering dirujuk sebagai fail fizikal. Nama mereka ditentukan oleh sistem pengendalian.

Dalam program Pascal, nama fail ditentukan menggunakan rentetan. Untuk bekerja dengan fail dalam program, anda mesti menentukan pembolehubah fail. Pascal menyokong tiga jenis fail: fail teks, fail komponen, fail yang tidak ditaip.

Pembolehubah fail yang diisytiharkan dalam program dipanggil fail logik. Semua prosedur dan fungsi asas yang menyediakan data I/O hanya berfungsi dengan fail logik. Fail fizikal mesti dikaitkan dengan fail logik sebelum prosedur pembukaan fail boleh dilakukan.

Fail teks

Tempat istimewa dalam bahasa Pascal diduduki oleh fail teks, komponennya adalah jenis aksara. Untuk menerangkan fail teks, bahasa mentakrifkan jenis standard Teks:

var TF1, TF2: Teks;

Fail teks ialah jujukan baris, dan baris ialah jujukan aksara. Garisan mempunyai panjang berubah-ubah, setiap baris berakhir dengan penamat garis.

Fail Komponen

Komponen atau fail ditaip ialah fail dengan jenis komponennya yang diisytiharkan. Fail komponen terdiri daripada perwakilan mesin bagi nilai pembolehubah; ia menyimpan data dalam bentuk yang sama seperti memori komputer.

Penerangan tentang nilai jenis fail ialah:

jenis M = Fail Daripada T;

di mana M ialah nama jenis fail;

T - jenis komponen.

Komponen fail boleh terdiri daripada semua jenis skalar, dan daripada jenis berstruktur - tatasusunan, set, rekod. Dalam hampir semua pelaksanaan khusus bahasa Pascal, binaan "fail fail" tidak dibenarkan.

Semua operasi pada fail komponen dilakukan menggunakan prosedur standard.

Tulis(f,X1,X2,...XK)

Fail tidak ditaip

Fail yang tidak ditaip membolehkan anda menulis bahagian sewenang-wenangnya memori komputer ke cakera dan membacanya dari cakera ke memori. Fail yang tidak ditaip diterangkan seperti berikut:

var f: Fail;

Sekarang kami menyenaraikan prosedur dan fungsi untuk bekerja dengan pelbagai jenis fail.

1. Procedure Assign(var F; FileName: String);

Prosedur AssignFile memetakan nama fail luaran kepada pembolehubah fail.

F ialah pembolehubah fail bagi sebarang jenis fail, FileName ialah ungkapan String, atau ungkapan PChar jika sintaks lanjutan dibenarkan. Semua operasi selanjutnya dengan F dilakukan dengan fail luaran.

Anda tidak boleh menggunakan prosedur dengan pembolehubah fail yang sudah terbuka.

2. Tutup Prosedur(varF);

Prosedur ini memutuskan pautan antara pembolehubah fail dan fail cakera luaran dan menutup fail.

F ialah pembolehubah fail dari mana-mana jenis fail, dibuka oleh prosedur Tetapkan Semula, Tulis Semula atau Tambah. Fail luaran yang dikaitkan dengan F diubah suai sepenuhnya dan kemudian ditutup, membebaskan deskriptor fail untuk digunakan semula.

Arahan {SI+} membolehkan anda mengendalikan ralat semasa pelaksanaan program menggunakan pengendalian pengecualian. Dengan arahan {$1-} dimatikan, anda mesti menggunakan IOResult untuk menyemak ralat I/O.

3.Fungsi Eof(var F): Boolean;

{Fail ditaip atau tidak ditaip}

Fungsi Eof[(var F: Text)]: Boolean;

{fail teks}

Semak sama ada kedudukan fail semasa ialah penghujung fail atau tidak.

Eof(F) mengembalikan True jika kedudukan fail semasa adalah selepas aksara terakhir fail, atau jika fail kosong; jika tidak Eof(F) mengembalikan Palsu.

Arahan {SI+} membolehkan anda mengendalikan ralat semasa pelaksanaan program menggunakan pengendalian pengecualian. Dengan arahan {SI-} dimatikan, anda mesti menggunakan IOResult untuk menyemak ralat I/O.

4. Padam Prosedur(var F);

Memadamkan fail luaran yang dikaitkan dengan F.

F ialah pembolehubah fail dari mana-mana jenis fail.

Sebelum memanggil prosedur Padam, fail mesti ditutup.

Arahan {SI+} membolehkan anda mengendalikan ralat semasa pelaksanaan program menggunakan pengendalian pengecualian. Dengan arahan {SI-} dimatikan, anda mesti menggunakan IOResult untuk menyemak ralat I/O.

5. Saiz Fail Fungsi(var F): Integer;

Mengembalikan saiz dalam bait fail F Walau bagaimanapun, jika F ialah fail yang ditaip, FileSize akan mengembalikan bilangan rekod dalam fail. Fail mesti dibuka sebelum menggunakan fungsi FileSize. Jika fail kosong, FileSize(F) mengembalikan sifar. F ialah pembolehubah mana-mana jenis fail.

6.Fungsi FilePos(varF): LongInt;

Mengembalikan kedudukan semasa fail dalam fail.

Sebelum menggunakan fungsi FilePos, fail mesti dibuka. Fungsi FilePos tidak digunakan dengan fail teks. F ialah pembolehubah mana-mana jenis fail, kecuali untuk jenis Teks.

7. Tetapan Semula Prosedur(var F [: Fail; Saiz Semula: Word]);

Membuka fail sedia ada.

F ialah pembolehubah mana-mana jenis fail yang dikaitkan dengan fail luaran menggunakan AssignFile. RecSize ialah ungkapan pilihan yang digunakan jika F ialah fail yang tidak ditaip. Jika F ialah fail yang tidak ditaip, RecSize menentukan saiz rekod yang digunakan semasa memindahkan data. Jika RecSize diabaikan, saiz rekod lalai ialah 128 bait.

Prosedur Tetapkan Semula membuka fail luaran sedia ada yang dikaitkan dengan pembolehubah fail F. Jika tiada fail luaran dengan nama itu, ralat masa jalan berlaku. Jika fail yang dikaitkan dengan F sudah dibuka, ia ditutup terlebih dahulu dan kemudian dibuka semula. Kedudukan fail semasa ditetapkan pada permulaan fail.

8. Procedure Rewrite(var F: File [; Recsize: Word]);

Mencipta dan membuka fail baharu.

F ialah pembolehubah mana-mana jenis fail yang dikaitkan dengan fail luaran menggunakan AssignFile. RecSize ialah ungkapan pilihan yang digunakan jika F ialah fail yang tidak ditaip. Jika F ialah fail yang tidak ditaip, RecSize menentukan saiz rekod yang digunakan semasa memindahkan data. Jika RecSize diabaikan, saiz rekod lalai ialah 128 bait.

Prosedur Tulis Semula mencipta fail luaran baharu dengan nama yang dikaitkan dengan F. Jika fail luaran dengan nama yang sama sudah wujud, ia akan dipadamkan dan fail kosong baharu dicipta.

9. Cari Prosedur(var F; N: LongInt);

Mengalihkan kedudukan fail semasa ke komponen yang ditentukan. Anda hanya boleh menggunakan prosedur dengan fail ditaip atau tidak ditaip terbuka.

Kedudukan semasa fail F dipindahkan ke nombor N. Nombor komponen pertama fail ialah 0.

Arahan Seek(F, FileSize(F)) mengalihkan kedudukan fail semasa ke penghujung fail.

10. Lampiran Prosedur(var F: Teks);

Membuka fail teks sedia ada untuk menambah maklumat pada penghujung fail (tambah).

Jika fail luaran dengan nama yang diberikan tidak wujud, ralat masa jalan berlaku. Jika fail F sudah dibuka, ia akan ditutup dan dibuka semula. Kedudukan fail semasa ditetapkan pada penghujung fail.

11.Fungsi Eoln[(var F: Teks)]: Boolean;

Menyemak sama ada kedudukan fail semasa ialah penghujung baris dalam fail teks.

Eoln(F) mengembalikan True jika kedudukan fail semasa berada di hujung baris atau fail; jika tidak Eoln(F) mengembalikan Palsu.

12. Bacaan Prosedur(F, V1 [, V2,..., Vn]);

{Fail yang ditaip dan tidak ditaip}

Bacaan Prosedur([var F: Teks;] V1 [, V2,..., Vn]);

{fail teks}

Untuk fail yang ditaip, prosedur membaca komponen fail ke dalam pembolehubah. Pada setiap bacaan, kedudukan semasa dalam fail maju ke elemen seterusnya.

Untuk fail teks, satu atau lebih nilai dibaca ke dalam satu atau lebih pembolehubah.

Dengan pembolehubah jenis String Read membaca semua aksara sehingga (tetapi tidak termasuk) penanda akhir baris seterusnya, atau sehingga Eof(F) menilai kepada Benar. Rentetan aksara yang terhasil diberikan kepada pembolehubah.

Dalam kes pembolehubah jenis integer atau sebenar, prosedur menunggu urutan aksara yang membentuk nombor mengikut peraturan sintaks Pascal. Pembacaan berhenti apabila ruang pertama, tab atau hujung baris ditemui, atau jika Eof(F) menilai kepada Benar. Jika rentetan angka tidak sepadan dengan format yang dijangkakan, maka ralat I/O berlaku.

13. Prosedur Bacaln([var F: Teks;] V1 [, V2..., Vn]);

Ia adalah lanjutan daripada prosedur Baca dan ditakrifkan untuk fail teks. Membaca rentetan aksara dalam fail, termasuk penanda akhir baris dan bergerak ke permulaan baris seterusnya. Memanggil fungsi Readln(F) tanpa parameter memindahkan kedudukan fail semasa ke permulaan baris seterusnya, jika ada, jika tidak, ia melompat ke penghujung fail.

14. Fungsi SeekEof[(var F: Text)]: Boolean;

Mengembalikan akhir fail dan hanya boleh digunakan untuk fail teks terbuka. Biasanya digunakan untuk membaca nilai berangka daripada fail teks.

15. Fungsi SeekEoln[(var F: Text)]: Boolean;

Mengembalikan penamat baris dalam fail dan hanya boleh digunakan untuk fail teks terbuka. Biasanya digunakan untuk membaca nilai berangka daripada fail teks.

16. Tulis Prosedur([var F: Teks;] P1 [, P2,..., Pn]);

{fail teks}

Menulis satu atau lebih nilai pada fail teks.

Setiap parameter masukan mestilah jenis Char, salah satu jenis integer (Byte, ShortInt, Word, Longint, Cardinal), salah satu jenis titik terapung (Single, Real, Double, Extended, Currency), salah satu jenis rentetan ( PChar, AisiString , ShortString), atau salah satu jenis boolean (Boolean, Bool).

Tulis Prosedur(F, V1,..., Vn);

{Fail ditaip}

Menulis pembolehubah kepada komponen fail. Pembolehubah VI...., Vn mestilah daripada jenis yang sama dengan elemen fail. Setiap kali pembolehubah ditulis, kedudukan semasa dalam fail dipindahkan ke elemen seterusnya.

17. Prosedur Writeln([var F: Teks;] [P1, P2,..., Pn]);

{fail teks}

Lakukan operasi Tulis, kemudian letakkan penanda akhir baris dalam fail.

Memanggil Writeln(F) tanpa parameter menulis penanda akhir baris pada fail. Fail mesti dibuka untuk output.

2. Modul. Jenis-jenis modul

Modul (1Ж1Т) dalam Pascal ialah perpustakaan subrutin yang direka khas. Modul, tidak seperti program, tidak boleh dilancarkan sendiri, ia hanya boleh mengambil bahagian dalam membina program dan modul lain. Modul membolehkan anda membuat perpustakaan peribadi prosedur dan fungsi dan membina program hampir semua saiz.

Modul dalam Pascal ialah unit program yang disimpan dan disusun secara berasingan. Secara umum, modul ialah koleksi sumber perisian yang bertujuan untuk digunakan oleh program lain. Sumber program difahami sebagai mana-mana elemen bahasa Pascal: pemalar, jenis, pembolehubah, subrutin. Modul itu sendiri bukan program boleh laku, elemennya digunakan oleh unit program lain.

Semua elemen program modul boleh dibahagikan kepada dua bahagian:

1) elemen program yang dimaksudkan untuk digunakan oleh program atau modul lain, elemen tersebut dipanggil kelihatan di luar modul;

2) elemen perisian yang hanya diperlukan untuk operasi modul itu sendiri, ia dipanggil tidak kelihatan (atau tersembunyi).

Selaras dengan ini, modul, sebagai tambahan kepada pengepala, mengandungi tiga bahagian utama, dipanggil antara muka, boleh laku dan dimulakan.

Secara umum, modul mempunyai struktur berikut:

unit <nama modul>; {tajuk modul}

antara muka

{penerangan elemen program yang boleh dilihat bagi modul}

pelaksanaan

{penerangan unsur pengaturcaraan tersembunyi modul}

memulakan

{pernyataan permulaan elemen modul}

akhir.

Dalam kes tertentu, modul mungkin tidak mengandungi bahagian pelaksanaan dan bahagian permulaan, maka struktur modul adalah seperti berikut:

unit <nama modul>; {tajuk modul}

antara muka

{penerangan elemen program yang boleh dilihat bagi modul}

pelaksanaan

akhir.

Penggunaan prosedur dan fungsi dalam modul mempunyai keistimewaannya yang tersendiri. Pengepala subrutin mengandungi semua maklumat yang diperlukan untuk memanggilnya: nama, senarai dan jenis parameter, jenis hasil untuk fungsi. Maklumat ini mesti tersedia untuk program dan modul lain. Sebaliknya, teks subrutin yang melaksanakan algoritmanya tidak boleh digunakan oleh program dan modul lain. Oleh itu, tajuk prosedur dan fungsi diletakkan di bahagian antara muka modul, dan teks diletakkan di bahagian pelaksanaan.

Bahagian antara muka modul mengandungi hanya boleh dilihat (boleh diakses oleh program dan modul lain) pengepala prosedur dan fungsi (tanpa perkataan perkhidmatan ke hadapan). Teks penuh prosedur atau fungsi diletakkan di bahagian pelaksanaan, dan pengepala mungkin tidak mengandungi senarai parameter formal.

Kod sumber modul mesti disusun menggunakan arahan Make submenu Compile dan ditulis pada cakera. Hasil penyusunan modul ialah fail dengan sambungan . TPU (Unit Turbo Pascal). Nama asas modul diambil daripada pengepala modul.

Untuk menyambungkan modul kepada program, anda mesti menyatakan namanya dalam bahagian penerangan modul, contohnya:

menggunakan Crt, Graf;

Sekiranya nama pembolehubah dalam bahagian antara muka modul dan dalam atur cara yang menggunakan modul ini adalah sama, rujukannya adalah kepada pembolehubah yang diterangkan dalam atur cara. Untuk merujuk kepada pembolehubah yang diisytiharkan dalam modul, anda mesti menggunakan nama kompaun yang terdiri daripada nama modul dan nama pembolehubah, dipisahkan dengan titik. Penggunaan nama kompaun digunakan bukan sahaja untuk nama pembolehubah, tetapi untuk semua nama yang diisytiharkan dalam bahagian antara muka modul.

Penggunaan rekursif modul adalah dilarang.

Jika modul mempunyai bahagian permulaan, maka pernyataan dalam bahagian itu akan dilaksanakan sebelum atur cara yang menggunakan modul itu mula melaksanakan.

Mari kita senaraikan jenis modul.

1. Modul SISTEM.

Modul SYSTEM melaksanakan rutin sokongan peringkat rendah untuk semua ciri terbina dalam seperti I/O, manipulasi rentetan, operasi titik terapung dan peruntukan memori dinamik.

Modul SYSTEM mengandungi semua rutin dan fungsi Pascal standard dan terbina dalam. Mana-mana subrutin Pascal yang bukan sebahagian daripada Pascal standard dan tidak terdapat dalam mana-mana modul lain terkandung dalam modul Sistem. Modul ini digunakan secara automatik dalam semua program dan tidak perlu dinyatakan dalam pernyataan kegunaan.

2. Modul DOS.

Modul Dos melaksanakan banyak rutin dan fungsi Pascal yang setara dengan panggilan DOS yang paling biasa digunakan, seperti GetTime, SetTime, DiskSize dan sebagainya.

3. Modul CRT.

Modul CRT melaksanakan beberapa program berkuasa yang menyediakan kawalan penuh ke atas ciri PC seperti kawalan mod skrin, kod papan kekunci lanjutan, warna, tetingkap dan bunyi. Modul CRT hanya boleh digunakan dalam program yang dijalankan pada komputer peribadi IBM PC, PC AT, PS / 2 daripada IBM dan serasi sepenuhnya dengannya.

Salah satu kelebihan utama menggunakan modul CRT ialah kelajuan dan fleksibiliti yang lebih besar dalam melaksanakan operasi skrin. Program yang tidak berfungsi dengan modul CRT memaparkan maklumat pada skrin menggunakan sistem pengendalian DOS, yang dikaitkan dengan overhed tambahan. Apabila menggunakan modul CRT, maklumat output dihantar terus ke sistem input/output asas (BIOS) atau, untuk operasi yang lebih pantas, terus ke memori video.

4. modul GRAF.

Menggunakan prosedur dan fungsi yang disertakan dalam modul ini, anda boleh mencipta pelbagai grafik pada skrin.

5. Modul TINTINGAN.

Modul OVERLAY membolehkan anda mengurangkan keperluan memori program DOS mod sebenar. Sebenarnya, adalah mungkin untuk menulis atur cara yang melebihi jumlah memori yang tersedia, kerana hanya sebahagian daripada program itu akan berada dalam ingatan pada satu-satu masa.

KULIAH Bil 7. Ingatan dinamik

1. Jenis data rujukan. ingatan dinamik. Pembolehubah dinamik

Pembolehubah statik (diperuntukkan secara statik) ialah pembolehubah yang diisytiharkan secara eksplisit dalam atur cara, ia dirujuk dengan nama. Tempat dalam ingatan untuk meletakkan pembolehubah statik ditentukan apabila program disusun. Tidak seperti pembolehubah statik sedemikian, program Pascal boleh mencipta pembolehubah dinamik. Sifat utama pembolehubah dinamik ialah ia dicipta dan memori diperuntukkan untuknya semasa pelaksanaan program.

Pembolehubah dinamik diletakkan dalam kawasan memori dinamik (kawasan timbunan). Pembolehubah dinamik tidak dinyatakan secara eksplisit dalam perisytiharan pembolehubah dan tidak boleh dirujuk dengan nama. Pembolehubah sedemikian diakses menggunakan penunjuk dan rujukan.

Jenis rujukan (penunjuk) mentakrifkan satu set nilai yang menunjuk kepada pembolehubah dinamik jenis tertentu, dipanggil jenis asas. Pembolehubah jenis rujukan mengandungi alamat pembolehubah dinamik dalam ingatan. Jika jenis asas ialah pengecam yang tidak diisytiharkan, maka ia mesti diisytiharkan dalam bahagian yang sama dalam pengisytiharan jenis seperti jenis penunjuk.

Perkataan terpelihara nil menandakan pemalar dengan nilai penunjuk yang tidak menunjuk kepada apa-apa.

Mari kita berikan contoh perihalan pembolehubah dinamik.

var p1, p2 : ^sebenar;

p3, p4 : ^integer;

2. Bekerja dengan memori dinamik. Penunjuk Tidak Ditaip

Prosedur dan Fungsi Memori Dinamik

1. Prosedur Baharu(var p: Penunjuk).

Memperuntukkan ruang dalam kawasan memori dinamik untuk menampung pembolehubah dinamik pЛ, dan memberikan alamatnya kepada penunjuk p.

2. Prosedur Buang(varp: Penunjuk).

Membebaskan memori yang diperuntukkan untuk peruntukan pembolehubah dinamik oleh prosedur Baharu, dan nilai penunjuk p menjadi tidak ditentukan.

3. Prosedur GetMem(varp: Penunjuk; saiz: Word).

Memperuntukkan bahagian memori dalam kawasan timbunan, memberikan alamat permulaannya kepada penunjuk p, saiz bahagian dalam bait ditentukan oleh parameter saiz.

4. Prosedur FreeMem(var p: Penunjuk; saiz: Word).

Membebaskan kawasan memori, alamat permulaannya ditentukan oleh penunjuk p, dan saiznya ditentukan oleh parameter saiz. Nilai penunjuk p menjadi tidak ditentukan.

5. Tanda Prosedur(var p: Penunjuk)

Menulis pada penuding p alamat permulaan bahagian memori dinamik bebas pada masa panggilannya.

6. Keluaran Prosedur(var p: Penunjuk)

Mengeluarkan bahagian memori dinamik, bermula dari alamat yang ditulis ke penunjuk p oleh prosedur Tanda, iaitu mengosongkan memori dinamik yang telah diduduki selepas panggilan ke prosedur Tanda.

7. Fungsi MaxAvaikLongint

Mengembalikan panjang, dalam bait, timbunan percuma terpanjang.

8. Fungsi MemAvaikLongint

Mengembalikan jumlah memori dinamik percuma dalam bait.

9. Fungsi pembantu SizeOf(X):Word

Mengembalikan jumlah bait yang diduduki oleh X, di mana X boleh sama ada nama pembolehubah untuk sebarang jenis atau nama jenis.

Penunjuk jenis terbina dalam menandakan penunjuk yang tidak ditaip, iaitu, penunjuk yang tidak menunjuk kepada mana-mana jenis tertentu. Pembolehubah jenis Penunjuk boleh dinyahrujuk: menyatakan aksara ^ selepas pembolehubah sedemikian menyebabkan ralat.

Seperti nilai yang dilambangkan dengan nol, nilai Penunjuk serasi dengan semua jenis penuding lain.

KULIAH № 8. Struktur data abstrak

1. Struktur data abstrak

Jenis data berstruktur, seperti tatasusunan, set dan rekod, adalah struktur statik kerana saiznya tidak berubah semasa keseluruhan pelaksanaan program.

Selalunya diperlukan bahawa struktur data menukar saiznya semasa menyelesaikan masalah. Struktur data sedemikian dipanggil dinamik. Ini termasuk tindanan, baris gilir, senarai, pokok, dsb.

Penerangan tentang struktur dinamik dengan bantuan tatasusunan, rekod dan fail membawa kepada penggunaan memori komputer yang membazir dan meningkatkan masa untuk menyelesaikan masalah.

Setiap komponen mana-mana struktur dinamik ialah rekod yang mengandungi sekurang-kurangnya dua medan: satu medan jenis "penunjuk", dan yang kedua - untuk penempatan data. Secara umum, rekod mungkin mengandungi bukan satu, tetapi beberapa petunjuk dan beberapa medan data. Medan data boleh menjadi pembolehubah, tatasusunan, set atau rekod.

Jika bahagian penunjuk mengandungi alamat satu elemen senarai, maka senarai itu dipanggil satu arah (atau dipautkan secara tunggal). Jika ia mengandungi dua komponen, maka ia disambungkan dua kali ganda. Anda boleh melakukan pelbagai operasi pada senarai, contohnya:

1) menambah elemen pada senarai;

2) mengalih keluar elemen daripada senarai dengan kunci yang diberikan;

3) cari elemen dengan nilai tertentu medan kunci;

4) menyusun elemen senarai;

5) pembahagian senarai kepada dua atau lebih senarai;

6) menggabungkan dua atau lebih senarai menjadi satu;

7) operasi lain.

Walau bagaimanapun, sebagai peraturan, keperluan untuk semua operasi dalam menyelesaikan pelbagai masalah tidak timbul. Oleh itu, bergantung pada operasi asas yang perlu digunakan, terdapat pelbagai jenis senarai. Yang paling popular ialah tindanan dan baris gilir.

2. Timbunan

Tindanan ialah struktur data dinamik, penambahan komponen yang mana dan penyingkiran komponen yang dibuat dari satu hujung, dipanggil bahagian atas tindanan. Tindanan berfungsi berdasarkan prinsip LIFO (Masuk Terakhir, Keluar Dahulu) - "Masuk terakhir, keluar dahulu".

Biasanya terdapat tiga operasi yang dilakukan pada tindanan:

1) pembentukan timbunan awal (rakaman komponen pertama);

2) menambah komponen pada timbunan;

3) pemilihan komponen (penghapusan).

Untuk membentuk tindanan dan bekerja dengannya, anda mesti mempunyai dua pembolehubah jenis "penunjuk", yang pertama menentukan bahagian atas tindanan, dan yang kedua adalah tambahan.

Contoh. Tulis atur cara yang membentuk timbunan, menambah bilangan komponen yang sewenang-wenangnya padanya, dan kemudian membaca semua komponen dan memaparkannya pada skrin paparan. Ambil rentetan aksara sebagai data. Input data - dari papan kekunci, tanda tamat input - rentetan aksara TAMAT.

STACK Program;

menggunakan Crt;

jenis

Alfa = Rentetan[10];

PComp = ^Komp;

Comp = rekod

SD : Alfa

pSeterusnya : PComp

akhir;

var

pTop:PComp;

sc: Alfa;

Cipta ProcedureStack(var pTop : PComp; var sC : Alfa);

memulakan

Baharu(pTop);

pTop^.pSeterusnya := TIADA;

pTop^.sD := sC;

akhir;

Tambah ProcedureComp(var pTop : PComp; var sC : Alfa);

var pAux : PComp;

memulakan

BARU(pAux);

pAux^.pSeterusnya := pTop;

pAtas := pAux;

pTop^.sD := sC;

akhir;

Prosedur DelComp(var pTop : PComp; var sC : ALFA);

memulakan

sC := pTop^.sD;

pTop := pTop^.pSeterusnya;

akhir;

memulakan

Clrscr;

writeln(' MASUKKAN STRING ');

readln(sC);

CreateStack(pTop, sc);

mengulangi

writeln(' MASUKKAN STRING ');

readln(sC);

AddComp(pTop, sc);

sehingga sC = 'TAMAT';

writeln('****** OUTPUT ******');

mengulangi

DelComp(pTop, sc);

writeln(sC);

sehingga pTop = TIADA;

akhir.

3. Beratur

Baris gilir ialah struktur data dinamik di mana komponen ditambah pada satu hujung dan diambil semula pada hujung yang lain. Barisan beratur berfungsi berdasarkan prinsip FIFO (Masuk Pertama, Keluar Dahulu) - "Masuk dahulu, dilayan dahulu".

Untuk membentuk baris gilir dan bekerja dengannya, adalah perlu untuk mempunyai tiga pembolehubah jenis penunjuk, yang pertama menentukan permulaan baris gilir, yang kedua - penghujung baris gilir, yang ketiga - tambahan.

Contoh. Tulis program yang membentuk baris gilir, tambahkan bilangan komponen yang sewenang-wenangnya padanya, dan kemudian baca semua komponen dan memaparkannya pada skrin paparan. Ambil rentetan aksara sebagai data. Input data - dari papan kekunci, tanda tamat input - rentetan aksara TAMAT.

ProgramQUEUE;

menggunakan Crt;

jenis

Alfa = Rentetan[10];

PComp = ^Komp;

Comp = rekod

SD : Alfa

pSeterusnya : PComp;

akhir;

var

pBegin, pEnd : PComp;

sc: Alfa;

Cipta ProcedureQueue(var pBegin,pEnd:PComp; var sC:Alfa);

memulakan

Baharu(pBegin);

pBegin^.pSeterusnya := TIADA;

pBegin^.sD := sC;

pEnd := pBegin;

akhir;

Prosedur Tambah ProcedureQueue(var pEnd : PComp; var sC : Alfa);

var pAux : PComp;

memulakan

Baharu(pAux);

pAux^.pSeterusnya := TIADA;

pEnd^.pNext := pAux;

pEnd := pAux;

pEnd^.sD := sC;

akhir;

Prosedur DelQueue(var pBegin : PComp; var sC : Alfa);

memulakan

sC := pBegin^.sD;

pBegin := pBegin^.pSeterusnya;

akhir;

memulakan

Clrscr;

writeln(' MASUKKAN STRING ');

readln(sC);

CreateQueue(pBegin, pEnd, sc);

mengulangi

writeln(' MASUKKAN STRING ');

readln(sC);

AddQueue(pEnd, sc);

sehingga sC = 'TAMAT';

writeln(' ***** PAPARAN HASIL *****');

mengulangi

DelQueue(pBegin, sc);

writeln(sC);

sehingga pBegin = TIADA;

akhir.

KULIAH No. 9. Struktur data seperti pokok

1. Struktur Data Pokok

Struktur data seperti pokok ialah satu set terhingga unsur-nod di antaranya terdapat hubungan - hubungan antara sumber dan yang dijana.

Jika kita menggunakan definisi rekursif yang dicadangkan oleh N. Wirth, maka struktur data pokok dengan jenis asas t adalah sama ada struktur kosong atau nod jenis t, yang dengannya set terhingga struktur pokok dengan jenis asas t, dipanggil subpokok, adalah berkaitan.

Seterusnya, kami memberikan takrifan yang digunakan apabila beroperasi dengan struktur pokok.

Jika nod y terletak betul-betul di bawah nod x, maka nod y dipanggil keturunan langsung nod x, dan x ialah nenek moyang terdekat nod y, iaitu, jika nod x berada pada tahap i-th, maka nod y adalah sewajarnya. terletak pada (i + 1) - aras ke.

Tahap maksimum nod pokok dipanggil ketinggian atau kedalaman pokok. Nenek moyang tidak hanya mempunyai satu nod pokok - akarnya.

Nod pokok yang tidak mempunyai anak dipanggil nod daun (atau daun pokok). Semua nod lain dipanggil nod dalaman. Bilangan anak segera suatu nod menentukan darjah nod itu, dan darjah maksimum yang mungkin bagi suatu nod dalam pokok tertentu menentukan darjah pokok itu.

Nenek moyang dan keturunan tidak boleh ditukar ganti, iaitu, hubungan antara perbuatan asal dan yang dihasilkan hanya dalam satu arah.

Jika anda pergi dari akar pokok ke beberapa nod tertentu, maka bilangan dahan pokok yang akan dilalui dalam kes ini dipanggil panjang laluan untuk nod ini. Jika semua dahan (nod) pokok tersusun, maka pokok itu dikatakan tertib.

Pokok binari adalah kes khas struktur pokok. Ini adalah pokok di mana setiap kanak-kanak mempunyai paling banyak dua anak, dipanggil subpohon kiri dan kanan. Oleh itu, pokok binari ialah struktur pokok yang darjahnya adalah dua.

Susunan pokok binari ditentukan oleh peraturan berikut: setiap nod mempunyai medan kuncinya sendiri, dan untuk setiap nod nilai kunci lebih besar daripada semua kunci dalam subpokok kiri dan kurang daripada semua kunci dalam subpokok kanannya.

Pokok yang darjahnya lebih besar daripada dua dipanggil bercabang kuat.

2. Operasi pada pokok

Selanjutnya, kami akan mempertimbangkan semua operasi berhubung dengan pokok binari.

I. Pembinaan pokok

Kami membentangkan algoritma untuk membina pokok yang dipesan.

1. Jika pokok kosong, maka data dipindahkan ke akar pokok. Jika pokok itu tidak kosong, maka salah satu dahannya diturunkan sedemikian rupa agar susunan pokok itu tidak dilanggar. Akibatnya, nod baharu menjadi daun pokok seterusnya.

2. Untuk menambah nod pada pokok yang sedia ada, anda boleh menggunakan algoritma di atas.

3. Apabila memadamkan nod daripada pokok, anda harus berhati-hati. Jika nod yang akan dikeluarkan adalah daun, atau hanya mempunyai satu anak, maka operasinya mudah. Jika nod yang akan dipadamkan mempunyai dua keturunan, maka adalah perlu untuk mencari nod di kalangan keturunannya yang boleh diletakkan di tempatnya. Ini adalah perlu kerana keperluan pokok itu dipesan.

Anda boleh melakukan ini: tukar nod yang hendak dialih keluar dengan nod dengan nilai kunci terbesar dalam subpokok kiri, atau dengan nod dengan nilai kunci terkecil dalam subpokok kanan, dan kemudian padamkan nod yang diingini sebagai daun.

II. Mencari nod dengan nilai medan kunci yang diberikan

Apabila melakukan operasi ini, perlu melintasi pokok itu. Ia perlu mengambil kira pelbagai bentuk penulisan pokok: awalan, infiks dan postfix.

Persoalannya timbul: bagaimana untuk mewakili nod pokok supaya paling mudah untuk bekerja dengan mereka? Ia adalah mungkin untuk mewakili pokok menggunakan tatasusunan, di mana setiap nod diterangkan oleh nilai jenis gabungan, yang mempunyai medan maklumat jenis aksara dan dua medan jenis rujukan. Tetapi ini tidak begitu mudah, kerana pokok mempunyai sejumlah besar nod yang tidak ditentukan sebelumnya. Oleh itu, sebaiknya gunakan pembolehubah dinamik apabila menerangkan pokok. Kemudian setiap nod diwakili oleh nilai jenis yang sama, yang mengandungi perihalan bilangan medan maklumat tertentu, dan bilangan medan sepadan mestilah sama dengan darjah pepohon. Adalah logik untuk mentakrifkan ketiadaan keturunan dengan nol. Kemudian, dalam Pascal, perihalan pokok binari mungkin kelihatan seperti ini:

TYPE TreeLink = ^Pokok;

pokok = rekod;

Inf : <datatype>;

Kiri, Kanan : TreeLink;

Tamat.

3. Contoh pelaksanaan operasi

1. Bina pokok dengan n nod ketinggian minimum, atau pokok seimbang sempurna (bilangan nod subpokok kiri dan kanan pokok sedemikian mestilah berbeza tidak lebih daripada satu).

Algoritma pembinaan rekursif:

1) nod pertama diambil sebagai akar pokok.

2) subpokok kiri nod nl dibina dengan cara yang sama.

3) subpokok kanan nod nr dibina dengan cara yang sama;

nr = n - nl - 1. Sebagai medan maklumat, kami akan mengambil nombor nod yang dimasukkan dari papan kekunci. Fungsi rekursif yang melaksanakan pembinaan ini akan kelihatan seperti ini:

Pokok Fungsi(n : Byte): TreeLink;

Var t : TreeLink; nl,nr,x : Bait;

Memulakan

Jika n = 0 maka Pokok := nil

Yang lain

Memulakan

nl := n div 2;

nr = n - nl - 1;

writeln('Masukkan nombor bucu ');

readln(x);

baru(t);

t^.inf := x;

t^.left := Pokok(nl);

t^.right := Pokok(nr);

Pokok := t;

berakhir;

{Pokok}

Tamat.

2. Dalam pepohon tertib binari, cari nod dengan nilai medan kunci yang diberikan. Jika tiada unsur sedemikian dalam pokok, kemudian tambahkannya pada pokok itu.

Prosedur Carian(x : Byte; var t : TreeLink);

Memulakan

Jika t = tiada maka

Memulakan

Baru(t);

t^inf := x;

t^.left := tiada;

t^.right := nil;

akhir

Lain jika x < t^.inf kemudian

Carian(x, t^.kiri)

Lain jika x > t^.inf kemudian

Carian(x, t^.kanan)

Yang lain

Memulakan

{elemen proses ditemui}

...

berakhir;

Tamat.

3. Tulis prosedur lintasan pokok dalam susunan hadapan, simetri dan terbalik, masing-masing.

3.1. Prosedur Prapesanan(t : TreeLink);

Memulakan

Jika t <> tiada maka

Memulakan

WriteIn(t^.inf);

Prapesan(t^.kiri);

Prapesan(t^.kanan);

berakhir;

berakhir;

3.2. Susunan Prosedur(t : TreeLink);

Memulakan

Jika t <> tiada maka

Memulakan

Inorder(t^.left);

WriteIn(t^.inf);

Inorder(t^.right);

berakhir;

Tamat.

3.3. Prosedur Postorder(t : TreeLink);

Memulakan

Jika t <> tiada maka

Memulakan

pesanan pos(t^.kiri);

pesanan pos(t^.kanan);

WriteIn(t^.inf);

berakhir;

Tamat.

4. Dalam pepohon tertib binari, padamkan nod dengan nilai medan kunci yang diberikan.

Mari kita terangkan prosedur rekursif yang akan mengambil kira kehadiran elemen yang diperlukan dalam pokok dan bilangan keturunan nod ini. Jika nod yang akan dipadamkan mempunyai dua anak, maka ia akan digantikan dengan nilai kunci terbesar dalam subpokok kirinya, dan hanya selepas itu ia akan dipadamkan secara kekal.

Prosedur Padam1(x : Byte; var t : TreeLink);

Var p : TreeLink;

Prosedur Padam2(var q : TreeLink);

Memulakan

Jika q^.kanan <> tiada maka Padam2(q^.kanan)

Yang lain

Memulakan

p^.inf := q^.inf;

p := q;

q := q^.kiri;

berakhir;

berakhir;

Memulakan

Jika t = tiada maka

Writeln('tiada unsur ditemui')

Lain jika x < t^.inf kemudian

Padam1(x, t^.kiri)

Lain jika x > t^.inf kemudian

Padam1(x, t^.kanan)

Yang lain

Memulakan

P := t;

Jika p^.left = tiada maka

t := p^.kanan

Yang lain

Jika p^.kanan = tiada maka

t := p^.kiri

Yang lain

Padam2(p^.kiri);

berakhir;

Tamat.

KULIAH Bil 10. Kiraan

1. Konsep graf. Cara untuk mewakili graf

Graf ialah pasangan G = (V,E), di mana V ialah set objek yang bersifat arbitrari, dipanggil bucu, dan E ialah keluarga pasangan ei = (vil, vi2), vijOV, dipanggil tepi. Dalam kes umum, set V dan/atau keluarga E mungkin mengandungi bilangan unsur yang tidak terhingga, tetapi kami akan mempertimbangkan hanya graf terhingga, iaitu graf yang kedua-dua V dan E adalah terhingga. Jika susunan unsur-unsur termasuk dalam ei perkara, maka graf dipanggil terarah, disingkatkan - digraf, sebaliknya - tidak terarah. Tepi digraf dipanggil lengkok. Dalam perkara berikut, kami menganggap bahawa istilah "graf", digunakan tanpa spesifikasi (diarahkan atau tidak terarah), menandakan graf tidak terarah.

Jika e = , maka bucu v dan u dipanggil hujung tepi. Di sini kita katakan bahawa tepi e adalah bersebelahan (insiden) kepada setiap bucu v dan u. Bucu v dan dan juga dipanggil bersebelahan (kejadian). Dalam kes umum, tepi bentuk e = ; tepi sedemikian dipanggil gelung.

Darjah bucu dalam graf ialah bilangan tepi yang datang ke bucu itu, dengan gelung dikira dua kali. Memandangkan setiap tepi adalah insiden kepada dua bucu, jumlah darjah semua bucu dalam graf adalah sama dengan dua kali ganda bilangan tepi: Sum(deg(vi), i=1...|V|) = 2 * | E|.

Berat nod ialah nombor (nyata, integer, atau rasional) yang diberikan kepada nod tertentu (ditafsirkan sebagai kos, pemprosesan, dll.). Berat, panjang tepi - nombor atau beberapa nombor yang ditafsirkan sebagai panjang, lebar jalur, dsb.

Laluan dalam graf (atau laluan dalam digraf) ialah urutan selang seli bagi bucu dan tepi (atau lengkok dalam digraf) dalam bentuk v0, (v0,v1), v1..., (vn - 1,vn ), vn. Nombor n dipanggil panjang laluan. Laluan tanpa tepi berulang dipanggil rantai; laluan tanpa bucu berulang dipanggil rantai mudah. Laluan boleh ditutup (v0 = vn). Laluan tertutup tanpa mengulangi tepi dipanggil kitaran (atau kontur dalam digraf); tanpa mengulangi bucu (kecuali yang pertama dan terakhir) - gelung mudah.

Graf dipanggil bersambung jika terdapat laluan antara mana-mana dua bucunya, dan terputus jika tidak. Graf terputus terdiri daripada beberapa komponen bersambung (subgraf bersambung).

Terdapat pelbagai cara untuk mewakili graf. Mari kita pertimbangkan setiap daripada mereka secara berasingan.

1. Matriks kejadian.

Ini ialah matriks segi empat tepat berdimensi nx n, dengan n ialah bilangan bucu, am ialah bilangan tepi. Nilai elemen matriks ditentukan seperti berikut: jika tepi xi dan bucu vj adalah kejadian, maka nilai elemen matriks yang sepadan adalah sama dengan satu, jika tidak nilainya adalah sifar. Untuk graf terarah, matriks kejadian dibina mengikut prinsip berikut: nilai elemen adalah sama dengan - 1 jika tepi xi berasal dari bucu vj, sama dengan 1 jika tepi xi memasuki bucu vj, dan sama dengan XNUMX sebaliknya. .

2. Matriks bersebelahan.

Ini ialah matriks segi empat sama dimensi nxn, dengan n ialah bilangan bucu. Jika bucu vi dan vj bersebelahan, iaitu, jika terdapat tepi yang menghubungkannya, maka elemen matriks yang sepadan adalah sama dengan satu, jika tidak, ia sama dengan sifar. Peraturan untuk membina matriks ini untuk graf terarah dan tidak terarah tidak berbeza. Matriks bersebelahan adalah lebih padat daripada matriks kejadian. Perlu diingatkan bahawa matriks ini juga sangat jarang, tetapi dalam kes graf tidak terarah ia adalah simetri sehubungan dengan pepenjuru utama, jadi anda tidak boleh menyimpan keseluruhan matriks, tetapi hanya separuh daripadanya (matriks segi tiga ).

3. Senarai tempat bersebelahan (insiden).

Ia ialah struktur data yang menyimpan senarai bucu bersebelahan untuk setiap bucu graf. Senarai itu ialah tatasusunan penunjuk, elemen ke-i yang mengandungi penunjuk kepada senarai bucu bersebelahan dengan bucu ke-i.

Senarai bersebelahan adalah lebih cekap daripada matriks bersebelahan kerana ia menghapuskan penyimpanan unsur nol.

4. Senarai senarai.

Ia ialah struktur data seperti pepohon di mana satu cabang mengandungi senarai bucu bersebelahan dengan setiap bucu graf, dan cabang kedua menghala ke bucu graf seterusnya. Cara mewakili graf ini adalah yang paling optimum.

2. Perwakilan graf dengan senarai kejadian. Algoritma Traversal Kedalaman Graf

Untuk melaksanakan graf sebagai senarai kejadian, anda boleh menggunakan jenis berikut:

TypeList = ^S;

S=rekod;

inf : Bait;

seterusnya : Senarai;

akhir;

Kemudian graf ditakrifkan seperti berikut:

Var Gr : tatasusunan[1..n] Senarai;

Sekarang mari kita beralih kepada prosedur traversal graf. Ini adalah algoritma tambahan yang membolehkan anda melihat semua bucu graf, menganalisis semua medan maklumat. Jika kita mempertimbangkan traversal graf secara mendalam, maka terdapat dua jenis algoritma: rekursif dan bukan rekursif.

Dengan algoritma rekursif depth-first traversal, kami mengambil bucu arbitrari dan mencari bucu ghaib (baru) v bersebelahan dengannya. Kemudian kita menganggap bucu v sebagai bukan baharu dan mencari sebarang bucu baharu bersebelahan dengannya. Jika sesetengah bucu tidak mempunyai bucu ghaib yang lebih baharu, maka kita anggap bucu ini akan digunakan dan kembalikan satu aras yang lebih tinggi kepada bucu dari mana kita sampai ke bucu yang digunakan. Traversal diteruskan dengan cara ini sehingga tiada bucu baru yang belum diimbas dalam graf.

Dalam Pascal, traversal depth-first akan kelihatan seperti ini:

Prosedur Obhod(gr : Graf; k : Byte);

Var g : Graf; l : Senarai;

Memulakan

nov[k] := palsu;

g:= gr;

Semasa g^.inf <> k lakukan

g := g^.seterusnya;

l := g^.smeg;

Walaupun l <> tiada bermula

Jika nov[l^.inf] maka Obhod(gr, l^.inf);

l := l^.seterusnya;

berakhir;

berakhir;

Nota

Dalam prosedur ini, apabila menerangkan jenis Graf, kami maksudkan perihalan graf dengan senarai senarai. Tatasusunan nov[i] ialah tatasusunan khas yang elemen ke-inya adalah Benar jika bucu ke-i tidak dilawati, dan Palsu sebaliknya.

Algoritma traversal bukan rekursif juga sering digunakan. Dalam kes ini, rekursi digantikan dengan timbunan. Setelah bucu telah dilihat, ia ditolak ke tindanan, dan ia akan digunakan apabila tiada lagi bucu baharu bersebelahan dengannya.

3. Perwakilan graf dengan senarai senarai. Algoritma Traversal Graf Keluasan

Graf boleh ditakrifkan menggunakan senarai senarai seperti berikut:

TypeList = ^Tlist;

tlist=rekod

inf : Bait;

seterusnya : Senarai;

akhir;

Graf = ^TGpaph;

TGpaph = rekod

inf : Bait;

smeg : Senarai;

seterusnya : Graf;

akhir;

Apabila merentasi graf dalam keluasan, kami memilih bucu arbitrari dan melihat semua bucu yang bersebelahan dengannya sekaligus. Barisan gilir digunakan dan bukannya timbunan. Algoritma carian luas pertama sangat berguna untuk mencari laluan terpendek dalam graf.

Berikut ialah prosedur untuk melintasi graf dalam lebar dalam pseudokod:

Prosedur Obhod2(v);

{values ​​​​spisok, nov - global}

Memulakan

beratur = O;

beratur <= v;

nov[v] = Salah;

Semasa beratur <> O lakukan

Memulakan

p <= baris gilir;

Untuk anda dalam spisok(p) lakukan

Jika baharu[u] ​​maka

Memulakan

nov[u] := Salah;

beratur <= u;

berakhir;

berakhir;

berakhir;

KULIAH # 11. Jenis data objek

1. Jenis objek dalam Pascal. Konsep objek, penerangan dan penggunaannya

Dari segi sejarah, pendekatan pertama untuk pengaturcaraan ialah pengaturcaraan prosedur, atau dikenali sebagai pengaturcaraan bawah ke atas. Pada mulanya, perpustakaan biasa program standard yang digunakan dalam pelbagai bidang aplikasi komputer telah dicipta. Kemudian, berdasarkan program ini, program yang lebih kompleks dicipta untuk menyelesaikan masalah tertentu.

Walau bagaimanapun, teknologi komputer sentiasa berkembang, ia mula digunakan untuk menyelesaikan pelbagai masalah pengeluaran, ekonomi, dan oleh itu ia menjadi perlu untuk memproses data pelbagai format dan menyelesaikan masalah bukan standard (contohnya, bukan angka). Oleh itu, apabila membangunkan bahasa pengaturcaraan, mereka mula memberi perhatian kepada penciptaan pelbagai jenis data. Ini menyumbang kepada kemunculan jenis data yang kompleks seperti gabungan, berbilang, rentetan, fail, dll. Sebelum menyelesaikan masalah, pengaturcara menjalankan penguraian, iaitu, membahagikan tugas kepada beberapa subtugas, untuk setiap satu modul yang berasingan telah ditulis . Teknologi pengaturcaraan utama termasuk tiga peringkat:

1) reka bentuk atas ke bawah;

2) pengaturcaraan modular;

3) pengekodan struktur.

Tetapi bermula dari pertengahan 60-an abad XX, konsep dan pendekatan baru mula terbentuk, yang membentuk asas teknologi pengaturcaraan berorientasikan objek. Dalam pendekatan ini, pemodelan dan penerangan tentang dunia sebenar dijalankan pada tahap konsep bidang subjek tertentu yang menjadi milik masalah yang diselesaikan.

Pengaturcaraan berorientasikan objek ialah teknik pengaturcaraan yang hampir menyerupai tingkah laku kita. Ia merupakan evolusi semula jadi daripada inovasi terdahulu dalam reka bentuk bahasa pengaturcaraan. Pengaturcaraan berorientasikan objek adalah lebih berstruktur daripada semua perkembangan sebelumnya mengenai pengaturcaraan berstruktur. Ia juga lebih modular dan lebih abstrak daripada percubaan sebelumnya pada abstraksi data dan butiran pengaturcaraan secara dalaman. Bahasa pengaturcaraan berorientasikan objek dicirikan oleh tiga sifat utama:

1) Enkapsulasi. Menggabungkan rekod dengan prosedur dan fungsi yang memanipulasi medan rekod ini membentuk jenis data baharu - objek;

2) Warisan. Takrif objek dan penggunaan selanjutnya untuk membina hierarki objek kanak-kanak dengan keupayaan untuk setiap objek kanak-kanak yang berkaitan dengan hierarki mengakses kod dan data semua objek induk;

3) Polimorfisme. Memberi tindakan satu nama, yang kemudiannya dikongsi ke atas dan ke bawah hierarki objek, dengan setiap objek dalam hierarki melaksanakan tindakan itu dengan cara yang sesuai dengannya.

Bercakap tentang objek, kami memperkenalkan jenis data baharu - objek. Jenis objek ialah struktur yang terdiri daripada bilangan komponen tetap. Setiap komponen adalah sama ada medan yang mengandungi data jenis yang ditakrifkan dengan ketat, atau kaedah yang menjalankan operasi pada objek. Dengan analogi dengan pengisytiharan pembolehubah, pengisytiharan medan menunjukkan jenis data medan ini dan pengecam yang menamakan medan: dengan analogi dengan pengisytiharan prosedur atau fungsi, penerangan kaedah menunjukkan tajuk prosedur, fungsi, pembina atau pemusnah.

Jenis objek boleh mewarisi komponen jenis objek lain. Jika jenis T2 mewarisi daripada jenis T1, maka jenis T2 adalah anak jenis T1, dan jenis T1 itu sendiri adalah ibu bapa jenis T2. Pewarisan adalah transitif, iaitu jika TK mewarisi daripada T2, dan T2 mewarisi daripada T1, maka TK mewarisi daripada T1. Skop (domain) jenis objek terdiri daripada dirinya sendiri dan semua keturunannya.

Kod sumber berikut ialah contoh pengisytiharan jenis objek, jenis

jenis

titik = objek

X, Y: integer;

akhir;

Rect = objek

A, B: TPoint;

prosedur Init(XA, YA, XB, YB: Integer);

prosedur Salin(var R: TRectangle);

prosedur Alih(DX, DY: Integer);

prosedur Tumbuh(DX, DY: Integer);

prosedur Intersect(var R: TRectangle);

prosedur Union(var R: TRectangle);

fungsi Mengandungi(P: Titik): Boolean;

akhir;

StringPtr = ^String;

FieldPtr = ^Tfield;

TField = objek

X, Y, Len: Integer;

Nama: StringPtr;

constructor Copy(var F: TField);

pembina Init(FX, FY, FLen: Integer; FName: String);

pemusnah Selesai; maya;

prosedur Paparan; maya;

prosedur Edit; maya;

fungsi GetStr: String; maya;

fungsi PutStr(S: String): Boolean; maya;

akhir;

StrFieldPtr = ^TSrField;

StrField = objek(TField)

Nilai: PString;

pembina Init(FX, FY, FLen: Integer; FName: String);

pemusnah Selesai; maya;

fungsi GetStr: String; maya;

fungsi PutStr(S: String): Boolean;

maya;

fungsi Dapatkan:rentetan;

prosedur Letakkan(S: String);

akhir;

NumFieldPtr = ^TNumField;

TNumField = objek(TField)

swasta

Nilai, Min, Maks: Longint;

awam

pembina Init(FX, FY, FLen: Integer; FName: String;

FMin, FMax: Longint);

fungsi GetStr: String; maya;

fungsi PutStr(S: String): Boolean; maya;

fungsi Dapatkan: Longint;

function Put(N: Longint);

akhir;

ZipFieldPtr = ^TZipField;

ZipField = objek(TNumField)

fungsi GetStr: String; maya;

fungsi PutStr(S: String): Boolean;

maya;

akhir.

Tidak seperti jenis lain, jenis objek hanya boleh diisytiharkan dalam bahagian pengisytiharan jenis pada tahap paling luar skop program atau modul. Oleh itu, jenis objek tidak boleh diisytiharkan dalam bahagian pengisytiharan berubah-ubah atau di dalam prosedur, fungsi atau blok kaedah.

Jenis komponen jenis fail tidak boleh mempunyai jenis objek atau sebarang jenis struktur yang mengandungi komponen jenis objek.

2. Warisan

Proses di mana satu jenis mewarisi ciri-ciri jenis lain dipanggil pewarisan. Keturunan dipanggil jenis terbitan (anak), dan jenis yang diwarisi oleh jenis anak dipanggil jenis induk (ibu bapa).

Jenis rekod Pascal yang diketahui sebelum ini tidak boleh diwarisi. Walau bagaimanapun, Borland Pascal memperluaskan bahasa Pascal untuk menyokong warisan. Salah satu sambungan ini ialah kategori struktur data baharu yang berkaitan dengan rekod, tetapi lebih berkuasa. Jenis data dalam kategori baharu ini ditakrifkan menggunakan perkataan simpanan baharu "objek". Jenis objek boleh ditakrifkan sebagai jenis bebas yang lengkap dalam cara menerangkan entri Pascal, tetapi ia juga boleh ditakrifkan sebagai keturunan jenis objek sedia ada dengan meletakkan jenis induk dalam kurungan selepas perkataan simpanan "objek".

3. Semerta Objek

Contoh objek dicipta dengan mengisytiharkan pembolehubah atau pemalar jenis objek, atau dengan menggunakan prosedur standard Baharu kepada pembolehubah jenis "penunjuk kepada jenis objek". Objek yang terhasil dipanggil contoh jenis objek;

var

F: Padang;

Z: TZipField;

FP: PF Field;

ZP: PZipField;

Memandangkan pengisytiharan pembolehubah ini, F ialah contoh TField dan Z ialah contoh TZipField. Begitu juga, selepas menggunakan Baharu pada FP dan ZP, FP akan menghala ke tika TField dan ZP akan menghala ke tika TZipField.

Jika jenis objek mengandungi kaedah maya, maka contoh jenis objek itu mesti dimulakan dengan memanggil pembina sebelum memanggil sebarang kaedah maya.

Di bawah adalah contoh:

var

S: StrField;

egin

S.Init(1, 1, 25, 'Nama depan');

S.Put('Vladimir');

S. Paparan;

...

S Selesai;

akhir.

Jika S.Init tidak dipanggil, maka memanggil S.Display akan menyebabkan contoh ini gagal.

Menetapkan contoh jenis objek tidak membayangkan permulaan contoh. Objek dimulakan oleh kod yang dihasilkan pengkompil yang berjalan di antara seruan pembina dan titik di mana pelaksanaan sebenarnya mencapai pernyataan pertama dalam blok kod pembina.

Jika tika objek tidak dimulakan dan semakan julat didayakan (oleh arahan {SR+}), maka panggilan pertama ke kaedah maya tika objek memberikan ralat masa jalan. Jika semakan julat dilumpuhkan (oleh arahan {SR-}), maka panggilan pertama kepada kaedah maya bagi objek yang tidak dimulakan boleh membawa kepada tingkah laku yang tidak dapat diramalkan.

Peraturan permulaan mandatori juga digunakan pada kejadian yang merupakan komponen jenis struct. Sebagai contoh:

var

Ulasan: tatasusunan [1..5] TStrField;

I: integer

memulakan

untuk saya := 1 hingga 5 lakukan

Komen [I].Init (1, I + 10, 40, 'first_name');

.

.

.

untuk I := 1 hingga 5 buat Komen [I].Selesai;

akhir;

Untuk keadaan dinamik, pemulaan biasanya mengenai peletakan dan pembersihan adalah mengenai pemadaman, yang dicapai melalui sintaks lanjutan prosedur standard Baharu dan Buang. Sebagai contoh:

var

SP: StrFieldPtr;

memulakan

Baru(SP, Init(1, 1, 25, 'first_name');

SP^.Put('Vladimir');

SP^.Paparan;

.

.

.

Buang (SP, Selesai);

akhir.

Penunjuk kepada jenis objek adalah tugasan yang serasi dengan penuding kepada mana-mana jenis objek induk, jadi pada masa jalan penuding kepada jenis objek boleh menunjuk ke tika jenis itu atau ke tika jenis anak.

Sebagai contoh, penunjuk jenis ZipFieldPtr boleh diberikan kepada penunjuk jenis PZipField, PNumField dan PField, dan pada masa jalanan, penunjuk jenis PField boleh sama ada nol atau menunjuk kepada contoh TField, TNumField atau TZipField, atau mana-mana contoh jenis kanak-kanak TField. .

Peraturan keserasian penuding tugasan ini juga digunakan pada parameter jenis objek. Contohnya, kaedah TField.Cop boleh menghantar contoh TField, TStrField, TNumField, TZipField atau mana-mana jenis anak TField yang lain.

4. Komponen dan Skop

Skop pengecam kacang melangkaui jenis objek. Selain itu, skop pengecam kacang meluas melalui blok prosedur, fungsi, pembina dan pemusnah yang melaksanakan kaedah jenis objek dan keturunannya. Berdasarkan pertimbangan ini, ejaan pengecam komponen mestilah unik dalam jenis objek dan dalam semua keturunannya, serta dalam semua kaedahnya.

Skop pengecam komponen yang diterangkan dalam bahagian peribadi pengisytiharan jenis adalah terhad kepada modul (program) yang mengandungi pengisytiharan jenis objek. Dalam erti kata lain, kacang pengecam persendirian bertindak seperti pengecam awam biasa dalam modul yang mengandungi pengisytiharan jenis objek, dan di luar modul mana-mana kacang dan pengecam persendirian tidak diketahui dan tidak boleh diakses. Dengan meletakkan jenis objek yang berkaitan dalam modul yang sama, anda boleh menjadikan objek ini mengakses komponen peribadi satu sama lain, dan komponen peribadi ini akan tidak diketahui oleh modul lain.

Dalam pengisytiharan jenis objek, pengepala kaedah boleh menentukan parameter jenis objek yang diterangkan, walaupun pengisytiharan belum lengkap.

KULIAH Bil 12. Kaedah

1. Kaedah

Pengisytiharan kaedah di dalam jenis objek sepadan dengan pengisytiharan kaedah ke hadapan (ke hadapan). Oleh itu, di suatu tempat selepas pengisytiharan jenis objek, tetapi dalam skop yang sama dengan skop pengisytiharan jenis objek, kaedah mesti dilaksanakan dengan mentakrifkan pengisytiharannya.

Untuk kaedah prosedural dan fungsian, pengisytiharan yang mentakrifkan berbentuk prosedur biasa atau pengisytiharan fungsi, dengan pengecualian dalam kes ini, pengecam prosedur atau fungsi dianggap sebagai pengecam kaedah.

Untuk kaedah pembina dan pemusnah, pengisytiharan yang menentukan mengambil bentuk pengisytiharan kaedah prosedur, dengan pengecualian bahawa prosedur perkataan yang dikhaskan digantikan oleh pembina atau pemusnah perkataan yang dikhaskan.

Pengisytiharan kaedah yang menentukan boleh, tetapi tidak perlu, mengulangi senarai parameter formal pengepala kaedah dalam jenis objek. Dalam kes ini, pengepala kaedah mesti sepadan dengan pengepala dalam jenis objek mengikut susunan, jenis dan nama parameter, dan dalam jenis pemulangan hasil fungsi jika kaedah itu adalah fungsi.

Penerangan mentakrifkan kaedah sentiasa mengandungi parameter tersirat dengan pengecam Diri, sepadan dengan parameter pembolehubah formal yang mempunyai jenis objek. Dalam blok kaedah, Diri mewakili contoh yang komponen kaedahnya ditentukan untuk menggunakan kaedah tersebut. Oleh itu, sebarang perubahan kepada nilai medan Diri ditunjukkan dalam contoh.

Skop pengecam kacang jenis objek meluas kepada blok prosedur, fungsi, pembina dan pemusnah yang melaksanakan kaedah jenis objek tersebut. Kesannya adalah sama seperti jika pernyataan dengan bentuk berikut dimasukkan pada permulaan blok kaedah:

dengan lakukan sendiri

memulakan

...

akhir;

Berdasarkan pertimbangan ini, ejaan pengecam komponen, parameter kaedah formal, Diri, dan sebarang pengecam yang dimasukkan ke dalam bahagian boleh laku kaedah mestilah unik.

Jika pengecam kaedah unik diperlukan, maka pengecam kaedah yang layak digunakan. Ia terdiri daripada pengecam jenis objek diikuti dengan titik dan pengecam kaedah. Seperti mana-mana pengecam lain, pengecam kaedah yang layak secara pilihan boleh didahului oleh pengecam pakej dan noktah.

Kaedah Maya

Kaedah adalah statik secara lalai, tetapi kecuali untuk pembina, ia boleh menjadi maya (dengan memasukkan arahan maya dalam pengisytiharan kaedah). Pengkompil menyelesaikan rujukan kepada panggilan kaedah statik semasa proses penyusunan, manakala panggilan kaedah maya diselesaikan pada masa berjalan. Ini kadangkala dipanggil pengikatan lewat.

Jika jenis objek mengisytiharkan atau mewarisi sebarang kaedah maya, maka pembolehubah jenis itu mesti dimulakan dengan memanggil pembina sebelum memanggil sebarang kaedah maya. Oleh itu, jenis objek yang menerangkan atau mewarisi kaedah maya juga mesti menerangkan atau mewarisi sekurang-kurangnya satu kaedah pembina.

Jenis objek boleh mengatasi mana-mana kaedah yang diwarisi daripada ibu bapanya. Jika pengisytiharan kaedah dalam kanak-kanak menentukan pengecam kaedah yang sama sebagai pengisytiharan kaedah dalam ibu bapa, maka pengisytiharan dalam kanak-kanak itu mengatasi pengisytiharan dalam ibu bapa. Skop kaedah mengatasi berkembang kepada skop kanak-kanak di mana kaedah itu diperkenalkan, dan akan kekal sedemikian sehingga pengecam kaedah ditindih semula.

Mengatasi kaedah statik adalah bebas daripada menukar pengepala kaedah. Sebaliknya, penggantian kaedah maya mesti mengekalkan susunan, jenis dan nama parameter, dan jenis hasil fungsi, jika ada. Selain itu, definisi semula mesti sekali lagi termasuk arahan maya.

Kaedah Dinamik

Borland Pascal menyokong kaedah terikat lewat tambahan yang dipanggil kaedah dinamik. Kaedah dinamik berbeza daripada kaedah maya hanya dalam cara ia dihantar pada masa berjalan. Dalam semua aspek lain, kaedah dinamik dianggap setara dengan kaedah maya.

Pengisytiharan kaedah dinamik adalah bersamaan dengan pengisytiharan kaedah maya, tetapi pengisytiharan kaedah dinamik mesti termasuk indeks kaedah dinamik, yang ditentukan serta-merta selepas kata kunci maya. Indeks kaedah dinamik mestilah pemalar integer antara 1 dan 656535 dan mestilah unik antara indeks kaedah dinamik lain yang terkandung dalam jenis objek atau nenek moyangnya. Sebagai contoh:

prosedur FileOpen(var Msg: TMessage); maya 100;

Penggantian kaedah dinamik mesti sepadan dengan susunan, jenis dan nama parameter dan betul-betul sepadan dengan jenis hasil fungsi kaedah induk. Penggantian juga mesti termasuk arahan maya diikuti dengan indeks kaedah dinamik yang sama yang dinyatakan dalam jenis objek nenek moyang.

2. Pembina dan pemusnah

Pembina dan pemusnah adalah bentuk kaedah khusus. Digunakan berkaitan dengan sintaks lanjutan prosedur standard Baharu dan Buang, pembina dan pemusnah mempunyai keupayaan untuk meletakkan dan mengalih keluar objek dinamik. Di samping itu, pembina mempunyai keupayaan untuk melakukan permulaan yang diperlukan bagi objek yang mengandungi kaedah maya. Seperti semua kaedah, pembina dan pemusnah boleh diwarisi, dan objek boleh mengandungi sebarang bilangan pembina dan pemusnah.

Pembina digunakan untuk memulakan objek yang baru dibuat. Biasanya, permulaan adalah berdasarkan nilai yang dihantar kepada pembina sebagai parameter. Pembina tidak boleh menjadi maya kerana mekanisme penghantaran kaedah maya bergantung pada pembina yang memulakan objek terlebih dahulu.

Berikut adalah beberapa contoh pembina:

constructor Field.Copy(var F: Field);

memulakan

Diri sendiri := F;

akhir;

constructor Field.Init(FX, FY, FLen: integer; FName: string);

memulakan

X := FX;

Y := FY;

GetMem(Nama, Panjang(FName) + 1);

Nama^ := FName;

akhir;

pembina TStrField.Init(FX, FY, FLen: integer; FName: string);

memulakan

Init diwarisi(FX, FY, FLen, FName);

Field.Init(FX, FY, FLen, FName);

GetMem(Nilai, Len);

Nilai^ := '';

akhir;

Tindakan utama pembina jenis terbitan (anak), seperti Medan TStr di atas. Init hampir selalu merupakan panggilan kepada pembina yang sesuai bagi induk terdekatnya untuk memulakan medan warisan objek. Selepas melaksanakan prosedur ini, pembina memulakan medan objek yang hanya dimiliki oleh jenis terbitan.

Pemusnah adalah bertentangan dengan pembina dan digunakan untuk membersihkan objek selepas ia digunakan. Biasanya, pembersihan terdiri daripada mengalih keluar semua medan penunjuk dalam objek.

Nota

Pemusnah boleh menjadi maya, dan selalunya. Pemusnah jarang mempunyai parameter.

Berikut adalah beberapa contoh pemusnah:

pemusnah Medan Selesai;

memulakan

FreeMem(Nama, Panjang(Nama^) + 1);

akhir;

pemusnah StrField.Done;

memulakan

FreeMem(Nilai, Len);

Medan Selesai;

akhir;

Pemusnah jenis kanak-kanak, seperti TStrField di atas. Selesai, biasanya mula-mula mengalih keluar medan penunjuk yang diperkenalkan dalam jenis terbitan, dan kemudian, sebagai langkah terakhir, memanggil pengumpul-pemusnah yang sesuai bagi induk terdekat untuk mengalih keluar medan penunjuk warisan objek.

3. Pemusnah

Borland Pascal menyediakan jenis kaedah khas yang dipanggil pengumpul sampah (atau pemusnah) untuk membersihkan dan memadam objek yang diperuntukkan secara dinamik. Pemusnah menggabungkan langkah memadam objek dengan sebarang tindakan atau tugas lain yang diperlukan untuk jenis objek tersebut. Anda boleh menentukan berbilang pemusnah untuk satu jenis objek.

Pemusnah ditakrifkan bersama-sama dengan semua kaedah objek lain dalam definisi jenis objek:

menaip

Temployee = objek

Nama: rentetan[25];

Tajuk: rentetan[25];

Kadar: Sebenar;

constructor Init(ANAme, ATitle: String; ARrate: Real);

pemusnah Selesai; maya;

fungsi GetName: String;

fungsi GetTitle: String;

fungsi GetRate: Rate; maya;

fungsi GetPayAmount: Real; maya;

akhir;

Pemusnah boleh diwarisi dan ia boleh sama ada statik atau maya. Memandangkan pemuktamad yang berbeza cenderung memerlukan jenis objek yang berbeza, secara amnya disyorkan bahawa pemusnah sentiasa maya supaya pemusnah yang betul dilaksanakan untuk setiap jenis objek.

Pemusnah perkataan terpelihara tidak perlu dinyatakan untuk setiap kaedah pembersihan, walaupun definisi jenis objek mengandungi kaedah maya. Pemusnah benar-benar hanya berfungsi pada objek yang diperuntukkan secara dinamik.

Apabila objek yang diperuntukkan secara dinamik dibersihkan, pemusnah menjalankan fungsi khas: ia memastikan bahawa bilangan bait yang betul sentiasa dibebaskan dalam kawasan memori yang diperuntukkan secara dinamik. Tidak ada kebimbangan tentang menggunakan pemusnah dengan objek yang diperuntukkan secara statik; sebenarnya, dengan tidak menghantar jenis objek kepada pemusnah, pengaturcara menafikan objek jenis itu daripada faedah penuh pengurusan memori dinamik dalam Borland Pascal.

Pemusnah sebenarnya menjadi diri mereka sendiri apabila objek polimorfik mesti dibersihkan dan apabila memori yang mereka duduki mesti diagihkan.

Objek polimorfik ialah objek yang telah ditetapkan kepada jenis induk kerana peraturan keserasian jenis lanjutan Borland Pascal. Contoh objek jenis THourly diberikan kepada pembolehubah jenis TEPekerja ialah contoh objek polimorfik. Peraturan ini juga boleh digunakan pada objek; penunjuk kepada THourly boleh diberikan secara bebas kepada penunjuk kepada TEmployee, dan objek yang ditunjukkan oleh penunjuk itu sekali lagi akan menjadi objek polimorfik. Istilah "polimorfik" adalah sesuai kerana kod yang memproses objek "tidak tahu" pada masa penyusunan dengan tepat jenis objek yang akhirnya perlu diproses. Satu-satunya perkara yang diketahui ialah objek ini tergolong dalam hierarki objek yang merupakan keturunan jenis objek yang ditentukan.

Jelas sekali, saiz jenis objek adalah berbeza. Jadi apabila tiba masanya untuk membersihkan objek polimorfik yang diperuntukkan timbunan, bagaimanakah Buang mengetahui berapa banyak bait ruang timbunan untuk dikosongkan? Pada masa penyusunan, tiada maklumat mengenai saiz objek boleh diekstrak daripada objek polimorfik.

Pemusnah menyelesaikan teka-teki ini dengan merujuk kepada tempat maklumat ini ditulis - dalam pembolehubah pelaksanaan TCM. Setiap TBM jenis objek mengandungi saiz dalam bait jenis objek tersebut. Jadual kaedah maya mana-mana objek tersedia melalui parameter tersembunyi Diri, dihantar ke kaedah apabila kaedah dipanggil. Pemusnah hanyalah sejenis kaedah, jadi apabila objek memanggilnya, pemusnah mendapat salinan Diri pada timbunan. Oleh itu, jika sesuatu objek adalah polimorfik pada masa penyusunan, ia tidak akan menjadi polimorfik pada masa larian kerana pengikatan lewat.

Untuk melaksanakan urus niaga terikat lewat ini, pemusnah mesti dipanggil sebagai sebahagian daripada sintaks lanjutan prosedur Buang:

Buang(P, Selesai);

(Panggilan kepada pemusnah di luar prosedur Buang tidak memperuntukkan sebarang memori sama sekali.) Apa yang sebenarnya berlaku di sini ialah pemungut sampah objek yang ditunjuk oleh P dilaksanakan seperti kaedah biasa. Walau bagaimanapun, setelah tindakan terakhir selesai, pemusnah mencari saiz pelaksanaan jenisnya dalam TCM dan menyerahkan saiz kepada prosedur Buang. Prosedur Buang menamatkan proses dengan memadamkan bilangan bait yang betul bagi ruang timbunan yang (ruang) sebelum ini dimiliki oleh P^. Bilangan bait yang akan dibebaskan adalah betul tidak kira sama ada P menunjuk kepada contoh jenis TSGaji atau sama ada ia menunjuk kepada salah satu jenis kanak-kanak jenis TSGaji, seperti TCommissioned.

Ambil perhatian bahawa kaedah pemusnah itu sendiri boleh kosong dan hanya melaksanakan fungsi ini:

destructorAnObject.Done;

memulakan

akhir;

Apa yang berguna dalam pemusnah ini bukanlah hak milik badannya, bagaimanapun, pengkompil menjana kod epilog sebagai tindak balas kepada perkataan simpanan pemusnah. Ia seperti modul yang tidak mengeksport apa-apa, tetapi melakukan beberapa kerja yang tidak kelihatan dengan melaksanakan bahagian permulaannya sebelum memulakan program. Semua tindakan berlaku di belakang tabir.

4. Kaedah Maya

Kaedah menjadi maya jika pengisytiharan jenis objeknya diikuti dengan perkataan terpelihara baharu maya. Jika kaedah dalam jenis induk diisytiharkan sebagai maya, maka semua kaedah dengan nama yang sama dalam jenis anak juga mesti diisytiharkan maya untuk mengelakkan ralat pengkompil.

Berikut ialah objek daripada contoh senarai gaji, dimayakan dengan betul:

menaip

PEmployee = ^TEmployee;

Temployee = objek

Nama, Tajuk: rentetan[25];

Kadar: Sebenar;

constructor Init(ANAme, ATitle: String; ARrate: Real);

fungsi GetPayAmount : Real; maya;

fungsi GetName : String;

fungsi GetTitle : String;

fungsi GetRate : Real;

prosedur Tunjukkan; maya;

akhir;

PHourly = ^THourly;

THourly = objek(Pekerja);

Masa: Integer;

pembina Init(AName, ATitle: String; ARrate: Real; Time: Integer);

fungsi GetPayAmount : Real; maya;

fungsi GetTime : Integer;

akhir;

PSGaji = ^TSgaji;

TSGaji = objek(Pekerja);

fungsi GetPayAmount : Real; maya;

akhir;

Pcommissioned = ^Tcommissioned;

Tcommissioned = objek(Bergaji);

Komisen : Nyata;

Jumlah Jualan : Nyata;

pembina Init(ANAme, ATitle: String; ARate,

ACommission, ASAlesAmount: Real);

fungsi GetPayAmount : Real; maya;

akhir;

Pembina ialah jenis prosedur khas yang melakukan beberapa kerja persediaan untuk mekanisme kaedah maya. Selain itu, pembina mesti dipanggil sebelum sebarang kaedah maya dipanggil. Memanggil kaedah maya tanpa terlebih dahulu memanggil pembina boleh menyekat sistem, dan tidak ada cara untuk pengkompil menyemak susunan kaedah dipanggil.

Setiap jenis objek yang mempunyai kaedah maya mesti mempunyai pembina.

Awas

Pembina mesti dipanggil sebelum sebarang kaedah maya lain dipanggil. Memanggil kaedah maya tanpa panggilan sebelumnya kepada pembina boleh menyebabkan kunci sistem, dan pengkompil tidak boleh menyemak susunan kaedah dipanggil.

Nota

Untuk pembina objek, dicadangkan untuk menggunakan pengecam Init.

Setiap contoh objek yang berbeza mesti dimulakan dengan panggilan pembina yang berasingan. Ia tidak mencukupi untuk memulakan satu contoh objek dan kemudian memberikan contoh itu kepada orang lain. Kejadian lain, walaupun ia mungkin mengandungi data yang sah, tidak akan dimulakan dengan pengendali tugasan dan akan menyekat sistem pada sebarang panggilan ke kaedah mayanya. Sebagai contoh:

var

FBee, GBee: Lebah; { buat dua contoh Lebah }

memulakan

FBee.Init(5, 9) { panggilan pembina untuk FBee }

GBee := FBee; { Gbee tidak sah! }

akhir;

Apakah sebenarnya yang dicipta oleh pembina? Setiap jenis objek mengandungi sesuatu yang dipanggil jadual kaedah maya (VMT) dalam segmen data. TVM mengandungi saiz jenis objek dan, untuk setiap kaedah maya, penunjuk kepada kod yang melaksanakan kaedah tersebut. Pembina mewujudkan hubungan antara pelaksanaan panggilan objek dan jenis TCM objek.

Adalah penting untuk diingat bahawa hanya terdapat satu TBM untuk setiap jenis objek. Contoh berasingan bagi jenis objek (iaitu, pembolehubah jenis ini) mengandungi hanya sambungan kepada TBM, tetapi bukan TBM itu sendiri. Pembina menetapkan nilai sambungan ini kepada TBM. Kerana ini, anda tidak boleh memulakan pelaksanaan sebelum memanggil pembina.

5. Medan data objek dan parameter kaedah formal

Implikasi fakta bahawa kaedah dan objeknya berkongsi skop yang sama ialah parameter formal kaedah tidak boleh sama dengan mana-mana medan data objek. Ini bukan sekatan baharu yang dikenakan oleh pengaturcaraan berorientasikan objek, tetapi peraturan skop lama yang sama yang selalu ada pada Pascal. Ini adalah sama seperti menghalang parameter formal prosedur daripada sama dengan pembolehubah tempatan prosedur:

prosedur CrunchIt(Crunchee: MyDataRec, Crunchby,

Kod Ralat: integer);

var

A, B: char;

Kod Ralat: integer;

memulakan

.

.

.

Pembolehubah tempatan prosedur dan parameter formalnya berkongsi skop yang sama dan oleh itu tidak boleh sama. Anda akan menerima mesej "Ralat 4: Pengecam pendua" jika anda cuba menyusun sesuatu seperti ini, ralat yang sama berlaku apabila anda cuba menetapkan parameter kaedah formal kepada nama medan objek yang dimiliki oleh kaedah ini.

Keadaannya agak berbeza, kerana meletakkan pengepala prosedur di dalam struktur data adalah tanda kepada inovasi dalam Turbo Pascal, tetapi prinsip asas skop Pascal tidak berubah.

KULIAH Bil 13. Keserasian jenis objek

1. Enkapsulasi

Gabungan kod dan data dalam objek dipanggil enkapsulasi. Pada dasarnya, adalah mungkin untuk menyediakan kaedah yang mencukupi supaya pengguna objek tidak akan mengakses medan objek secara langsung. Beberapa bahasa berorientasikan objek lain, seperti Smalltalk, memerlukan enkapsulasi mandatori, tetapi Borland Pascal mempunyai pilihan.

Sebagai contoh, objek TEmployee dan THourly ditulis dengan cara yang sama sekali tidak perlu mengakses medan data dalaman mereka secara langsung:

jenis

Temployee = objek

Nama, Tajuk: rentetan[25];

Kadar: Sebenar;

procedure Init(AName, ATitle: string; ARrate: Real);

fungsi GetName : String;

fungsi GetTitle : String;

fungsi GetRate : Real;

fungsi GetPayAmount : Real;

akhir;

THourly = objek(Pekerja)

Masa: Integer;

procedure Init(ANAme, ATitle: string; ARrate:

Nyata, Atime: Integer);

fungsi GetPayAmount : Real;

akhir;

Terdapat hanya empat medan data di sini: Nama, Tajuk, Kadar dan Masa. Kaedah GetName dan GetTitle memaparkan nama keluarga dan kedudukan pekerja, masing-masing. Kaedah GetPayAmount menggunakan Kadar, dan dalam kes kerja SETIAP JAM dan Masa untuk mengira jumlah pembayaran kepada pekerja. Tidak perlu lagi merujuk terus ke medan data ini.

Dengan mengandaikan kewujudan contoh AnHourly jenis THourly, kami boleh menggunakan satu set kaedah untuk memanipulasi medan data AnHourly seperti ini:

dengan kerja setiap jam

memulakan

Init (Aleksandr Petrov, Operator lif fork' 12.95, 62);

{Memaparkan nama keluarga, kedudukan dan jumlah pembayaran}

Tunjukkan;

akhir;

Perlu diingatkan bahawa akses kepada medan objek dijalankan hanya dengan bantuan kaedah objek ini.

2. Mengembangkan Objek

Malangnya, Pascal standard tidak menyediakan sebarang kemudahan untuk mencipta prosedur fleksibel yang membolehkan anda bekerja dengan jenis data yang berbeza sama sekali. Pengaturcaraan berorientasikan objek menyelesaikan masalah ini dengan warisan: jika jenis terbitan ditakrifkan, maka kaedah jenis induk diwarisi, tetapi ia boleh ditindih jika dikehendaki. Untuk mengatasi kaedah yang diwarisi, hanya mengisytiharkan kaedah baharu dengan nama yang sama dengan kaedah yang diwarisi, tetapi dengan badan yang berbeza dan (jika perlu) set parameter yang berbeza.

Mari kita takrifkan jenis kanak-kanak Pekerja TE yang mewakili pekerja yang dibayar kadar setiap jam dalam contoh berikut:

malar

PayPeriods = 26; { tempoh pembayaran }

Ambang Lebih Masa = 80; { untuk tempoh pembayaran }

Faktor Lebih Masa = 1.5; { kadar setiap jam }

jenis

THourly = objek(Pekerja)

Masa: Integer;

procedure Init(ANAme, ATitle: string; ARrate:

Nyata, Atime: Integer);

fungsi GetPayAmount : Real;

akhir;

prosedur THourly.Init(ANAme, ATitle: string;

ARrate: Real, Atime: Integer);

memulakan

TEmployee.Init(ANName, ATitle, ARrate);

Masa : = ATime;

akhir;

fungsi THourly.GetPayAmount: Real;

var

Lebih masa: Integer;

memulakan

Lebih Masa := Masa - Ambang Lebih Masa;

jika Kerja Lebih Masa > 0 maka

GetPayAmount := RoundPay(Lebih Masa Ambang * Kadar +

Kadar Lebih Masa * Faktor Lebih Masa * Kadar)

lagi

GetPayAmount := RoundPay(Masa * Kadar)

akhir;

Seseorang yang dibayar mengikut kadar setiap jam ialah seorang pekerja: dia mempunyai segala-galanya yang digunakan untuk menentukan objek TEmployee (nama, jawatan, kadar), dan hanya jumlah wang yang diterima setiap jam bergantung pada berapa jam dia bekerja semasa tempoh kena bayar. Oleh itu, THourly juga memerlukan medan Masa.

Oleh kerana THourly mentakrifkan medan Masa baharu, pengamulaannya memerlukan kaedah Init baharu yang memulakan kedua-dua masa dan medan yang diwarisi. Daripada memberikan nilai terus kepada medan yang diwarisi seperti Nama, Tajuk dan Kadar, mengapa tidak menggunakan semula kaedah permulaan objek TEmployee (diilustrasikan oleh pernyataan THourly Init yang pertama).

Memanggil kaedah yang sedang ditindih bukanlah gaya terbaik. Secara umum, kemungkinan TEmployee.Init melakukan pemulaan yang penting tetapi tersembunyi.

Apabila memanggil kaedah yang diganti, anda mesti memastikan bahawa jenis objek terbitan termasuk kefungsian induk. Di samping itu, sebarang perubahan dalam kaedah induk secara automatik memberi kesan kepada semua keturunan.

Selepas memanggil TEmployee.Init, THourly.Init kemudiannya boleh melakukan pemulaannya sendiri, yang dalam kes ini hanya terdiri daripada memberikan nilai yang diluluskan dalam ATime.

Satu lagi contoh kaedah yang dibatalkan ialah fungsi THourly.GetPayAmount, yang mengira jumlah pembayaran untuk pekerja setiap jam. Malah, setiap jenis objek TEmployee mempunyai kaedah GetPayAmount sendiri, kerana jenis pekerja bergantung pada cara pengiraan dibuat. Kaedah THourly.GetPayAmount harus mengambil kira berapa jam pekerja itu bekerja, sama ada terdapat kerja lebih masa, apakah faktor peningkatan untuk kerja lebih masa, dsb.

Kaedah bergaji. GetPayAmount hanya perlu membahagikan kadar pekerja dengan bilangan pembayaran dalam setiap tahun (dalam contoh kami).

pekerja unit;

antara muka

malar

Tempoh Gaji = 26; {dalam tahun}

Ambang Lebih Masa = 80; {untuk setiap tempoh pembayaran}

Faktor Lebih Masa=1.5; {kenaikan berbanding bayaran biasa}

jenis

Temployee = objek

Nama, Tajuk: rentetan[25];

Kadar: Sebenar;

procedure Init(AName, ATitle: string; ARrate: Real);

fungsi GetName : String;

fungsi GetTitle : String;

fungsi GetRate : Real;

fungsi GetPayAmount : Real;

akhir;

THourly = objek(Pekerja)

Masa: Integer;

procedure Init(ANAme, ATitle: string; ARrate:

Nyata, Atime: Integer);

fungsi GetPayAmount : Real;

fungsi GetTime : Real;

akhir;

TSGaji = objek(Pekerja)

fungsi GetPayAmount : Real;

akhir;

Tcommissioned = objek(TSgaji)

Komisen : Nyata;

Jumlah Jualan : Nyata;

pembina Init(ANAme, ATitle: String; ARate,

ACommission, ASAlesAmount: Real);

fungsi GetPayAmount : Real;

akhir;

pelaksanaan

fungsi RoundPay(Upah: Nyata): Nyata;

{bundarkan pembayaran untuk mengabaikan jumlah yang kurang daripada

unit kewangan}

memulakan

RoundPay := Trunc(Upah * 100) / 100;

.

.

.

TEmployee ialah bahagian atas hierarki objek kami dan mengandungi kaedah GetPayAmount yang pertama.

fungsi TEmployee.GetPayAmount : Real;

memulakan

RunError(211); { beri ralat masa jalan }

akhir;

Ia mungkin mengejutkan bahawa kaedah itu memberikan ralat masa jalan. Jika Employee.GetPayAmount dipanggil, ralat berlaku dalam program. kenapa? Kerana TEmployee ialah bahagian atas hierarki objek kami dan tidak mentakrifkan pekerja sebenar; oleh itu, tiada kaedah TEmployee dipanggil dengan cara tertentu, walaupun ia mungkin diwarisi. Semua pekerja kami sama ada mengikut jam, bergaji atau kerja sekeping. Ralat masa jalan menamatkan pelaksanaan program dan mengeluarkan 211, yang sepadan dengan mesej ralat yang dikaitkan dengan panggilan kaedah abstrak (jika program memanggil TEmployee.GetPayAmount secara tidak sengaja).

Di bawah ialah kaedah THourly.GetPayAmount, yang mengambil kira perkara seperti gaji lebih masa, jam bekerja, dsb.

fungsi THourly.GetPayAMount : Real;

var

Lebih Masa: Integer;

memulakan

Lebih Masa := Masa - Ambang Lebih Masa;

jika Kerja Lebih Masa > 0 maka

GetPayAmount := RoundPay(Lebih Masa Ambang * Kadar +

Kadar Lebih Masa * Faktor Lebih Masa * Kadar)

lagi

GetPayAmount := RoundPay(Masa * Kadar)

akhir;

Kaedah Tsalaried.GetPayAmount adalah lebih mudah; bertaruh di dalamnya

dibahagikan dengan bilangan pembayaran:

fungsi TSalaried.GetPayAmount : Real;

memulakan

GetPayAmount := RoundPay(Kadar / Tempoh Bayaran);

akhir;

Jika anda melihat kaedah TCommissioned.GetPayAmount, anda akan melihat bahawa ia memanggil TSalaried.GetPayAmount, mengira komisen dan menambahkannya pada nilai yang dikembalikan oleh kaedah Tsalaried. GetPayAmount.

fungsi TСommissioned.GetPayAmount : Real;

memulakan

GetPayAmount := RoundPay(TSalaried.GetPayAmount +

Komisen * Jumlah Jualan);

akhir;

Nota penting: Walaupun kaedah boleh ditindih, medan data tidak boleh ditindih. Sebaik sahaja medan data telah ditakrifkan dalam hierarki objek, tiada jenis anak boleh menentukan medan data dengan nama yang betul-betul sama.

3. Keserasian jenis objek

Warisan mengubah suai peraturan keserasian jenis Borland Pascal sedikit sebanyak. Antara lain, jenis terbitan mewarisi keserasian jenis semua jenis induknya.

Keserasian jenis lanjutan ini mengambil tiga bentuk:

1) antara pelaksanaan objek;

2) antara penunjuk kepada pelaksanaan objek;

3) antara parameter formal dan sebenar.

Walau bagaimanapun, adalah sangat penting untuk diingat bahawa dalam ketiga-tiga bentuk, keserasian jenis hanya meliputi anak kepada ibu bapa. Dalam erti kata lain, jenis kanak-kanak boleh digunakan secara bebas menggantikan jenis ibu bapa, tetapi bukan sebaliknya.

Sebagai contoh, TSalaried ialah anak kepada TEmployee dan TSosh-missioned ialah anak kepada TSalaried. Dengan itu, pertimbangkan huraian berikut:

menaip

PEmployee = ^TEmployee;

PSGaji = ^TSgaji;

Pcommissioned = ^Tcommissioned;

var

Seorang Pekerja: TEmployee;

ASGaji: TSGaji;

Pcommissioned: TCommissioned;

TEmployeePtr: PEmployee;

TSGajiPtr: PSGaji;

TCommissionedPtr: PCCommissioned;

Di bawah huraian ini, pengendali berikut adalah sah

tugasan:

Seorang Pekerja :=Agaji;

ASGaji : = Acommissioned;

TCommissionedPtr := ACommissioned;

Nota

Objek induk boleh diberikan contoh mana-mana jenis terbitannya. Tugasan belakang tidak dibenarkan.

Konsep ini baharu kepada Pascal, dan pada mulanya mungkin sukar untuk mengingati keserasian jenis pesanan yang masuk. Anda perlu berfikir seperti ini: sumber mesti dapat mengisi penerima sepenuhnya. Jenis terbitan mengandungi semua yang terdapat pada jenis induknya disebabkan oleh harta warisan. Oleh itu, jenis terbitan sama ada saiz yang sama, atau (yang selalunya berlaku) ia lebih besar daripada induknya, tetapi tidak pernah lebih kecil. Menugaskan objek ibu bapa (ibu bapa) kepada anak (anak) boleh meninggalkan beberapa medan objek kanak-kanak itu tidak ditentukan, yang berbahaya dan oleh itu menyalahi undang-undang.

Dalam penyata tugasan, hanya medan yang biasa kepada kedua-dua jenis akan disalin daripada sumber ke destinasi. Dalam pengendali tugasan:

SeorangPekerja:= Acommissioned;

Hanya medan Nama, Tajuk dan Kadar daripada ACommissioned akan disalin ke AnEmployee, kerana ini adalah satu-satunya medan yang biasa untuk TCommissioned dan TEmployee. Keserasian jenis juga berfungsi antara penunjuk kepada jenis objek, dan mengikut peraturan umum yang sama seperti pelaksanaan objek. Penunjuk kepada kanak-kanak boleh diberikan kepada penuding kepada ibu bapa. Memandangkan takrifan sebelumnya, tugasan penunjuk berikut adalah sah:

TSSalariedPtr:= TCommissionedPtr;

TEmployeePtr:= TSalariedPtr;

TEmployeePtr:= PCommissionedPtr;

Ingat bahawa tugasan terbalik tidak dibenarkan!

Parameter formal (sama ada nilai atau parameter pembolehubah) jenis objek tertentu boleh mengambil sebagai parameter sebenar objek jenisnya sendiri atau objek semua jenis kanak-kanak. Jika anda menentukan pengepala prosedur seperti ini:

prosedur CalcFedTax(Mangsa: TSGaji);

maka jenis parameter sebenar boleh TSGaji atau TCommissioned, tetapi bukan TEmployee. Mangsa juga boleh menjadi parameter berubah-ubah. Dalam kes ini, peraturan keserasian yang sama dipatuhi.

Nota:

Terdapat perbezaan asas antara parameter nilai dan parameter pembolehubah. Parameter nilai ialah penunjuk kepada objek sebenar yang diluluskan sebagai parameter, manakala parameter pembolehubah hanyalah salinan parameter sebenar. Selain itu, salinan ini hanya termasuk medan yang disertakan dalam jenis parameter nilai formal. Ini bermakna bahawa parameter sebenar benar-benar ditukar kepada jenis parameter formal. Parameter pembolehubah lebih seperti menghantar ke corak, dalam erti kata bahawa parameter sebenar kekal tidak berubah.

Begitu juga, jika parameter formal ialah penunjuk kepada jenis objek, parameter sebenar boleh menjadi penunjuk kepada jenis objek itu atau kepada mana-mana jenis kanak-kanak. Biarkan tajuk prosedur diberikan:

procedure Worker.Add(AWorker: PSalared);

Jenis parameter sebenar yang sah kemudiannya akan dibayar gaji atau PCommissioned, tetapi bukan PEmployee.

KULIAH Bil 14. Asembler

1. Mengenai assembler

Suatu ketika dahulu, assembler adalah bahasa tanpa mengetahui yang mana mustahil untuk membuat komputer melakukan sesuatu yang berguna. Secara beransur-ansur keadaan berubah. Cara komunikasi yang lebih mudah dengan komputer muncul. Tetapi tidak seperti bahasa lain, penghimpun tidak mati; lebih-lebih lagi, ia tidak dapat melakukan ini pada dasarnya. kenapa? Untuk mencari jawapan, kami akan cuba memahami apa itu bahasa himpunan secara umum.

Ringkasnya, bahasa himpunan adalah perwakilan simbolik bahasa mesin. Semua proses dalam mesin pada tahap perkakasan yang paling rendah hanya didorong oleh arahan (arahan) bahasa mesin. Daripada ini adalah jelas bahawa, walaupun nama biasa, bahasa pemasangan untuk setiap jenis komputer adalah berbeza. Ini juga terpakai pada penampilan program yang ditulis dalam penghimpun, dan idea yang dicerminkan oleh bahasa ini.

Benar-benar menyelesaikan masalah berkaitan perkakasan (atau, lebih-lebih lagi, yang berkaitan dengan perkakasan, seperti mempercepatkan atur cara, contohnya) adalah mustahil tanpa pengetahuan tentang pemasang.

Seorang pengaturcara atau mana-mana pengguna lain boleh menggunakan mana-mana alat peringkat tinggi sehingga program untuk membina dunia maya dan, mungkin, tidak mengesyaki bahawa komputer sebenarnya tidak melaksanakan arahan bahasa di mana atur caranya ditulis, tetapi perwakilannya yang diubah. dalam bentuk perintah urutan yang membosankan dan membosankan bahasa yang sama sekali berbeza - bahasa mesin. Sekarang bayangkan bahawa pengguna sedemikian mempunyai masalah yang tidak standard. Sebagai contoh, programnya mesti berfungsi dengan beberapa peranti luar biasa atau melakukan tindakan lain yang memerlukan pengetahuan tentang prinsip perkakasan komputer. Tidak kira betapa baiknya bahasa di mana pengaturcara menulis programnya, dia tidak boleh melakukannya tanpa mengetahui penghimpun. Dan bukan kebetulan bahawa hampir semua penyusun bahasa peringkat tinggi mengandungi cara menyambungkan modul mereka dengan modul dalam pemasang atau akses sokongan ke peringkat pengaturcaraan pemasang.

Komputer terdiri daripada beberapa peranti fizikal, setiap satu disambungkan kepada satu unit, dipanggil unit sistem. Untuk memahami tujuan fungsinya, mari kita lihat gambarajah blok komputer biasa (Rajah 1). Ia tidak berpura-pura kepada ketepatan mutlak dan hanya bertujuan untuk menunjukkan tujuan, kesalinghubungan dan komposisi tipikal unsur-unsur komputer peribadi moden.

nasi. 1. Gambar rajah struktur komputer peribadi

2. Model perisian mikropemproses

Dalam pasaran komputer hari ini, terdapat pelbagai jenis komputer yang berbeza. Oleh itu, adalah mungkin untuk mengandaikan bahawa pengguna akan mempunyai soalan tentang cara menilai keupayaan jenis (atau model) komputer tertentu dan ciri tersendiri daripada komputer jenis lain (model). Untuk menyatukan semua konsep yang mencirikan komputer dari segi sifat terkawal program berfungsi, terdapat istilah khas - seni bina komputer. Buat pertama kalinya, konsep seni bina komputer mula disebut dengan kemunculan mesin generasi ke-3 untuk penilaian perbandingannya.

Adalah wajar untuk mula mempelajari bahasa pemasangan mana-mana komputer hanya selepas mengetahui bahagian komputer yang dibiarkan kelihatan dan tersedia untuk pengaturcaraan dalam bahasa ini. Ini adalah model program komputer yang dipanggil, sebahagian daripadanya ialah model program mikropemproses, yang mengandungi tiga puluh dua daftar, lebih kurang tersedia untuk digunakan oleh pengaturcara.

Daftar ini boleh dibahagikan kepada dua kumpulan besar:

1) 6 daftar pengguna;

2) 16 daftar sistem.

3. Daftar pengguna

Seperti namanya, daftar pengguna dipanggil kerana pengaturcara boleh menggunakannya semasa menulis programnya. Daftar ini termasuk (Gamb. 2):

1) lapan daftar 32-bit yang boleh digunakan oleh pengaturcara untuk menyimpan data dan alamat (ia juga dipanggil daftar tujuan umum (RON)):

eax/ax/ah/al;

ebx/bx/bh/bl;

edx/dx/dh/dl;

ecx/cx/ch/cl;

ebp/bp;

esi/si;

edi/di;

esp/sp.

2) enam daftar segmen: cs, ds, ss, es, fs, gs;

3) daftar status dan kawalan:

bendera daftar bendera/bendera;

daftar penunjuk arahan eip/ip.

nasi. 2. Daftar pengguna

Banyak daftar ini diberikan dengan garis miring. Ini bukan daftar yang berbeza - ia adalah sebahagian daripada satu daftar 32-bit yang besar. Mereka boleh digunakan dalam program sebagai objek berasingan.

4. Daftar am

Semua daftar kumpulan ini membenarkan anda mengakses bahagian "bawah" mereka. Hanya bahagian bawah 16- dan 8-bit daftar ini boleh digunakan untuk mengalamatkan diri. 16 bit atas daftar ini tidak tersedia sebagai objek bebas.

Mari kita senaraikan daftar yang tergolong dalam kumpulan daftar tujuan umum. Oleh kerana daftar ini terletak secara fizikal dalam mikropemproses di dalam unit logik aritmetik (AL>), ia juga dipanggil daftar ALU:

1) eax/ax/ah/al (Daftar akumulator) - bateri. Digunakan untuk menyimpan data perantaraan. Dalam beberapa arahan, penggunaan daftar ini adalah wajib;

2) ebx/bx/bh/bl (Daftar asas) - daftar asas. Digunakan untuk menyimpan alamat asas beberapa objek dalam ingatan;

3) ecx/cx/ch/cl (Daftar kiraan) - daftar kaunter. Ia digunakan dalam arahan yang melakukan beberapa tindakan berulang. Penggunaannya selalunya tersirat dan tersembunyi dalam algoritma arahan yang sepadan.

Sebagai contoh, arahan organisasi gelung, selain memindahkan kawalan kepada arahan yang terletak di alamat tertentu, menganalisis dan mengurangkan nilai daftar esx/cx dengan satu;

4) edx/dx/dh/dl (Data register) - daftar data.

Sama seperti daftar eax/ax/ah/al, ia menyimpan data perantaraan. Sesetengah arahan memerlukan penggunaannya; untuk beberapa arahan ini berlaku secara tersirat.

Dua daftar berikut digunakan untuk menyokong operasi rantaian yang dipanggil, iaitu operasi yang memproses rantaian unsur secara berurutan, setiap satunya boleh menjadi 32, 16 atau 8 bit panjang:

1) esi/si (daftar Indeks Sumber) - indeks sumber.

Daftar dalam operasi rantaian ini mengandungi alamat semasa elemen dalam rantaian sumber;

2) edi/di (daftar Indeks Destinasi) - indeks penerima (penerima). Daftar dalam operasi rantaian ini mengandungi alamat semasa dalam rantaian destinasi.

Dalam seni bina mikropemproses pada peringkat perkakasan dan perisian, struktur data seperti timbunan disokong. Untuk bekerja dengan timbunan dalam sistem arahan mikropemproses terdapat arahan khas, dan dalam model perisian mikropemproses terdapat daftar khas untuk ini:

1) esp/sp (daftar Penunjuk Tindanan) - daftar penuding tindanan. Mengandungi penuding ke bahagian atas tindanan dalam segmen tindanan semasa.

2) ebp/bp (daftar Penunjuk Asas) - daftar penuding asas bingkai tindanan. Direka bentuk untuk mengatur akses rawak kepada data di dalam tindanan.

Penggunaan penyematan keras daftar untuk beberapa arahan memungkinkan untuk mengekod perwakilan mesin mereka dengan lebih padat. Mengetahui ciri-ciri ini akan, jika perlu, menjimatkan sekurang-kurangnya beberapa bait memori yang diduduki oleh kod program.

5. Daftar segmen

Terdapat enam daftar segmen dalam model perisian mikropemproses: cs, ss, ds, es, gs, fs.

Kewujudan mereka adalah disebabkan oleh spesifikasi organisasi dan penggunaan RAM oleh mikropemproses Intel. Ia terletak pada fakta bahawa perkakasan mikropemproses menyokong organisasi struktur program dalam bentuk tiga bahagian, yang dipanggil segmen. Sehubungan itu, organisasi ingatan sedemikian dipanggil bersegmen.

Untuk menunjukkan segmen yang program mempunyai akses pada masa tertentu, daftar segmen dimaksudkan. Sebenarnya (dengan sedikit pembetulan) daftar ini mengandungi alamat memori dari mana segmen yang sepadan bermula. Logik memproses arahan mesin dibina sedemikian rupa sehingga alamat dalam daftar segmen yang jelas digunakan secara tersirat apabila mengambil arahan, mengakses data program atau mengakses timbunan.

Mikropemproses menyokong jenis segmen berikut.

1. Segmen kod. Mengandungi arahan program. Untuk mengakses segmen ini, daftar cs (daftar segmen kod) digunakan - daftar kod segmen. Ia mengandungi alamat segmen arahan mesin yang boleh diakses oleh mikropemproses (iaitu, arahan ini dimuatkan ke dalam saluran paip mikropemproses).

2. Segmen data. Mengandungi data yang diproses oleh program. Untuk mengakses segmen ini, daftar ds (daftar segmen data) digunakan - daftar data segmen yang menyimpan alamat segmen data program semasa.

3. Segmen timbunan. Segmen ini ialah kawasan ingatan yang dipanggil timbunan. Mikropemproses mengatur kerja dengan tindanan mengikut prinsip berikut: elemen terakhir yang ditulis ke kawasan ini dipilih dahulu. Untuk mengakses segmen ini, daftar ss (daftar segmen tindanan) digunakan - daftar segmen tindanan yang mengandungi alamat segmen tindanan.

4. Segmen data tambahan. Secara tersirat, algoritma untuk melaksanakan kebanyakan arahan mesin mengandaikan bahawa data yang mereka proses terletak dalam segmen data, alamatnya dalam daftar segmen ds. Jika program tidak mempunyai cukup satu segmen data, maka ia mempunyai peluang untuk menggunakan tiga lagi segmen data tambahan. Tetapi tidak seperti segmen data utama, yang alamatnya terkandung dalam daftar segmen ds, apabila menggunakan segmen data tambahan, alamatnya mesti dinyatakan secara eksplisit menggunakan awalan definisi semula segmen khas dalam arahan. Alamat segmen data tambahan mesti terkandung dalam daftar es, gs, fs (daftar segmen data sambungan).

6. Daftar status dan kawalan

Mikropemproses termasuk beberapa daftar yang sentiasa mengandungi maklumat tentang keadaan kedua-dua mikropemproses itu sendiri dan program yang arahannya sedang dimuatkan ke saluran paip. Daftar ini termasuk:

1) bendera daftar bendera/bendera;

2) daftar penunjuk arahan eip/ip.

Menggunakan daftar ini, anda boleh mendapatkan maklumat tentang hasil pelaksanaan arahan dan mempengaruhi keadaan mikropemproses itu sendiri. Mari kita pertimbangkan dengan lebih terperinci tujuan dan kandungan daftar ini.

1. bendera/bendera (flag register) - daftar bendera. Kedalaman bit eflag/flag ialah 32/16 bit. Bit individu daftar ini mempunyai tujuan fungsi tertentu dan dipanggil bendera. Bahagian bawah daftar ini betul-betul sama dengan daftar bendera untuk tahun 18086. Rajah 3 menunjukkan kandungan daftar bendera.

nasi. 3. Kandungan daftar bendera

Bergantung pada cara ia digunakan, bendera daftar bendera/bendera boleh dibahagikan kepada tiga kumpulan:

1) lapan bendera status.

Bendera ini mungkin berubah selepas arahan mesin telah dilaksanakan. Bendera status daftar bendera mencerminkan spesifik hasil pelaksanaan operasi aritmetik atau logik. Ini memungkinkan untuk menganalisis keadaan proses pengiraan dan bertindak balas terhadapnya menggunakan arahan lompat bersyarat dan panggilan subrutin. Jadual 1 menyenaraikan bendera status dan tujuannya.

2) satu bendera kawalan.

Ditandakan df (Bendera Direktori). Ia terletak dalam bit 10 daftar eflag dan digunakan oleh arahan berantai. Nilai bendera df menentukan arah pemprosesan elemen demi elemen dalam operasi ini: dari awal rentetan hingga akhir (df = 0) atau sebaliknya, dari akhir rentetan hingga permulaannya (df = 1). Terdapat arahan khas untuk bekerja dengan bendera df: eld (keluarkan bendera df) dan std (tetapkan bendera df). Penggunaan arahan ini membolehkan anda melaraskan bendera df mengikut algoritma dan memastikan bahawa pembilang secara automatik dinaikkan atau dikurangkan apabila melakukan operasi pada rentetan.

3) lima bendera sistem.

Mereka mengawal I/O, gangguan bertopeng, nyahpepijat, penukaran tugas dan mod maya 8086. Program aplikasi tidak disyorkan untuk mengubah suai bendera ini tanpa perlu, kerana ini akan menyebabkan program ditamatkan dalam kebanyakan kes. Jadual 2 menyenaraikan bendera sistem dan tujuannya.

Jadual 1. Bendera statusJadual 2. Bendera sistem

2. eip/ip (daftar Instraction Pointer) - daftar penunjuk arahan. Daftar eip/ip adalah 32/16 bit lebar dan mengandungi offset arahan seterusnya yang akan dilaksanakan berbanding kandungan daftar segmen cs dalam segmen arahan semasa. Daftar ini tidak boleh diakses secara langsung kepada pengaturcara, tetapi nilainya dimuatkan dan diubah oleh pelbagai arahan kawalan, yang termasuk arahan untuk lompatan bersyarat dan tanpa syarat, prosedur panggilan dan kembali daripada prosedur. Kejadian gangguan juga mengubah suai daftar eip/ip.

KULIAH Bil 15. Daftar

1. Daftar sistem mikropemproses

Nama daftar ini menunjukkan bahawa mereka melaksanakan fungsi tertentu dalam sistem. Penggunaan daftar sistem dikawal ketat. Merekalah yang menyediakan mod yang dilindungi. Mereka juga boleh dianggap sebagai sebahagian daripada seni bina mikropemproses, yang sengaja dibiarkan kelihatan supaya pengaturcara sistem yang berkelayakan boleh melakukan operasi tahap paling rendah.

Daftar sistem boleh dibahagikan kepada tiga kumpulan:

1) empat daftar kawalan;

2) empat daftar alamat sistem;

3) lapan daftar nyahpepijat.

2. Daftar kawalan

Kumpulan daftar kawalan termasuk empat daftar: cr0, cr1, cr2, cr3. Daftar ini adalah untuk kawalan sistem umum. Daftar kawalan hanya tersedia untuk program dengan tahap keistimewaan 0.

Walaupun mikropemproses mempunyai empat daftar kawalan, hanya tiga daripadanya tersedia - cr1 dikecualikan, fungsi yang belum ditentukan (ia dikhaskan untuk kegunaan masa hadapan).

Daftar cr0 mengandungi bendera sistem yang mengawal mod operasi mikropemproses dan mencerminkan keadaannya secara global, tanpa mengira tugas khusus yang dilakukan.

Tujuan bendera sistem:

1) pe (Protect Enable), bit 0 - dayakan mod operasi yang dilindungi. Keadaan bendera ini menunjukkan dalam mana antara dua mod - nyata (pe = 0) atau dilindungi (pe = 1) - mikropemproses beroperasi pada masa tertentu;

2) mp (Math Present), bit 1 - kehadiran coprocessor. Sentiasa 1;

3) ts (Task Switched), bit 3 - penukaran tugas. Pemproses secara automatik menetapkan bit ini apabila ia beralih kepada tugas lain;

4) pagi (Alignment Mask), bit 18 - alignment mask. Bit ini membolehkan (am = 1) atau melumpuhkan (am = 0) kawalan penjajaran;

5) cd (Cache Disable), bit 30 - lumpuhkan memori cache.

Menggunakan bit ini, anda boleh melumpuhkan (cd =1) atau membolehkan (cd = 0) penggunaan cache dalaman (cache peringkat pertama);

6) pg (Paging), bit 31 - dayakan (pg =1) atau nyahdayakan (pg = 0).

Bendera digunakan dalam model paging organisasi memori.

Daftar cr2 digunakan dalam paging RAM untuk mendaftarkan situasi apabila arahan semasa mengakses alamat yang terkandung dalam halaman memori yang pada masa ini tiada dalam ingatan.

Dalam keadaan sedemikian, nombor pengecualian 14 berlaku dalam mikropemproses, dan alamat 32-bit linear arahan yang menyebabkan pengecualian ini ditulis untuk mendaftarkan cr2. Dengan maklumat ini, pengendali pengecualian 14 menentukan halaman yang dikehendaki, menukarnya ke dalam memori dan menyambung semula operasi biasa program;

Daftar cr3 juga digunakan untuk memori paging. Ini adalah apa yang dipanggil daftar direktori halaman peringkat pertama. Ia mengandungi alamat asas fizikal 20-bit bagi direktori halaman tugas semasa. Direktori ini mengandungi 1024 deskriptor 32-bit, setiap satunya mengandungi alamat jadual halaman peringkat kedua. Seterusnya, setiap jadual halaman peringkat kedua mengandungi 1024 deskriptor 32-bit yang menangani bingkai halaman dalam ingatan. Saiz bingkai halaman ialah 4 KB.

3. Daftar alamat sistem

Daftar ini juga dipanggil daftar pengurusan memori.

Ia direka untuk melindungi program dan data dalam mod berbilang tugas mikropemproses. Apabila beroperasi dalam mod dilindungi mikropemproses, ruang alamat dibahagikan kepada:

1) global - biasa untuk semua tugas;

2) tempatan - berasingan untuk setiap tugas.

Pemisahan ini menerangkan kehadiran daftar sistem berikut dalam seni bina mikropemproses:

1) daftar gdtr jadual deskriptor global (Daftar Jadual Deskriptor Global), mempunyai saiz 48 bit dan mengandungi alamat asas 32-bit (bit 16-47) bagi jadual deskriptor global GDT dan 16-bit (bit 0-15) nilai had, iaitu saiz dalam bait jadual GDT;

2) daftar jadual deskriptor tempatan ldtr (Daftar Jadual Deskriptor Tempatan), mempunyai saiz 16 bit dan mengandungi apa yang dipanggil pemilih deskriptor bagi jadual deskriptor tempatan LDT Pemilih ini adalah penunjuk dalam jadual GDT, yang menerangkan segmen yang mengandungi jadual deskriptor tempatan LDT;

3) daftar jadual deskriptor interrupt idtr (Daftar Jadual Deskriptor Interrupt), mempunyai saiz 48 bit dan mengandungi alamat asas 32-bit (bit 16-47) bagi jadual deskriptor interrupt IDT dan 16-bit (bit 0-15) nilai had, iaitu saiz dalam bait jadual IDT;

4) Daftar tugas 16-bit tr (Daftar Tugas), yang, seperti daftar ldtr, mengandungi pemilih, iaitu penunjuk kepada deskriptor dalam jadual GDT. Deskriptor ini menerangkan Status Segmen Tugas (TSS) semasa. Segmen ini dicipta untuk setiap tugas dalam sistem, mempunyai struktur yang dikawal ketat dan mengandungi konteks (keadaan semasa) tugasan. Tujuan utama segmen TSS adalah untuk menyimpan keadaan semasa tugasan semasa beralih kepada tugasan lain.

4. ​​Daftar nyahpepijat

Ini adalah kumpulan daftar yang sangat menarik yang bertujuan untuk penyahpepijatan perkakasan. Alat penyahpepijatan perkakasan pertama kali muncul dalam mikropemproses i486. Dalam perkakasan, mikropemproses mengandungi lapan daftar nyahpepijat, tetapi hanya enam daripadanya sebenarnya digunakan.

Daftar dr0, dr1, dr2, dr3 mempunyai lebar 32 bit dan direka bentuk untuk menetapkan alamat linear empat titik putus. Mekanisme yang digunakan dalam kes ini adalah seperti berikut: sebarang alamat yang dijana oleh program semasa dibandingkan dengan alamat dalam daftar dr0... dr3, dan jika terdapat padanan, pengecualian penyahpepijatan dengan nombor 1 dijana.

Daftar dr6 dipanggil daftar status nyahpepijat. Bit dalam daftar ini ditetapkan mengikut sebab yang menyebabkan pengecualian nombor 1 terakhir berlaku.

Kami menyenaraikan bit ini dan tujuannya:

1) b0 - jika bit ini ditetapkan kepada 1, maka pengecualian terakhir (gangguan) berlaku akibat daripada mencapai pusat pemeriksaan yang ditakrifkan dalam daftar dr0;

2) b1 - serupa dengan b0, tetapi untuk pusat pemeriksaan dalam daftar dr1;

3) b2 - serupa dengan b0, tetapi untuk pusat pemeriksaan dalam daftar dr2;

4) bЗ - serupa dengan b0, tetapi untuk pusat pemeriksaan dalam daftar dr3;

5) bd (bit 13) - berfungsi untuk melindungi daftar debug;

6) bs (bit 14) - ditetapkan kepada 1 jika pengecualian 1 disebabkan oleh keadaan bendera tf = 1 dalam daftar eflags;

7) bt (bit 15) ditetapkan kepada 1 jika pengecualian 1 disebabkan oleh suis kepada tugas dengan bit perangkap ditetapkan dalam TSS t = 1.

Semua bit lain dalam daftar ini diisi dengan sifar. Pengendali pengecualian 1, berdasarkan kandungan dr6, mesti menentukan sebab pengecualian dan mengambil tindakan yang perlu.

Daftar dr7 dipanggil daftar kawalan nyahpepijat. Ia mengandungi medan untuk setiap satu daripada empat daftar titik putus nyahpepijat yang membolehkan anda menentukan syarat berikut di mana gangguan harus dijana:

1) lokasi pendaftaran pusat pemeriksaan - hanya dalam tugas semasa atau dalam mana-mana tugas. Bit ini menduduki 8 bit bawah daftar dr7 (2 bit untuk setiap titik putus (sebenarnya titik putus) yang ditetapkan oleh daftar dr0, dr1, dr2, dr3, masing-masing).

Bit pertama setiap pasangan ialah resolusi tempatan yang dipanggil; menetapkannya memberitahu titik putus untuk berkuat kuasa jika ia berada dalam ruang alamat tugas semasa.

Bit kedua dalam setiap pasangan mentakrifkan kebenaran global, yang menunjukkan bahawa titik putus yang diberikan adalah sah dalam ruang alamat semua tugas yang berada dalam sistem;

2) jenis akses di mana gangguan dimulakan: hanya apabila mengambil arahan, semasa menulis, atau semasa menulis / membaca data. Bit yang menentukan sifat kejadian gangguan ini terletak di bahagian atas daftar ini. Kebanyakan daftar sistem boleh diakses secara pemrograman.

KULIAH Bil 16. Program Asembler

1. Struktur atur cara dalam penghimpun

Program bahasa himpunan ialah himpunan blok memori yang dipanggil segmen memori. Program mungkin terdiri daripada satu atau lebih daripada segmen blok ini. Setiap segmen mengandungi koleksi ayat bahasa, yang setiap satunya menduduki barisan kod program yang berasingan.

Pernyataan perhimpunan terdiri daripada empat jenis:

1) arahan atau arahan, yang merupakan analog simbolik arahan mesin. Semasa proses penterjemahan, arahan pemasangan ditukar kepada arahan sepadan set arahan mikropemproses;

2) makro. Ini adalah ayat teks program yang diformalkan dengan cara tertentu dan digantikan dengan ayat lain semasa siaran;

3) arahan, yang merupakan petunjuk kepada penterjemah penghimpun untuk melakukan tindakan tertentu. Arahan tidak mempunyai rakan dalam perwakilan mesin;

4) baris ulasan yang mengandungi sebarang aksara, termasuk huruf abjad Rusia. Komen tidak diendahkan oleh penterjemah.

2. Sintaks Himpunan

Ayat yang membentuk atur cara boleh menjadi binaan sintaksis yang sepadan dengan arahan, makro, arahan atau ulasan. Untuk penterjemah penghimpun mengenalinya, ia mesti dibentuk mengikut peraturan sintaksis tertentu. Untuk melakukan ini, sebaiknya gunakan penerangan formal sintaks bahasa, seperti peraturan tatabahasa. Cara yang paling biasa untuk menerangkan bahasa pengaturcaraan dengan cara ini ialah gambar rajah sintaks dan bentuk Backus-Naur yang dilanjutkan. Untuk kegunaan praktikal, gambar rajah sintaks adalah lebih mudah. Sebagai contoh, sintaks pernyataan bahasa himpunan boleh diterangkan menggunakan gambar rajah sintaks yang ditunjukkan dalam rajah berikut.

nasi. 4. Format ayat pemasang

nasi. 5. Format Arahan

nasi. 6. Format arahan dan makro

Pada lukisan ini:

1) nama label - pengecam, yang nilainya ialah alamat bait pertama ayat kod sumber program yang dinyatakannya;

2) nama - pengecam yang membezakan arahan ini daripada arahan lain dengan nama yang sama. Hasil daripada pemprosesan oleh penghimpun arahan tertentu, ciri tertentu boleh diberikan kepada nama ini;

3) kod operasi (COP) dan arahan ialah sebutan mnemonik bagi arahan mesin, arahan makro atau arahan penterjemah yang sepadan;

4) operan - bahagian arahan, makro atau arahan pemasang, menandakan objek di mana operasi dilakukan. Operan pemasang diterangkan dengan ungkapan dengan pemalar angka dan teks, label pembolehubah dan pengecam menggunakan tanda operasi dan beberapa perkataan terpelihara.

Bagaimana untuk menggunakan gambar rajah sintaks? Ia sangat mudah: apa yang anda perlu lakukan ialah mencari dan kemudian ikut laluan dari input gambar rajah (kiri) ke outputnya (kanan). Jika laluan sedemikian wujud, maka ayat atau binaan adalah betul dari segi sintaksis. Sekiranya tiada laluan sedemikian, maka pengkompil tidak akan menerima pembinaan ini. Apabila bekerja dengan gambar rajah sintaks, perhatikan arah traversal yang ditunjukkan oleh anak panah, kerana di antara laluan mungkin terdapat laluan yang boleh diikuti dari kanan ke kiri. Malah, gambar rajah sintaksis mencerminkan logik penterjemah apabila menghuraikan ayat input program.

Aksara yang dibenarkan semasa menulis teks program ialah:

1) semua huruf Latin: A - Z, a - z. Dalam kes ini, huruf besar dan huruf kecil dianggap setara;

2) nombor dari 0 hingga 9;

3) tanda ?, @, S, _, &;

4) pemisah.

Ayat pemasang terbentuk daripada leksem, yang merupakan urutan simbol bahasa yang sah yang tidak dapat dipisahkan secara sintaksis yang masuk akal bagi penterjemah.

Token adalah seperti berikut.

1. Pengecam ialah jujukan aksara yang sah yang digunakan untuk menetapkan objek program seperti kod operasi, nama pembolehubah dan nama label. Peraturan untuk menulis pengecam adalah seperti berikut: pengecam boleh terdiri daripada satu atau lebih aksara. Sebagai aksara, anda boleh menggunakan huruf abjad Latin, nombor dan beberapa aksara khas - _, ?, $, @. Pengecam tidak boleh bermula dengan aksara digit. Panjang pengecam boleh sehingga 255 aksara, walaupun penterjemah hanya menerima 32 yang pertama dan mengabaikan yang lain. Anda boleh melaraskan panjang pengecam yang mungkin menggunakan pilihan baris arahan mv. Di samping itu, adalah mungkin untuk memberitahu penterjemah untuk membezakan antara huruf besar dan huruf kecil atau mengabaikan perbezaannya (yang dilakukan secara lalai). Pilihan baris arahan /mu, /ml, /mx digunakan untuk ini.

2. Rantaian aksara - urutan aksara yang disertakan dalam petikan tunggal atau berganda.

3. Integer dalam salah satu sistem nombor berikut: perduaan, perpuluhan, perenambelasan. Pengenalpastian nombor semasa menulisnya dalam program pemasang dijalankan mengikut peraturan tertentu:

1) nombor perpuluhan tidak memerlukan sebarang aksara tambahan untuk dikenal pasti, contohnya, 25 atau 139;

2) untuk mengenal pasti nombor binari dalam teks sumber program, adalah perlu untuk meletakkan Latin "b" selepas menulis sifar dan yang membentuknya, sebagai contoh, 10010101 b;

3) Nombor perenambelasan mempunyai lebih banyak konvensyen apabila menulis:

a) pertama, ia terdiri daripada nombor 0...9, huruf kecil dan huruf besar abjad Latin a, b, c, d, e, Gili D B, C, D, E, E

b) kedua, penterjemah mungkin mengalami kesukaran untuk mengenali nombor perenambelasan kerana fakta bahawa ia hanya boleh terdiri daripada digit 0...9 (contohnya, 190845) atau bermula dengan huruf abjad Latin (contohnya, efl5 ). Untuk "menjelaskan" kepada penterjemah bahawa token yang diberikan bukanlah nombor perpuluhan atau pengecam, pengaturcara mesti menyerlahkan nombor perenambelasan dengan cara yang istimewa. Untuk melakukan ini, tulis huruf Latin "h" di hujung jujukan digit perenambelasan yang membentuk nombor perenambelasan. Ini adalah satu kemestian. Jika nombor perenambelasan bermula dengan huruf, maka sifar pendahuluan ditulis di hadapannya: 0 efl5 h.

Oleh itu, kami mengetahui bagaimana ayat-ayat program penghimpun dibina. Tetapi ini hanyalah pandangan yang paling dangkal.

Hampir setiap ayat mengandungi penerangan tentang objek yang mana atau dengan bantuannya beberapa tindakan dilakukan. Objek ini dipanggil operan. Ia boleh ditakrifkan seperti berikut: operan ialah objek (beberapa nilai, daftar atau sel memori) yang dipengaruhi oleh arahan atau arahan, atau ia adalah objek yang mentakrifkan atau memperhalusi tindakan arahan atau arahan.

Operan boleh digabungkan dengan operator aritmetik, logik, bitwise dan atribut untuk mengira beberapa nilai atau menentukan lokasi memori yang akan dipengaruhi oleh arahan atau arahan yang diberikan.

Mari kita pertimbangkan dengan lebih terperinci ciri-ciri operan dalam klasifikasi berikut:

1) operan malar atau segera - nombor, rentetan, nama atau ungkapan yang mempunyai beberapa nilai tetap. Nama tidak boleh dipindahkan, iaitu, ia tidak boleh bergantung pada alamat program untuk dimuatkan ke dalam ingatan. Sebagai contoh, ia boleh ditakrifkan dengan operator sama atau =;

2) operan alamat, nyatakan lokasi fizikal operan dalam ingatan dengan menyatakan dua komponen alamat: segmen dan offset (Rajah 7);

nasi. 7. Sintaks perihalan operan alamat

3) operan boleh dipindahkan - sebarang nama simbolik yang mewakili beberapa alamat memori. Alamat ini mungkin menunjukkan lokasi dalam ingatan beberapa arahan (jika operan ialah label) atau data (jika operan ialah nama lokasi memori dalam segmen data).

Operan yang boleh dipindahkan berbeza daripada operan alamat kerana ia tidak terikat pada alamat memori fizikal tertentu. Komponen segmen alamat operan yang dialihkan tidak diketahui dan akan ditentukan selepas atur cara dimuatkan ke dalam ingatan untuk dilaksanakan.

Kaunter alamat ialah jenis operan tertentu. Ia dilambangkan dengan tanda S. Kekhususan operan ini ialah apabila penterjemah pemasang menemui simbol ini dalam program sumber, ia menggantikan nilai semasa pembilang alamat. Nilai kaunter alamat, atau kaunter penempatan seperti yang kadangkala dipanggil, ialah mengimbangi arahan mesin semasa dari permulaan segmen kod. Dalam format penyenaraian, lajur kedua atau ketiga sepadan dengan kaunter alamat (bergantung pada sama ada lajur dengan tahap sarang ada atau tidak dalam penyenaraian). Jika kita mengambil sebarang penyenaraian sebagai contoh, dapat dilihat bahawa apabila penterjemah memproses arahan pemasang seterusnya, pembilang alamat bertambah dengan panjang arahan mesin yang dihasilkan. Adalah penting untuk memahami perkara ini dengan betul. Sebagai contoh, memproses arahan pemasang tidak mengubah kaunter. Arahan, tidak seperti arahan penghimpun, hanyalah arahan kepada pengkompil untuk melaksanakan tindakan tertentu untuk membentuk perwakilan mesin program, dan bagi mereka pengkompil tidak menjana sebarang struktur dalam ingatan.

Apabila menggunakan ungkapan sedemikian untuk melompat, ketahui panjang arahan itu sendiri di mana ungkapan ini digunakan, kerana nilai pembilang alamat sepadan dengan offset dalam segmen arahan arahan ini, dan bukan arahan yang mengikutinya . Dalam contoh kami, arahan jmp mengambil 2 bait. Tetapi berhati-hati, panjang arahan bergantung pada operan yang digunakan. Arahan dengan operan daftar akan lebih pendek daripada arahan dengan salah satu operannya terletak dalam ingatan. Dalam kebanyakan kes, maklumat ini boleh diperolehi dengan mengetahui format arahan mesin dan dengan menganalisis lajur penyenaraian dengan kod objek arahan;

4) operan daftar hanyalah nama daftar. Dalam atur cara pemasang, anda boleh menggunakan nama semua daftar tujuan umum dan kebanyakan daftar sistem;

5) operasi asas dan indeks. Jenis operan ini digunakan untuk melaksanakan asas tidak langsung, pengalamatan indeks tidak langsung, atau gabungan dan sambungannya;

6) Operan struktur digunakan untuk mengakses elemen khusus jenis data kompleks yang dipanggil struktur.

Rekod (serupa dengan jenis struct) digunakan untuk mengakses medan bit beberapa rekod.

Operand ialah komponen asas yang membentuk sebahagian daripada arahan mesin, menandakan objek di mana operasi dilakukan. Dalam kes yang lebih umum, operan boleh dimasukkan sebagai komponen dalam formasi yang lebih kompleks dipanggil ungkapan. Ungkapan ialah gabungan operan dan operator, dianggap sebagai keseluruhan. Hasil penilaian ungkapan boleh menjadi alamat beberapa sel memori atau beberapa nilai tetap (mutlak).

Kami telah mempertimbangkan jenis operan yang mungkin. Kami kini menyenaraikan kemungkinan jenis operator pemasang dan peraturan sintaksis untuk pembentukan ungkapan pemasang, dan memberikan penerangan ringkas tentang pengendali.

1. Operator aritmetik. Ini termasuk:

1) unary "+" dan "-";

2) binari "+" dan "-";

3) pendaraban "*";

4) pembahagian integer "/";

5) mendapatkan baki dari bahagian "mod".

Pengendali ini terletak pada tahap keutamaan 6,7,8 dalam Jadual 4.

nasi. 8. Sintaks operasi aritmetik

2. Operator Shift mengalihkan ungkapan dengan bilangan bit yang ditentukan (Rajah 9).

nasi. 9. Sintaks operator syif

3. Operator perbandingan (mengembalikan nilai "benar" atau "salah") bertujuan untuk pembentukan ungkapan logik (Rajah 10 dan Jadual 3). Nilai logik "benar" sepadan dengan unit digital, dan "salah" - kepada sifar.

nasi. 10. Sintaks pengendali perbandingan

Jadual 3. Operator perbandingan

4. Operator logik melakukan operasi bitwise pada ungkapan (Rajah 11). Ungkapan mestilah mutlak, iaitu, sedemikian, yang nilai berangkanya boleh dikira oleh penterjemah.

nasi. 11. Sintaks pengendali logik

5. Pengendali indeks []. Tanda kurung juga merupakan pengendali, dan penterjemah menganggap kehadirannya sebagai arahan untuk menambah nilai ungkapan_1 di belakang kurungan ini dengan ungkapan_2 yang disertakan dalam kurungan (Gamb. 12).

nasi. 12. Sintaks pengendali indeks

Ambil perhatian bahawa sebutan berikut diterima pakai dalam literatur tentang pemasang: apabila teks merujuk kepada kandungan daftar, namanya diambil dalam kurungan. Kami juga akan mematuhi notasi ini.

6. Operator definisi semula jenis ptr digunakan untuk mentakrifkan semula atau melayakkan jenis label atau pembolehubah yang ditakrifkan oleh ungkapan (Rajah 13).

Jenis boleh mengambil salah satu daripada nilai berikut: bait, perkataan, dword, qword, tbyte, dekat, jauh.

nasi. 13. Sintaks pengendali definisi semula jenis

7. Operator definisi semula segmen ":" (titik bertitik) memaksa pengiraan alamat fizikal berbanding komponen segmen tertentu: "nama daftar segmen", "nama segmen" daripada arahan SEGMEN yang sepadan atau "nama kumpulan" (Gamb. 14). Apabila membincangkan segmentasi, kami bercakap tentang fakta bahawa mikropemproses pada peringkat perkakasan menyokong tiga jenis segmen - kod, tindanan dan data. Apakah sokongan perkakasan ini? Sebagai contoh, untuk memilih pelaksanaan arahan seterusnya, mikropemproses semestinya perlu melihat kandungan segmen register cs dan hanya ia. Dan daftar ini, seperti yang kita ketahui, mengandungi (belum beralih) alamat fizikal permulaan segmen arahan. Untuk mendapatkan alamat arahan tertentu, mikropemproses perlu mendarabkan kandungan cs dengan 16 (yang bermaksud anjakan sebanyak empat bit) dan menambah nilai 20-bit yang terhasil kepada kandungan 16-bit daftar ip. Kira-kira perkara yang sama berlaku apabila mikropemproses memproses operan dalam arahan mesin. Jika ia melihat bahawa operan ialah alamat (alamat berkesan yang hanya sebahagian daripada alamat fizikal), maka ia tahu di segmen mana untuk mencarinya - secara lalai, ia ialah segmen yang alamat mulanya disimpan dalam daftar segmen ds .

Tetapi bagaimana pula dengan segmen timbunan? Dalam konteks pertimbangan kami, kami berminat dengan daftar sp dan bp. Jika mikropemproses melihat salah satu daripada daftar ini sebagai operan (atau sebahagian daripadanya, jika operan ialah ungkapan), maka secara lalai ia membentuk alamat fizikal operan, menggunakan kandungan daftar ss sebagai komponen segmennya. Ini ialah satu set program mikro dalam unit kawalan program mikro, setiap satunya melaksanakan salah satu arahan dalam sistem arahan mesin mikropemproses. Setiap mikroprogram berfungsi mengikut algoritmanya sendiri. Sudah tentu, anda tidak boleh mengubahnya, tetapi anda boleh membetulkannya sedikit. Ini dilakukan menggunakan medan awalan arahan mesin pilihan. Jika kita bersetuju tentang cara arahan berfungsi, maka medan ini tiada. Jika kita ingin membuat pindaan (jika, sudah tentu, ia dibenarkan untuk arahan tertentu) kepada algoritma arahan itu, maka perlu membentuk awalan yang sesuai.

Awalan ialah nilai satu bait yang nilai berangkanya menentukan tujuannya. Mikropemproses mengiktiraf dengan nilai yang ditentukan bahawa bait ini adalah awalan, dan kerja mikroprogram selanjutnya dilakukan dengan mengambil kira arahan yang diterima untuk membetulkan kerjanya. Kini kami berminat dengan salah satu daripadanya - awalan penggantian segmen (definisi semula). Tujuannya adalah untuk menunjukkan kepada mikropemproses (dan sebenarnya, firmware) bahawa kami tidak mahu menggunakan segmen lalai. Kemungkinan untuk definisi semula sedemikian, sudah tentu, terhad. Segmen arahan tidak boleh ditakrifkan semula, alamat perintah boleh laku seterusnya ditentukan secara unik oleh pasangan cs: ip. Dan di sini segmen timbunan dan data - adalah mungkin. Itulah gunanya pengendali ":". Penterjemah pemasang, memproses pernyataan ini, menjana awalan penggantian segmen satu bait yang sepadan.

nasi. 14. Sintaks pengendali definisi semula segmen

8. Operator penamaan jenis struktur "."(dot) juga memaksa pengkompil untuk melakukan pengiraan tertentu jika ia berlaku dalam ungkapan.

9. Operator untuk mendapatkan komponen segmen alamat seg ungkapan mengembalikan alamat fizikal segmen untuk ungkapan (Rajah 15), yang boleh menjadi label, pembolehubah, nama segmen, nama kumpulan atau beberapa nama simbolik .

nasi. 15. Sintaks operator penerima komponen segmen

10. Operator untuk mendapatkan offset bagi offset ungkapan membolehkan anda mendapatkan nilai offset bagi ungkapan (Rajah 16) dalam bait berbanding dengan permulaan segmen di mana ungkapan itu ditakrifkan.

nasi. 16. Sintaks operator get offset

Seperti dalam bahasa peringkat tinggi, pelaksanaan operator pemasang semasa menilai ungkapan dijalankan mengikut keutamaan mereka (Jadual 4). Operasi dengan keutamaan yang sama dilaksanakan secara berurutan dari kiri ke kanan. Mengubah susunan pelaksanaan boleh dilakukan dengan meletakkan kurungan yang mempunyai keutamaan tertinggi.

Jadual 4. Operator dan keutamaannya

3. Arahan Pembahagian

Dalam perbincangan sebelum ini, kami mengetahui semua peraturan asas untuk menulis arahan dan operan dalam program bahasa himpunan. Persoalan tentang cara memformat urutan arahan dengan betul supaya penterjemah boleh memprosesnya dan mikropemproses boleh melaksanakannya masih terbuka.

Apabila mempertimbangkan seni bina mikropemproses, kami mengetahui bahawa ia mempunyai enam daftar segmen, di mana ia boleh berfungsi secara serentak:

1) dengan satu segmen kod;

2) dengan satu segmen timbunan;

3) dengan satu segmen data;

4) dengan tiga segmen data tambahan.

Ingat sekali lagi bahawa segmen secara fizikalnya adalah kawasan memori yang diduduki oleh arahan dan (atau) data yang alamatnya dikira relatif kepada nilai dalam daftar segmen yang sepadan.

Penerangan sintaksis segmen dalam penghimpun ialah pembinaan yang ditunjukkan dalam Rajah 17:

nasi. 17. Sintaks perihalan segmen

Adalah penting untuk ambil perhatian bahawa kefungsian segmen agak lebih luas daripada hanya memecahkan program kepada blok kod, data dan tindanan. Segmentasi adalah sebahagian daripada mekanisme yang lebih umum yang berkaitan dengan konsep pengaturcaraan modular. Ia melibatkan penyatuan reka bentuk modul objek yang dicipta oleh pengkompil, termasuk dari bahasa pengaturcaraan yang berbeza. Ini membolehkan anda menggabungkan program yang ditulis dalam bahasa yang berbeza. Ia adalah untuk pelaksanaan pelbagai pilihan untuk kesatuan sebegini bahawa operan dalam arahan SEGMEN dimaksudkan.

Pertimbangkan mereka dengan lebih terperinci.

1. Atribut penjajaran segmen (jenis penjajaran) memberitahu pemaut untuk memastikan permulaan segmen diletakkan pada sempadan yang ditentukan. Ini penting kerana penjajaran yang betul menjadikan capaian data lebih pantas pada pemproses i80x86. Nilai yang sah untuk atribut ini adalah seperti berikut:

1) BYTE - penjajaran tidak dilakukan. Segmen boleh bermula pada mana-mana alamat memori;

2) WORD - segmen bermula pada alamat yang merupakan gandaan dua, iaitu bit terakhir (paling ketara) alamat fizikal ialah 0 (diselaraskan dengan sempadan perkataan);

3) DWORD - segmen bermula pada alamat yang merupakan gandaan empat, iaitu dua bit terakhir (paling ketara) ialah 0 (penjajaran sempadan perkataan dua kali);

4) PARA - segmen bermula pada alamat yang berganda 16, iaitu digit heksadesimal terakhir alamat mestilah Oh (penjajaran dengan sempadan perenggan);

5) PAGE - segmen bermula pada alamat yang berganda 256, iaitu dua digit heksadesimal terakhir mestilah 00h (diselaraskan dengan sempadan halaman 256-bait);

6) MEMPAGE - segmen bermula pada alamat yang berganda 4 KB, iaitu tiga digit heksadesimal terakhir mestilah OOOh (alamat halaman memori 4 KB seterusnya). Jenis penjajaran lalai ialah PARA.

2. Atribut segmen gabungan (jenis gabungan) memberitahu pemaut cara menggabungkan segmen modul berbeza yang mempunyai nama yang sama. Nilai atribut gabungan segmen boleh:

1) SWASTA - segmen tidak akan digabungkan dengan segmen lain dengan nama yang sama di luar modul ini;

2) AWAM - menyebabkan penghubung menghubungkan semua segmen dengan nama yang sama. Segmen gabungan baharu akan menjadi keseluruhan dan berterusan. Semua alamat (offset) objek, dan ini mungkin bergantung pada jenis perintah dan segmen data, akan dikira secara relatif kepada permulaan segmen baharu ini;

3) BIASA - meletakkan semua segmen dengan nama yang sama pada alamat yang sama. Semua segmen dengan nama yang diberikan akan bertindih dan berkongsi memori. Saiz segmen yang terhasil akan sama dengan saiz segmen terbesar;

4) AT xxxx - menempatkan segmen pada alamat mutlak perenggan (perenggan ialah jumlah memori, gandaan 16; oleh itu, digit heksadesimal terakhir alamat perenggan ialah 0). Alamat mutlak perenggan diberikan oleh xxx. Penyambung meletakkan segmen pada alamat memori yang diberikan (ini boleh digunakan, contohnya, untuk mengakses memori video atau kawasan ROM>), dengan mengambil kira atribut gabungan. Secara fizikal, ini bermakna bahawa segmen, apabila dimuatkan ke dalam ingatan, akan ditempatkan bermula dari alamat mutlak perenggan ini, tetapi untuk mengaksesnya, nilai yang dinyatakan dalam atribut mesti dimuatkan ke dalam daftar segmen yang sepadan. Semua label dan alamat dalam segmen yang ditakrifkan adalah relatif kepada alamat mutlak yang diberikan;

5) STACK - definisi segmen tindanan. Menyebabkan penyambung menyambung semua segmen dengan nama yang sama dan mengira alamat dalam segmen ini berbanding dengan daftar ss. Jenis gabungan STACK (tindanan) adalah serupa dengan gabungan jenis PUBLIC, kecuali daftar ss ialah daftar segmen standard untuk segmen tindanan. Daftar sp ditetapkan pada penghujung segmen tindanan bercantum. Jika tiada segmen tindanan ditentukan, pemaut akan mengeluarkan amaran bahawa tiada segmen tindanan ditemui. Jika segmen tindanan dibuat dan jenis STACK gabungan tidak digunakan, pengaturcara mesti secara eksplisit memuatkan alamat segmen ke dalam daftar ss (serupa dengan daftar ds).

Atribut gabungan lalai kepada PRIVATE.

3. Atribut kelas segmen (jenis kelas) ialah rentetan petikan yang membantu pemaut menentukan susunan segmen yang sesuai apabila memasang atur cara daripada berbilang segmen modul. Penyambung menggabungkan semua segmen dengan nama kelas yang sama bersama-sama dalam ingatan (nama kelas biasanya boleh apa-apa, tetapi lebih baik jika ia mencerminkan fungsi segmen). Penggunaan biasa nama kelas adalah untuk mengumpulkan semua segmen kod program (biasanya kelas "kod" digunakan untuk ini). Menggunakan mekanisme penaipan kelas, anda juga boleh mengumpulkan segmen data yang dimulakan dan tidak diinisialisasi.

4. Atribut saiz segmen. Untuk i80386 dan pemproses yang lebih tinggi, segmen boleh menjadi 16-bit atau 32-bit. Ini memberi kesan terutamanya kepada saiz segmen dan susunan alamat fizikal terbentuk di dalamnya. Atribut boleh mengambil nilai berikut:

1) USE16 - ini bermakna bahawa segmen membenarkan pengalamatan 16-bit. Apabila membentuk alamat fizikal, hanya offset 16-bit boleh digunakan. Sehubungan itu, segmen sedemikian boleh mengandungi sehingga 64 KB kod atau data;

2) USE32 - segmen akan menjadi 32-bit. Apabila membentuk alamat fizikal, offset 32-bit boleh digunakan. Oleh itu, segmen sedemikian boleh mengandungi sehingga 4 GB kod atau data.

Semua segmen adalah sama dalam diri mereka sendiri, kerana arahan SEGMENT dan ENDS tidak mengandungi maklumat tentang tujuan fungsi segmen tersebut. Untuk menggunakannya sebagai kod, data atau segmen tindanan, anda mesti terlebih dahulu memaklumkan penterjemah tentang perkara ini, yang mana arahan ASSUME khas digunakan, yang mempunyai format yang ditunjukkan dalam Rajah. 18. Arahan ini memberitahu penterjemah segmen mana yang terikat kepada segmen yang mendaftar. Seterusnya, ini akan membolehkan penterjemah mengikat nama simbolik yang ditakrifkan dalam segmen dengan betul. Pengikatan segmen kepada daftar segmen dijalankan menggunakan operan arahan ini, di mana nama_segmen mestilah nama segmen yang ditakrifkan dalam kod sumber program oleh arahan SEGMEN atau kata kunci nothing. Jika hanya kata kunci tiada apa yang digunakan sebagai operan, maka tugasan daftar segmen sebelumnya dibatalkan, dan untuk semua enam daftar segmen sekaligus. Tetapi kata kunci tiada apa yang boleh digunakan dan bukannya argumen nama segmen; dalam kes ini, sambungan antara segmen dengan nama segmen nama dan daftar segmen yang sepadan akan dipecahkan secara selektif (lihat Rajah 18).

nasi. 18. ANGGAP Arahan

Untuk program ringkas yang mengandungi satu segmen untuk kod, data dan tindanan, kami ingin memudahkan penerangannya. Untuk melakukan ini, penterjemah MASM dan TASM memperkenalkan keupayaan untuk menggunakan arahan segmentasi yang dipermudahkan. Tetapi di sini masalah timbul berkaitan dengan fakta bahawa ia adalah perlu untuk mengimbangi ketidakupayaan untuk mengawal secara langsung penempatan dan gabungan segmen. Untuk melakukan ini, bersama-sama dengan arahan segmentasi yang dipermudahkan, mereka mula menggunakan arahan untuk menentukan model memori MODEL, yang sebahagiannya mula mengawal penempatan segmen dan melaksanakan fungsi arahan ASSUME (oleh itu, apabila menggunakan arahan segmentasi yang dipermudahkan, Arahan ASSUME boleh ditinggalkan). Arahan ini mengikat segmen, yang dalam hal menggunakan arahan segmentasi yang dipermudahkan, mempunyai nama yang dipratentukan, dengan daftar segmen (walaupun anda masih perlu memulakan ds secara eksplisit).

Sintaks arahan MODEL ditunjukkan dalam Rajah 19.

nasi. 19. Sintaks arahan MODEL

Parameter mandatori arahan MODEL ialah model memori. Parameter ini mentakrifkan model pembahagian memori untuk POU. Adalah diandaikan bahawa modul program hanya boleh mempunyai jenis segmen tertentu, yang ditakrifkan oleh arahan perihalan segmen yang dipermudahkan yang kami nyatakan sebelum ini. Arahan ini ditunjukkan dalam Jadual 5.

Jadual 5. Arahan definisi segmen dipermudahkan

Kehadiran parameter [nama] dalam beberapa arahan menunjukkan bahawa adalah mungkin untuk menentukan beberapa segmen jenis ini. Sebaliknya, kewujudan beberapa jenis segmen data adalah disebabkan oleh keperluan untuk memastikan keserasian dengan beberapa penyusun bahasa peringkat tinggi, yang mencipta segmen data yang berbeza untuk data yang dimulakan dan tidak dimulakan, serta pemalar.

Apabila menggunakan arahan MODEL, pengkompil menyediakan beberapa pengecam yang boleh diakses semasa operasi program untuk mendapatkan maklumat tentang ciri-ciri tertentu model memori yang diberikan (Jadual 7). Mari kita senaraikan pengecam ini dan nilainya (Jadual 6).

Jadual 6. Pengecam yang dicipta oleh arahan MODEL

Kami kini boleh melengkapkan perbincangan kami tentang arahan MODEL. Operan arahan MODEL digunakan untuk menentukan model memori yang mentakrifkan set segmen program, saiz data dan segmen kod, dan kaedah memautkan segmen dan daftar segmen. Jadual 7 menunjukkan beberapa nilai parameter "model memori" arahan MODEL.

Jadual 7. Model Memori

Parameter "pengubah suai" arahan MODEL membolehkan anda menentukan beberapa ciri menggunakan model memori yang dipilih (Jadual 8).

Jadual 8. Pengubah suai model memori

Parameter pilihan "bahasa" dan "pengubah suai bahasa" mentakrifkan beberapa ciri panggilan prosedur. Keperluan untuk menggunakan parameter ini timbul semasa menulis dan memaut program dalam pelbagai bahasa pengaturcaraan.

Arahan pembahagian standard dan dipermudahkan yang telah kami huraikan tidak saling eksklusif. Arahan standard digunakan apabila pengaturcara ingin mempunyai kawalan sepenuhnya ke atas penempatan segmen dalam ingatan dan gabungannya dengan segmen daripada modul lain.

Arahan ringkas berguna untuk atur cara dan atur cara ringkas yang bertujuan untuk menghubungkan dengan modul program yang ditulis dalam bahasa peringkat tinggi. Ini membolehkan pemaut memautkan modul dengan cekap daripada bahasa yang berbeza dengan menyeragamkan pemautan dan pengurusan.

KULIAH No. 17. Struktur perintah dalam Assembler

1. Struktur arahan mesin

Arahan mesin ialah petunjuk kepada mikropemproses, dikodkan mengikut peraturan tertentu, untuk melaksanakan beberapa operasi atau tindakan. Setiap arahan mengandungi elemen yang mentakrifkan:

1) apa yang perlu dilakukan? (Jawapan kepada soalan ini diberikan oleh elemen arahan yang dipanggil kod operasi (COP).);

2) objek di mana sesuatu perlu dilakukan (elemen ini dipanggil operan);

3) bagaimana caranya? (Elemen ini dipanggil jenis operan, biasanya dinyatakan secara tersirat.)

Format arahan mesin yang ditunjukkan dalam Rajah 20 adalah yang paling umum. Panjang maksimum arahan mesin ialah 15 bait. Perintah sebenar mungkin mengandungi bilangan medan yang jauh lebih kecil, sehingga satu - KOP sahaja.

nasi. 20. Format arahan mesin

Mari kita terangkan tujuan medan arahan mesin.

1. Awalan.

Elemen arahan mesin pilihan, setiap satunya ialah 1 bait atau mungkin ditinggalkan. Dalam ingatan, awalan mendahului arahan. Tujuan awalan adalah untuk mengubah suai operasi yang dilakukan oleh arahan. Aplikasi boleh menggunakan jenis awalan berikut:

1) awalan penggantian segmen. Menentukan secara eksplisit daftar segmen yang digunakan dalam arahan ini untuk menangani tindanan atau data. Awalan mengatasi pilihan daftar segmen lalai. Awalan penggantian segmen mempunyai makna berikut:

a) 2eh - penggantian segmen cs;

b) 36j - penggantian segmen ss;

c) 3eh - penggantian segmen ds;

d) 26j - penggantian segmen e;

e) 64j - penggantian segmen fs;

e) 65j - penggantian segmen gs;

2) awalan bitness alamat menentukan bitness alamat (32- atau 16-bit). Setiap arahan yang menggunakan operan alamat diberikan lebar bit alamat operan itu. Alamat ini boleh menjadi 16 atau 32 bit. Jika lebar alamat untuk arahan ini ialah 16 bit, ini bermakna perintah itu mengandungi offset 16-bit (Gamb. 20), ia sepadan dengan offset 16-bit operan alamat berbanding dengan permulaan beberapa segmen. Dalam konteks Rajah 21, offset ini dipanggil alamat berkesan. Jika alamatnya ialah 32 bit, ini bermakna perintah itu mengandungi offset 32-bit (Rajah 20), ia sepadan dengan offset 32-bit operan alamat berbanding dengan permulaan segmen, dan nilainya membentuk 32 -bit offset dalam segmen. Awalan bitness alamat boleh digunakan untuk menukar bitness alamat lalai. Perubahan ini hanya akan menjejaskan arahan yang didahului oleh awalan;

nasi. 21. Mekanisme pembentukan alamat fizikal dalam mod sebenar

3) Awalan lebar bit operan adalah sama dengan awalan lebar bit alamat, tetapi menunjukkan panjang bit operan (32-bit atau 16-bit) yang mana arahan itu berfungsi. Apakah peraturan untuk menetapkan alamat dan atribut lebar bit operan secara lalai?

Dalam mod sebenar dan mod 18086 maya, nilai atribut ini ialah 16 bit. Dalam mod yang dilindungi, nilai atribut bergantung pada keadaan bit D dalam deskriptor segmen boleh laku. Jika D = 0, maka nilai atribut lalai ialah 16 bit; jika D = 1, maka 32 bit.

Nilai awalan untuk lebar operan 66j dan lebar alamat 67j. Dengan awalan bit alamat mod sebenar, anda boleh menggunakan pengalamatan 32-bit, tetapi ketahui had saiz segmen 64 KB. Sama seperti awalan lebar alamat, anda boleh menggunakan awalan lebar operan mod sebenar untuk bekerja dengan operan 32-bit (contohnya, dalam arahan aritmetik);

4) awalan ulangan digunakan dengan arahan rantai (perintah pemprosesan baris). Awalan ini "menggelungkan" arahan untuk memproses semua elemen rantai. Sistem arahan menyokong dua jenis awalan:

a) tanpa syarat (rep - OOh), memaksa perintah berantai diulang beberapa kali;

b) bersyarat (repe/repz - OOh, repne/repnz - 0f2h), yang, apabila gelung, semak beberapa bendera, dan sebagai hasil semakan, keluar awal dari gelung adalah mungkin.

2. Kod operasi.

Elemen yang diperlukan yang menerangkan operasi yang dilakukan oleh arahan. Banyak arahan sepadan dengan beberapa kod operasi, yang masing-masing menentukan nuansa operasi. Medan arahan mesin seterusnya menentukan lokasi operan yang terlibat dalam operasi dan spesifik penggunaannya. Pertimbangan medan ini disambungkan dengan cara menentukan operan dalam arahan mesin dan oleh itu akan dilakukan kemudian.

3. Mod alamat bait modr/m.

Nilai bait ini menentukan borang alamat operan yang digunakan. Operan boleh berada dalam ingatan dalam satu atau dua daftar. Jika operan berada dalam ingatan, maka bait modr/m menentukan komponen (daftar offset, pangkalan dan indeks) yang digunakan untuk mengira alamat berkesannya (Rajah 21). Dalam mod yang dilindungi, bait sib (Skala-Index-Base) juga boleh digunakan untuk menentukan lokasi operan dalam ingatan. Bait modr/m terdiri daripada tiga medan (Rajah 20):

1) medan mod menentukan bilangan bait yang diduduki oleh alamat operan dalam arahan (Rajah 20, medan offset dalam arahan). Medan mod digunakan bersama dengan medan r/m, yang menentukan cara mengubah suai alamat operan "imbangan arahan". Sebagai contoh, jika mod = 00, ini bermakna tiada medan offset dalam arahan, dan alamat operan ditentukan oleh kandungan daftar pangkalan dan (atau) indeks. Daftar mana yang akan digunakan untuk mengira alamat berkesan ditentukan oleh nilai bait ini. Jika mod = 01, ini bermakna medan offset hadir dalam arahan, menduduki 1 bait dan diubah suai oleh kandungan daftar indeks asas dan (atau). Jika mod = 10, ini bermakna medan offset hadir dalam arahan, menduduki 2 atau 4 bait (bergantung pada saiz alamat lalai atau awalan), dan diubah suai oleh kandungan daftar asas dan/atau indeks. Jika mod = 11, ini bermakna tiada operan dalam ingatan: ia berada dalam daftar. Nilai bait mod yang sama digunakan apabila operan segera digunakan dalam arahan;

2) medan reg/cop menentukan sama ada daftar yang terletak dalam arahan sebagai ganti operan pertama, atau kemungkinan lanjutan opcode;

3) medan r/m digunakan bersama dengan medan mod dan menentukan sama ada daftar yang terletak dalam arahan di tempat operan pertama (jika mod = 11), atau daftar asas dan indeks yang digunakan untuk mengira alamat berkesan (bersama-sama dengan medan offset dalam arahan).

4. Skala bait - indeks - asas (bait sib).

Digunakan untuk memperluaskan kemungkinan menangani operan. Kehadiran bait sib dalam arahan mesin ditunjukkan oleh gabungan salah satu nilai 01 atau 10 medan mod dan nilai medan r/m = 100. Bait sib terdiri daripada tiga medan:

1) medan skala ss. Medan ini mengandungi faktor skala untuk indeks komponen indeks, yang menduduki 3 bit seterusnya bagi bait sib. Medan ss boleh mengandungi salah satu daripada nilai berikut: 1, 2, 4, 8.

Apabila mengira alamat berkesan, kandungan daftar indeks akan didarab dengan nilai ini;

2) medan indeks. Digunakan untuk menyimpan nombor daftar indeks yang digunakan untuk mengira alamat berkesan operan;

3) medan asas. Digunakan untuk menyimpan nombor daftar asas, yang juga digunakan untuk mengira alamat berkesan operan. Hampir semua daftar tujuan umum boleh digunakan sebagai daftar asas dan indeks.

5. Medan offset dalam arahan.

Integer bertanda 8-, 16-, atau 32-bit yang mewakili, secara keseluruhan atau sebahagian (tertakluk kepada pertimbangan di atas), nilai alamat berkesan operan.

6. Medan operan segera.

Medan pilihan yang merupakan operan segera 8-bit, 16-bit atau 32-bit. Kehadiran medan ini, sudah tentu, dicerminkan dalam nilai bait modr/m.

2. Kaedah untuk menentukan operan arahan

Operan ditetapkan secara tersirat pada tahap perisian tegar

Dalam kes ini, arahan secara eksplisit tidak mengandungi operan. Algoritma pelaksanaan perintah menggunakan beberapa objek lalai (daftar, bendera dalam bendera, dll.).

Contohnya, perintah cli dan sti secara tersirat berfungsi dengan bendera if interrupt dalam daftar eflags, dan perintah xlat secara tersirat mengakses daftar al dan baris dalam ingatan pada alamat yang ditentukan oleh pasangan daftar ds:bx.

Operan dinyatakan dalam arahan itu sendiri (operand segera)

Operan berada dalam kod arahan, iaitu, ia adalah sebahagian daripadanya. Untuk menyimpan operan sedemikian dalam arahan, medan sehingga 32 bit panjang diperuntukkan (Rajah 20). Operan segera hanya boleh menjadi operan kedua (sumber). Operan destinasi boleh sama ada dalam ingatan atau dalam daftar.

Contohnya: mov ax,0ffffti menggerakkan pemalar heksadesimal ffff ke dalam register ax. Perintah tambah tambah, 2 menambah kandungan medan pada jumlah alamat dengan integer 2 dan menulis hasilnya di tempat operan pertama, iaitu ke dalam ingatan.

Operan berada dalam salah satu daftar

Operan daftar ditentukan oleh nama daftar. Daftar boleh digunakan:

1) Mendaftar 32-bit EAX, EBX, ECX, EDX, ESI, EDI, ESP, EUR;

2) Daftar 16-bit AX, BX, CX, DX, SI, DI, SP, BP;

3) Daftar 8-bit AH, AL, BH, BL, CH, CL, DH, DL;

4) segmen mendaftar CS, DS, SS, ES, FS, GS.

Sebagai contoh, arahan tambah ax,bx menambah kandungan daftar ax dan bx dan menulis hasilnya ke bx. Perintah dec si mengurangkan kandungan si sebanyak 1.

Operan berada dalam ingatan

Ini adalah yang paling kompleks dan pada masa yang sama cara yang paling fleksibel untuk menentukan operan. Ia membolehkan anda melaksanakan dua jenis pengalamatan utama berikut: langsung dan tidak langsung.

Sebaliknya, pengalamatan tidak langsung mempunyai jenis berikut:

1) pengalamatan pangkalan tidak langsung; nama lain ialah daftar alamat tidak langsung;

2) pengalamatan asas tidak langsung dengan offset;

3) pengalamatan indeks tidak langsung dengan offset;

4) pengalamatan indeks asas tidak langsung;

5) alamat indeks asas tidak langsung dengan offset.

Operan ialah port I/O

Sebagai tambahan kepada ruang alamat RAM, mikropemproses mengekalkan ruang alamat I/O, yang digunakan untuk mengakses peranti I/O. Ruang alamat I/O ialah 64 KB. Alamat diperuntukkan untuk mana-mana peranti komputer dalam ruang ini. Nilai alamat tertentu dalam ruang ini dipanggil port I/O. Secara fizikal, port I / O sepadan dengan daftar perkakasan (jangan dikelirukan dengan daftar mikropemproses), yang diakses menggunakan arahan pemasang khas masuk dan keluar.

Sebagai contoh:

dalam al,60j; masukkan bait dari port 60h

Daftar yang dialamatkan oleh port I/O boleh berukuran 8,16, 32, atau XNUMX bit, tetapi lebar bit daftar ditetapkan untuk port tertentu. Perintah masuk dan keluar beroperasi pada julat objek tetap. Daftar penumpuk yang dipanggil EAX, AX, AL digunakan sebagai sumber maklumat atau penerima. Pilihan daftar ditentukan oleh bitness port. Nombor port boleh ditentukan sebagai operan segera dalam arahan masuk dan keluar, atau sebagai nilai dalam daftar DX. Kaedah terakhir membolehkan anda menentukan nombor port dalam program secara dinamik.

Operan berada pada timbunan

Arahan mungkin tidak mempunyai operan sama sekali, mungkin mempunyai satu atau dua operan. Kebanyakan arahan memerlukan dua operan, satu daripadanya ialah operan sumber dan satu lagi ialah operan destinasi. Adalah penting bahawa satu operan boleh ditempatkan dalam daftar atau ingatan, dan operan kedua mesti berada dalam daftar atau terus dalam arahan. Operan segera hanya boleh menjadi operan sumber. Dalam arahan mesin dua operan, gabungan operan berikut mungkin:

1) daftar - daftar;

2) daftar - ingatan;

3) ingatan - daftar;

4) operan segera - daftar;

5) operan segera - ingatan.

Terdapat pengecualian kepada peraturan ini mengenai:

1) arahan berantai yang boleh memindahkan data dari memori ke memori;

2) perintah tindanan yang boleh memindahkan data dari ingatan ke tindanan yang juga ada dalam ingatan;

3) arahan jenis pendaraban, yang, sebagai tambahan kepada operan yang dinyatakan dalam arahan, juga menggunakan operan tersirat kedua.

Daripada gabungan operan yang disenaraikan, daftar - memori dan memori - daftar paling kerap digunakan. Memandangkan kepentingan mereka, kami akan mempertimbangkannya dengan lebih terperinci. Kami akan mengiringi perbincangan dengan contoh arahan penghimpun yang akan menunjukkan cara format perintah penghimpun berubah apabila satu atau satu lagi jenis pengalamatan digunakan. Dalam hal ini, lihat semula Rajah 21, yang menunjukkan prinsip membentuk alamat fizikal pada bas alamat mikropemproses. Ia dapat dilihat bahawa alamat operan dibentuk sebagai jumlah dua komponen - kandungan daftar segmen beralih sebanyak 4 bit dan alamat berkesan 16-bit, yang secara amnya dikira sebagai jumlah tiga komponen: asas, mengimbangi dan indeks.

3. Cara-cara menangani

Kami menyenaraikan dan kemudian mempertimbangkan ciri-ciri jenis utama operan pengalamatan dalam ingatan:

1) alamat langsung;

2) pengalamatan asas (daftar) tidak langsung;

3) pengalamatan asas (daftar) tidak langsung dengan offset;

4) pengalamatan indeks tidak langsung dengan offset;

5) pengalamatan indeks asas tidak langsung;

6) alamat indeks asas tidak langsung dengan offset.

Alamat Langsung

Ini adalah bentuk paling mudah untuk menangani operan dalam ingatan, kerana alamat berkesan terkandung dalam arahan itu sendiri dan tiada sumber atau daftar tambahan digunakan untuk membentuknya. Alamat berkesan diambil terus dari medan offset arahan mesin (lihat Rajah 20), yang boleh bersaiz 8, 16, 32 bit. Nilai ini secara unik mengenal pasti bait, perkataan atau kata ganda yang terletak dalam segmen data.

Pengalamatan langsung boleh terdiri daripada dua jenis.

Pengalamatan langsung relatif

Digunakan untuk arahan lompatan bersyarat untuk menunjukkan alamat lompat relatif. Kerelatifan peralihan sedemikian terletak pada fakta bahawa medan offset arahan mesin mengandungi nilai 8-, 16- atau 32-bit, yang, sebagai hasil daripada operasi arahan, akan ditambah kepada kandungan daftar penunjuk arahan ip/eip. Hasil daripada penambahan ini, alamat diperolehi, yang mana peralihan dijalankan.

Pengalamatan langsung mutlak

Dalam kes ini, alamat berkesan adalah sebahagian daripada arahan mesin, tetapi alamat ini dibentuk hanya daripada nilai medan offset dalam arahan. Untuk membentuk alamat fizikal operan dalam ingatan, mikropemproses menambah medan ini dengan nilai daftar segmen dialihkan sebanyak 4 bit. Beberapa bentuk pengalamatan ini boleh digunakan dalam arahan penghimpun.

Tetapi pengalamatan sedemikian jarang digunakan - sel yang biasa digunakan dalam program ini diberikan nama simbolik. Semasa penterjemahan, pemasang mengira dan menggantikan nilai offset nama-nama ini ke dalam arahan mesin yang dijananya dalam medan "offset arahan". Akibatnya, ternyata arahan mesin secara langsung menangani operannya, mempunyai, sebenarnya, dalam salah satu bidangnya nilai alamat berkesan.

Jenis pengalamatan lain adalah tidak langsung. Perkataan "tidak langsung" dalam nama jenis pengalamatan ini bermakna hanya sebahagian daripada alamat berkesan boleh berada dalam arahan itu sendiri, dan komponennya yang selebihnya berada dalam daftar, yang ditunjukkan oleh kandungannya oleh bait modr/m dan, mungkin, mengikut bait sib.

Pengalamatan asas (daftar) tidak langsung

Dengan pengalamatan ini, alamat berkesan operan boleh berada dalam mana-mana daftar tujuan umum, kecuali untuk sp / esp dan bp / ebp (ini adalah daftar khusus untuk bekerja dengan segmen tindanan). Secara sintaksis dalam arahan, mod pengalamatan ini dinyatakan dengan melampirkan nama daftar dalam kurungan segi empat sama []. Sebagai contoh, arahan mov ax, [ecx] meletakkan dalam register ax kandungan perkataan pada alamat dari segmen data dengan offset disimpan dalam register esx. Memandangkan kandungan daftar boleh ditukar dengan mudah semasa program, kaedah pengalamatan ini membolehkan anda menetapkan alamat operan secara dinamik untuk beberapa arahan mesin. Sifat ini sangat berguna, contohnya, untuk mengatur pengiraan kitaran dan untuk bekerja dengan pelbagai struktur data seperti jadual atau tatasusunan.

Pengalamatan pangkalan tidak langsung (daftar) dengan offset

Jenis pengalamatan ini adalah tambahan kepada yang sebelumnya dan direka bentuk untuk mengakses data dengan offset yang diketahui berbanding beberapa alamat asas. Jenis pengalamatan ini mudah digunakan untuk mengakses unsur-unsur struktur data, apabila offset unsur-unsur diketahui lebih awal, pada peringkat pembangunan program, dan alamat asas (permulaan) struktur mesti dikira secara dinamik, pada peringkat pelaksanaan program. Pengubahsuaian kandungan daftar asas membolehkan anda mengakses unsur-unsur dengan nama yang sama dalam keadaan berbeza bagi jenis struktur data yang sama.

Contohnya, arahan mov ax,[edx+3h] memindahkan perkataan dari kawasan ingatan ke register ax di alamat: kandungan edx + 3h.

Arahan mov ax,mas[dx] memindahkan perkataan ke dalam register ax di alamat: kandungan dx ditambah dengan nilai mas pengenal (ingat bahawa pengkompil memberikan kepada setiap pengecam nilai yang sama dengan offset pengecam ini daripada permulaan segmen data).

Pengalamatan indeks tidak langsung dengan offset

Pengalamatan jenis ini sangat serupa dengan pengalamatan asas tidak langsung dengan offset. Di sini juga, salah satu daftar tujuan umum digunakan untuk membentuk alamat berkesan. Tetapi pengalamatan indeks mempunyai satu ciri menarik yang sangat mudah untuk bekerja dengan tatasusunan. Ia berkaitan dengan kemungkinan apa yang dipanggil penskalaan kandungan daftar indeks. Apa ini?

Lihat Rajah 20. Kami berminat dengan bait sib. Apabila membincangkan struktur bait ini, kami perhatikan bahawa ia terdiri daripada tiga medan. Salah satu medan ini ialah medan skala ss, yang mana kandungan daftar indeks didarabkan.

Contohnya, dalam arahan mov ax,mas[si*2], nilai alamat berkesan operan kedua dikira dengan ungkapan mas+(si)*2. Disebabkan fakta bahawa pemasang tidak mempunyai cara untuk mengatur pengindeksan tatasusunan, pengaturcara perlu mengaturnya sendiri.

Mempunyai keupayaan untuk skala dengan ketara membantu dalam menyelesaikan masalah ini, tetapi dengan syarat saiz elemen tatasusunan ialah 1, 2, 4 atau 8 bait.

Pengalamatan indeks asas tidak langsung

Dengan jenis pengalamatan ini, alamat berkesan dibentuk sebagai jumlah kandungan dua daftar tujuan umum: asas dan indeks. Daftar ini boleh menjadi sebarang daftar tujuan umum, dan penskalaan kandungan daftar indeks sering digunakan.

Pengalamatan indeks asas tidak langsung dengan offset

Pengalamatan jenis ini adalah pelengkap pengalamatan diindeks tidak langsung. Alamat berkesan dibentuk sebagai jumlah tiga komponen: kandungan daftar asas, kandungan daftar indeks, dan nilai medan offset dalam arahan.

Contohnya, arahan mov eax,[esi+5] [edx] mengalihkan kata ganda ke daftar eax di alamat: (esi) + 5 + (edx).

Perintah add ax,array[esi] [ebx] menambah kandungan register ax kepada kandungan perkataan di alamat: nilai tatasusunan pengecam + (esi) + (ebx).

KULIAH Bil 18. Pasukan

1. Arahan pemindahan data

Untuk kemudahan aplikasi praktikal dan refleksi kekhususannya, adalah lebih mudah untuk mempertimbangkan arahan kumpulan ini mengikut tujuan fungsinya, mengikut mana mereka boleh dibahagikan kepada kumpulan arahan berikut:

1) pemindahan data tujuan umum;

2) input-output ke port;

3) bekerja dengan alamat dan petunjuk;

4) transformasi data;

5) bekerja dengan timbunan.

Perintah Pemindahan Data Umum

Kumpulan ini termasuk arahan berikut:

1) mov ialah arahan pemindahan data asas. Ia melaksanakan pelbagai pilihan penghantaran. Perhatikan spesifikasi arahan ini:

a) arahan mov tidak boleh digunakan untuk memindahkan dari satu kawasan memori ke kawasan memori yang lain. Jika keperluan sedemikian timbul, maka mana-mana daftar tujuan am yang tersedia pada masa ini harus digunakan sebagai penimbal perantaraan;

b) adalah mustahil untuk memuatkan nilai terus dari memori ke dalam daftar segmen. Oleh itu, untuk melakukan beban sedemikian, anda perlu menggunakan objek perantaraan. Ini mungkin daftar tujuan umum atau timbunan;

c) anda tidak boleh memindahkan kandungan satu daftar segmen ke daftar segmen lain. Ini kerana tiada opcode yang sepadan dalam sistem arahan. Tetapi keperluan untuk tindakan sedemikian sering timbul. Anda boleh melakukan pemindahan sedemikian menggunakan daftar tujuan umum yang sama seperti daftar perantaraan;

d) anda tidak boleh menggunakan CS daftar segmen sebagai operan destinasi. Sebabnya mudah sahaja. Hakikatnya ialah dalam seni bina mikropemproses, pasangan cs: ip sentiasa mengandungi alamat arahan yang harus dilaksanakan seterusnya. Menukar kandungan daftar CS dengan arahan mov sebenarnya bermakna operasi lompat, bukan pemindahan, yang tidak boleh diterima. 2) xchg - digunakan untuk pemindahan data dua arah. Untuk operasi ini, sudah tentu, anda boleh menggunakan urutan beberapa arahan mov, tetapi disebabkan oleh fakta bahawa operasi pertukaran digunakan agak kerap, pembangun sistem arahan mikropemproses menganggap perlu untuk memperkenalkan arahan pertukaran xchg yang berasingan. Sememangnya, operan mestilah daripada jenis yang sama. Ia tidak dibenarkan (seperti untuk semua arahan pemasang) untuk menukar kandungan dua sel memori antara satu sama lain.

Perintah I/O Port

Lihat Rajah 22. Ia menunjukkan gambar rajah konseptual kawalan perkakasan komputer yang sangat mudah dan ringkas.

nasi. 22. Gambar rajah konsep kawalan perkakasan komputer

Seperti yang anda lihat dari Rajah 22, tahap paling rendah ialah tahap BIOS, di mana perkakasan dikendalikan terus melalui port. Ini melaksanakan konsep kebebasan peralatan. Apabila menggantikan perkakasan, hanya perlu membetulkan fungsi BIOS yang sepadan, mengorientasikan semulanya ke alamat baharu dan logik port.

Pada asasnya, mengurus peranti secara langsung melalui port adalah mudah. Maklumat tentang nombor port, kedalaman bitnya, format maklumat kawalan diberikan dalam penerangan teknikal peranti. Anda hanya perlu mengetahui matlamat akhir tindakan anda, algoritma yang sesuai dengan peranti tertentu berfungsi, dan susunan pengaturcaraan portnya, iaitu, sebenarnya, anda perlu tahu apa dan dalam urutan apa yang anda perlu hantar ke pelabuhan (semasa menulis kepadanya) atau membaca daripadanya (semasa membaca) dan bagaimana maklumat ini harus ditafsirkan. Untuk melakukan ini, cukup dua arahan yang terdapat dalam sistem arahan mikropemproses:

1) dalam penumpuk, port_number - input kepada penumpuk dari port dengan nombor port_number;

2) out port, accumulator - keluarkan kandungan accumulator ke port dengan nombor port_number.

Perintah untuk bekerja dengan alamat dan penunjuk memori

Apabila menulis atur cara dalam penghimpun, kerja intensif dilakukan dengan alamat operan yang ada dalam ingatan. Untuk menyokong operasi jenis ini, terdapat kumpulan arahan khas, yang merangkumi arahan berikut:

1) destinasi lea, sumber - pemuatan alamat yang berkesan;

2) Destinasi id, sumber - memuatkan penunjuk ke dalam daftar segmen data ds;

3) destinasi, sumber - memuatkan penunjuk ke dalam daftar segmen data tambahan;

4) destinasi lgs, sumber - memuatkan penunjuk ke dalam daftar segmen data tambahan gs;

5) destinasi lfs, sumber - memuatkan penunjuk ke dalam daftar segmen data tambahan fs;

6) destinasi lss, sumber - muatkan penunjuk ke dalam daftar segmen tindanan ss.

Perintah lea adalah serupa dengan arahan mov kerana ia juga melakukan pergerakan. Walau bagaimanapun, arahan lea tidak memindahkan data, tetapi alamat berkesan data (iaitu, mengimbangi data dari permulaan segmen data) ke daftar yang ditunjukkan oleh operan destinasi.

Selalunya, untuk melakukan beberapa tindakan dalam program, tidak cukup untuk mengetahui nilai alamat data yang berkesan sahaja, tetapi perlu mempunyai penunjuk penuh kepada data. Penunjuk data lengkap terdiri daripada komponen segmen dan offset. Semua arahan lain kumpulan ini membolehkan anda mendapatkan penunjuk penuh sedemikian kepada operan dalam ingatan dalam sepasang daftar. Dalam kes ini, nama daftar segmen, di mana komponen segmen alamat diletakkan, ditentukan oleh kod operasi. Sehubungan itu, offset diletakkan dalam daftar umum yang ditunjukkan oleh operan destinasi.

Tetapi tidak semuanya begitu mudah dengan operan sumber. Malah, dalam arahan sebagai sumber, anda tidak boleh menentukan secara langsung nama operan dalam ingatan, yang kami ingin menerima penunjuk. Mula-mula, anda perlu mendapatkan nilai penuding penuh dalam beberapa kawasan memori dan nyatakan alamat penuh nama kawasan ini dalam arahan get. Untuk melaksanakan tindakan ini, anda perlu mengingati arahan untuk menempah dan memulakan memori.

Apabila menggunakan arahan ini, kes khas adalah mungkin apabila nama arahan definisi data lain (sebenarnya, nama pembolehubah) dinyatakan dalam medan operan. Dalam kes ini, alamat pembolehubah ini terbentuk dalam ingatan. Alamat mana yang akan dijana (berkesan atau lengkap) bergantung pada arahan yang digunakan. Jika ia adalah dw, maka hanya nilai 16-bit alamat berkesan terbentuk dalam ingatan; jika ia adalah dd, alamat penuh ditulis ke ingatan. Lokasi alamat ini dalam ingatan adalah seperti berikut: perkataan rendah mengandungi offset, perkataan tinggi mengandungi komponen segmen 16-bit alamat.

Sebagai contoh, apabila mengatur kerja dengan rantaian aksara, adalah mudah untuk meletakkan alamat permulaannya dalam daftar tertentu dan kemudian mengubah suai nilai ini dalam gelung untuk akses berurutan kepada elemen rantai.

Keperluan untuk menggunakan arahan untuk mendapatkan penunjuk data penuh dalam ingatan, iaitu, alamat segmen dan nilai mengimbangi dalam segmen, timbul, khususnya, apabila bekerja dengan rantai.

Perintah penukaran data

Banyak arahan mikropemproses boleh dikaitkan dengan kumpulan ini, tetapi kebanyakannya mempunyai ciri tertentu yang memerlukannya untuk dikaitkan dengan kumpulan berfungsi lain. Oleh itu, daripada keseluruhan set perintah mikropemproses, hanya satu perintah boleh dikaitkan secara langsung dengan arahan penukaran data: xlat [address_of_transcoding_table]

Ini adalah pasukan yang sangat menarik dan berguna. Kesannya ialah ia menggantikan nilai dalam daftar al dengan bait lain daripada jadual memori yang terletak di alamat yang ditentukan oleh operan remap_table_address.

Perkataan "jadual" sangat bersyarat, sebenarnya, ia hanyalah rentetan bait. Alamat bait dalam rentetan yang akan menggantikan kandungan daftar al ditentukan oleh jumlah (bx) + (al), iaitu kandungan al bertindak sebagai indeks dalam tatasusunan bait.

Apabila bekerja dengan arahan xlat, perhatikan perkara halus berikut. Walaupun arahan itu menentukan alamat rentetan bait dari mana nilai baharu itu hendak diambil, alamat ini mesti dipramuat (contohnya, menggunakan arahan lea) ke dalam daftar bx. Oleh itu, operan lookup_table_address tidak benar-benar diperlukan (pilihan operan ditunjukkan dengan melampirkannya dalam kurungan segi empat sama). Bagi rentetan bait (jadual transcoding), ia adalah kawasan memori dari 1 hingga 255 bait dalam saiz (julat nombor yang tidak ditandatangani dalam daftar 8-bit).

Perintah Timbunan

Kumpulan ini ialah satu set perintah khusus yang memfokuskan pada mengatur kerja yang fleksibel dan cekap dengan timbunan.

Tindanan ialah kawasan memori yang diperuntukkan khas untuk penyimpanan sementara data program. Kepentingan timbunan ditentukan oleh fakta bahawa segmen berasingan disediakan untuknya dalam struktur program. Sekiranya pengaturcara terlupa mengisytiharkan segmen tindanan dalam programnya, pemaut tlink akan mengeluarkan mesej amaran.

Terdapat tiga daftar untuk bekerja dengan timbunan:

1) ss - daftar segmen tindanan;

2) sp/esp - daftar penuding tindanan;

3) bp/ebp - daftar penuding asas bingkai tindanan.

Saiz tindanan bergantung pada mod pengendalian mikropemproses dan dihadkan kepada 64 KB (atau 4 GB dalam mod dilindungi).

Hanya satu timbunan tersedia pada satu masa, alamat segmennya terkandung dalam daftar SS. Timbunan ini dipanggil timbunan semasa. Untuk merujuk kepada tindanan lain ("tukar tindanan"), adalah perlu untuk memuatkan alamat lain ke dalam daftar ss. Daftar SS digunakan secara automatik oleh pemproses untuk melaksanakan semua arahan yang berfungsi pada tindanan.

Kami menyenaraikan beberapa lagi ciri untuk bekerja dengan timbunan:

1) menulis dan membaca data pada timbunan dijalankan mengikut prinsip LIFO,

2) apabila data ditulis pada timbunan, yang terakhir berkembang ke arah alamat yang lebih rendah. Ciri ini dibenamkan dalam algoritma arahan untuk bekerja dengan timbunan;

3) apabila menggunakan daftar esp/sp dan ebp/bp untuk pengalamatan memori, penghimpun secara automatik menganggap bahawa nilai yang terkandung di dalamnya adalah mengimbangi berbanding dengan daftar segmen ss.

Secara amnya, susunan disusun seperti yang ditunjukkan dalam Rajah 23.

nasi. 23. Gambar rajah konsep organisasi tindanan

Daftar SS, ESP/SP dan EUR/BP direka bentuk untuk berfungsi dengan tindanan. Daftar ini digunakan dengan cara yang kompleks, dan setiap daripada mereka mempunyai tujuan fungsinya sendiri.

Daftar ESP/SP sentiasa menunjuk ke bahagian atas tindanan, iaitu, ia mengandungi offset di mana elemen terakhir ditolak ke tindanan. Arahan tindanan secara tersirat mengubah daftar ini supaya ia sentiasa menunjuk kepada elemen terakhir yang ditolak ke tindanan. Jika tindanan kosong, maka nilai esp adalah sama dengan alamat bait terakhir segmen yang diperuntukkan untuk tindanan. Apabila elemen ditolak ke tindanan, pemproses mengurangkan nilai daftar esp, dan kemudian menulis elemen ke alamat bucu baharu. Apabila memaparkan data daripada tindanan, pemproses menyalin elemen yang terletak di alamat atas, dan kemudian menambah nilai daftar penuding tindanan esp. Oleh itu, ternyata timbunan itu tumbuh ke bawah, ke arah penurunan alamat.

Bagaimana jika kita perlu mengakses elemen bukan di bahagian atas, tetapi di dalam timbunan? Untuk melakukan ini, gunakan daftar EBP. Daftar EBP ialah daftar penuding asas bingkai tindanan.

Sebagai contoh, helah biasa apabila memasuki subrutin adalah untuk lulus parameter yang dikehendaki dengan menolaknya ke dalam tindanan. Jika subrutin juga aktif bekerja dengan timbunan, maka akses kepada parameter ini menjadi bermasalah. Jalan keluar adalah untuk menyimpan alamat bahagian atas tindanan dalam penunjuk bingkai (asas) tindanan selepas menulis data yang diperlukan pada tindanan - daftar EUR. Nilai dalam EUR kemudiannya boleh digunakan untuk mengakses parameter yang diluluskan.

Permulaan timbunan terletak pada alamat memori yang lebih tinggi. Dalam Rajah 23, alamat ini dilambangkan dengan pasangan ss: ffF. Peralihan wT diberikan di sini secara bersyarat. Pada hakikatnya, nilai ini ditentukan oleh nilai yang ditentukan oleh pengaturcara apabila menerangkan segmen tindanan dalam programnya.

Untuk mengatur kerja dengan timbunan, terdapat arahan khas untuk menulis dan membaca.

1. sumber tolak - menulis nilai sumber ke bahagian atas timbunan.

Yang menarik ialah algoritma arahan ini, yang merangkumi tindakan berikut (Gamb. 24):

1) (sp) = (sp) - 2; nilai sp dikurangkan sebanyak 2;

2) nilai dari sumber ditulis ke alamat yang ditentukan oleh pasangan ss: sp.

nasi. 24. Bagaimana arahan tolak berfungsi

2. tugasan pop - menulis nilai dari bahagian atas tindanan ke lokasi yang ditentukan oleh operan destinasi. Oleh itu, nilai itu "dialih keluar" dari bahagian atas timbunan. Algoritma arahan pop adalah sebaliknya daripada algoritma arahan tolak (Gamb. 25):

1) menulis kandungan bahagian atas timbunan di lokasi yang ditunjukkan oleh operan destinasi;

2) (sp) = (sp) + 2; meningkatkan nilai sp.

nasi. 25. Bagaimana arahan pop berfungsi

3. pusha - arahan menulis kumpulan kepada timbunan. Dengan arahan ini, register ax, cx, dx, bx, sp, bp, si, di ditulis secara berurutan pada tindanan. Ambil perhatian bahawa kandungan asal sp ditulis, iaitu kandungan yang sebelum arahan pusha dikeluarkan (Rajah 26).

nasi. 26. Bagaimana arahan pusha berfungsi

4. pushaw hampir sinonim dengan arahan pusha. Apa bezanya? Atribut bitness boleh sama ada use16 atau use32. Mari lihat bagaimana arahan pusha dan pushaw berfungsi dengan setiap atribut ini:

1) use16 - algoritma pushaw adalah serupa dengan algoritma pusha;

2) use32 - pushaw tidak berubah (iaitu ia tidak sensitif kepada lebar segmen dan sentiasa berfungsi dengan daftar bersaiz perkataan - ax, cx, dx, bx, sp, bp, si, di). Perintah pusha adalah sensitif kepada lebar segmen yang ditetapkan dan apabila segmen 32-bit ditentukan, ia berfungsi dengan daftar 32-bit yang sepadan, iaitu eax, esx, edx, ebx, esp, ebp, esi, edi.

5. pushad - dilakukan sama dengan arahan pusha, tetapi terdapat beberapa keanehan.

Tiga arahan berikut melakukan sebaliknya daripada arahan di atas:

1) rora;

2) popaw;

3) pop.

Kumpulan arahan yang diterangkan di bawah membolehkan anda menyimpan daftar bendera pada tindanan dan menulis perkataan atau kata ganda pada tindanan. Ambil perhatian bahawa arahan yang disenaraikan di bawah adalah satu-satunya arahan dalam set arahan mikropemproses yang membenarkan (dan memerlukan) akses kepada keseluruhan kandungan daftar bendera.

1. pushf - menyimpan daftar bendera pada timbunan.

Operasi arahan ini bergantung pada atribut saiz segmen:

1) gunakan 16 - daftar bendera bersaiz 2 bait ditulis pada timbunan;

2) use32 - daftar eflags sebanyak 4 bait ditulis pada timbunan.

2. pushfw - menyimpan daftar bendera bersaiz perkataan pada timbunan. Sentiasa berfungsi seperti pushf dengan atribut use16.

3. pushfd - menyimpan bendera atau bendera bendera mendaftar pada tindanan bergantung pada atribut lebar bit segmen (iaitu, sama seperti pushf).

Begitu juga, tiga arahan berikut melakukan sebaliknya daripada operasi yang dibincangkan di atas:

1) popf;

2) popftv;

3) popfd.

Dan sebagai kesimpulan, kami perhatikan jenis operasi utama apabila penggunaan timbunan hampir tidak dapat dielakkan:

1) memanggil subrutin;

2) penyimpanan sementara nilai daftar;

3) definisi pembolehubah tempatan.

2. Arahan aritmetik

Mikropemproses boleh melakukan operasi integer dan titik terapung. Untuk melakukan ini, seni binanya mempunyai dua blok berasingan:

1) peranti untuk melaksanakan operasi integer;

2) peranti untuk melaksanakan operasi titik terapung.

Setiap peranti ini mempunyai sistem arahan sendiri. Pada dasarnya, peranti integer boleh mengambil alih banyak fungsi peranti titik terapung, tetapi ini akan mahal dari segi pengiraan. Untuk kebanyakan masalah menggunakan bahasa himpunan, aritmetik integer sudah memadai.

Gambaran keseluruhan kumpulan arahan dan data aritmetik

Peranti pengkomputeran integer menyokong lebih sedikit daripada sedozen arahan aritmetik. Rajah 27 menunjukkan klasifikasi arahan dalam kumpulan ini.

nasi. 27. Pengelasan perintah aritmetik

Kumpulan arahan aritmetik integer berfungsi dengan dua jenis nombor:

1) nombor perduaan integer. Nombor mungkin mempunyai digit yang ditandatangani atau tidak, iaitu, nombor yang ditandatangani atau tidak ditandatangani;

2) nombor perpuluhan integer.

Pertimbangkan format mesin di mana jenis data ini disimpan.

Nombor binari integer

Integer binari titik tetap ialah nombor yang dikodkan dalam sistem nombor binari.

Dimensi integer binari boleh menjadi 8, 16 atau 32 bit. Tanda nombor binari ditentukan oleh bagaimana bit paling ketara dalam perwakilan nombor itu ditafsirkan. Ini ialah bit 7,15 atau 31 untuk nombor dimensi yang sepadan. Pada masa yang sama, menarik bahawa antara perintah aritmetik hanya terdapat dua perintah yang benar-benar mengambil kira bit yang paling penting ini sebagai satu tanda - ini adalah perintah pendaraban dan pembahagian integer imul dan idiv. Dalam kes lain, tanggungjawab untuk tindakan dengan nombor yang ditandatangani dan, dengan itu, dengan bit tanda terletak pada pengaturcara. Julat nilai nombor binari bergantung pada saiz dan tafsiran bit paling ketara sama ada sebagai bit paling ketara nombor atau sebagai bit tanda nombor (Jadual 9).

Jadual 9. Julat nombor binari Nombor perpuluhan

Nombor perpuluhan ialah sejenis perwakilan khas maklumat berangka, yang berdasarkan prinsip pengekodan setiap digit perpuluhan nombor oleh sekumpulan empat bit. Dalam kes ini, setiap bait nombor mengandungi satu atau dua digit perpuluhan dalam apa yang dipanggil kod perpuluhan berkod binari (BCD - Perpuluhan Berkod Binari). Mikropemproses menyimpan nombor BCD dalam dua format (Gamb. 28):

1) format yang dibungkus. Dalam format ini, setiap bait mengandungi dua digit perpuluhan. Digit perpuluhan ialah nilai binari 0-bit antara 9 dan 4. Dalam kes ini, kod digit tertinggi nombor menduduki 4 bit tertinggi. Oleh itu, julat perwakilan nombor pek perpuluhan dalam 1 bait adalah dari 00 hingga 99;

2) format tidak dibungkus. Dalam format ini, setiap bait mengandungi satu digit perpuluhan dalam empat bit paling tidak bererti. 4 bit atas ditetapkan kepada sifar. Ini adalah zon yang dipanggil. Oleh itu, julat mewakili nombor perpuluhan yang dibongkar dalam 1 bait adalah dari 0 hingga 9.

nasi. 28. Perwakilan nombor BCD

Bagaimana untuk menerangkan nombor perpuluhan binari dalam program? Untuk melakukan ini, anda boleh menggunakan hanya dua penerangan data dan arahan permulaan - db dan dt. Kemungkinan menggunakan hanya arahan ini untuk menerangkan nombor BCD adalah disebabkan oleh fakta bahawa prinsip "bait rendah pada alamat rendah" juga boleh digunakan untuk nombor sedemikian, yang sangat mudah untuk pemprosesannya. Dan secara umum, apabila menggunakan jenis data seperti nombor BCD, susunan nombor ini diterangkan dalam program dan algoritma untuk memprosesnya adalah masalah citarasa dan keutamaan peribadi pengaturcara. Ini akan menjadi jelas selepas kita melihat asas bekerja dengan nombor BCD di bawah.

Operasi aritmetik pada integer binari

Penambahan nombor binari yang tidak ditandatangani

Mikropemproses melakukan penambahan operan mengikut peraturan untuk menambah nombor binari. Tiada masalah selagi nilai hasil tidak melebihi dimensi medan operan. Sebagai contoh, apabila menambah operan bersaiz bait, hasilnya tidak boleh melebihi nombor 255. Jika ini berlaku, maka hasilnya tidak betul. Mari kita pertimbangkan mengapa ini berlaku.

Sebagai contoh, mari kita lakukan penambahan: 254 + 5 = 259 dalam binari. 11111110 + 0000101 = 1 00000011. Hasilnya melangkaui 8 bit dan nilai yang betul sesuai dengan 9 bit, dan nilai 8 kekal dalam medan 3-bit operan, yang, sudah tentu, tidak benar. Dalam mikropemproses, hasil penambahan ini diramalkan dan cara khas disediakan untuk membetulkan situasi sedemikian dan memprosesnya. Jadi, untuk membetulkan keadaan melangkaui grid bit hasil, seperti dalam kes ini, cf bendera pembawa dimaksudkan. Ia terletak di bit 0 daftar bendera EFLAGS/FLAGS. Tetapan bendera ini yang membetulkan fakta pemindahan satu daripada tertib tinggi operan. Sememangnya, pengaturcara mesti mengambil kira kemungkinan hasil operasi penambahan tersebut dan menyediakan cara untuk pembetulan. Ini melibatkan memasukkan bahagian kod selepas operasi penambahan di mana bendera cf dihuraikan. Bendera ini boleh dihuraikan dalam pelbagai cara.

Yang paling mudah dan paling mudah diakses ialah menggunakan perintah cawangan bersyarat jcc. Arahan ini mempunyai sebagai operan nama label dalam segmen kod semasa. Peralihan kepada label ini dijalankan jika, hasil daripada pengendalian arahan sebelumnya, bendera cf ditetapkan kepada 1. Terdapat tiga arahan penambahan binari dalam sistem arahan mikropemproses:

1) operan inc - operasi kenaikan, iaitu meningkatkan nilai operan sebanyak 1;

2) tambah operand_1, operand_2 - arahan penambahan dengan prinsip operasi: operand_1 = operand_1 + operand_2;

3) adc operand_1, operand_2 - arahan tambahan dengan mengambil kira bendera carry cf. Prinsip operasi arahan: operand_1 = operand_1 + operand_2 + value_sG.

Beri perhatian kepada arahan terakhir - ini adalah arahan tambahan, yang mengambil kira pemindahan satu dari perintah tinggi. Kami telah mempertimbangkan mekanisme untuk penampilan unit sedemikian. Oleh itu, arahan adc ialah alat mikropemproses untuk menambah nombor binari yang panjang, yang dimensinya melebihi panjang medan standard yang disokong oleh mikropemproses.

Penambahan Binari yang Ditandatangani

Sebenarnya, mikropemproses "sedar" tentang perbezaan antara nombor bertanda dan tidak bertanda. Sebaliknya, dia mempunyai cara untuk menetapkan kejadian situasi ciri yang berkembang dalam proses pengiraan. Kami membincangkan beberapa daripadanya apabila membincangkan penambahan yang tidak ditandatangani:

1) bendera cf carry, menetapkannya kepada 1 menunjukkan bahawa operan berada di luar julat;

2) arahan adc, yang mengambil kira kemungkinan keluar sedemikian (membawa dari bit yang paling tidak ketara).

Cara lain ialah mendaftarkan keadaan bit (tanda) tertib tinggi bagi operan, yang dilakukan menggunakan bendera limpahan dalam daftar EFLAGS (bit 11).

Sudah tentu, anda masih ingat bagaimana nombor diwakili dalam komputer: positif - dalam binari, negatif - dalam pelengkap dua. Pertimbangkan pelbagai pilihan untuk menambah nombor. Contoh-contoh ini bertujuan untuk menunjukkan tingkah laku dua bit yang paling ketara bagi operan dan ketepatan hasil operasi tambah.

Contoh

30566 = 0111011101100110

+

00687 = 00000010

=

31253 = 01111010

Kami memantau pemindahan dari digit ke-14 dan ke-15 dan ketepatan keputusan: tiada pemindahan, hasilnya betul.

Contoh

30566 = 0111011101100110

+

30566 = 0111011101100110

=

1132 = 11101110

Terdapat perpindahan dari kategori ke-14; tiada perpindahan dari kategori ke-15. Hasilnya adalah salah, kerana terdapat limpahan - nilai nombor ternyata lebih besar daripada apa yang boleh dimiliki oleh nombor bertanda 16-bit (+32 767).

Contoh

-30566 = 10001000 10011010

+

-04875 = 11101100 11110101

=

-35441 = 01110101 10001111

Terdapat pemindahan dari digit ke-15, tidak ada pemindahan dari digit ke-14. Hasilnya tidak betul, kerana bukannya nombor negatif, ia ternyata positif (bit yang paling ketara ialah 0).

Contoh

-4875 = 11101100 11110101

+

-4875 = 11101100 11110101

=

09750 = 11011001

Terdapat pemindahan dari bit ke-14 dan ke-15. Hasilnya betul.

Oleh itu, kami memeriksa semua kes dan mendapati bahawa situasi limpahan (menetapkan bendera OF kepada 1) berlaku semasa pemindahan:

1) daripada digit ke-14 (untuk nombor positif yang ditandatangani);

2) daripada digit ke-15 (untuk nombor negatif).

Sebaliknya, tiada limpahan berlaku (iaitu, bendera OF ditetapkan semula kepada 0) jika terdapat pembawaan daripada kedua-dua bit atau jika tiada pembawaan dalam kedua-dua bit.

Jadi limpahan didaftarkan dengan bendera limpahan. Sebagai tambahan kepada bendera, apabila memindahkan daripada bit tertib tinggi, CF bendera pemindahan ditetapkan kepada 1. Memandangkan mikropemproses tidak mengetahui tentang kewujudan nombor bertanda dan tidak bertanda, pengaturcara bertanggungjawab sepenuhnya untuk tindakan yang betul dengan nombor yang terhasil. Anda boleh menghuraikan bendera CF dan OF dengan arahan lompat bersyarat JC\JNC dan JO\JNO, masing-masing.

Bagi arahan untuk menambah nombor dengan tanda, ia adalah sama seperti untuk nombor tanpa tanda.

Penolakan nombor binari yang tidak ditandatangani

Seperti dalam analisis operasi tambah, kita akan membincangkan intipati proses yang berlaku semasa melakukan operasi tolak. Jika minuend lebih besar daripada subtrahend, maka tidak ada masalah - perbezaannya adalah positif, hasilnya betul. Jika minuend kurang daripada yang ditolak, terdapat masalah: hasilnya kurang daripada 0, dan ini sudah pun nombor yang ditandatangani. Dalam kes ini, hasilnya mesti dibalut. Apakah maksud ini? Dengan penolakan biasa (dalam lajur), mereka membuat pinjaman 1 daripada susunan tertinggi. Mikropemproses melakukan perkara yang sama, iaitu, ia mengambil 1 daripada digit mengikut yang tertinggi dalam grid bit operan. Mari kita jelaskan dengan contoh.

Contoh

05 = 00000000

-10 = 00000000 00001010

Untuk melakukan penolakan, mari lakukan

pinjaman khayalan senior:

100000000 00000101

-

00000000 00001010

=

11111111 11111011

Oleh itu, pada dasarnya, tindakan

(65 + 536) - 5 = 10

0 di sini, seolah-olah, bersamaan dengan nombor 65536. Hasilnya, sudah tentu, tidak betul, tetapi mikropemproses menganggap bahawa semuanya baik-baik saja, walaupun ia membetulkan fakta meminjam unit dengan menetapkan bendera pembawa rujuk. Tetapi lihat sekali lagi dengan teliti hasil operasi tolak. Ia adalah pelengkap -5 dalam dua! Mari kita jalankan eksperimen: nyatakan perbezaan sebagai hasil tambah 5 + (-10).

Contoh

5 = 00000000

+

(-10)= 11111111 11110110

=

11111111 11111011

iaitu kami mendapat hasil yang sama seperti dalam contoh sebelumnya.

Oleh itu, selepas arahan untuk menolak nombor yang tidak ditandatangani, adalah perlu untuk menganalisis keadaan bendera CE. Jika ia ditetapkan kepada 1, maka ini menunjukkan bahawa terdapat peminjaman dari urutan tinggi dan hasilnya diperoleh dalam kod tambahan .

Seperti arahan penambahan, kumpulan arahan penolakan terdiri daripada set terkecil yang mungkin. Arahan ini melakukan penolakan mengikut algoritma yang sedang kita pertimbangkan, dan pengecualian mesti diambil kira oleh pengaturcara sendiri. Perintah penolakan termasuk:

1) operan dec - operasi pengurangan, iaitu mengurangkan nilai operan sebanyak 1;

2) sub operan_1, operan_2 - perintah penolakan; prinsip operasinya: operand_1 = operand_1 - operand_2;

3) sbb operand_1, operand_2 - arahan tolak mengambil kira pinjaman (ci flag): operand_1 = operand_1 - operand_2 - value_sG.

Seperti yang anda boleh lihat, antara arahan penolakan terdapat perintah sbb yang mengambil kira bendera carry cf. Perintah ini serupa dengan adc, tetapi kini bendera cf bertindak sebagai penunjuk peminjaman 1 daripada digit paling bererti apabila menolak nombor.

Penolakan binari yang ditandatangani

Di sini semuanya agak rumit. Mikropemproses tidak perlu mempunyai dua peranti - penambahan dan penolakan. Ia cukup untuk mempunyai hanya satu - peranti tambahan. Tetapi untuk penolakan dengan cara menambah nombor dengan tanda dalam kod tambahan, adalah perlu untuk mewakili kedua-dua operan - kedua-dua yang dikurangkan dan yang ditolak. Hasilnya juga harus dianggap sebagai nilai pelengkap dua. Tetapi di sini kesukaran timbul. Pertama sekali, ia berkaitan dengan fakta bahawa bit yang paling penting bagi operan dianggap sebagai bit tanda. Pertimbangkan contoh penolakan 45 - (-127).

Contoh

Penolakan nombor bertanda 1

45 = 0010

-

-127 = 1000 0001

=

-44 = 1010 1100

Berdasarkan bit tanda, hasilnya ternyata negatif, yang seterusnya, menunjukkan bahawa nombor itu harus dianggap sebagai pelengkap sama dengan -44. Keputusan yang betul mestilah 172. Di sini, seperti dalam kes penambahan yang ditandatangani, kami bertemu dengan limpahan mantissa, apabila bit ketara nombor menukar bit tanda operan. Anda boleh menjejaki keadaan ini dengan kandungan bendera limpahan. Menetapkannya kepada 1 menunjukkan bahawa keputusan berada di luar julat nombor yang ditandatangani (iaitu, bit yang paling ketara telah berubah) untuk operan sebesar ini dan pengaturcara mesti mengambil tindakan untuk membetulkan hasilnya.

Contoh

Penolakan nombor bertanda 2

-45-45 = -45 + (-45) = -90.

-45=11010011

+

-45=11010011

=

-90 = 1010 0110

Semuanya baik-baik saja di sini, bendera limpahan ditetapkan semula kepada 0, dan 1 dalam bit tanda menunjukkan bahawa nilai hasil ialah nombor pelengkap dua.

Penolakan dan penambahan operan besar

Jika anda perasan, arahan penambahan dan penolakan berfungsi dengan operan dimensi tetap: 8, 16, 32 bit. Tetapi bagaimana jika anda perlu menambah nombor dimensi yang lebih besar, contohnya 48 bit, menggunakan operan 16-bit? Sebagai contoh, mari tambah dua nombor 48-bit:

nasi. 29. Menambah operan besar

Rajah 29 menunjukkan teknologi untuk menambah nombor panjang langkah demi langkah. Ia boleh dilihat bahawa proses menambah nombor berbilang bait berlaku dengan cara yang sama seperti semasa menambah dua nombor "dalam lajur" - dengan pelaksanaan, jika perlu, memindahkan 1 ke bit tertinggi. Jika kita berjaya memprogramkan proses ini, maka kita akan meluaskan julat nombor binari dengan ketara yang boleh kita lakukan operasi tambah dan tolak.

Prinsip penolakan nombor dengan julat perwakilan melebihi grid bit operan piawai adalah sama seperti untuk penambahan, iaitu, bendera bawa cf digunakan. Anda hanya perlu membayangkan proses penolakan dalam lajur dan menggabungkan arahan mikropemproses dengan betul dengan arahan sbb.

Untuk mengakhiri perbincangan kita tentang arahan penambahan dan penolakan, sebagai tambahan kepada rujuk dan bendera, terdapat beberapa bendera lain dalam daftar bendera yang boleh digunakan dengan arahan aritmetik binari. Ini adalah bendera berikut:

1) zf - bendera sifar, yang ditetapkan kepada 1 jika hasil operasi ialah 0, dan kepada 1 jika hasilnya tidak sama dengan 0;

2) sf - bendera tanda, nilai yang selepas operasi aritmetik (dan bukan sahaja) bertepatan dengan nilai bit paling ketara hasil, iaitu dengan bit 7, 15 atau 31. Oleh itu, bendera ini boleh digunakan untuk operasi pada nombor yang ditandatangani.

Pendaraban nombor tidak bertanda

Perintah untuk mendarab nombor tidak bertanda ialah

mul faktor_1

Seperti yang anda lihat, arahan mengandungi hanya satu operan pengganda. Faktor operan kedua_2 dinyatakan secara tersirat. Lokasinya tetap dan bergantung pada saiz faktor. Oleh kerana, secara amnya, hasil pendaraban adalah lebih besar daripada mana-mana faktornya, saiz dan lokasinya juga mesti ditentukan secara unik. Pilihan untuk saiz faktor dan penempatan operan kedua dan hasilnya ditunjukkan dalam Jadual 10.

Jadual 10. Susunan operan dan hasil darab

Ia boleh dilihat dari jadual bahawa produk terdiri daripada dua bahagian dan, bergantung pada saiz operan, diletakkan di dua tempat - di tempat faktor_2 (bahagian bawah) dan dalam daftar tambahan ah, dx, edx (bahagian yang lebih tinggi ). Bagaimana, kemudian, secara dinamik (iaitu, semasa pelaksanaan program) untuk mengetahui bahawa hasilnya cukup kecil untuk dimuatkan dalam satu daftar, atau bahawa ia melebihi dimensi daftar dan bahagian tertinggi berakhir dalam daftar lain? Untuk melakukan ini, kami menggunakan bendera cf dan limpahan yang telah kami ketahui daripada perbincangan sebelumnya:

1) jika bahagian utama keputusan adalah sifar, maka selepas operasi produk tanda cf = 0 dan daripada = 0;

2) jika bendera ini bukan sifar, maka ini bermakna bahawa hasilnya telah melampaui bahagian terkecil produk dan terdiri daripada dua bahagian, yang harus diambil kira dalam kerja selanjutnya.

Darab nombor yang ditandatangani

Perintah untuk mendarab nombor dengan tanda ialah

[imul operand_1, operand_2, operand_3]

Perintah ini dilaksanakan dengan cara yang sama seperti arahan mul. Ciri tersendiri bagi perintah imul hanyalah pembentukan tanda.

Jika hasilnya kecil dan sesuai dalam satu daftar (iaitu, jika cf = daripada = 0), maka kandungan daftar lain (bahagian tinggi) adalah sambungan tanda - semua bitnya sama dengan bit tinggi (bit tanda ) daripada bahagian bawah hasil. Jika tidak (jika cf = daripada = 1), tanda hasil ialah bit tanda bahagian tinggi hasil, dan bit tanda bahagian rendah ialah bit signifikan kod hasil binari.

Pembahagian nombor tidak bertanda

Perintah untuk membahagi nombor tidak bertanda ialah

pembahagi div

Pembahagi boleh berada dalam ingatan atau dalam daftar dan bersaiz 8, 16, atau 32 bit. Lokasi dividen adalah tetap dan, seperti dalam arahan pendaraban, bergantung pada saiz operan. Hasil daripada arahan bahagi ialah nilai bagi dan baki.

Pilihan untuk lokasi dan saiz operan operasi bahagi ditunjukkan dalam Jadual 11.

Jadual 11. Susunan operan dan hasil pembahagian

Selepas arahan bahagi dilaksanakan, kandungan bendera tidak ditentukan, tetapi sampukan nombor 0, dipanggil "bahagi dengan sifar", mungkin berlaku. Jenis gangguan ini tergolong dalam pengecualian yang dipanggil. Gangguan jenis ini berlaku di dalam mikropemproses disebabkan oleh beberapa anomali semasa proses pengkomputeran. Sampukan O, "bahagi dengan sifar", semasa melaksanakan arahan div boleh berlaku atas salah satu sebab berikut:

1) pembahagi adalah sifar;

2) hasil bagi tidak termasuk dalam grid bit yang diperuntukkan untuknya, yang boleh berlaku dalam kes berikut:

a) apabila membahagikan dividen dengan nilai perkataan dengan pembahagi dengan nilai bait, dan nilai dividen lebih daripada 256 kali lebih besar daripada nilai pembahagi;

b) apabila membahagikan dividen dengan nilai kata ganda dengan pembahagi dengan nilai perkataan, dan nilai dividen lebih daripada 65 kali lebih besar daripada nilai pembahagi;

c) apabila membahagikan dividen dengan nilai perkataan empat kali ganda dengan pembahagi dengan nilai kata ganda, dan nilai dividen adalah lebih daripada 4 kali lebih besar daripada nilai pembahagi.

Pembahagian dengan tanda

Perintah untuk membahagi nombor dengan tanda ialah

pembahagi idiv

Untuk arahan ini, semua peruntukan yang dipertimbangkan mengenai arahan dan nombor yang ditandatangani adalah sah. Kami hanya perhatikan ciri-ciri berlakunya pengecualian 0, "bahagi dengan sifar", dalam kes nombor dengan tanda. Ia berlaku apabila melaksanakan perintah idiv untuk salah satu sebab berikut:

1) pembahagi adalah sifar;

2) hasil bagi tidak termasuk dalam grid bit yang diperuntukkan untuknya.

Yang terakhir seterusnya boleh berlaku:

1) apabila membahagikan dividen dengan nilai perkataan yang ditandatangani oleh pembahagi dengan nilai bait yang ditandatangani, dan nilai dividen adalah lebih daripada 128 kali ganda nilai pembahagi (oleh itu, hasil bahagi tidak seharusnya berada di luar julat dari -128 kepada + 127);

2) apabila membahagikan dividen dengan nilai kata ganda yang ditandatangani oleh pembahagi dengan nilai perkataan yang ditandatangani, dan nilai dividen adalah lebih daripada 32 kali nilai pembahagi (oleh itu, hasil bahagi mestilah tidak berada di luar julat dari - 768 kepada +32);

3) apabila membahagikan dividen dengan nilai empat kata yang ditandatangani dengan pembahagi kata ganda yang ditandatangani, dan nilai dividen adalah lebih daripada 2 kali ganda nilai pembahagi (oleh itu, hasil bahagi mestilah tidak berada di luar julat -147 hingga + 483 648 2 147).

Arahan Bantu untuk Operasi Integer

Terdapat beberapa arahan dalam set arahan mikropemproses yang boleh memudahkan untuk memprogramkan algoritma yang melakukan pengiraan aritmetik. Pelbagai masalah mungkin timbul di dalamnya, untuk penyelesaian yang mana pembangun mikropemproses telah menyediakan beberapa arahan.

Jenis Perintah Penukaran

Bagaimana jika saiz operan yang terlibat dalam operasi aritmetik adalah berbeza? Sebagai contoh, katakan dalam operasi tambah, satu operan ialah perkataan dan satu lagi ialah kata ganda. Dikatakan di atas bahawa operan daripada format yang sama mesti mengambil bahagian dalam operasi penambahan. Sekiranya nombor tidak ditandatangani, maka outputnya mudah dicari. Dalam kes ini, berdasarkan operan asal, yang baru (format perkataan berganda) boleh dibentuk, bit tinggi yang hanya boleh diisi dengan sifar. Keadaan ini lebih rumit untuk nombor yang ditandatangani: bagaimana untuk mengambil kira tanda operan secara dinamik, semasa pelaksanaan program? Untuk menyelesaikan masalah sedemikian, set arahan mikropemproses mempunyai apa yang dipanggil arahan penukaran jenis. Arahan ini mengembangkan bait menjadi perkataan, perkataan menjadi kata ganda dan kata ganda menjadi perkataan empat (nilai 64-bit). Arahan penukaran jenis amat berguna apabila menukar integer yang ditandatangani, kerana ia secara automatik mengisi bit tertib tinggi bagi operan yang baru dibina dengan nilai bit tanda objek lama. Operasi ini menghasilkan nilai integer dengan tanda yang sama dan magnitud yang sama seperti yang asal, tetapi dalam format yang lebih panjang. Transformasi sedemikian dipanggil operasi penyebaran tanda.

Terdapat dua jenis perintah penukaran jenis.

1. Arahan tanpa operan. Perintah ini berfungsi dengan daftar tetap:

1) cbw (Tukar Bait kepada Perkataan) - arahan untuk menukar bait (dalam daftar al) kepada perkataan (dalam daftar ah) dengan menyebarkan nilai bit al tinggi kepada semua bit daftar ah;

2) cwd (Convert Word to Double) - arahan untuk menukar perkataan (dalam register ax) kepada double word (dalam registers dx: ax) dengan menyebarkan nilai ax bit tinggi kepada semua bit register dx;

3) cwde (Tukar Word ke Ganda) - arahan untuk menukar perkataan (dalam register ax) menjadi kata ganda (dalam register eax) dengan menyebarkan nilai ax bit tinggi ke semua bit separuh atas daftar eax ;

4) cdq (Convert Double Word to Quarter Word) - arahan untuk menukar kata ganda (dalam daftar eax) menjadi perkataan empat kali ganda (dalam edx: eax registers) dengan menyebarkan nilai bit eax yang paling ketara kepada semua bit daftar edx.

2. Arahan movsx dan movzx berkaitan dengan arahan pemprosesan rentetan. Perintah ini mempunyai sifat yang berguna dalam konteks masalah kami:

1) movsx operand_1, operand_2 - hantar dengan penyebaran tanda. Memanjangkan nilai 8 atau 16-bit operand_2, yang boleh menjadi daftar atau operan memori, kepada nilai 16 atau 32-bit dalam salah satu daftar, menggunakan nilai bit tanda untuk mengisi kedudukan yang lebih tinggi bagi operan_1. Arahan ini berguna untuk menyediakan operan yang ditandatangani untuk operasi aritmetik;

2) movzx operand_1, operand_2 - hantar dengan sambungan sifar. Memanjangkan nilai 8-bit atau 16-bit operand_2 kepada 16-bit atau 32-bit, mengosongkan (mengisi) kedudukan tinggi operand_2 dengan sifar. Arahan ini berguna untuk menyediakan operan tidak bertanda untuk aritmetik.

Perintah lain yang berguna

1. xtambah destinasi, sumber - pertukaran dan penambahan.

Perintah itu membolehkan anda melakukan dua tindakan mengikut urutan:

1) pertukaran destinasi dan nilai sumber;

2) letakkan operan destinasi sebagai ganti jumlah: destinasi = destinasi + sumber.

2. operan neg - penolakan dengan pelengkap dua.

Arahan menyongsangkan nilai operan. Secara fizikal, arahan melakukan satu tindakan:

operan = 0 - operan, iaitu menolak operan daripada sifar.

Perintah operan neg boleh digunakan:

1) untuk menukar tanda;

2) untuk melakukan penolakan daripada pemalar.

Operasi aritmetik pada nombor perduaan-perpuluhan

Dalam bahagian ini, kita akan melihat spesifik bagi setiap empat operasi aritmetik asas untuk nombor BCD yang dibungkus dan dibongkar.

Persoalannya mungkin timbul: mengapa kita memerlukan nombor BCD? Jawapannya mungkin: Nombor BCD diperlukan dalam aplikasi perniagaan, iaitu di mana nombor itu perlu besar dan tepat. Seperti yang telah kita lihat pada contoh nombor binari, operasi dengan nombor sedemikian agak bermasalah untuk bahasa himpunan. Kelemahan menggunakan nombor binari termasuk yang berikut:

1) Nilai dalam format perkataan dan kata ganda mempunyai julat terhad. Jika program ini direka untuk bekerja dalam bidang kewangan, maka mengehadkan jumlah dalam rubel kepada 65 (untuk satu perkataan) atau bahkan 536 (untuk kata ganda) akan mengecilkan skop penggunaannya dengan ketara;

2) kehadiran ralat pembundaran. Bolehkah anda bayangkan program berjalan di suatu tempat di bank yang tidak mengambil kira nilai baki apabila beroperasi dengan integer binari dan beroperasi dengan berbilion-bilion? Saya tidak mahu menjadi pengarang program sedemikian. Penggunaan nombor titik terapung tidak akan menjimatkan - masalah pembundaran yang sama wujud di sana;

3) pembentangan sejumlah besar hasil dalam bentuk simbolik (kod ASCII). Program perniagaan bukan sahaja melakukan pengiraan; salah satu tujuan penggunaannya ialah penyampaian maklumat yang segera kepada pengguna. Untuk melakukan ini, sudah tentu, maklumat mesti dibentangkan dalam bentuk simbolik. Menukar nombor daripada binari kepada ASCII memerlukan beberapa usaha pengiraan. Nombor titik terapung adalah lebih sukar untuk diterjemahkan ke dalam bentuk simbolik. Tetapi jika anda melihat perwakilan perenambelasan bagi digit perpuluhan yang tidak dibungkus dan aksara yang sepadan dalam jadual ASCII, anda boleh melihat bahawa ia berbeza sebanyak 30j. Oleh itu, penukaran kepada bentuk simbolik dan sebaliknya adalah lebih mudah dan cepat.

Anda mungkin telah melihat kepentingan menguasai sekurang-kurangnya asas tindakan dengan nombor perpuluhan. Seterusnya, pertimbangkan ciri-ciri menjalankan operasi aritmetik asas dengan nombor perpuluhan. Kami segera perhatikan hakikat bahawa tiada arahan berasingan untuk penambahan, penolakan, pendaraban dan pembahagian nombor BCD. Ini dilakukan atas sebab yang agak boleh difahami: dimensi nombor sedemikian boleh sewenang-wenangnya besar. Nombor BCD boleh ditambah dan ditolak, kedua-duanya dibungkus dan dibongkar, tetapi hanya nombor BCD yang dibongkar boleh membahagi dan mendarab. Mengapa ini berlaku akan dilihat dari perbincangan lanjut.

Aritmetik pada nombor BCD yang dibongkar

Tambahkan nombor BCD yang tidak dibungkus

Mari kita pertimbangkan dua kes penambahan.

Contoh

Hasil penambahan tidak lebih daripada 9

6 = 0000

+

3 = 0000

=

9 = 0000

Tiada perpindahan dari junior kepada senior tetrad. Hasilnya betul.

Contoh

Hasil penambahan lebih besar daripada 9:

06 = 0000

+

07 = 0000

=

13 = 0000

Kami tidak lagi menerima nombor BCD. Hasilnya salah. Hasil yang betul dalam format BCD yang dibongkar hendaklah 0000 0001 0000 0011 dalam binari (atau 13 dalam perpuluhan).

Selepas menganalisis masalah ini apabila menambah nombor BCD (dan masalah yang sama semasa menjalankan operasi aritmetik lain) dan cara yang mungkin untuk menyelesaikannya, pembangun sistem arahan mikropemproses memutuskan untuk tidak memperkenalkan arahan khas untuk bekerja dengan nombor BCD, tetapi untuk memperkenalkan beberapa arahan pembetulan .

Tujuan arahan ini adalah untuk membetulkan hasil operasi arahan aritmetik biasa untuk kes di mana operan di dalamnya adalah nombor BCD.

Dalam kes penolakan dalam contoh 10, dapat dilihat bahawa keputusan yang diperoleh perlu diperbetulkan. Untuk membetulkan operasi menambah dua nombor BCD yang tidak dibungkus satu digit dalam sistem arahan mikropemproses, terdapat arahan khas - aaa (ASCII Adjust for Addition) - pembetulan hasil penambahan untuk perwakilan dalam bentuk simbolik.

Arahan ini tidak mempunyai operan. Ia berfungsi secara tersirat hanya dengan daftar al dan menghuraikan nilai tetrad bawahnya:

1) jika nilai ini kurang daripada 9, maka cf bendera ditetapkan semula kepada XNUMX dan peralihan kepada arahan seterusnya dijalankan;

2) jika nilai ini lebih besar daripada 9, maka tindakan berikut dilakukan:

a) 6 ditambah kepada kandungan tetrad al yang lebih rendah (tetapi bukan kepada kandungan keseluruhan daftar!) Oleh itu, nilai hasil perpuluhan dibetulkan dalam arah yang betul;

b) bendera cf ditetapkan kepada 1, dengan itu menetapkan pemindahan kepada bit yang paling ketara supaya ia boleh diambil kira dalam tindakan seterusnya.

Jadi, dalam contoh 10, dengan mengandaikan bahawa nilai jumlah 0000 1101 adalah dalam al, selepas arahan aaa, daftar akan mempunyai 1101 + 0110 = 0011, iaitu binari 0000 0011 atau perpuluhan 3, dan bendera cf akan ditetapkan kepada 1, iaitu Pemindahan telah disimpan dalam mikropemproses. Seterusnya, pengaturcara perlu menggunakan arahan penambahan adc, yang akan mengambil kira bawa dari bit sebelumnya.

Penolakan nombor BCD yang tidak dibungkus

Keadaan di sini agak serupa dengan penambahan. Mari kita pertimbangkan kes yang sama.

Contoh

Hasil penolakan tidak lebih daripada 9:

6 = 0000

-

3 = 0000

=

3 = 0000

Seperti yang anda lihat, tiada pinjaman daripada buku nota senior. Hasilnya betul dan tidak memerlukan pembetulan.

Contoh

Hasil penolakan lebih besar daripada 9:

6 = 0000

-

7 = 0000

=

-1 = 1111 1111

Penolakan dijalankan mengikut peraturan aritmetik binari. Oleh itu, hasilnya bukan nombor BCD.

Hasil yang betul dalam format BCD yang dibongkar hendaklah 9 (0000 1001 dalam binari). Dalam kes ini, peminjaman daripada digit paling ketara diandaikan, seperti dengan perintah tolak biasa, iaitu dalam kes nombor BCD, penolakan 16 - 7 sebenarnya harus dilakukan. Oleh itu, jelas bahawa, seperti dalam kes tambahan, hasil penolakan perlu diperbetulkan. Untuk ini, terdapat arahan khas - aas (ASCII Adjust for Substraction) - pembetulan hasil penolakan untuk perwakilan dalam bentuk simbolik.

Arahan aas juga tidak mempunyai operan dan beroperasi pada daftar al, menghuraikan tetrad tertib terkecilnya seperti berikut:

1) jika nilainya kurang daripada 9, maka bendera cf ditetapkan semula kepada 0 dan kawalan dipindahkan ke arahan seterusnya;

2) jika nilai tetrad dalam al lebih besar daripada 9, maka arahan aas melakukan tindakan berikut:

a) menolak 6 daripada kandungan tetrad bawah daftar al (nota - bukan daripada kandungan keseluruhan daftar);

b) menetapkan semula tetrad atas daftar al;

c) menetapkan bendera cf kepada 1, dengan itu menetapkan pinjaman pesanan tinggi khayalan.

Jelas bahawa arahan aas digunakan bersama dengan perintah sub dan sbb subtraction asas. Dalam kes ini, masuk akal untuk menggunakan perintah sub hanya sekali, apabila menolak digit terendah operan, maka arahan sbb harus digunakan, yang akan mengambil kira kemungkinan pinjaman dari urutan tertinggi.

Pendaraban nombor BCD yang tidak dibungkus

Menggunakan contoh menambah dan menolak nombor yang tidak dibungkus, menjadi jelas bahawa tiada algoritma standard untuk melaksanakan operasi ini pada nombor BCD, dan pengaturcara mesti sendiri, berdasarkan keperluan untuk programnya, melaksanakan operasi ini.

Pelaksanaan dua operasi yang tinggal - pendaraban dan pembahagian - adalah lebih rumit. Dalam set arahan mikropemproses, hanya ada cara untuk penghasilan pendaraban dan pembahagian nombor BCD yang tidak dibungkus satu digit.

Untuk mendarab nombor dimensi sewenang-wenangnya, anda perlu melaksanakan proses pendaraban sendiri, berdasarkan beberapa algoritma pendaraban, sebagai contoh, "dalam lajur".

Untuk mendarab dua nombor BCD satu digit, anda mesti:

1) letakkan salah satu faktor dalam daftar AL (seperti yang dikehendaki oleh arahan mul);

2) letakkan operan kedua dalam daftar atau ingatan, memperuntukkan bait;

3) gandakan faktor dengan arahan mul (hasilnya, seperti yang dijangkakan, akan berada dalam ah);

4) hasilnya, sudah tentu, akan berada dalam kod binari, jadi ia perlu diperbetulkan.

Untuk membetulkan hasil selepas pendaraban, arahan khas digunakan - aam (ASCII Adjust for Multiplication) - pembetulan hasil pendaraban untuk perwakilan dalam bentuk simbolik.

Ia tidak mempunyai operan dan beroperasi pada daftar AX seperti berikut:

1) membahagikan al dengan 10;

2) hasil pembahagian ditulis seperti berikut: hasil bagi dalam al, baki dalam ah. Akibatnya, selepas melaksanakan arahan aam, daftar AL dan ah mengandungi digit BCD yang betul bagi hasil dua digit.

Sebelum kita menamatkan perbincangan kita tentang arahan aam, kita perlu ambil perhatian satu lagi kegunaannya. Arahan ini boleh digunakan untuk menukar nombor perduaan dalam daftar AL kepada nombor BCD yang tidak dibungkus, yang akan diletakkan dalam daftar ah: digit yang paling ketara bagi keputusan adalah dalam ah, digit paling tidak bererti adalah dalam al. Adalah jelas bahawa nombor binari mestilah dalam julat 0... 99.

Pembahagian nombor BCD yang tidak dibungkus

Proses melaksanakan operasi bahagi dua nombor BCD yang tidak dibungkus agak berbeza daripada operasi lain yang dipertimbangkan sebelum ini dengan mereka. Tindakan pembetulan juga diperlukan di sini, tetapi ia mesti dilakukan sebelum operasi utama yang membahagikan secara langsung satu nombor BCD dengan nombor BCD yang lain. Pertama, dalam daftar ah, anda perlu mendapatkan dua digit BCD dividen yang telah dibongkar. Ini menjadikan pengaturcara selesa untuknya dalam satu cara. Seterusnya, anda perlu mengeluarkan arahan aad - aad (ASCII Adjust for Division) - pembetulan bahagian untuk perwakilan simbolik.

Arahan itu tidak mempunyai operan dan menukar nombor BCD yang dibongkar dua digit dalam daftar kapak kepada nombor binari. Nombor binari ini seterusnya akan memainkan peranan dividen dalam operasi bahagian. Sebagai tambahan kepada penukaran, arahan aad meletakkan nombor binari yang terhasil dalam daftar AL. Dividen secara semula jadi akan menjadi nombor binari dari julat 0... 99.

Algoritma yang perintah aad melakukan penukaran ini adalah seperti berikut:

1) darab digit tertinggi nombor BCD asal dalam ah (kandungan AH) dengan 10;

2) lakukan penambahan AH + AL, yang hasilnya (nombor binari) dimasukkan dalam AL;

3) set semula kandungan AN.

Seterusnya, pengaturcara perlu mengeluarkan perintah pembahagian div biasa untuk melaksanakan pembahagian kandungan kapak dengan satu digit BCD yang terletak dalam daftar bait atau lokasi memori bait.

Sama seperti aash, arahan aad juga boleh digunakan untuk menukar nombor BCD yang tidak dibungkus daripada julat 0... 99 kepada setara binarinya.

Untuk membahagikan bilangan kapasiti yang lebih besar, serta dalam kes pendaraban, anda perlu melaksanakan algoritma anda sendiri, sebagai contoh, "dalam lajur", atau mencari cara yang lebih optimum.

Aritmetik pada Nombor BCD Berbungkus

Seperti yang dinyatakan di atas, nombor BCD yang dibungkus hanya boleh ditambah dan ditolak. Untuk melakukan tindakan lain ke atasnya, mereka mesti ditukar tambahan sama ada kepada format yang tidak dibungkus atau kepada perwakilan binari. Disebabkan fakta bahawa nombor BCD yang dibungkus tidak begitu menarik, kami akan mempertimbangkannya secara ringkas.

Menambah Nombor BCD Berbungkus

Mula-mula, mari kita sampai ke inti masalah dan cuba tambah dua nombor BCD padat dua digit. Contoh Menambah Nombor BCD Berbungkus:

67 = 01100111

+

75 = 01110101

=

142 = 1101 1100 = 220

Seperti yang anda lihat, dalam binari hasilnya ialah 1101 1100 (atau 220 dalam perpuluhan), yang tidak betul. Ini kerana mikropemproses tidak mengetahui kewujudan nombor BCD dan menambahnya mengikut peraturan untuk menambah nombor binari. Sebenarnya, keputusan dalam BCD hendaklah 0001 0100 0010 (atau 142 dalam perpuluhan).

Ia boleh dilihat bahawa, bagi nombor BCD yang tidak dibungkus, untuk nombor BCD yang dibungkus terdapat keperluan untuk membetulkan keputusan operasi aritmetik.

Mikropemproses menyediakan arahan ini daa - daa (Pelarasan Perpuluhan untuk Penambahan) - pembetulan hasil penambahan untuk pembentangan dalam bentuk perpuluhan.

Arahan daa menukar kandungan daftar al kepada dua digit perpuluhan yang dibungkus mengikut algoritma yang diberikan dalam perihalan perintah daa. Unit yang terhasil (jika hasil penambahan lebih besar daripada 99) disimpan dalam bendera cf, dengan itu mengambil kira pemindahan kepada bit yang paling ketara.

Penolakan nombor BCD yang dibungkus

Sama seperti penambahan, mikropemproses menganggap nombor BCD yang dibungkus sebagai binari dan menolak nombor BCD sebagai binari dengan sewajarnya.

Contoh

Penolakan nombor BCD yang dibungkus.

Mari kita tolak 67-75. Oleh kerana mikropemproses melakukan penolakan dalam cara penambahan, kami akan mengikuti ini:

67 = 01100111

+

-75=10110101

=

-8 = 0001 1100 = 28

Seperti yang anda lihat, hasilnya ialah 28 dalam perpuluhan, yang tidak masuk akal. Dalam BCD, hasilnya hendaklah 0000 1000 (atau 8 dalam perpuluhan).

Apabila memprogramkan penolakan nombor BCD yang dibungkus, pengaturcara, dan juga apabila menolak nombor BCD yang tidak dibungkus, mesti mengawal tanda itu sendiri. Ini dilakukan menggunakan bendera CF, yang membetulkan pinjaman pesanan tinggi.

Penolakan nombor BCD itu sendiri dilakukan dengan perintah sub atau sbb penolakan yang mudah. Pembetulan keputusan dijalankan dengan arahan das - das (Pelarasan Perpuluhan untuk Penolakan) - pembetulan hasil penolakan untuk perwakilan dalam bentuk perpuluhan.

Arahan das menukarkan kandungan daftar AL kepada dua digit perpuluhan yang dibungkus mengikut algoritma yang diberikan dalam perihalan arahan das.

KULIAH No. 19. Kawal arahan pemindahan

1. Perintah logik

Bersama-sama dengan cara pengiraan aritmetik, sistem arahan mikropemproses juga mempunyai cara penukaran data logik. Dengan cara logik transformasi data sedemikian, yang berdasarkan peraturan logik formal.

Logik formal beroperasi pada tahap kenyataan benar dan salah. Untuk mikropemproses, ini biasanya bermaksud 1 dan 0, masing-masing. Untuk komputer, bahasa sifar dan satu adalah asli, tetapi unit minimum data yang digunakan untuk arahan mesin ialah satu bait. Walau bagaimanapun, pada peringkat sistem, selalunya perlu untuk dapat beroperasi pada tahap yang paling rendah, iaitu tahap bit.

nasi. 29. Cara pemprosesan data logik

Cara transformasi data logik termasuk perintah logik dan operasi logik. Operan arahan pemasang secara amnya boleh menjadi ungkapan, yang seterusnya merupakan gabungan operator dan operan. Antara pengendali ini mungkin terdapat pengendali yang melaksanakan operasi logik pada objek ekspresi.

Sebelum mempertimbangkan alat ini secara terperinci, mari kita pertimbangkan apakah data logik itu sendiri dan apakah operasi yang dilakukan ke atasnya.

Data boolean

Asas teori bagi pemprosesan data logik ialah logik formal. Terdapat beberapa sistem logik. Salah satu yang paling terkenal ialah kalkulus proposisi. Proposisi ialah sebarang pernyataan yang boleh dikatakan sama ada benar atau salah.

Kalkulus proposisi ialah satu set peraturan yang digunakan untuk menentukan kebenaran atau kepalsuan beberapa gabungan proposisi.

Kalkulus proposisi sangat harmoni digabungkan dengan prinsip komputer dan kaedah asas pengaturcaraannya. Semua komponen perkakasan komputer dibina di atas cip logik. Sistem untuk mewakili maklumat dalam komputer pada tahap yang paling rendah adalah berdasarkan konsep bit. Sedikit, hanya mempunyai dua keadaan (0 (salah) dan 1 (benar)), sesuai secara semula jadi ke dalam kalkulus proposisi.

Menurut teori, operasi logik berikut boleh dilakukan pada pernyataan (pada bit).

1. Negasi (BUKAN logik) - operasi logik pada satu operan, hasilnya adalah timbal balik nilai operan asal.

Operasi ini dicirikan secara unik oleh jadual kebenaran berikut (Jadual 12).

Jadual 12. Jadual kebenaran untuk penafian logik

2. Penambahan logik (termasuk logik ATAU) - operasi logik pada dua operan, hasilnya adalah "benar" (1) jika satu atau kedua-dua operan adalah benar (1), dan "salah" (0) jika kedua-dua operan adalah palsu (0).

Operasi ini diterangkan menggunakan jadual kebenaran berikut (Jadual 13).

Jadual 13. Jadual kebenaran untuk logik inklusif ATAU

3. Pendaraban logik (logik DAN) - operasi logik pada dua operan, keputusannya adalah benar (1) hanya jika kedua-dua operan adalah benar (1). Dalam semua kes lain, nilai operasi adalah "palsu" (0).

Operasi ini diterangkan menggunakan jadual kebenaran berikut (Jadual 14).

Jadual 14. Jadual logik DAN kebenaran

4. Penambahan eksklusif logik (eksklusif logik ATAU) - operasi logik pada dua operan, hasilnya "benar" (1), jika hanya satu daripada dua operan itu benar (1), dan palsu (0), jika kedua-dua operan adalah sama ada palsu (0) atau benar (1). Operasi ini diterangkan menggunakan jadual kebenaran berikut (Jadual 15).

Jadual 15. Jadual kebenaran untuk XOR logik

Set arahan mikropemproses mengandungi lima arahan yang menyokong operasi ini. Arahan ini melaksanakan operasi logik pada bit operan. Dimensi operan, sudah tentu, mestilah sama. Sebagai contoh, jika dimensi operan adalah sama dengan perkataan (16 bit), maka operasi logik dilakukan terlebih dahulu pada sifar bit operan, dan hasilnya ditulis ke tempat bit 0 hasilnya. Seterusnya, arahan secara berurutan mengulangi tindakan ini pada semua bit dari yang pertama hingga kelima belas.

Perintah logik

Sistem arahan mikropemproses mempunyai set perintah berikut yang menyokong kerja dengan data logik:

1) dan operand_1, operand_2 - operasi pendaraban logik. Perintah melakukan operasi logik DAN bitwise (konjungsi) pada bit operan operan_1 dan operan_2. Hasilnya ditulis sebagai ganti operand_1;

2) og operand_1, operand_2 - operasi penambahan logik. Perintah melakukan operasi OR logik bitwise (disjunction) pada bit operan operan_1 dan operan_2. Hasilnya ditulis sebagai ganti operand_1;

3) xor operand_1, operand_2 - operasi penambahan eksklusif logik. Perintah melakukan operasi XOR logik bitwise pada bit operan operan_1 dan operan_2. Hasilnya ditulis sebagai ganti operan;

4) uji operand_1, operand_2 - operasi "ujian" (menggunakan kaedah pendaraban logik). Perintah melakukan operasi logik DAN bitwise pada bit operan operan_1 dan operan_2. Keadaan operan tetap sama, hanya bendera zf, sf, dan pf diubah, yang memungkinkan untuk menganalisis keadaan bit individu operan tanpa mengubah keadaannya;

5) bukan operan - operasi penafian logik. Perintah melakukan penyongsangan bitwise (menggantikan nilai dengan sebaliknya) bagi setiap bit operan. Hasilnya ditulis sebagai ganti operan.

Untuk memahami peranan arahan logik dalam set arahan mikropemproses, adalah sangat penting untuk memahami bidang aplikasinya dan kaedah biasa penggunaannya dalam pengaturcaraan.

Dengan bantuan arahan logik, adalah mungkin untuk memilih bit individu dalam operan untuk tujuan menetapkannya, menetapkannya semula, menyongsangkannya, atau sekadar menyemak nilai tertentu.

Untuk mengatur kerja sedemikian dengan bit, operand_2 biasanya memainkan peranan sebagai topeng. Dengan bantuan bit topeng ini ditetapkan dalam bit 1, bit operan_1 yang diperlukan untuk operasi tertentu ditentukan. Mari tunjukkan arahan logik yang boleh digunakan untuk tujuan ini:

1) untuk menetapkan digit tertentu (bit) kepada 1, arahan og operand_1, operand_2 digunakan.

Dalam arahan ini, operand_2, yang bertindak sebagai topeng, mesti mengandungi 1 bit sebagai ganti bit yang harus ditetapkan kepada 1 dalam operand_XNUMX;

2) untuk menetapkan semula digit tertentu (bit) kepada 0, arahan dan operand_1, operand_2 digunakan.

Dalam arahan ini, operand_2, yang bertindak sebagai mask, mesti mengandungi sifar bit sebagai ganti bit tersebut yang mesti ditetapkan kepada 0 dalam operand_1;

3) perintah xor operand_1, operand_2 digunakan:

a) untuk mengetahui bit dalam operan_1 dan operan yang berbeza;

b) untuk menyongsangkan keadaan bit yang ditentukan dalam operan_1.

Bit topeng yang menarik minat kami (operand_2) apabila melaksanakan arahan xor mestilah tunggal, selebihnya mestilah sifar;

Ujian perintah operand_1, operand_2 (semak operand_1) digunakan untuk menyemak status bit yang ditentukan.

Bit operand_1 yang diperiksa dalam topeng (operand_2) mesti ditetapkan kepada satu. Algoritma perintah ujian adalah serupa dengan algoritma perintah dan, tetapi ia tidak mengubah nilai operand_1. Hasil daripada arahan adalah untuk menetapkan nilai bendera sifar zf:

1) jika zf = 0, maka sebagai hasil daripada pendaraban logik, hasil sifar diperoleh, iaitu satu unit bit topeng, yang tidak sepadan dengan bit unit operan yang sepadan;

2) jika zf = 1, maka sebagai hasil pendaraban logik, hasil bukan sifar diperoleh, iaitu, sekurang-kurangnya satu unit bit topeng bertepatan dengan bit unit yang sepadan operand_1.

Untuk bertindak balas terhadap keputusan arahan ujian, adalah dinasihatkan untuk menggunakan label jnz arahan lompat (Lompat jika Bukan Sifar) - lompat jika bendera sifar zf bukan sifar, atau arahan tindakan terbalik - label jz (Lompat jika Sifar ) - lompat jika bendera sifar zf = 0.

Dua arahan berikut mencari bit operan pertama yang ditetapkan kepada 1. Carian boleh dilakukan dari awal dan dari akhir operan:

1) bsf operand_1, operand_2 (Bit Scanning Forward) - mengimbas bit ke hadapan. Arahan mencari (mengimbas) bit operand_2 daripada yang paling tidak signifikan kepada yang paling ketara (dari bit 0 hingga bit yang paling ketara) untuk mencari bit pertama yang ditetapkan kepada 1. Jika satu ditemui, operand_1 diisi dengan bilangan bit ini sebagai nilai integer. Jika semua bit operand_2 ialah 0, maka bendera sifar zf ditetapkan kepada 1, jika tidak, bendera zf ditetapkan semula kepada 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) - imbas bit dalam susunan terbalik. Arahan mencari (mengimbas) bit operand_2 daripada yang paling ketara kepada yang paling tidak ketara (dari bit yang paling ketara kepada bit 0) untuk mencari bit pertama yang ditetapkan kepada 1. Jika satu dijumpai, operand_1 diisi dengan bilangan bit ini sebagai nilai integer. Adalah penting bahawa kedudukan bit unit pertama di sebelah kiri masih dikira relatif kepada bit 0. Jika semua bit operan_2 ialah 0, maka bendera sifar zf ditetapkan kepada 1, jika tidak, bendera zf ditetapkan semula kepada 0.

Dalam model terkini mikropemproses Intel, beberapa arahan lagi telah muncul dalam kumpulan arahan logik yang membolehkan anda mengakses satu bit tertentu operan. Operan boleh sama ada dalam ingatan atau dalam daftar umum. Kedudukan bit diberikan oleh bit mengimbangi berbanding dengan bit yang paling tidak ketara bagi operan. Nilai offset boleh ditentukan sebagai nilai langsung atau terkandung dalam daftar tujuan umum. Anda boleh menggunakan hasil arahan bsr dan bsf sebagai nilai offset. Semua arahan memberikan nilai bit yang dipilih kepada bendera CE.

1) operan bt, bit_offset (Ujian Bit) - ujian bit. Arahan memindahkan nilai bit ke bendera cf;

2) operan bts, offset_bit (Ujian dan Set Bit) - menyemak dan menetapkan sedikit. Arahan memindahkan nilai bit ke bendera CF dan kemudian menetapkan bit untuk diperiksa kepada 1;

3) operan btr, bit_offset (Ujian Bit dan Set Semula) - menyemak dan menetapkan semula sedikit. Arahan memindahkan nilai bit ke bendera CF dan kemudian menetapkan bit ini kepada 0;

4) operan btc, offset_bit (Ujian Bit dan Tukar) - menyemak dan menyongsangkan sedikit. Arahan membungkus nilai bit dalam bendera cf dan kemudian menyongsangkan nilai bit itu.

Anjakan Arahan

Arahan dalam kumpulan ini juga menyediakan manipulasi bit individu bagi operan, tetapi dengan cara yang berbeza daripada arahan logik yang dibincangkan di atas.

Semua arahan anjakan menggerakkan bit dalam medan operan ke kiri atau kanan bergantung pada opcode. Semua arahan anjakan mempunyai struktur yang sama - operan salin, shift_count.

Bilangan bit yang akan dialihkan - counter_shifts - terletak di tempat operan kedua dan boleh ditetapkan dalam dua cara:

1) secara statik, yang melibatkan penetapan nilai tetap menggunakan operan langsung;

2) secara dinamik, yang bermaksud memasukkan nilai pembilang anjakan ke dalam daftar cl sebelum melaksanakan arahan anjakan.

Berdasarkan dimensi daftar cl, jelas bahawa nilai pembilang anjakan boleh berkisar antara 0 hingga 255. Tetapi sebenarnya, ini tidak sepenuhnya benar. Untuk tujuan pengoptimuman, mikropemproses hanya menerima nilai lima bit paling tidak ketara pembilang, iaitu nilai terletak dalam julat dari 0 hingga 31.

Semua arahan syif menetapkan bendera bawa rujuk.

Apabila bit beralih keluar dari operan, ia mula-mula memukul bendera pembawa, menetapkannya sama dengan nilai bit seterusnya di luar operan. Ke mana bit ini seterusnya bergantung pada jenis arahan anjakan dan algoritma program.

Perintah Shift boleh dibahagikan kepada dua jenis mengikut prinsip operasi:

1) arahan anjakan linear;

2) arahan anjakan kitaran.

Perintah anjakan linear

Perintah jenis ini termasuk perintah yang beralih mengikut algoritma berikut:

1) bit seterusnya yang ditolak menetapkan bendera CF;

2) bit yang dimasukkan ke dalam operan dari hujung yang lain mempunyai nilai 0;

3) apabila bit seterusnya dialihkan, ia masuk ke dalam bendera CF, manakala nilai bit teralih sebelumnya hilang! Perintah anjakan linear dibahagikan kepada dua subjenis:

1) arahan anjakan linear logik;

2) arahan anjakan linear aritmetik.

Perintah anjakan linear logik termasuk yang berikut:

1) operan shl, anjakan_kaunter (Shift Logical Left) - anjakan logik ke kiri. Kandungan operan dialihkan ke kiri dengan bilangan bit yang ditentukan oleh shift_count. Di sebelah kanan (dalam kedudukan bit paling tidak ketara) sifar dimasukkan;

2) operan shr, shift_count (Shift Logical Right) - anjakan logik ke kanan. Kandungan operan dialihkan ke kanan dengan bilangan bit yang ditentukan oleh shift_count. Di sebelah kiri (dalam kedudukan bit tanda yang paling ketara), sifar dimasukkan.

Rajah 30 menunjukkan bagaimana arahan ini berfungsi.

nasi. 30. Skim kerja arahan anjakan logik linear

Arahan anjakan linear aritmetik berbeza daripada arahan anjakan logik kerana ia beroperasi pada bit tanda operan dengan cara yang istimewa.

1) operan sal, shift_counter (Shift Aritmetik Kiri) - anjakan aritmetik ke kiri. Kandungan operan dialihkan ke kiri dengan bilangan bit yang ditentukan oleh shift_count. Di sebelah kanan (dalam kedudukan bit paling tidak ketara), sifar dimasukkan. Arahan sal tidak mengekalkan tanda, tetapi menetapkan bendera dengan / sekiranya berlaku perubahan tanda dengan bit seterusnya. Jika tidak, perintah sal adalah sama dengan perintah shl;

2) operan sar, shift_count (Anjakan Aritmetik Kanan) - anjakan aritmetik ke kanan. Kandungan operan dialihkan ke kanan dengan bilangan bit yang ditentukan oleh shift_count. Sifar dimasukkan ke dalam operan di sebelah kiri. Perintah sar mengekalkan tanda, memulihkannya selepas setiap peralihan bit.

Rajah 31 menunjukkan cara arahan anjakan aritmetik linear berfungsi.

nasi. 31. Skim pengendalian arahan anjakan aritmetik linear

Putar Perintah

Arahan peralihan kitaran termasuk arahan yang menyimpan nilai bit yang dialihkan. Terdapat dua jenis arahan anjakan kitaran:

1) arahan peralihan kitaran mudah;

2) arahan anjakan kitaran melalui bendera pembawa rujuk.

Perintah peralihan kitaran mudah termasuk:

1) operan rol, shift_counter (Putar Kiri) - anjakan kitaran ke kiri. Kandungan operan dialihkan ke kiri dengan bilangan bit yang ditentukan oleh operan shift_count. Bit anjakan kiri ditulis ke operan yang sama dari kanan;

2) operan gog, anjakan_kaunter (Putar Kanan) - anjakan kitaran ke kanan. Kandungan operan dialihkan ke kanan dengan bilangan bit yang ditentukan oleh operan shift_count. Bit yang dialihkan ke kanan ditulis pada operan yang sama di sebelah kiri.

nasi. 32. Skim pengendalian perintah anjakan kitaran mudah

Seperti yang dapat dilihat daripada Rajah 32, arahan anjakan kitaran mudah dalam perjalanan kerja mereka melakukan satu tindakan yang berguna, iaitu: bit yang dialihkan secara kitaran bukan sahaja ditolak ke dalam operan dari hujung yang lain, tetapi pada masa yang sama ia nilai menjadi nilai bendera CE.

Perintah anjakan kitaran melalui CF bendera pembawa berbeza daripada perintah anjakan kitaran mudah kerana bit yang dialihkan tidak serta-merta memasuki operan dari hujungnya yang satu lagi, tetapi ditulis terlebih dahulu pada bendera pembawa CE Hanya pelaksanaan seterusnya bagi arahan anjakan ini ( dengan syarat ia dilaksanakan dalam gelung) menyebabkan bit maju sebelum ini diletakkan di hujung operan yang lain (Rajah 33).

Perkara berikut berkaitan dengan arahan anjakan kitaran melalui bendera pembawa:

1) operan rcl, shift_count (Putar melalui Bawa Kiri) - anjakan kiri kitaran melalui bawa.

Kandungan operan dialihkan ke kiri dengan bilangan bit yang ditentukan oleh operan shift_count. Bit yang dialihkan pula menjadi nilai bendera pembawa rujuk.

2) operan rsg, shift_count (Putar melalui Bawa Kanan) - anjakan kitaran ke kanan melalui pembawa.

Kandungan operan dialihkan ke kanan dengan bilangan bit yang ditentukan oleh operan shift_count. Bit yang dialihkan pula menjadi nilai CF bendera pembawa.

nasi. 33. Arahan Putar melalui Carry Flag CF

Rajah 33 menunjukkan bahawa apabila beralih melalui bendera pembawa, elemen perantaraan muncul, dengan bantuan yang, khususnya, adalah mungkin untuk menggantikan bit yang dialihkan secara kitaran, khususnya, ketidakpadanan jujukan bit.

Selepas ini, ketidakpadanan jujukan sedikit bermaksud tindakan yang membenarkan dalam beberapa cara untuk menyetempatkan dan mengekstrak bahagian yang diperlukan bagi jujukan ini dan menulisnya ke tempat lain.

Perintah shift tambahan

Sistem arahan model mikropemproses Intel terkini, bermula dengan i80386, mengandungi arahan anjakan tambahan yang mengembangkan keupayaan yang kami bincangkan sebelum ini. Ini ialah arahan anjakan berketepatan berganda:

1) shld operand_1, operand_2, shift_counter - anjakan kiri berketepatan dua kali ganda. Perintah shld melakukan penggantian dengan mengalihkan bit operand_1 ke kiri, mengisi bitnya di sebelah kanan dengan nilai bit yang dialihkan daripada operand_2 mengikut rajah dalam Rajah. 34. Bilangan bit yang akan dialihkan ditentukan oleh nilai shift_counter, yang boleh berada dalam julat 0... 31. Nilai ini boleh ditentukan sebagai operan segera atau terkandung dalam daftar cl. Nilai operand_2 tidak diubah.

nasi. 34. Skim arahan shld

2) shrd operand_1, operand_2, shift_counter - anjakan kanan berketepatan dua kali ganda. Arahan melakukan penggantian dengan mengalihkan bit operand_1 ke kanan, mengisi bitnya di sebelah kiri dengan nilai bit yang disesarkan daripada operand_2 mengikut rajah dalam Rajah 35. Bilangan bit yang akan dialihkan ialah ditentukan oleh nilai shift_counter, yang boleh terletak dalam julat 0... 31. Nilai ini boleh ditentukan oleh operan segera atau terkandung dalam daftar cl. Nilai operand_2 tidak diubah.

nasi. 35. Skim perintah shrd

Seperti yang kami nyatakan, arahan shld dan shrd beralih sehingga 32 bit, tetapi disebabkan oleh keanehan menentukan operan dan algoritma operasi, arahan ini boleh digunakan untuk bekerja dengan medan sehingga 64 bit panjang.

2. Arahan Pemindahan Kawalan

Kami berkenalan dengan beberapa arahan dari mana bahagian linear program terbentuk. Setiap daripada mereka secara amnya melakukan beberapa penukaran atau pemindahan data, selepas itu mikropemproses memindahkan kawalan ke arahan seterusnya. Tetapi sangat sedikit program yang berfungsi dengan cara yang konsisten. Biasanya terdapat titik dalam program di mana keputusan mesti dibuat tentang arahan yang akan dilaksanakan seterusnya. Penyelesaian ini mungkin:

1) tanpa syarat - pada ketika ini, adalah perlu untuk memindahkan kawalan bukan kepada arahan yang akan datang, tetapi kepada yang lain, yang berada pada jarak tertentu dari arahan semasa;

2) bersyarat - keputusan tentang arahan mana yang akan dilaksanakan seterusnya dibuat berdasarkan analisis beberapa keadaan atau data.

Program ialah jujukan arahan dan data yang menempati sejumlah ruang RAM. Ruang ingatan ini boleh sama ada bersebelahan atau terdiri daripada berbilang serpihan.

Arahan program mana yang harus dilaksanakan seterusnya, mikropemproses belajar daripada kandungan cs: (e) pasangan daftar ip:

1) cs - daftar segmen kod, yang mengandungi alamat fizikal (asas) segmen kod semasa;

2) eip/ip - daftar penunjuk arahan, yang mengandungi nilai yang mewakili offset dalam ingatan arahan seterusnya yang akan dilaksanakan berbanding permulaan segmen kod semasa.

Daftar tertentu yang akan digunakan bergantung pada mod pengalamatan yang ditetapkan use16 atau use32. Jika penggunaan 16 ditentukan, maka ip digunakan, jika use32, maka eip digunakan.

Oleh itu, arahan pemindahan kawalan mengubah kandungan daftar cs dan eip / ip, akibatnya mikropemproses memilih untuk pelaksanaan bukan arahan program seterusnya mengikut urutan, tetapi arahan dalam beberapa bahagian lain program. Saluran paip di dalam mikropemproses ditetapkan semula.

Menurut prinsip operasi, arahan mikropemproses yang menyediakan organisasi peralihan dalam program boleh dibahagikan kepada 3 kumpulan:

1. Pemindahan tanpa syarat arahan kawalan:

1) perintah cawangan tanpa syarat;

2) arahan untuk memanggil prosedur dan kembali daripada prosedur;

3) arahan untuk memanggil gangguan perisian dan kembali daripada gangguan perisian.

2. Perintah untuk pemindahan kawalan bersyarat:

1) arahan lompat dengan hasil perintah perbandingan p;

2) arahan peralihan mengikut keadaan bendera tertentu;

3) arahan untuk melompat melalui kandungan daftar esx/cx.

3. Perintah kawalan kitaran:

1) arahan untuk mengatur kitaran dengan pembilang ехх/сх;

2) arahan untuk mengatur kitaran dengan kaunter ех/сх dengan kemungkinan keluar awal dari kitaran dengan syarat tambahan.

Lompat tanpa syarat

Perbincangan sebelum ini telah mendedahkan beberapa butiran mengenai mekanisme peralihan. Arahan lompat mengubah suai daftar penunjuk arahan eip/ip dan mungkin daftar segmen kod cs. Apa sebenarnya yang perlu diubah suai bergantung kepada:

1) pada jenis operan dalam arahan cawangan tanpa syarat (dekat atau jauh);

2) daripada menentukan pengubah suai sebelum alamat lompat (dalam arahan lompat); dalam kes ini, alamat lompat itu sendiri boleh didapati sama ada secara langsung dalam arahan (lompat terus), atau dalam daftar atau sel memori (lompat tidak langsung).

Pengubah suai boleh mengambil nilai berikut:

1) berhampiran ptr - peralihan terus ke label dalam segmen kod semasa. Hanya daftar eip/ip diubah suai (bergantung pada jenis segmen kod use16 atau use32 yang ditentukan) berdasarkan alamat (label) yang dinyatakan dalam arahan atau ungkapan menggunakan simbol pengekstrakan nilai - $;

2) ptr jauh - peralihan terus ke label dalam segmen kod lain. Alamat lompat ditentukan sebagai operan atau alamat (label) segera dan terdiri daripada pemilih 16-bit dan ofset 16/32-bit, yang dimuatkan ke dalam daftar cs dan ip/eip, masing-masing;

3) perkataan ptr - peralihan tidak langsung ke label dalam segmen kod semasa. Hanya eip/ip diubah suai (dengan nilai offset dari memori pada alamat yang dinyatakan dalam arahan, atau dari daftar). Saiz mengimbangi 16 atau 32 bit;

4) dword ptr - peralihan tidak langsung ke label dalam segmen kod lain. Kedua-dua daftar - cs dan eip / ip - diubah suai (dengan nilai dari ingatan - dan hanya dari ingatan, dari daftar). Perkataan/dword pertama alamat ini mewakili offset dan dimuatkan ke dalam ip/eip; perkataan kedua/ketiga dimuatkan ke dalam cs. jmp arahan lompat tanpa syarat

Sintaks arahan untuk lompat tanpa syarat ialah jmp [modifier] jump_address - lompat tanpa syarat tanpa menyimpan maklumat tentang titik balik.

Jump_address ialah alamat dalam bentuk label atau alamat kawasan memori di mana penunjuk lompat berada.

Secara keseluruhan, dalam sistem arahan mikropemproses terdapat beberapa kod arahan mesin untuk jmp lompat tanpa syarat.

Perbezaan mereka ditentukan oleh jarak peralihan dan cara alamat sasaran ditentukan. Jarak lompatan ditentukan oleh lokasi operan alamat_lompat. Alamat ini mungkin dalam segmen kod semasa atau dalam beberapa segmen lain. Dalam kes pertama, peralihan dipanggil intra-segmen, atau dekat, dalam kedua - antara segmen, atau jauh. Lompatan intra-segmen mengandaikan bahawa hanya kandungan daftar eip/ip diubah.

Terdapat tiga pilihan untuk penggunaan intra-segmen arahan jmp:

1) lurus pendek;

2) lurus;

3) tidak langsung.

Prosedur

Bahasa perhimpunan mempunyai beberapa alat yang menyelesaikan masalah pendua bahagian kod. Ini termasuk:

1) mekanisme prosedur;

2) pemasang makro;

3) mekanisme gangguan.

Prosedur, sering juga dipanggil subrutin, ialah unit berfungsi asas untuk mengurai (membahagikan kepada beberapa bahagian) tugas. Prosedur ialah sekumpulan perintah untuk menyelesaikan subtugas tertentu dan mempunyai cara untuk menerima kawalan dari titik di mana tugas dipanggil pada tahap yang lebih tinggi dan mengembalikan kawalan ke tahap ini.

Dalam kes yang paling mudah, program mungkin terdiri daripada satu prosedur. Dalam erti kata lain, prosedur boleh ditakrifkan sebagai satu set arahan yang dibentuk dengan baik, yang, diterangkan sekali, boleh dipanggil di mana-mana dalam program jika perlu.

Untuk menerangkan urutan perintah sebagai prosedur dalam bahasa himpunan, dua arahan digunakan: PROC dan ENDP.

Sintaks penerangan prosedur adalah seperti berikut (Rajah 36).

nasi. 36. Sintaks perihalan prosedur dalam atur cara

Rajah 36 menunjukkan bahawa dalam pengepala prosedur (arahan PROC), hanya nama prosedur yang wajib. Di antara bilangan besar operan arahan PROC, [jarak] harus diserlahkan. Atribut ini boleh mengambil nilai dekat atau jauh dan mencirikan kemungkinan memanggil prosedur dari segmen kod lain. Secara lalai, atribut [jarak] ditetapkan kepada dekat.

Prosedur boleh diletakkan di mana-mana dalam program, tetapi dengan cara yang ia tidak mendapat kawalan secara rawak. Jika prosedur hanya dimasukkan ke dalam aliran arahan am, maka mikropemproses akan melihat arahan prosedur sebagai sebahagian daripada aliran ini dan, dengan itu, akan melaksanakan arahan prosedur.

Lompat bersyarat

Mikropemproses mempunyai 18 arahan lompat bersyarat. Perintah ini membolehkan anda menyemak:

1) hubungan antara operan dengan tanda ("lebih besar - kurang");

2) hubungan antara operan tanpa tanda ("lebih tinggi - lebih rendah");

3) keadaan bendera aritmetik ZF, SF, CF, OF, PF (tetapi bukan AF).

Perintah lompat bersyarat mempunyai sintaks yang sama:

jcc jump_label

Seperti yang anda lihat, kod mnemonik semua arahan bermula dengan "j" - daripada perkataan lompat (lompat), ia - menentukan keadaan khusus yang dianalisis oleh arahan.

Bagi operan jump_label, label ini hanya boleh terletak dalam segmen kod semasa; pemindahan kawalan antara segmen dalam lompatan bersyarat tidak dibenarkan. Dalam hal ini, tidak ada persoalan tentang pengubah suai, yang terdapat dalam sintaks arahan lompat tanpa syarat. Dalam model awal mikropemproses (i8086, i80186 dan i80286), arahan cawangan bersyarat hanya boleh melakukan lompatan pendek - dari -128 hingga +127 bait daripada arahan berikutan arahan cawangan bersyarat. Bermula dengan model mikropemproses 80386, sekatan ini dialih keluar, tetapi, seperti yang anda lihat, hanya dalam segmen kod semasa.

Untuk membuat keputusan tentang di mana kawalan akan dipindahkan ke arahan lompat bersyarat, syarat mesti dibentuk terlebih dahulu, berdasarkan keputusan untuk memindahkan kawalan akan dibuat.

Sumber keadaan sedemikian boleh:

1) sebarang arahan yang mengubah keadaan bendera aritmetik;

2) arahan perbandingan p, yang membandingkan nilai dua operan;

3) keadaan daftar esx/cx.

cmp bandingkan arahan

Perintah perbandingan halaman mempunyai cara kerja yang menarik. Ia betul-betul sama dengan arahan penolakan - sub operan, operan_2.

Arahan p, seperti sub arahan, menolak operan dan menetapkan bendera. Satu-satunya perkara yang tidak dilakukan ialah menulis hasil penolakan sebagai ganti operan pertama.

Sintaks arahan str - str operand_1, operand_2 (compare) - membandingkan dua operan dan menetapkan bendera berdasarkan hasil perbandingan.

Bendera yang ditetapkan oleh perintah p boleh dianalisis dengan arahan cawangan bersyarat khas. Sebelum kita melihatnya, mari kita beri sedikit perhatian kepada mnemonik arahan lompat bersyarat ini (Jadual 16). Memahami tatatanda apabila membentuk nama perintah lompat bersyarat (elemen dalam nama perintah jcc, kami menetapkannya) akan memudahkan hafalan dan penggunaan praktikal selanjutnya.

Jadual 16. Maksud singkatan dalam nama arahan jcc Jadual 17. Senarai arahan lompat bersyarat bagi perintah p operand_1, operand_2

Jangan terkejut dengan fakta bahawa beberapa kod mnemonik yang berbeza bagi arahan cawangan bersyarat sepadan dengan nilai bendera yang sama (mereka dipisahkan antara satu sama lain dengan garis miring dalam Jadual 17). Perbezaan dalam nama adalah disebabkan oleh keinginan pembangun mikropemproses untuk memudahkan penggunaan arahan lompat bersyarat dalam kombinasi dengan kumpulan arahan tertentu. Oleh itu, nama yang berbeza mencerminkan orientasi fungsi yang berbeza. Walau bagaimanapun, hakikat bahawa arahan ini bertindak balas kepada bendera yang sama menjadikannya benar-benar setara dan sama dalam program. Oleh itu, dalam Jadual 17 mereka dikumpulkan bukan mengikut nama, tetapi oleh nilai bendera (syarat) yang mereka bertindak balas.

Arahan Cawangan Bersyarat dan Bendera

Penamaan mnemonik bagi beberapa arahan lompat bersyarat mencerminkan nama bendera yang digunakannya, dan mempunyai struktur berikut: aksara pertama ialah "j" (Lompat, lompat), yang kedua ialah sama ada penunjukan bendera atau watak penafian " n", diikuti dengan nama bendera . Struktur pasukan ini mencerminkan tujuannya. Jika tiada aksara "n", maka keadaan bendera diperiksa, jika ia sama dengan 1, peralihan kepada label lompat dibuat. Jika aksara "n" hadir, maka keadaan bendera diperiksa untuk kesamaan kepada 0, dan jika berjaya, lompatan ke label lompat dibuat.

Mnemonik arahan, nama bendera dan keadaan lompat ditunjukkan dalam Jadual 18. Arahan ini boleh digunakan selepas sebarang arahan yang mengubah suai bendera yang ditentukan.

Jadual 18. Arahan Lompat Bersyarat dan Bendera

Jika anda melihat dengan teliti pada jadual 17 dan 18, anda boleh melihat bahawa banyak arahan lompat bersyarat di dalamnya adalah setara, kerana kedua-duanya adalah berdasarkan analisis bendera yang sama.

Arahan Lompat Bersyarat dan Daftar esx/cx

Seni bina mikropemproses melibatkan penggunaan khusus bagi banyak daftar. Sebagai contoh, daftar EAX / AX / AL digunakan sebagai penumpuk, dan daftar BP, SP digunakan untuk berfungsi dengan timbunan. Daftar ECX / CX juga mempunyai tujuan fungsi tertentu: ia bertindak sebagai pembilang dalam arahan kawalan gelung dan apabila bekerja dengan rentetan aksara. Ada kemungkinan bahawa secara fungsional arahan cawangan bersyarat yang dikaitkan dengan daftar esx/cx akan dikaitkan dengan lebih tepat kepada kumpulan arahan ini.

Sintaks untuk arahan cawangan bersyarat ini ialah:

1) jcxz jump_label (Lompat jika ex ialah Sifar) - lompat jika cx ialah sifar;

2) jecxz jump_label (Lompat Sama ех Sifar) - lompat jika ех adalah sifar.

Perintah ini sangat berguna apabila menggelung dan apabila bekerja dengan rentetan aksara.

Perlu diingatkan bahawa terdapat batasan yang wujud dalam arahan jcxz/jecxz. Tidak seperti arahan pemindahan bersyarat lain, arahan jcxz/jecxz hanya boleh menangani lompatan pendek -128 bait atau +127 bait daripada arahan yang mengikutinya.

Organisasi kitaran

Kitaran, seperti yang anda ketahui, adalah struktur algoritma yang penting, tanpa penggunaannya, mungkin, tiada program boleh lakukan. Anda boleh mengatur pelaksanaan kitaran bahagian tertentu program, contohnya, menggunakan pemindahan bersyarat arahan kawalan atau arahan lompat tanpa syarat jmp. Dengan organisasi kitaran sedemikian, semua operasi untuk organisasinya dilakukan secara manual. Tetapi, memandangkan kepentingan elemen algoritma seperti kitaran, pembangun mikropemproses memperkenalkan sekumpulan tiga arahan ke dalam sistem arahan, yang memudahkan pengaturcaraan kitaran. Arahan ini juga menggunakan daftar esx/cx sebagai pembilang gelung.

Mari kita berikan penerangan ringkas tentang arahan ini:

1) label transition_gelung (Gelung) - ulangi kitaran. Perintah ini membolehkan anda mengatur gelung yang serupa dengan gelung dalam bahasa peringkat tinggi dengan pengurangan automatik pembilang gelung. Tugas pasukan adalah untuk melakukan perkara berikut:

a) pengurangan daftar ECX/CX;

b) membandingkan daftar ECX/CX dengan sifar: jika (ECX/CX) = 0, maka kawalan dipindahkan ke arahan seterusnya selepas gelung;

2) loop/loopz jump_label

Arahan gelung dan loopz adalah sinonim mutlak. Kerja arahan adalah untuk melaksanakan tindakan berikut:

a) pengurangan daftar ECX/CX;

b) membandingkan daftar ECX/CX dengan sifar;

c) analisis status bendera sifar ZF jika (ECX/CX) = 0 atau XF = 0, kawalan dipindahkan ke arahan selepas gelung seterusnya.

3) loopne/loopnz jump_label

Arahan loopne dan loopnz juga adalah sinonim mutlak. Kerja arahan adalah untuk melaksanakan tindakan berikut:

a) pengurangan daftar ECX/CX;

b) membandingkan daftar ECX/CX dengan sifar;

c) analisis keadaan bendera sifar ZF: jika (ECX/CX) = 0 atau ZF = 1, kawalan dipindahkan ke arahan seterusnya selepas gelung.

Arahan gelung/loopz dan loopne/loopnz adalah timbal balik dalam operasinya. Mereka melanjutkan tindakan perintah gelung dengan menghuraikan bendera zf tambahan, yang memungkinkan untuk mengatur keluar awal dari gelung, menggunakan bendera ini sebagai penunjuk.

Kelemahan gelung arahan gelung, gelung/loopz, dan loopne/loopnz ialah mereka hanya melaksanakan lompatan pendek (dari -128 hingga +127 bait). Untuk bekerja dengan gelung panjang, anda perlu menggunakan lompatan bersyarat dan arahan jmp, jadi cuba kuasai kedua-dua cara mengatur gelung.

Pengarang: Tsvetkova A.V.

Kami mengesyorkan artikel yang menarik bahagian Nota kuliah, helaian curang:

Sains Sosial. katil bayi

Pergigian. Nota kuliah

Penyakit dalaman. Nota kuliah

Lihat artikel lain bahagian Nota kuliah, helaian curang.

Baca dan tulis berguna komen pada artikel ini.

<< Belakang

Berita terkini sains dan teknologi, elektronik baharu:

Kewujudan peraturan entropi untuk jalinan kuantum telah terbukti 09.05.2024

Mekanik kuantum terus memukau kita dengan fenomena misteri dan penemuan yang tidak dijangka. Baru-baru ini, Bartosz Regula dari Pusat RIKEN untuk Pengkomputeran Kuantum dan Ludovico Lamy dari Universiti Amsterdam membentangkan penemuan baharu yang melibatkan keterikatan kuantum dan kaitannya dengan entropi. Keterikatan kuantum memainkan peranan penting dalam sains dan teknologi maklumat kuantum moden. Walau bagaimanapun, kerumitan strukturnya menjadikan pemahaman dan pengurusannya mencabar. Penemuan Regulus dan Lamy menunjukkan bahawa keterikatan kuantum mengikut peraturan entropi yang serupa dengan peraturan untuk sistem klasik. Penemuan ini membuka perspektif baharu dalam bidang sains dan teknologi maklumat kuantum, memperdalam pemahaman kita tentang jalinan kuantum dan kaitannya dengan termodinamik. Hasil kajian menunjukkan kemungkinan keterbalikan transformasi belitan, yang boleh memudahkan penggunaannya dalam pelbagai teknologi kuantum. Membuka peraturan baharu ...>>

Penghawa dingin mini Sony Reon Pocket 5 09.05.2024

Musim panas adalah masa untuk berehat dan mengembara, tetapi selalunya panas boleh mengubah masa ini menjadi siksaan yang tidak tertanggung. Temui produk baharu daripada Sony - penghawa dingin mini Reon Pocket 5, yang menjanjikan untuk menjadikan musim panas lebih selesa untuk penggunanya. Sony telah memperkenalkan peranti unik - perapi mini Reon Pocket 5, yang menyediakan penyejukan badan pada hari panas. Dengan itu, pengguna boleh menikmati kesejukan pada bila-bila masa, di mana sahaja dengan hanya memakainya di leher mereka. Penghawa dingin mini ini dilengkapi dengan pelarasan automatik mod operasi, serta penderia suhu dan kelembapan. Terima kasih kepada teknologi inovatif, Reon Pocket 5 melaraskan operasinya bergantung pada aktiviti pengguna dan keadaan persekitaran. Pengguna boleh melaraskan suhu dengan mudah menggunakan aplikasi mudah alih khusus yang disambungkan melalui Bluetooth. Selain itu, baju-T dan seluar pendek yang direka khas tersedia untuk kemudahan, yang boleh dipasangkan perapi mini. Peranti boleh oh ...>>

Tenaga dari angkasa untuk Starship 08.05.2024

Menghasilkan tenaga suria di angkasa semakin boleh dilaksanakan dengan kemunculan teknologi baharu dan pembangunan program angkasa lepas. Ketua syarikat permulaan Virtus Solis berkongsi visinya menggunakan SpaceX's Starship untuk mencipta loji kuasa orbit yang mampu menggerakkan Bumi. Startup Virtus Solis telah melancarkan projek bercita-cita tinggi untuk mencipta loji kuasa orbit menggunakan Starship SpaceX. Idea ini boleh mengubah dengan ketara bidang pengeluaran tenaga suria, menjadikannya lebih mudah diakses dan lebih murah. Teras rancangan permulaan adalah untuk mengurangkan kos pelancaran satelit ke angkasa menggunakan Starship. Kejayaan teknologi ini dijangka menjadikan pengeluaran tenaga suria di angkasa lebih berdaya saing dengan sumber tenaga tradisional. Virtual Solis merancang untuk membina panel fotovoltaik yang besar di orbit, menggunakan Starship untuk menghantar peralatan yang diperlukan. Walau bagaimanapun, salah satu cabaran utama ...>>

Berita rawak daripada Arkib

Pada skate tulang 15.09.2008

Skates dicipta bukan untuk hiburan, tetapi sebagai alat pengangkutan. Kesimpulan ini dicapai oleh ahli fisiologi Inggeris dan Itali.

Skates, diperbuat daripada tulang rusa atau rusa dan diikat pada kaki dengan tali kulit, pertama kali muncul di selatan Scandinavia kira-kira 3000 tahun yang lalu. Terdapat banyak tasik di kawasan ini, ia membeku pada musim sejuk, yang membolehkan anda memendekkan laluan - pergi terus di atas ais dan bukannya mengelilingi setiap tasik di sepanjang pantai.

Ahli fisiologi meminta sekumpulan sukarelawan untuk berlari melintasi tasik beku dengan replika kasut ais purba. Kumpulan lain hanya berjalan di atas ais. Pada masa yang sama, kadar nadi dan penggunaan oksigen diukur dalam kedua-duanya, yang memungkinkan untuk menilai penggunaan tenaga.

Ternyata pemain skate bergerak dua kali lebih pantas daripada pejalan kaki, menjimatkan 10% tenaga.

Berita menarik lain:

▪ Koko - perlindungan terhadap hipertensi

▪ Dinamakan sebab pertumbuhan pesat lohong hitam

▪ karp muzik

▪ Nilai coklat gelap untuk orang tua dengan arteri berpenyakit

▪ Sistem storan tenaga pintar EcoBlade daripada Schneider Electric

Suapan berita sains dan teknologi, elektronik baharu

 

Bahan-bahan menarik Perpustakaan Teknikal Percuma:

▪ bahagian tapak Penunjuk, penderia, pengesan. Pemilihan artikel

▪ artikel Cask of Diogenes. Ungkapan popular

▪ Mengapakah nilai wang ditentukan oleh emas? Jawapan terperinci

▪ pasal Kokorysh. Legenda, penanaman, kaedah aplikasi

▪ artikel Penjana sinusoidal pada cip LM386. Ensiklopedia elektronik radio dan kejuruteraan elektrik

▪ pasal Kek Segera. Fokus Rahsia

Tinggalkan komen anda pada artikel ini:

Имя:


E-mel (pilihan):


Komen:





Semua bahasa halaman ini

Laman utama | Perpustakaan | artikel | Peta Laman | Ulasan laman web

www.diagram.com.ua

www.diagram.com.ua
2000-2024