09.03.2023
Rumah / Pelayanan online / Karakteristik umum sistem perintah bahasa Assembler untuk IBM-PC (kumpulan perintah dasar, cara dasar menangani operan). Struktur program dalam bahasa Assembler. Perintah bahasa rakitan Perintah bahasa rakitan

Karakteristik umum sistem perintah bahasa Assembler untuk IBM-PC (kumpulan perintah dasar, cara dasar menangani operan). Struktur program dalam bahasa Assembler. Perintah bahasa rakitan Perintah bahasa rakitan

Pekerjaan kursus

Subjek "Pemrograman sistem"

Topik nomor 4: "Memecahkan masalah untuk prosedur"

pilihan 2

UNIVERSITAS NEGERI SIBERIA TIMUR

TEKNOLOGI DAN MANAJEMEN

____________________________________________________________________

KULIAH TEKNOLOGI

LATIHAN

untuk makalah

Disiplin:
Topik: Pemecahan masalah untuk prosedur
Artis: Glavinskaya Arina Alexandrovna
Ketua: Sesegma Viktorovna Dambaeva
Ringkasan singkat dari pekerjaan: studi tentang subrutin pada bahasa campuran,
pemecahan masalah menggunakan subrutin
1. Bagian teoretis: Informasi dasar tentang bahasa rakitan (set
perintah, dll.), Organisasi subprogram, Cara meneruskan parameter
dalam subrutin
2. Bagian praktis: Kembangkan dua subrutin, salah satunya mengubah huruf tertentu menjadi huruf besar (termasuk untuk huruf Rusia), dan yang lainnya mengubah huruf menjadi huruf kecil.
mengubah huruf apa pun menjadi huruf besar, dan yang lainnya mengubah huruf menjadi huruf kecil.
mengubah huruf menjadi huruf kecil.
Jadwal proyek sesuai dengan jadwal:
1. Bagian teoretis - 30% pada minggu ke-7.
2. Bagian praktis - 70% dalam 11 minggu.
3. Perlindungan - 100% dalam 14 minggu.
Persyaratan desain:
1. Penyelesaian dan catatan penjelasan proyek kursus harus diserahkan di
elektronik dan hard copy.
2. Volume laporan harus paling sedikit 20 halaman yang diketik, tidak termasuk lampiran.
3. RPP dibuat sesuai dengan GOST 7.32-91 dan ditandatangani oleh kepala.

Kepala Pekerjaan __________________

Penampil __________________

Tanggal pengeluaran " 26 " September 2017 G.


Perkenalan. 2

1.1 Informasi dasar tentang bahasa rakitan. 3

1.1.1 Kumpulan perintah. 4

1.2 Organisasi subrutin dalam bahasa rakitan. 4

1.3 Metode untuk meneruskan parameter dalam subrutin. 6

1.3.1 Melewati parameter melalui register.. 6

1.3.2 Melewati parameter melalui tumpukan. 7

2 BAGIAN PRAKTIS.. 9

2.1 Pernyataan masalah. 9

2.2 Deskripsi solusi masalah. 9

2.3 Menguji program.. 7

Kesimpulan. 8

Referensi.. 9


Perkenalan

Diketahui bahwa pemrograman dalam bahasa Assembly itu sulit. Seperti yang Anda ketahui, ada banyak bahasa berbeda sekarang level tinggi , yang memungkinkan Anda menghabiskan lebih sedikit tenaga saat menulis program. Secara alami, pertanyaan muncul ketika seorang programmer mungkin perlu menggunakan Assembler saat menulis program. Saat ini, ada dua area di mana penggunaan bahasa rakitan dibenarkan, dan seringkali diperlukan.

Pertama, inilah yang disebut program sistem yang bergantung pada mesin, yang biasanya mereka kendalikan berbagai perangkat komputer (program semacam itu disebut driver). Program sistem ini menggunakan instruksi mesin khusus yang tidak perlu digunakan secara biasa (atau, seperti yang mereka katakan, terapan) program. Perintah-perintah ini tidak mungkin atau sangat sulit ditentukan dalam bahasa tingkat tinggi.

Area kedua aplikasi Assembler terkait dengan optimalisasi eksekusi program. Sangat sering, program penerjemah (kompiler) dari bahasa tingkat tinggi menghasilkan program bahasa mesin yang sangat tidak efisien. Ini biasanya berlaku untuk program yang bersifat komputasi, di mana bagian program yang sangat kecil (sekitar 3-5%) (loop utama) dijalankan hampir sepanjang waktu. Untuk mengatasi masalah ini, apa yang disebut sistem pemrograman multibahasa dapat digunakan, yang memungkinkan Anda untuk menulis bagian dari program dalam berbagai bahasa. Biasanya, bagian utama program ditulis dalam bahasa pemrograman tingkat tinggi (Fortran, Pascal, C, dll.), dan bagian kritis waktu dari program ditulis dalam Assembler. Dalam hal ini, kecepatan keseluruhan program dapat meningkat secara signifikan. Ini seringkali merupakan satu-satunya cara agar program menghasilkan hasil dalam waktu yang wajar.

Ini makalah adalah untuk mendapatkan keterampilan praktis dalam pemrograman dalam bahasa assembly.

Tugas kerja:

1. Untuk mempelajari informasi dasar tentang bahasa Assembler (struktur dan komponen program di Assembler, format perintah, organisasi subrutin, dll.);

2. Untuk mempelajari jenis-jenis operasi bit, format dan logika perintah logika assembler;

3. Memecahkan masalah individu untuk penggunaan subrutin di Assembler;

4.. Merumuskan kesimpulan tentang pekerjaan yang dilakukan.

1 BAGIAN TEORITIS

Dasar-dasar bahasa assembly

Assembler - bahasa pemrograman level rendah, yang merupakan format untuk menulis instruksi mesin yang nyaman untuk persepsi manusia.

Perintah bahasa rakitan berkorespondensi satu lawan satu dengan perintah prosesor dan, pada kenyataannya, mewakili bentuk notasi simbolik yang nyaman (kode mnemonik) dari perintah dan argumennya. Bahasa rakitan juga menyediakan abstraksi pemrograman dasar: menghubungkan bagian-bagian program dan data melalui label dengan nama dan arahan simbolis.

Arahan perakitan memungkinkan Anda untuk memasukkan blok data (dijelaskan secara eksplisit atau dibaca dari file) ke dalam program; ulangi fragmen tertentu beberapa kali; kompilasi fragmen sesuai dengan kondisi; atur alamat eksekusi fragmen, ubah nilai label selama kompilasi; gunakan definisi makro dengan parameter, dll.

Keuntungan dan kerugian

Jumlah minimum kode redundan (penggunaan lebih sedikit perintah dan akses memori). Akibatnya, kecepatan lebih tinggi dan ukuran lebih kecil program;

sejumlah besar kode, sejumlah besar tugas kecil tambahan;

Keterbacaan kode yang buruk, kesulitan dukungan (debugging, penambahan fitur);

· kesulitan menerapkan paradigma pemrograman dan konvensi lain yang agak rumit, kompleksitas pengembangan bersama;

Lebih sedikit perpustakaan yang tersedia, kompatibilitasnya rendah;

· akses langsung ke perangkat keras: port input-output, register prosesor khusus;

"pas" maksimum untuk platform yang diinginkan (penggunaan instruksi khusus, fitur Teknik"kelenjar");

· non-portabilitas ke platform lain (kecuali yang kompatibel dengan biner).

Selain instruksi, program mungkin berisi arahan: perintah yang tidak diterjemahkan langsung ke dalam instruksi mesin, tetapi mengontrol operasi kompiler. Kumpulan dan sintaksisnya sangat bervariasi dan tidak bergantung pada platform perangkat keras, tetapi pada kompiler yang digunakan (menimbulkan dialek bahasa dalam keluarga arsitektur yang sama). Sebagai satu set arahan, kita dapat membedakan:

Definisi data (konstanta dan variabel);

manajemen organisasi program dalam memori dan parameter file keluaran;

mengatur mode kompiler;

Segala macam abstraksi (yaitu, elemen bahasa tingkat tinggi) - dari desain prosedur dan fungsi (untuk menyederhanakan implementasi paradigma pemrograman prosedural) hingga struktur dan loop bersyarat (untuk paradigma pemrograman terstruktur);

makro.

Kumpulan perintah

Instruksi bahasa rakitan yang umum adalah:

Perintah transfer data (mov, dll.)

Perintah aritmatika (add, sub, imul, dll.)

Operasi logis dan bitwise (atau, dan, xor, shr, dll.)

Perintah untuk mengelola eksekusi program (jmp, loop, ret, dll.)

Perintah panggilan interupsi (kadang-kadang disebut sebagai perintah kontrol): int

Perintah I/O ke port (masuk, keluar)

Mikrokontroler dan mikrokomputer juga dicirikan oleh perintah yang melakukan pemeriksaan dan transisi berdasarkan kondisi, misalnya:

· jne - lompat jika tidak sama;

· jge - melompat jika lebih besar dari atau sama dengan .

Informasi Umum tentang bahasa rakitan

Bahasa perakitan simbolik memungkinkan untuk menghilangkan sebagian besar kekurangan pemrograman bahasa mesin.

Keuntungan utamanya adalah bahwa dalam bahasa rakitan semua elemen program direpresentasikan dalam bentuk simbolik. Mengkonversi nama perintah simbolik menjadi nama mereka kode biner ditugaskan untuk program khusus- assembler, yang membebaskan programmer dari kerja keras dan menghilangkan kesalahan yang tak terhindarkan.

Nama simbolik yang diperkenalkan saat memprogram dalam bahasa rakitan, sebagai aturan, mencerminkan semantik program, dan singkatan perintah - fungsi utamanya. Misalnya: PARAM - parameter, TABLE - table, MASK - mask, ADD - penjumlahan, SUB - pengurangan, dll. n.Nama-nama tersebut mudah diingat oleh programmer.

Untuk memprogram dalam bahasa assembly, Anda harus memiliki yang kompleks peralatan daripada saat memprogram dalam bahasa mesin: Anda memerlukan sistem komputer berbasis mikrokomputer atau PC dengan satu set periferal(keyboard alfanumerik, tampilan karakter, drive floppy disk dan printer), serta sistem residen atau lintas-pemrograman untuk jenis mikroprosesor yang diperlukan. Bahasa rakitan memungkinkan Anda menulis dan men-debug program yang jauh lebih kompleks secara efisien daripada bahasa mesin (hingga 1 - 4 KB).

Bahasa rakitan berorientasi pada mesin, yaitu, bergantung pada bahasa mesin dan struktur mikroprosesor yang sesuai, karena mereka menetapkan nama simbolik tertentu untuk setiap instruksi mikroprosesor.

Bahasa rakitan memberikan peningkatan yang signifikan dalam produktivitas pemrogram dibandingkan dengan bahasa mesin dan pada saat yang sama mempertahankan kemampuan untuk menggunakan semua sumber daya perangkat keras mikroprosesor yang dapat diakses oleh perangkat lunak. Ini memungkinkan pemrogram terampil untuk menulis program yang berjalan dalam waktu lebih singkat dan menggunakan lebih sedikit memori daripada program yang ditulis dalam bahasa tingkat tinggi.

Dalam hal ini, hampir semua program kontrol perangkat I / O (driver) ditulis dalam bahasa rakitan, meskipun terdapat banyak bahasa tingkat tinggi.

Menggunakan bahasa assembly, programmer dapat mengatur parameter berikut:

mnemonik (nama simbolik) dari setiap perintah bahasa mesin mikroprosesor;

format standar untuk baris program yang dijelaskan dalam assembler;

format untuk menentukan berbagai cara opsi pengalamatan dan perintah;

format untuk menentukan konstanta karakter dan konstanta tipe integer di berbagai sistem perhitungan;

pseudo-perintah yang mengontrol proses perakitan (penerjemahan) program.

Dalam bahasa rakitan, program ditulis baris demi baris, yaitu satu baris dialokasikan untuk setiap instruksi.

Untuk mikrokomputer yang dibangun berdasarkan jenis mikroprosesor yang paling umum, mungkin ada beberapa varian bahasa rakitan, namun biasanya ada satu distribusi praktis - inilah yang disebut bahasa rakitan standar

Pemrograman pada level instruksi mesin adalah level minimum yang memungkinkan pemrograman. Sistem instruksi mesin harus cukup untuk mengimplementasikan tindakan yang diperlukan dengan mengeluarkan instruksi ke perangkat keras komputer.

Setiap instruksi mesin terdiri dari dua bagian:

operasi - menentukan "apa yang harus dilakukan";

· operan - objek pemrosesan mendefinisikan, "apa yang harus dilakukan dengan".

Instruksi mesin mikroprosesor, ditulis dalam bahasa rakitan, adalah satu baris dengan bentuk sintaksis berikut:

beri label operan perintah/direktif;komentar

Dalam hal ini, bidang wajib dalam satu baris adalah perintah atau arahan.

Label, perintah/direktif, dan operan (jika ada) dipisahkan oleh setidaknya satu spasi atau karakter tab.

Jika suatu perintah atau direktif perlu dilanjutkan pada baris berikutnya, maka digunakan karakter backslash: \.

Secara default, bahasa rakitan tidak membedakan antara huruf besar dan huruf kecil dalam perintah atau arahan.

Pengalamatan Langsung: Alamat efektif ditentukan langsung oleh bidang offset instruksi mesin, yang dapat berukuran 8, 16, atau 32 bit.

mov eax, jumlah ; eax = jumlah

Assembler mengganti jumlah dengan alamat yang sesuai yang disimpan di segmen data (secara default, dialamatkan oleh register ds) dan menempatkan nilai yang disimpan di jumlah alamat di register eax.

pengalamatan tidak langsung pada gilirannya memiliki jenis berikut:

Pengalamatan dasar (register) tidak langsung;

Pengalamatan basic (register) tidak langsung dengan offset;

· pengalamatan indeks tidak langsung;

· pengalamatan indeks basis tidak langsung.

Pengalamatan dasar (register) tidak langsung. Dengan pengalamatan ini, alamat efektif operan dapat berada di salah satu register tujuan umum, kecuali untuk sp/esp dan bp/ebp (ini adalah register khusus untuk bekerja dengan segmen tumpukan). Secara sintaksis dalam sebuah instruksi, mode pengalamatan ini diekspresikan dengan melampirkan nama register dalam tanda kurung siku.

bergerak eax, ; eax = *esi; *nilai esi di alamat esi

Struktur dalam bahasa assembly

Array yang telah kita bahas di atas adalah kumpulan elemen dengan tipe yang sama. Namun seringkali dalam aplikasi ada kebutuhan untuk mempertimbangkan kumpulan data tertentu beda tipe sebagai beberapa jenis tunggal.

Ini sangat relevan, misalnya, untuk program basis data, di mana kumpulan data dari berbagai jenis perlu dikaitkan dengan satu objek.

Sebagai contoh, sebelumnya kita melihat Listing 4, yang bekerja dengan array elemen tiga byte. Setiap elemen, pada gilirannya, adalah dua elemen dari jenis yang berbeda: bidang penghitung satu byte dan bidang dua byte yang dapat membawa lebih banyak informasi yang diperlukan untuk penyimpanan dan pemrosesan. Jika pembaca sudah familiar dengan salah satu bahasa tingkat tinggi, maka dia tahu bahwa objek seperti itu biasanya dideskripsikan menggunakan tipe data khusus - struktur.

Untuk meningkatkan kegunaan bahasa rakitan, tipe data ini juga diperkenalkan ke dalamnya.

A-priori struktur adalah tipe data yang terdiri dari sejumlah elemen dari tipe yang berbeda.

Untuk menggunakan struktur dalam suatu program, Anda perlu melakukan tiga hal:

    Bertanya templat struktur .

    Intinya, ini berarti mendefinisikan tipe data baru, yang nantinya dapat digunakan untuk mendefinisikan variabel tipe ini.

    Mendefinisikan contoh struktur .

    Tahap ini melibatkan inisialisasi variabel tertentu dengan struktur yang telah ditentukan sebelumnya (menggunakan templat).

    Mengatur mengakses anggota struktur .

Sangat penting bagi Anda untuk memahami sejak awal apa perbedaannya keterangan struktur dalam program dan nya definisi.

menggambarkan struktur dalam suatu program hanya berarti menunjukkan skema atau polanya; memori tidak dialokasikan.

Templat ini hanya dapat dianggap sebagai informasi bagi penerjemah tentang lokasi bidang dan nilai defaultnya.

Mendefinisikan struktur berarti menginstruksikan penerjemah untuk mengalokasikan memori dan menetapkan nama simbolik ke area memori ini.

Anda dapat mendeskripsikan struktur dalam program hanya sekali, dan mendefinisikannya beberapa kali.

Deskripsi template struktur

Deklarasi templat struktur memiliki sintaks berikut:

struktur_nama STRUC

struktur_nama SELESAI

Di Sini adalah urutan arahan deskripsi data db, dw, dd, dq Dan dt.

Operan mereka menentukan ukuran bidang dan nilai awal opsional. Nilai-nilai ini mungkin akan menginisialisasi bidang yang sesuai saat struktur ditentukan.

Seperti yang telah kami catat saat mendeskripsikan templat, tidak ada memori yang dialokasikan, karena ini hanya informasi untuk penerjemah.

Lokasi templat dalam program bisa sewenang-wenang, tetapi, mengikuti logika penerjemah satu langkah, itu harus ditempatkan sebelum tempat variabel dengan tipe struktur ini ditentukan. Artinya, saat mendeskripsikan variabel dengan tipe struktur apa pun di segmen data, templatnya harus ditempatkan di awal segmen data atau sebelumnya.

Pertimbangkan untuk bekerja dengan struktur menggunakan contoh pemodelan database karyawan dari departemen tertentu.

Untuk kesederhanaan, untuk menghindari masalah konversi informasi selama input, kami setuju bahwa semua bidang bersifat simbolis.

Mari tentukan struktur record dari database ini dengan pola berikut:

Mendefinisikan data dengan tipe struktur

Untuk menggunakan struktur yang dijelaskan menggunakan templat dalam program, Anda perlu menentukan variabel dengan jenis struktur ini. Sintaks berikut digunakan untuk ini:

[nama variabel] structure_name

    nama variabel- pengidentifikasi variabel dari tipe struktural yang diberikan.

    Menentukan nama variabel adalah opsional. Jika tidak ditentukan, area memori dengan ukuran jumlah panjang semua elemen struktur akan dialokasikan begitu saja.

    daftar nilai- daftar nilai awal elemen struktur yang dipisahkan koma yang dilampirkan dalam tanda kurung sudut.

    Tugasnya juga opsional.

    Jika daftar tidak lengkap, maka semua bidang struktur untuk variabel yang diberikan diinisialisasi dengan nilai dari template, jika ada.

    Itu diperbolehkan untuk menginisialisasi bidang individu, tetapi dalam hal ini bidang yang hilang harus dipisahkan dengan koma. Bidang yang hilang akan diinisialisasi dengan nilai dari templat struct. Jika, saat mendefinisikan variabel baru dengan tipe struktur ini, kami setuju dengan semua nilai bidang dalam templatnya (yaitu, disetel secara default), maka Anda hanya perlu menulis tanda kurung sudut.

    Misalnya: pekerja pemenang.

Sebagai contoh, mari kita definisikan beberapa variabel dengan tipe struktur yang dijelaskan di atas.

Metode Struktur

Gagasan memperkenalkan tipe struktural ke dalam bahasa pemrograman apa pun adalah menggabungkan variabel dari tipe yang berbeda ke dalam satu objek.

Bahasa harus menyediakan sarana untuk mengakses variabel-variabel ini dalam instance struct tertentu. Untuk merujuk dalam perintah ke bidang dari beberapa struktur, operator khusus digunakan - simbol ". " (dot). Ini digunakan dalam sintaks berikut:

    alamat_ekspresi- pengidentifikasi variabel dari beberapa tipe struktural atau ekspresi dalam tanda kurung sesuai dengan aturan sintaks yang ditunjukkan di bawah (Gbr. 1);

    structure_field_name- nama bidang dari templat struktur.

    Ini sebenarnya juga merupakan alamat, atau lebih tepatnya, offset bidang dari awal struktur.

Jadi operatornya" . " (titik) mengevaluasi ekspresi

Beras. 5. Sintaks ekspresi alamat dalam operator akses bidang struktur

Mari kita tunjukkan pada contoh struktur yang telah kita definisikan pekerja beberapa teknik untuk bekerja dengan struktur.

Misalnya, ekstrak ke kapak nilai bidang dengan usia. Karena kecil kemungkinannya usia orang yang sehat akan lebih dari 99 tahun, setelah memasukkan isi bidang karakter ini ke dalam register kapak akan lebih mudah untuk mengubahnya menjadi representasi biner dengan perintah aad.

Hati-hati, karena prinsip penyimpanan data "byte rendah di alamat rendah" angka tertinggi dari usia akan ditempatkan di Al, dan yang termuda di ah.

Untuk memperbaikinya, cukup gunakan perintah xchg al,ah:

mov ax,word ptr sotr1.age ;at al age sotr1

dan itu mungkin seperti ini:

Pekerjaan lebih lanjut dengan larik struktur dilakukan dengan cara yang sama seperti larik satu dimensi. Beberapa pertanyaan muncul di sini:

Bagaimana menangani ukuran dan bagaimana mengatur pengindeksan elemen array?

Seperti pengidentifikasi lain yang ditentukan dalam program, penerjemah memberikan nama tipe struktur dan nama variabel dengan tipe struktur atribut tipe. Nilai atribut ini adalah ukuran dalam byte yang ditempati oleh bidang struktur ini. Anda dapat mengekstrak nilai ini menggunakan operator jenis.

Setelah ukuran instance struktur diketahui, pengorganisasian pengindeksan dalam array struktur tidak terlalu sulit.

Misalnya:

Bagaimana cara menyalin bidang dari satu struktur ke bidang yang sesuai dari struktur lain? Atau bagaimana cara menyalin seluruh struktur? Mari salin bidangnya nam karyawan ketiga di lapangan nam karyawan kelima:

pekerja mas_sotr 10 dup()

mov bx, offset mas_sotr

mov si,(tipe pekerja)*2 ;si=77*2

mov di,(tipe pekerja)*4 ;si=77*4

Bagi saya, keahlian seorang programmer cepat atau lambat membuat seseorang terlihat seperti ibu rumah tangga yang baik. Dia, seperti dia, terus-menerus mencari tempat untuk menyimpan sesuatu, mengurangi dan membuat makan malam yang enak dari makanan minimum. Dan jika ini berhasil, maka kepuasan moral tidak kurang, dan mungkin lebih dari makan malam yang enak di ibu rumah tangga. Tingkat kepuasan ini, menurut saya, tergantung pada tingkat kecintaan pada profesi seseorang.

Di sisi lain, kemajuan dalam pengembangan perangkat lunak dan perangkat keras agak membuat programmer rileks, dan cukup sering ada situasi yang mirip dengan pepatah terkenal tentang lalat dan gajah - untuk menyelesaikan beberapa masalah kecil, alat berat digunakan terlibat, yang keefektifannya, dalam kasus umum, hanya signifikan ketika pelaksanaan proyek-proyek yang relatif besar.

Kehadiran dalam bahasa dua jenis data berikut mungkin karena keinginan "nyonya rumah" untuk menggunakan area kerja tabel (RAM) seefisien mungkin saat menyiapkan makanan atau untuk menempatkan produk (data program ).

1. Arsitektur PC………………………………………………………………………………5

    1.1. Register.

    1.1.1 Register tujuan umum.

1.1.2. register segmen

1.1.3 Daftar bendera

1.2. Organisasi memori.

1.3. Representasi data.

1.3.1 Tipe data

1.3.2 Representasi karakter dan string

2. Pernyataan program perakitan ………………………………………

    1. Perintah bahasa assembly

2.2. Mode pengalamatan dan format instruksi mesin

3. Operator semu ………………………………………………………………….

3.1 Arahan definisi data

3.2 Struktur program perakitan

3.2.1 Segmen program. menganggap direktif

3.2.3 Arahan segmentasi yang disederhanakan

4. Merakit dan menghubungkan program ………………………….

5. Perintah transfer data……………………………………………….

    5.1 Perintah umum

    5.2 Perintah Tumpukan

5.3 Perintah I/O

5.4 Perintah penerusan alamat

5.5 Perintah Transfer Bendera

6. Perintah aritmatika ……………………………………………………….

    6.1 Operasi aritmatika pada bilangan bulat biner

6.1.1 Penjumlahan dan pengurangan

6.1.2 Perintah untuk menambah dan mengurangi penerima satu per satu

6.2 Perkalian dan pembagian

6.3 Perubahan tanda tangan

7. Operasi logika ………………………………………………………….

8. Shift dan shift siklik …………………………………………

9. Operasi dawai …………………………………………………………….

10. Logika dan organisasi program ………………………………………………

10.1 Lompatan tanpa syarat

10.2 Lompatan bersyarat

10.4 Prosedur dalam bahasa assembly

10.5 Menginterupsi INT

10.6 Perangkat lunak sistem

10.6.1.1 Membaca keyboard.

10.6.1.2 Menampilkan karakter di layar

10.6.1.3 Mengakhiri program.

10.6.2.1 Memilih mode tampilan

11. Memori disk ………………………………………………………………………..

11.2 Tabel alokasi file

11.3 Disk I/O

11.3.1 Menulis file ke disk

11.3.1.1 data ASCIIZ

11.3.1.2 Nomor file

11.3.1.3 Membuat file disk

11.3.2 Membaca file disk

Perkenalan

Bahasa assembly adalah representasi simbolis dari bahasa mesin. Semua proses di komputer pribadi (PC) pada level perangkat keras terendah hanya digerakkan oleh perintah (instruksi) bahasa mesin. Tidak mungkin untuk benar-benar menyelesaikan masalah yang berhubungan dengan perangkat keras (atau bahkan, terlebih lagi, masalah yang berhubungan dengan perangkat keras, seperti meningkatkan kecepatan program), tanpa sepengetahuan assembler.

Assembler adalah bentuk perintah yang mudah digunakan langsung untuk komponen PC dan membutuhkan pengetahuan tentang properti dan kemampuan sirkuit terintegrasi yang berisi komponen tersebut, yaitu mikroprosesor PC. Dengan demikian, bahasa rakitan berhubungan langsung dengan organisasi internal PC. Dan bukan kebetulan bahwa hampir semua kompiler bahasa tingkat tinggi mendukung akses ke tingkat pemrograman assembler.

Unsur persiapan programmer profesional tentu saja mempelajari assembler. Ini karena pemrograman bahasa rakitan membutuhkan pengetahuan tentang arsitektur PC, yang memungkinkan Anda membuat program yang lebih efisien dalam bahasa lain dan menggabungkannya dengan program bahasa rakitan.

Manual berkaitan dengan pemrograman dalam bahasa rakitan untuk komputer berbasis mikroprosesor Intel.

Tutorial ini ditujukan untuk semua orang yang tertarik dengan arsitektur prosesor dan dasar-dasar pemrograman dalam bahasa Assembly, pertama-tama, untuk pengembang produk perangkat lunak.

    arsitektur PC.

Arsitektur komputer adalah representasi abstrak dari komputer yang mencerminkan organisasi struktural, sirkuit, dan logisnya.

Semua komputer modern memiliki beberapa properti arsitektur umum dan individual. Properti individu hanya melekat pada model komputer tertentu.

Konsep arsitektur komputer meliputi:

    diagram blok komputer;

    sarana dan metode untuk mengakses elemen diagram blok KOMPUTER;

    set dan ketersediaan register;

    organisasi dan metode pengalamatan;

    cara penyajian dan format data komputer;

    satu set instruksi mesin komputer;

    format instruksi mesin;

    penanganan interupsi.

Elemen utama perangkat keras komputer: unit sistem, keyboard, perangkat tampilan, drive disk, perangkat pencetakan (printer) dan berbagai alat komunikasi. Unit sistem terdiri dari motherboard, catu daya dan sel ekspansi untuk papan tambahan. Motherboard berisi mikroprosesor, read-only memory (ROM), RAM(RAM) dan koprosesor.

      Register.

Di dalam mikroprosesor, informasi terkandung dalam kelompok yang terdiri dari 32 register (16 pengguna, 16 sistem), kurang lebih tersedia untuk digunakan oleh pemrogram. Karena manual dikhususkan untuk pemrograman untuk mikroprosesor 8088-i486, paling logis untuk memulai topik ini dengan membahas register internal mikroprosesor yang tersedia untuk pengguna.

Register pengguna digunakan oleh programmer untuk menulis program. Register-register tersebut antara lain:

    delapan register 32-bit (register tujuan umum) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    enam register segmen 16-bit: CS,DS, SS, ES, FS,GS;

    register status dan kontrol: register bendera EFLAGS/FLAGS, dan register penunjuk perintah EIP/IP.

Bagian dari satu register 32-bit ditunjukkan melalui garis miring. Awalan E (Extended) menunjukkan penggunaan register 32-bit. Untuk bekerja dengan byte, register dengan awalan L (rendah) dan H (tinggi) digunakan, misalnya, AL, CH - menunjukkan byte rendah dan tinggi dari bagian 16-bit register.

        Register umum.

EAX/AX/AH/AL(Pendaftaran akumulator) - baterai. Digunakan dalam perkalian dan pembagian, dalam operasi I/O, dan dalam beberapa operasi pada string.

EBX/BX/BH/BL - register dasar(base register), sering digunakan saat pengalamatan data di memori.

ECX/CX/CH/CL - menangkal(hitung register), digunakan sebagai penghitung jumlah pengulangan loop.

EDX/DX/DH/DL - pendaftaran data(register data), digunakan untuk menyimpan data antara. Beberapa perintah memerlukannya.

Semua register grup ini memungkinkan Anda untuk mengakses bagian "bawah" mereka. Hanya bagian 16- dan 8-bit yang lebih rendah dari register ini yang dapat digunakan untuk pengalamatan sendiri. 16 bit teratas dari register ini tidak tersedia sebagai objek independen.

Untuk mendukung perintah pemrosesan string yang memungkinkan pemrosesan string elemen berurutan dengan panjang 32, 16 atau 8 bit, berikut ini digunakan:

ESI/SI (register indeks sumber) - indeks sumber. Berisi alamat elemen sumber saat ini.

EDI/DI (register indeks jarak) - indeks penerima(penerima). Berisi alamat saat ini di string tujuan.

Arsitektur mikroprosesor pada tingkat perangkat keras dan perangkat lunak mendukung struktur data - tumpukan. Untuk bekerja dengan tumpukan, ada perintah khusus dan register khusus. Perlu dicatat bahwa tumpukan diisi ke alamat yang lebih kecil.

ESP/SP (daftar penunjuk tumpukan) - daftar penunjuk tumpukan. Berisi pointer ke atas tumpukan di segmen tumpukan saat ini.

EBP/BP (daftar penunjuk dasar) – register penunjuk dasar tumpukan. Dirancang untuk mengatur akses acak ke data di dalam tumpukan.

1.1.2. register segmen

Model perangkat lunak mikroprosesor memiliki enam register segmen: CS, SS, DS, ES, GS, FS. Keberadaan mereka disebabkan oleh kekhususan organisasi dan penggunaan RAM oleh mikroprosesor Intel. Perangkat keras mikroprosesor mendukung organisasi struktural dari program yang terdiri dari segmen. Untuk menentukan segmen yang tersedia di saat ini register segmen. Mikroprosesor mendukung jenis segmen berikut:

    segmen kode. Berisi perintah program Untuk mengakses segmen ini, gunakan register CS (register segmen kode) - register kode segmen. Ini berisi alamat segmen instruksi mesin yang dapat diakses oleh mikroprosesor.

    segmen data. Berisi data yang diproses oleh program. Untuk mengakses segmen ini, register DS (register segmen data) digunakan - register data segmen, yang menyimpan alamat segmen data program saat ini.

    Segmen tumpukan. Segmen ini adalah wilayah memori yang disebut tumpukan. Mikroprosesor mengatur tumpukan sesuai dengan prinsip - yang pertama "datang", yang pertama "kiri". Untuk mengakses stack, register SS (stack segment register) digunakan - register segmen tumpukan A berisi alamat segmen tumpukan.

    Segmen data tambahan. Data yang akan diproses dapat berupa tiga segmen data tambahan. Secara default, data diasumsikan berada di segmen data. Saat menggunakan segmen data tambahan, alamatnya harus ditentukan secara eksplisit menggunakan prefiks redefinisi segmen khusus dalam perintah. Alamat segmen data tambahan harus dimuat dalam register ES, GS, FS (register segmen data ekstensi).

        Kontrol dan Register Status

Mikroprosesor berisi beberapa register yang berisi informasi tentang status mikroprosesor itu sendiri dan program yang instruksinya saat ini dimuat ke dalam pipa. Ini:

Daftar penunjuk perintah EIP/IP;

    Daftar bendera EFLAGS/BENDERA.

Dengan menggunakan register ini, Anda dapat memperoleh informasi tentang hasil eksekusi perintah dan memengaruhi status mikroprosesor itu sendiri.

EIP/IP (daftar penunjuk instruksi) - penunjuk perintah. Register EIP/IP memiliki lebar 32 atau 16 bit dan berisi offset dari instruksi selanjutnya yang akan dieksekusi relatif terhadap isi register segmen CS di segmen instruksi saat ini. Register ini tidak dapat diakses secara langsung, tetapi diubah dengan instruksi lompat.

EFLAGS/BENDERA (Bendera daftar) - daftar bendera. Kedalaman bit 32/16 bit. Bit individu dari register ini memiliki tujuan fungsional tertentu dan disebut flag. Bendera adalah bit yang disetel ke 1 ("bendera disetel") jika beberapa kondisi terpenuhi dan 0 ("bendera dihapus") jika tidak. Bagian bawah register ini sepenuhnya analog dengan register FLAGS untuk i8086.

1.1.3 Daftar bendera

Register flag adalah 32-bit dan memiliki nama EFLAGS (Gbr. 1). Bit individu dari register memiliki tujuan fungsional tertentu dan disebut flag. Masing-masing diberi nama tertentu (ZF, CF, dll.). EFLAGS 16 bit yang lebih rendah mewakili register FLAGS 16-bit yang digunakan saat menjalankan program yang ditulis untuk mikroprosesor i086 dan i286.

Gbr.1 Daftar bendera

Beberapa bendera disebut bendera kondisi; mereka secara otomatis berubah ketika perintah dijalankan dan memperbaiki properti tertentu dari hasilnya (misalnya, apakah sama dengan nol). Bendera lain disebut bendera negara bagian; mereka berubah dari program dan memengaruhi perilaku prosesor selanjutnya (misalnya, mereka memblokir interupsi).

Bendera kondisi:

CF (membawa bendera) - membawa bendera. Dibutuhkan nilai 1 jika, saat menambahkan bilangan bulat, unit pembawa muncul yang tidak "pas" ke dalam kisi bit, atau jika, saat mengurangkan angka yang tidak bertanda, yang pertama lebih kecil dari yang kedua. Dalam perintah shift, bit yang off-grid dimasukkan ke dalam CF. CF juga memperbaiki fitur instruksi perkalian.

OF (bendera luapan) bendera meluap. Diatur ke 1 jika, ketika menambah atau mengurangi bilangan bulat dengan tanda, hasilnya diperoleh, modulo melebihi nilai yang diizinkan (mantissa meluap dan "naik" ke bit tanda).

ZF (bendera nol) bendera nol. Set ke 1 jika hasil dari perintah adalah 0.

SF (Bendera tanda) - bendera tanda. Setel ke 1 jika operasi pada bilangan bertanda menghasilkan hasil negatif.

PF (bendera paritas) - bendera keseimbangan. Itu sama dengan 1 jika hasil dari perintah berikutnya berisi bilangan biner genap. Biasanya diperhitungkan hanya selama operasi I/O.

AF (bendera pembawa tambahan) - membawa bendera tambahan. Memperbaiki fitur melakukan operasi pada bilangan biner-desimal.

Bendera status:

DF (bendera arah) bendera arah. Menetapkan arah pemindaian garis dalam perintah string: dengan DF=0, garis dipindai "maju" (dari awal hingga akhir), dengan DF=1 - ke arah yang berlawanan.

IOPL (tingkat hak istimewa masukan/keluaran) - Tingkat hak istimewa I/O. Digunakan dalam mode terproteksi mikroprosesor untuk mengontrol akses ke perintah I/O, bergantung pada hak istimewa tugas.

NT (tugas bersarang) bendera bersarang tugas. Digunakan dalam mode terproteksi mikroprosesor untuk merekam fakta bahwa satu tugas bersarang di dalam tugas lainnya.

Bendera sistem:

JIKA (tanda Interrupt) - bendera interupsi. Dengan IF=0, prosesor berhenti merespons interupsi yang datang padanya, dengan IF=1, pemblokiran interupsi dihapus.

TF (bendera jebakan) jejak bendera. Dengan TF=1, setelah menjalankan setiap instruksi, prosesor membuat interupsi (dengan nomor 1), yang dapat digunakan saat men-debug program untuk melacaknya.

RF (tanda resume) melanjutkan bendera. Digunakan saat menangani interupsi dari register debug.

VM (mode virtual 8086) - bendera 8086 maya. 1 - prosesor beroperasi dalam mode virtual 8086. 0 - prosesor beroperasi dalam mode nyata atau terlindungi.

AC (pemeriksaan keselarasan) - bendera kontrol penyelarasan. Dirancang untuk mengaktifkan kontrol penyelarasan saat mengakses memori.

      Organisasi memori.

Memori fisik yang dapat diakses oleh mikroprosesor disebut memori kerja ( atau memori akses acak RAM). RAM adalah rangkaian byte yang memiliki alamat uniknya sendiri (nomornya), disebut fisik. Kisaran alamat fisik adalah 0 hingga 4 GB. Mekanisme manajemen memori sepenuhnya berbasis perangkat keras.

Mikroprosesor mendukung beberapa model penggunaan RAM pada perangkat keras:

    model tersegmentasi. Dalam model ini, memori program dibagi menjadi area memori yang berdekatan (segmen), dan program itu sendiri hanya dapat mengakses data yang ada di segmen ini;

    model halaman. Dalam hal ini, RAM dianggap sebagai kumpulan blok dengan ukuran tetap 4 KB. Aplikasi utama dari model ini terkait dengan organisasi memori maya, yang memungkinkan program menggunakan lebih banyak ruang memori daripada jumlah memori fisik. Untuk mikroprosesor Pentium, kemungkinan ukuran memori virtual bisa mencapai 4 TB.

Penggunaan dan penerapan model ini bergantung pada mode operasi mikroprosesor:

    Mode alamat nyata (mode nyata). Modusnya mirip dengan pengoperasian prosesor i8086. Diperlukan untuk pengoperasian program yang dirancang untuk model prosesor awal.

    Modus terlindungi. Mode terlindungi memungkinkan multitasking memproses informasi, perlindungan memori menggunakan mekanisme hak istimewa empat tingkat dan pagingnya.

    Modus maya 8086. Dalam mode ini, dimungkinkan untuk menjalankan beberapa program untuk i8086. Dalam hal ini, program mode real dapat berfungsi.

Segmentasi adalah mekanisme pengalamatan yang memastikan keberadaan beberapa ruang alamat independen. Segmen adalah blok memori independen yang didukung perangkat keras.

Setiap program pada umumnya dapat terdiri dari sejumlah segmen, tetapi memiliki akses langsung ke tiga segmen utama: kode, data, dan tumpukan - dan dari satu hingga tiga segmen data tambahan. sistem operasi menempatkan segmen program dalam RAM pada alamat fisik tertentu, setelah itu menempatkan nilai alamat ini ke dalam register yang sesuai. Dalam sebuah segmen, program mengakses alamat relatif terhadap awal segmen secara linier, yaitu mulai dari alamat 0 dan berakhir pada alamat yang sama dengan ukuran segmen. Alamat kerabat atau bias, yang digunakan mikroprosesor untuk mengakses data dalam suatu segmen disebut efisien.

Pembentukan alamat fisik dalam mode nyata

Dalam mode nyata, rentang alamat fisik adalah dari 0 hingga 1 MB. Ukuran segmen maksimum adalah 64 KB. Ketika mengacu pada spesifik alamat fisik RAM ditentukan oleh alamat awal segmen dan offset dalam segmen tersebut. Alamat awal segmen diambil dari register segmen yang sesuai. Dalam hal ini, register segmen hanya berisi 16 bit atas dari alamat fisik awal segmen. Empat bit bawah yang hilang dari alamat 20-bit diperoleh dengan menggeser nilai register segmen ke kiri sebanyak 4 bit. Operasi shift dilakukan di perangkat keras. Nilai 20-bit yang dihasilkan adalah alamat fisik aktual yang sesuai dengan awal segmen. Itu adalah alamat fisik ditentukan sebagai pasangan "segmen:offset", di mana "segmen" adalah 16 bit pertama dari alamat awal segmen memori tempat sel berada, dan "offset" adalah alamat 16-bit sel ini, dihitung dari awal segmen memori ini (nilai 16*segmen +offset memberikan alamat absolut sel). Jika, misalnya, nilai 1234h disimpan dalam register CS, maka pasangan alamat 1234h:507h mendefinisikan alamat absolut sama dengan 16*1234h+507h =12340h+507h = 12847h. Pasangan seperti itu ditulis sebagai kata ganda, dan (untuk angka) dalam bentuk "terbalik": kata pertama berisi offset, dan yang kedua - segmen, masing-masing kata ini pada gilirannya diwakili dalam "terbalik" membentuk. Misalnya, pasangan 1234h:5678h akan ditulis seperti ini:| 78 | 56| 34 | 12|.

Mekanisme pembentukan alamat fisik ini memungkinkan Anda membuat perangkat lunak dapat dipindahkan, yaitu, tidak bergantung pada alamat unduhan tertentu dalam RAM.

Struktur instruksi bahasa rakitan Pemrograman pada tingkat instruksi mesin adalah tingkat minimum di mana pemrograman komputer dimungkinkan. Sistem instruksi mesin harus cukup untuk mengimplementasikan tindakan yang diperlukan dengan mengeluarkan instruksi ke perangkat keras mesin. Setiap instruksi mesin terdiri dari dua bagian: bagian operasi yang mendefinisikan "apa yang harus dilakukan" dan operan yang mendefinisikan objek pemrosesan, yaitu "apa yang harus dilakukan". Instruksi mesin dari mikroprosesor, ditulis dalam bahasa Assembly, adalah satu baris, memiliki bentuk sebagai berikut: label instruction/directive operand(s); komentar Label, perintah/direktif, dan operan dipisahkan oleh setidaknya satu spasi atau karakter tab. Operan instruksi dipisahkan dengan koma.

Struktur instruksi bahasa rakitan Instruksi bahasa rakitan memberi tahu kompiler tindakan apa yang harus dilakukan mikroprosesor. Arahan perakitan adalah parameter yang ditentukan dalam teks program yang memengaruhi proses perakitan atau properti file keluaran. Operan menentukan nilai awal data (dalam segmen data) atau elemen yang akan ditindaklanjuti oleh instruksi (dalam segmen kode). Sebuah instruksi mungkin memiliki satu atau dua operan, atau tanpa operan. Jumlah operan secara implisit ditentukan oleh kode instruksi. Jika perintah atau arahan perlu dilanjutkan ke baris berikutnya, maka digunakan karakter garis miring terbalik: "" . Secara default, assembler tidak membedakan antara huruf besar dan huruf kecil dalam perintah dan arahan. Contoh arahan dan perintah Hitung db 1 ; Nama, arahan, satu operan mov eax, 0 ; Perintah, dua operan

Pengidentifikasi adalah urutan karakter yang valid yang digunakan untuk menunjuk nama variabel dan nama label. Pengidentifikasi dapat terdiri dari satu atau lebih karakter berikut: semua huruf alfabet Latin; angka dari 0 sampai 9; karakter khusus: _, @, $, ? . Titik dapat digunakan sebagai karakter pertama label. Nama assembler cadangan (direktif, operator, nama perintah) tidak dapat digunakan sebagai pengidentifikasi. Karakter pertama pengidentifikasi harus berupa huruf atau karakter khusus. Panjang pengidentifikasi maksimum adalah 255 karakter, tetapi penerjemah menerima 32 karakter pertama dan mengabaikan sisanya. Semua label yang ditulis pada baris yang tidak berisi direktif assembler harus diakhiri dengan tanda titik dua ":". Label, perintah (direktif), dan operan tidak harus dimulai pada posisi tertentu dalam string. Dianjurkan untuk menuliskannya di kolom agar program lebih mudah dibaca.

Label Semua label yang ditulis pada baris yang tidak berisi direktif assembler harus diakhiri dengan tanda titik dua ":". Label, perintah (direktif), dan operan tidak harus dimulai pada posisi tertentu dalam string. Dianjurkan untuk menuliskannya di kolom agar program lebih mudah dibaca.

Komentar Penggunaan komentar dalam sebuah program meningkatkan kejelasannya, terutama ketika tujuan dari sekumpulan instruksi tidak jelas. Komentar dimulai pada setiap baris modul sumber dengan titik koma (;). Semua karakter di sebelah kanan "; ' sampai akhir baris adalah komentar. Komentar dapat berisi karakter apa pun yang dapat dicetak, termasuk "spasi". Komentar dapat menjangkau seluruh baris atau mengikuti perintah pada baris yang sama.

Struktur program bahasa rakitan Program bahasa rakitan dapat terdiri dari beberapa bagian, yang disebut modul, yang masing-masing dapat menentukan satu atau lebih segmen data, tumpukan, dan kode. Setiap program bahasa rakitan lengkap harus menyertakan satu modul utama, atau utama, dari mana pelaksanaannya dimulai. Modul dapat berisi segmen program, data, dan tumpukan yang dideklarasikan dengan arahan yang sesuai.

Model Memori Sebelum mendeklarasikan segmen, Anda harus menentukan model memori menggunakan direktif. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Model memori bahasa rakitan dasar: Model memori Pengalamatan kode Pengalamatan data Sistem operasi Kode dan interleaving data TINY DEKAT MS-DOS Valid KECIL DEKAT MS-DOS, Windows Tidak MEDIUM FAR DEKAT MS-DOS, Windows Tidak COMPACT DEKAT JAUH MS-DOS, Windows Tidak BESAR JAUH MS-DOS, Windows Tidak BESAR JAUH MS-DOS, Windows Tidak DEKAT Windows 2000, Windows XP, Windows Valid FLAT DEKAT NT,

Model Memori Model kecil ini hanya bekerja pada aplikasi MS-DOS 16-bit. Dalam model ini, semua data dan kode berada dalam satu segmen fisik. Ukuran file program dalam hal ini tidak melebihi 64 KB. Model kecil mendukung satu segmen kode dan satu segmen data. Data dan kode saat menggunakan model ini dialamatkan sebagai near (dekat). Model medium mendukung banyak segmen kode dan satu segmen data, dengan semua tautan di segmen kode dianggap jauh (jauh) secara default, dan tautan di segmen data dianggap dekat (dekat). Model kompak mendukung beberapa segmen data yang menggunakan pengalamatan data jauh (far) dan satu segmen kode yang menggunakan pengalamatan data dekat (near). Model besar mendukung beberapa segmen kode dan beberapa segmen data. Secara default, semua referensi kode dan data dianggap jauh. Model besar hampir setara dengan model memori besar.

Model Memori Model datar mengasumsikan konfigurasi program tidak tersegmentasi dan hanya digunakan pada sistem operasi 32-bit. Model ini mirip dengan model kecil karena data dan kode berada di segmen 32-bit yang sama. Untuk mengembangkan program untuk model datar sebelum direktif. model datar harus menempatkan salah satu arahan: . 386, . 486, . 586 atau. 686. Pilihan direktif pemilihan prosesor menentukan kumpulan perintah yang tersedia saat menulis program. Huruf p setelah arahan pemilihan prosesor berarti mode operasi yang dilindungi. Pengalamatan data dan kode sudah dekat, dengan semua alamat dan pointer menjadi 32-bit.

model memori. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Parameter modifier digunakan untuk menentukan jenis segmen dan dapat mengambil nilai berikut: gunakan 16 (segmen dari model yang dipilih digunakan sebagai 16-bit) gunakan 32 (segmen dari model yang dipilih digunakan sebagai 32-bit). Parameter konvensi_panggilan digunakan untuk menentukan bagaimana parameter dilewatkan saat memanggil prosedur dari bahasa lain, termasuk bahasa tingkat tinggi (C++, Pascal). Parameter dapat mengambil nilai berikut: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

model memori. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Parameter OS_type adalah OS_DOS secara default, dan saat ini merupakan satu-satunya nilai yang didukung untuk parameter ini. Parameter stack_param disetel ke: NEARSTACK (register SS sama dengan DS, wilayah data dan tumpukan terletak di segmen fisik yang sama) FARSTACK (register SS tidak sama dengan DS, wilayah data dan tumpukan terletak di segmen fisik yang berbeda). Standarnya adalah NEARSTACK.

Contoh program "tidak melakukan apa-apa". 686 P.MODEL DATAR, STDCALL. DATA. KODE MULAI: RET END MULAI RET - perintah mikroprosesor. Ini memastikan penghentian program yang benar. Program lainnya terkait dengan pengoperasian penerjemah. . 686 P - Perintah mode terproteksi Pentium 6 (Pentium II) diperbolehkan. Arahan ini memilih set instruksi assembler yang didukung dengan menentukan model prosesor. . MODEL FLAT, stdcall - model memori datar. Model memori ini digunakan di sistem operasi Windows. stdcall adalah konvensi pemanggilan prosedur untuk digunakan.

Contoh program "tidak melakukan apa-apa". 686 P.MODEL DATAR, STDCALL. DATA. KODE MULAI: RET AKHIR MULAI . DATA - segmen program yang berisi data. Program ini tidak menggunakan stack, jadi segment. STACK hilang. . KODE - segmen program yang berisi kode. MULAI - label. AKHIR MULAI - akhir dari program dan pesan ke kompiler bahwa program harus dimulai dari label MULAI. Setiap program harus berisi arahan END yang menandai akhir dari kode sumber program. Semua baris yang mengikuti direktif END diabaikan Label setelah direktif END memberi tahu kompiler nama modul utama tempat eksekusi program dimulai. Jika program berisi satu modul, label setelah arahan END dapat dihilangkan.

Penerjemah bahasa rakitan Penerjemah adalah sebuah program atau sarana teknis A yang mengubah program di salah satu bahasa pemrograman menjadi program di bahasa target, disebut kode objek. Selain mendukung mnemonik instruksi mesin, setiap penerjemah memiliki rangkaian arahan dan makro sendiri, seringkali tidak kompatibel dengan hal lain. Jenis utama penerjemah bahasa rakitan adalah: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - assembler multi-pass yang didistribusikan secara bebas yang ditulis oleh Tomasz Gryshtar (Polandia), NASM (Netwide Assembler) - a assembler gratis untuk Intel x architecture 86 dibuat oleh Simon Tatham dengan Julian Hall dan saat ini sedang dikembangkan oleh tim pengembangan kecil di Source. Menempa. bersih.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Terjemahan program di Microsoft Visual Studio 2005 1) Buat proyek dengan memilih File->New->Project menu Dan"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Terjemahan program di Microsoft Visual Studio 2005 2) Di pohon proyek (View->Solution Explorer) tambahkan"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Terjemahan program di Microsoft Visual Studio 2005 3) Pilih jenis file Code C++, tetapi tentukan nama dengan ekstensi. asm:

Terjemahan program di Microsoft Visual Studio 2005 5) Tetapkan opsi kompiler. Pilih di tombol kanan di menu file proyek Custom Build Rules…

Terjemahan program di Microsoft Visual Studio 2005 dan di jendela yang muncul, pilih Microsoft Macro Assembler.

Terjemahan program di Microsoft Visual Studio 2005 Periksa dengan tombol kanan di file halo. asm pohon proyek dari menu Properties dan atur General->Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Terjemahan program di Microsoft Visual Studio 2005 6) Kompilasi file dengan memilih Build->Build hello.prj ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Pemrograman di OS Windows Pemrograman di OS Windows didasarkan pada penggunaan fungsi API (Application Program Interface, yaitu antarmuka aplikasi perangkat lunak). Jumlah mereka mencapai 2000. Program untuk Windows sebagian besar terdiri dari panggilan semacam itu. Semua interaksi dengan perangkat eksternal dan sumber daya sistem operasi terjadi, sebagai suatu peraturan, melalui fungsi-fungsi tersebut. ruang operasi sistem jendela menggunakan model memori datar. Alamat dari setiap lokasi memori akan ditentukan oleh isi dari satu register 32-bit. Ada 3 jenis struktur program untuk Windows: dialog (jendela utama adalah dialog), struktur konsol atau tanpa jendela, struktur klasik (jendela, bingkai).

Panggilan fitur Windows API Dalam file bantuan, setiap fungsi API direpresentasikan sebagai tipe nama_fungsi (FA 1, FA 2, FA 3) Tipe – tipe nilai kembalian; FAX – daftar argumen formal dalam urutannya. Misalnya, int Message. Kotak (HWND h.Wnd, LPCTSTR lp. Teks, LPCTSTR lp. Caption, UINT u. Jenis); Fungsi ini menampilkan jendela dengan pesan dan tombol keluar. Arti parameter: h. Wnd - pegangan ke jendela di mana jendela pesan akan muncul, lp. Teks - teks yang akan muncul di jendela, lp. Keterangan - teks dalam judul jendela, u. Jenis - jenis jendela, khususnya, Anda dapat menentukan jumlah tombol keluar.

Memanggil fungsi Windows API ke Pesan. Kotak (HWND h.Wnd, LPCTSTR lp. Teks, LPCTSTR lp. Caption, UINT u. Jenis); Hampir semua parameter fungsi API sebenarnya adalah bilangan bulat 32-bit: HWND adalah bilangan bulat 32-bit, LPCTSTR adalah penunjuk string 32-bit, UINT adalah bilangan bulat 32-bit. Akhiran "A" sering ditambahkan ke nama fungsi untuk beralih ke versi fungsi yang lebih baru.

Memanggil fungsi Windows API ke Pesan. Kotak (HWND h.Wnd, LPCTSTR lp. Teks, LPCTSTR lp. Caption, UINT u. Jenis); Saat menggunakan MASM, Anda harus menambahkan @N N di akhir nama - jumlah byte yang ditempati argumen yang diteruskan di tumpukan. Untuk fungsi Win 32 API, angka ini dapat didefinisikan sebagai jumlah argumen n kali 4 (byte di setiap argumen): N=4*n. Untuk memanggil suatu fungsi, instruksi CALL dari assembler digunakan. Dalam hal ini, semua argumen ke fungsi diteruskan melalui tumpukan (perintah PUSH). Arah penyampaian argumen: KIRI KE KANAN - BAWAH ATAS. Argumen u akan didorong ke tumpukan terlebih dahulu. jenis. Memanggil fungsi yang ditentukan akan terlihat seperti ini: CALL Message. kotak. [email dilindungi]

Memanggil fungsi Windows API ke Pesan. Kotak (HWND h.Wnd, LPCTSTR lp. Teks, LPCTSTR lp. Caption, UINT u. Jenis); Hasil eksekusi setiap fungsi API biasanya berupa bilangan bulat, yang dikembalikan dalam register EAX. Direktif OFFSET adalah "offset segmen" atau, dalam istilah bahasa tingkat tinggi, "penunjuk" ke awal string. Direktif EQU, seperti #define di C, mendefinisikan sebuah konstanta. Arahan EXTERN memberi tahu kompiler bahwa fungsi atau pengidentifikasi berada di luar modul.

Contoh program "Halo semuanya!" . 686 P.MODEL DATAR, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Program pertama saya", 0 STR 2 DB "Halo semuanya!", 0 HW DD ? pesan EKSTERNAL. kotak. [email dilindungi]: DI DEKAT. KODE MULAI: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Pesan. kotak. [email dilindungi] RET AKHIR MULAI

Direktif INVOKE Penerjemah bahasa MASM juga memungkinkan untuk menyederhanakan pemanggilan fungsi menggunakan alat makro - direktif INVOKE: fungsi INVOKE, parameter1, parameter2, ... Tidak perlu menambahkan @16 ke pemanggilan fungsi; parameter ditulis persis sesuai urutan yang diberikan dalam deskripsi fungsi. makro penerjemah mendorong parameter ke tumpukan. untuk menggunakan direktif INVOKE, Anda harus memiliki deskripsi prototipe fungsi menggunakan direktif PROTO dalam bentuk: Pesan. kotak. PROTO: DWORD, : DWORD