Pengaturcaraan dalam kod mesin dan bahasa pemasangan. Arahan pemasang asas

Tag
Label dalam bahasa himpunan boleh mengandungi simbol berikut:


Huruf: A hingga Z dan a hingga z
Nombor: 0 hingga 9
Watak istimewa: tanda soal (?)
titik (.) (aksara pertama sahaja)
tanda "komersial" (@)
garis bawah (_)
dolar ($)

Aksara pertama dalam label mestilah huruf atau aksara khas. Nombor tidak boleh menjadi aksara pertama label, dan aksara $ dan ? kadangkala mempunyai makna yang istimewa dan secara amnya tidak disyorkan untuk digunakan. Huruf besar dan huruf kecil tidak dibezakan secara lalai, tetapi pembezaan boleh didayakan dengan menetapkan satu atau pilihan lain dalam baris arahan penghimpun Panjang maksimum tag - 31 aksara. Contoh label: COUNT, PAGE25, $E10. Adalah disyorkan untuk menggunakan label deskriptif dan semantik. Nama daftar seperti AX, DI atau AL dikhaskan dan digunakan hanya untuk menunjukkan daftar yang sepadan.
Jika label terletak sebelum arahan pemproses, sejurus selepas itu sentiasa terdapat simbol ":" (titik bertitik), yang memberitahu pemasang untuk mencipta pembolehubah dengan nama ini mengandungi alamat arahan semasa:
some_loop:

loopne some_loop
Apabila label muncul sebelum arahan pemasang, ia biasanya salah satu daripada operan arahan itu dan titik bertindih tidak disertakan:

segmen codesg
lodsw ; membaca perkataan daripada rentetan,
cmp kapak,7; jika ia adalah 7 - keluar dari gelung
codesg tamat
Mari lihat arahan yang berfungsi secara langsung dengan label dan nilainya: LABEL, EQU dan =.

Arahan LABEL

Jenis label Arahan LABEL mentakrifkan label dan menentukan jenisnya. Jenis boleh menjadi salah satu daripada: BYTE (bait), WORD (perkataan), DWORD (perkataan ganda), FWORD (6 bait), QWORD (perkataan empat segi), TBYTE (10 bait), NEAR (berhampiran label), FAR (jauh label). Label diberikan nilai yang sama dengan alamat arahan seterusnya atau data seterusnya, dan jenis yang dinyatakan secara eksplisit. Bergantung kepada jenis arahan
label mov,0 akan menulis bait (perkataan, kata ganda, dll.) yang diisi dengan sifar ke dalam ingatan, dan arahan
label panggilan akan membuat panggilan pendek atau panjang ke subrutin.

Menggunakan arahan LABEL, adalah mudah untuk mengatur akses kepada data yang sama, kedua-dua bait dan perkataan, dengan mentakrifkan dua label dengan jenis yang berbeza di hadapan data.

Arahan EQU

Arahan EQU memberikan nilai kepada label, yang ditentukan sebagai hasil ungkapan integer di sebelah kanan. Hasil ungkapan ini boleh menjadi integer, alamat atau sebarang rentetan aksara:
label ungkapan persamaan

kebenaran sama 1
message1 equ "Cuba lagi$"
var2 equ 4
cmp kapak,kebenaran ; cmp kapak,1
db mesej1 ; db "Cuba lagi$"
mov ax,var2 ; mov ax, 4 Arahan EQU paling kerap digunakan untuk memperkenalkan parameter yang biasa kepada keseluruhan program, serupa dengan arahan #define bagi prapemproses C.

Arahan =

Arahan = adalah bersamaan dengan EQU, tetapi label yang ditakrifkannya hanya boleh menerima nilai integer. Selain itu, label yang ditentukan oleh arahan ini boleh ditindih.

Setiap pemasang menawarkan satu set keseluruhan label khas yang dipratentukan - ini boleh jadi Tarikh semasa(@tarikh atau ??tarikh), jenis pemproses (@cpu), atau nama segmen program tertentu, tetapi satu-satunya label pratakrif yang disokong oleh semua pemasang yang telah kami lihat ialah $ . Ia sentiasa sepadan dengan alamat semasa. Sebagai contoh, arahan

Jmp$

melakukan cawangan tanpa syarat pada dirinya sendiri, supaya gelung kekal dicipta daripada satu arahan.

Untuk lebih memahami keseluruhan perkara ini, saya menulis program kecil. Masih sama "Hello World", tetapi dengan cara yang baharu :) Teks di bawah:

Program ini dipasang oleh TASM dan MASM, tetapi fail EXE yang dipasang oleh MASM adalah satu bait lebih besar. Kami mendapati bahawa perintah mov dx,offset msg telah digantikan dengan arahan lea dx,msgb. LEA meletakkan alamat offset bagi data yang ditentukan dalam DX, i.e. melakukan perkara yang sama seperti arahan mov dengan offset. Saya cadangkan melihat ini di bawah penyahpepijat.



Mari lihat dengan teliti senarai pemasangan dan cari perbezaannya.



Menariknya, TASM mengumpulkan arahan LEA ke dalam dalam kes ini sebagai arahan MOV (opcode BA), dan MASM memasang arahan LEA ke dalam opcode yang berbeza - 8D16, yang meningkatkan saiz program sebanyak 1 bait. Saya tidak tahu mengapa dia memutuskan untuk melakukan ini lagi, tetapi ia akan menjadi menarik untuk mengetahui.

Satu daripada elemen penting Bahagian buku ini mengandungi contoh program dalam kod mesin dan dalam bahasa PERHIMPUNAN. Dalam cetakan program ini kita perlu menggunakan ini

dipanggil ASSEMBLY DIRECTIVES dan kini, mungkin, yang paling banyak masa yang sesuai untuk memberi gambaran tentang apa itu.

Kami akan melihat arahan berikut: ORG, EQU, DEFB, DEFW, DEFM dan END, tetapi sebelum kita mula mempertimbangkannya, kita perlu memahami dengan tegas:

1. Arahan ASSEMBLY bukan arahan pemproses Z8 0 dan dalam pengertian ini tidak mempunyai kaitan dengan kod mesin Z8 0.

2. ASSEMBLER ialah program yang menterjemah (menterjemah) teks yang ditulis oleh anda dalam bentuk mnemonik kepada kod objek iaitu kod mesin. Dan arahan ASSEMBLY ini adalah beberapa arahan kepada program perhimpunan. Ia tidak diterjemahkan dan tidak akan dimasukkan ke dalam kod objek, tetapi ia akan memudahkan anda menulis, dan yang paling penting, membaca program yang ditulis dalam mnemonik.

3. Terdapat banyak program PERHIMPUNAN dan setiap daripadanya boleh mempunyai arahannya sendiri. Mereka mungkin mempunyai arahan yang sama, tetapi mempunyai keperluan yang berbeza untuk penggunaannya. Secara ringkasnya, anda perlu mewujudkan kaedah khusus untuk menggunakan arahan ASSEMBLY mengikut arahan untuk program pemasangan yang anda gunakan (contohnya, EDITAS, GENS 3, GENS 4, ZEUS, dll.). Dan walaupun tiada piawaian, namun, beberapa konsep asas masih boleh dikenal pasti, dan kami akan memberi tumpuan kepada mereka.

3.1. Komen.

Kita akan mulakan dengan perkara yang paling mudah - komen. Ia ditulis selepas simbol ";". (titik bertitik).

Anda, tentu saja, faham bahawa segala-galanya yang merupakan ulasan tidak disusun ke dalam kod mesin oleh ASSEMBLY - ini tidak berguna. Ia hanya berfungsi untuk memudahkan anda berurusan dengan penyenaraian yang orang lain atau anda sendiri susun, tetapi sudah lama dahulu.

Sebagai contoh:

10 60001 LD E,A 2 0

Seperti yang anda lihat, talian boleh

; Dimuatkan ke dalam daftar E yang mengandungi -; penekan bateri. ; Dikurangkan satu.

hanya dari komen.

Tag.

Label sangat memudahkan penulisan program dalam mnemonik ASSEMBLY. Dalam operasi lompat JP, JR, DJNZ dan subrutin panggilan CALL, anda tidak boleh menentukan alamat yang anda ingin lompat, tetapi gantikan label. Sebaliknya, apabila anda menulis arahan untuk alamat ini, letakkan tanda di sana juga, Sebagai contoh:

10 60001 MULAKAN LD B,0 4

20 60003 LAGI INC HL

40 60005 DJNZ, LAGI

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ,BERMULA

Seperti yang anda lihat, ia sangat mudah. Anda boleh segera melihat bahawa dari baris 40 pulangan adalah kepada label LAGI jika daftar B tidak mencapai sifar. Baris 270 kembali ke label BEGIN.

Sudah pasti masuk akal untuk memilih nama untuk label yang sepadan dengan maksud operasi yang dijalankan - ini menjadikan penyenaraian program lebih mudah dibaca dan difahami.

Semasa penyusunan, program pemasangan itu sendiri akan mengira nilai offset yang diperlukan dalam arahan pemproses dan menggantikannya dan bukannya label. Jadi, sebagai contoh, dalam baris 40, bukannya DJNZ LAGI, kod objek akan mengandungi DJNZ FCH, iaitu perkara yang sama.

Dalam contoh sebelumnya, kami menggunakan label dengan sangat berhati-hati. Hakikatnya ialah kedua-dua rujukan kepada label dan label itu sendiri adalah dalam prosedur yang sama. Tetapi bagaimana jika anda ingin mengakses label yang berada dalam prosedur lain yang anda tulis dan susun semalam, dan bagaimana jika anda perlu membuat peralihan kepada prosedur ROM dan mahu menggunakan label itu? Dalam kes ini, arahan EQU akan membantu anda. Dia memberikan label nilai angka. Sudah tentu, semasa penyusunan arahan ini tidak ditukar kepada kod mesin dalam apa jua cara, tetapi jika terdapat rujukan kepada label ini dalam teks program, maka nilai yang diambil daripada arahan EQU akan digantikan.

Sebagai contoh, dalam program anda, anda perlu memanggil prosedur ROM berulang kali, sebut CLEAR (1EACH=7 8 52) dan OUT-LINE (1856H=6230). Kemudian pada permulaan program anda anda tentukan

contohnya memanggil mereka JELAS

arahan

nilai kepada label mereka, n

dan OUT L.

JELAS

EQU 7 8 52

KELUAR L

EQU 62 3 0

LABEL

EQU 60016

panggilan

anda tahu ini

prosedur atau

oleh tanda.

60001

LD HL, (LABEL)

60004

LD BC, 0008

60007

LD DE, (04 52)

60010

PANGGILAN JELAS

60013

PANGGILAN L

60016

Terus

berhutang dengan awak

memberi amaran,

contoh

dari sudut pandangan

perisian

contoh cara arahan PERHIMPUNAN tertentu digunakan dan jika anda memerlukan contoh maksud sebenar, maka anda akan menerimanya sedikit kemudian, dalam bab-bab berikutnya, di mana kami akan memeriksa teknik praktikal pengaturcaraan.

Mari kita lihat lagi contoh sebelumnya. Dalam baris 30, kami menghantar kepada pasangan daftar HL apa yang terkandung dalam alamat yang ditunjukkan oleh label LABEL, yang, menurut arahan EQU, menghala ke alamat 60016.

Jadi, sel 60016 dan 60017 mengandungi beberapa data yang kemudiannya boleh digunakan oleh program. Anda boleh menghantar data ini ke sel sendiri sebelum penyusunan. Dan anda tidak perlu menggunakan kod mesin untuk ini. Nilai awal dalam sel memori anda boleh menetapkan menggunakan arahan DEFB, DEFW dan DEFM.

DEFB - DEFINE BYTE - tetapkan bait.

DEFW - DEFINE WORD - tetapkan "perkataan" ("perkataan" ialah dua bait berturut-turut. Biasanya ini adalah alamat.) DEFM - DEFINE MESSAGE - tetapkan mesej (ini adalah beberapa bait berturut-turut). Biasanya, atur cara pemasangan mengenakan had pada bilangan bait yang boleh ditentukan oleh satu arahan DEFM, katakan tidak lebih daripada lima. Tetapi ini tidak sepatutnya membimbangkan anda. Jika anda ingin menentukan mesej yang panjang, anda boleh meletakkan seberapa banyak baris DEFM dalam satu baris yang anda mahu.

Jadi, DEFB menentukan satu bait tunggal (0...255), DEFW menentukan dua bait berturut-turut (0...65535), dan DEFM menentukan kumpulan bait berturut-turut - mesej teks, jadual nombor dan sebagainya.

Dalam contoh kami sebelum ini, jika kami ingin menyimpan beberapa nombor dua bait di alamat 60016 dan 60017, baris 80 perlu ditulis seperti ini:

80 60016 DEFW 5C92H

90 60018

Katakan anda ingin menyimpan perkataan "Spectrum" bermula dari alamat 60135.

Kod untuk huruf "S" Kod untuk huruf "p" "e" "c" "t" "r"

"u" "m"

60135

60136

60137

60138

60139

60140

60141

60142

53H 7 0H 65H 63H 7 4H 72H 75H 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

anda boleh menentukannya dalam pasangan bait:

Tetapi lebih mudah dan betul untuk menetapkannya sebagai mesej:

60135 DEFM 5370656374 ; "Spect"

60140 DEFM 72756D ; "rum"

makan kes khas apabila pengaturcaraan dalam ASSEMBLY, apabila teks program juga perlu dimasukkan melalui DEFB atau DEFM. Ini berlaku apabila anda menulis program untuk kalkulator terbina dalam. Lagipun, program pemasangan boleh menterjemah mnemonik ASSEMBLY ke dalam kod mesin, tetapi ia tidak tahu apa-apa tentang kod kalkulator dan tidak mengetahui mnemoniknya. Kod kalkulator ialah perkara dalaman "Sinclair", tafsirannya

Atur cara yang terletak dalam ROM diproses dan kod kalkulator tiada kaitan dengan pemproses dan arahannya. Oleh itu, anda hanya boleh memasukkan perintah kalkulator ke dalam atur cara pemasangan sebagai jujukan bait bebas, iaitu, melalui DEFB atau DEFM.

Dalam bahagian pertama buku, kami menggunakan tatatanda mnemonik untuk arahan kalkulator, seperti add, stk_data s_lt, dsb., dan menulisnya dengan huruf kecil, berbeza dengan arahan pemproses. Tetapi kami telah melakukan ini sebelum ini dan akan terus melakukannya hanya demi pemahaman dan kemudahan rakaman. Program ASSEMBLY tidak mengetahui mnemonik seperti itu; mereka tidak ada dalam kamusnya.

Oleh itu, dengan bantuan DEFB, DEFW dan DEFM, mereka menetapkan nilai awal pembolehubah program, memasukkan jadual, mesej dan sebarang jujukan data lain ke dalam program, walaupun

grafik, serta urutan kod yang program pemasangan tidak faham sebagai arahan ASSEMBLY.

3.5. Arahan ORG, TAMAT.

Kita hanya perlu mempertimbangkan dua arahan yang paling remeh. Arahan ORG mengisytiharkan alamat dari mana program akan dipasang. Ia mestilah arahan pertama dalam kod sumber, walaupun pada dasarnya mungkin terdapat ulasan sebelum itu.

Anda perasan bahawa dalam contoh di atas kami menulis lajur alamat di sebelah kiri di mana arahan tertentu akan diletakkan. Jadi, ini tidak perlu dilakukan semasa pengaturcaraan dalam ASSEMBLY. Ia cukup untuk memberi arahan pada awal-awal lagi

10 ORG 63000

dan kemudian program pemasangan itu sendiri akan mengira di mana sel memori ini atau arahan itu akan ditempatkan. Ini sangat memudahkan proses pengaturcaraan. Dan jika anda membuat perubahan pada teks siap, ASSEMBLER itu sendiri akan membetulkan semua alamat.

Arahan TAMAT menandakan tamatnya sesuatu program. Sekiranya terdapat perkara lain selepas itu, ADUN akan mengabaikannya semasa penyusunan.

Mungkin itu sahaja yang patut diketahui tentang arahan ASSEMBLY untuk bermula. Ini bukan semua arahan yang mungkin anda temui dalam kehidupan, dan peraturan penggunaannya berbeza untuk ADUN yang berbeza, tetapi pada umumnya minimum ini akan memenuhi 90 peratus keperluan maklumat anda, dan anda harus mendapatkan selebihnya daripada arahan untuk ASSEMBLEER yang anda bekerjasama .

Apabila menulis atur cara dalam bahasa Himpunan, arahan digunakan yang menunjukkan kepada pengkompil lokasi program dalam ingatan, mentakrifkan makro, memulakan ingatan, dsb. Senarai arahan dan penerangannya diberikan dalam Jadual. 1.8. Semua arahan bermula dengan titik. Mari kita senaraikan secara ringkas fungsi yang dilakukan oleh arahan dalam setiap segmen.

Segmen program dibuka dengan arahan .CSEG. Jika program bermula dengan segmen ini, arahan itu mungkin tiada. Dalam segmen program, anda boleh menggunakan arahan .ORG untuk menunjukkan permulaan segmen.

Arahan .DB dalam segmen mentakrifkan satu bait atau kumpulan bait pemalar yang ditulis ke memori Flash. Arahan .DW mentakrifkan perkataan atau kumpulan perkataan yang ditulis ke ingatan sebagai pemalar. Permulaan pemalar rakaman ditentukan oleh label sebelum arahan yang sepadan. Pemalar terhitung dipisahkan dengan koma.

Arahan .DEF memberikan nama simbolik kepada daftar. Arahan .EQU, .SET memberikan nilai kepada nama. Nama yang diberikan nilai oleh arahan .EQU tidak boleh ditetapkan semula dan nilai tidak boleh ditukar. Nama yang diberikan oleh arahan .SET boleh ditukar oleh arahan .SET yang lain.

Arahan .DEVICE menentukan jenis pengawal mikro sasaran yang akan digunakan untuk melaksanakan program. Kehadiran arahan ini membolehkan cara memantau arahan program berhubung dengan peranti fizikal, memberi amaran tentang kemustahilan melaksanakan arahan tertentu, saiz memori yang digunakan, dsb.

Arahan .INCLUDE dengan nama fail digunakan untuk memasukkan fail lain dalam teks program.

Jadual 1.8. Senarai arahan

Arahan

Penerangan

Simpan bait dalam RAM

Segmen program

Tentukan bait - pemalar dalam memori Flash atau

Berikan nama simbolik kepada daftar

Menentukan peranti yang hendak disusun

program

Segmen data

Mentakrifkan perkataan dalam memori Flash atau EEPROM

Tamat makro

Tetapkan ekspresi malar

segmen EEPROM

Keluar fail

Lampirkan fail lain

Dayakan penjanaan penyenaraian

Dayakan pengembangan makro dalam penyenaraian

Permulaan makro

Matikan penjanaan penyenaraian

Tetapkan kedudukan dalam segmen

Tetapkan pembolehubah kepada ungkapan yang setara

Arahan .MACRO dan .ENDMACRO merangka definisi makro. Definisi makro boleh mempunyai sehingga 10 parameter dengan nama tetap@0,…,@9. Apabila memanggil definisi makro, parameter ditentukan sebagai senarai dalam susunan berangka.

Segmen data bermula dengan arahan .DSEG. Arahan .ORG dan .BYTE boleh digunakan dalam segmen. Arahan.BYTE menentukan bilangan bait yang akan diakses semasa pelaksanaan program. Kawasan rizab bermula pada alamat yang ditentukan oleh label sebelum arahan.

Segmen jenis EEPROM bermula dengan arahan .ESEG. Arahan .ORG, .DB, .DW boleh digunakan dalam segmen. Arahan .DB dalam segmen menentukan satu atau sekumpulan bait untuk ditulis kepada EEPROM. Arahan.DW mentakrifkan perkataan atau kumpulan perkataan yang ditulis ke memori EEPROM dalam pasangan 2 bait. Permulaan bait rakaman dan perkataan ditentukan oleh label sebelum arahan yang sepadan.

Arahan .LIST, .NOLIST, .LISTMAC digunakan untuk mengawal output penyenaraian.

Arahan ialah arahan kawalan pengkompil. Pengisytiharan setiap daripada mereka mesti dimulakan dengan tempoh. Amalan menunjukkan bahawa dalam mana-mana pemasang hanya kira-kira 10...20 arahan yang paling intensif digunakan. Semua yang lain adalah sama ada pilihan atau bertanggungjawab untuk mengawal sifat pengkompil kecil sahaja. Arahan "asas", yang juga tipikal untuk pemasang pemproses lain, termasuk arahan .equ, .org, .def, .сseg, .dseg, dsb. Nah, arahan seperti .dq, .exit, .listmac in program sebenar benar-benar sangat jarang berlaku. Di bawah ialah senarai, penerangan dan contoh penggunaan arahan daripada pemasang proprietari mikropengawal AVR.

Pengganti arahan .termasuk fail teks ke tempat dalam program di mana ia digunakan. Di samping itu, fail penggantian itu sendiri juga mungkin mengandungi arahan .include. Jika fail itu terletak dalam direktori projek atau dalam salah satu folder perkhidmatan, maka bukannya laluan penuh, ia dibenarkan untuk menunjukkan hanya pautan kepada namanya.

Arahan.termasuk
Sintaks penulisan:
.include "(laluan fail)"
Contoh penggunaan:

Sertakan "m8def.inc" ;masukkan fail pengepala standard

Arahan .exit memberitahu penghimpun tempat fail berakhir teks sumber. Semua pernyataan selepas arahan menjadi tidak kelihatan kepada pengkompil. Jika .exit berlaku dalam fail yang disertakan, maka binaan projek berakhir dengan baris di mana arahan .include berada. Jika tiada arahan .keluar, titik akhir binaan dipertimbangkan baris terakhir teks sumber.

Arahan.keluar
Sintaks penulisan:
.keluar
Contoh penggunaan:

Keluar ;akhir fail

Arahan .nolist dan .list mengawal fail penyenaraian, yang biasanya dijana selepas projek dibina. Yang pertama daripada mereka melarang, dan yang lain, dengan sewajarnya, membenarkan output maklumat ke fail. Arahan .list mengatasi tindakan .nolist dan sebaliknya.

Directives.nolist, .list
Sintaks penulisan:
.nolist, .list
Contoh penggunaan:

Nolist ;melarang output teks fail “m8def.inc” .masukkan "m8def.inc" ;ke dalam fail penyenaraian program.list ;teruskan output maklumat

Arahan .equ memberikan nilai angka kepada nama simbolik. Nama simbolik mestilah unik dan tidak boleh ditukar semasa program sedang ditulis. Arahan tidak boleh digunakan untuk memberikan nama simbolik kepada daftar tujuan am.

Directive.equ
Sintaks penulisan:
.equ (nama simbolik) = (ungkapan)
Contoh penggunaan:

Equ DDRB = 0x17 ;tetapkan nama DDRB kepada 0x17 .equ PORTB = DDRB + 1 ;tetapkan nama PORTB kepada 0x18

Arahan .set mempunyai kesan yang sama seperti .equ. Tetapi tidak seperti yang terakhir, nama simbolik boleh ditakrifkan semula di mana-mana dalam program.

Directive.set
Sintaks penulisan:
.set (nama simbolik) = (ungkapan)
Contoh penggunaan:

Set OFFSET = 0x100 ;memberi nama nilai OFFSET 0x100 . .set OFFSET = OFFSET + 1 ;tolak nilai OFFSET

Arahan .def memberikan nama simbolik kepada salah satu daftar tujuan umum. Dalam perjalanan program selanjutnya nama diberi boleh ditindih oleh arahan .undef.

Arahan .def, .undef
Sintaks penulisan:
.def (nama simbolik) = (huruf besar)
.undef (nama simbolik)
Contoh penggunaan:

Def temp = R16 ;menyerahkan daftar R16 nama temp .undef temp ;batalkan penggunaan selanjutnya bagi nama temp

Arahan .db, .dw, .dd, .dq bertujuan untuk menyimpan memori mikropengawal untuk data yang dimulakan. Kesemuanya hanya boleh digunakan dalam kod dan segmen memori EEPROM. Perbezaan antara arahan ini ialah kedalaman bit data yang diwakili. Arahan .db rizab bait, .dw rizab perkataan, .dd rizab kata ganda. Dalam kes yang jarang berlaku, ia juga mungkin mudah untuk menggunakan arahan .dq, yang menyimpan data 64-bit.

Directives.db, .dw, .dd, .dq
Sintaks penulisan:
(label): .db (data 8-bit)
(label): .dw (data 16-bit)
(label): .dd (data 32-bit)
(label): .dq (data 64-bit)
Contoh penggunaan:

Label: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 .dd 0xFADEEFCA, 42089184378, -DEQEBA 18 077149609196178927, -521103510453211

Arahan .byte menyimpan memori untuk data yang tidak dimulakan dalam segmen SRAM dan EEPROM.

Arahan.bait
Sintaks penulisan:
(label): .byte (jumlah data untuk ditempah)
Contoh penggunaan:

Equ PAGESIZE = 0x20 buffer: . byte 2*PAGESIZE ;simpan 64 bait dalam SRAM

Arahan .dseg, .eseg, .cseg mentakrifkan permulaan data, EEPROM dan segmen kod, masing-masing. DALAM fail sumber setiap segmen boleh diwakili dalam satu salinan sahaja. Jika semua arahan ini tiada dalam atur cara, pengkompil secara lalai menganggap bahawa semua pernyataan terletak dalam bahagian kod.

Arahan .dseg, .eseg, .cseg
Sintaks penulisan:
.dseg
.eseg
.cseg
Contoh penggunaan:

Dseg ;permulaan penimbal segmen data: . bait 32 ;menempah 32 bait untuk penimbal dalam SRAM .cseg ;permulaan segmen kod rjmp awal. rentetan: .db "ATmega8",0 ;rentetan disimpan dalam memori FLASH.eseg ;permulaan segmen memori EEPROM _var: .bait 2 ;menetapkan 2 bait untuk pembolehubah _var _cnst: .db 0xAA ;menetapkan bait untuk pembolehubah _cnst = 0xAA

Arahan The.org membolehkan anda menetapkan alamat permulaan pengkompil dalam segmen kod, data dan EEPROM. Apabila digunakan dalam segmen kod, arahan menentukan alamat lokasi perkataan program 16-bit.

Directive.org
Sintaks penulisan:
.org (alamat permulaan)
Contoh penggunaan:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;permulaan segmen data.org SRAM_START ;menempah 32 bait dalam SRAM untuk penimbal, penimbal: . bait 32 ;bermula pada alamat 0x60 .cseg ;permulaan segmen kod.org 0 ;set semula vektor pada alamat 0 rjmp awal. .org 0x50 ;mulakan program utama di alamat 0x50 awal: ldi temp,high(RAMEND) ;stack initialization out SPH,temp ldi temp,low(RAMEND) out SPL,temp .

Arahan .macro, .endmacro (.endm) mentakrifkan permulaan dan akhir makro, masing-masing.

Directives.macro, .endmacro (.endm)
Sintaks penulisan:
.makro (nama makro)
Contoh penggunaan:

Set_bit makro ;pengisytiharan makro untuk menetapkan bit port sbi @0,@1 ;set bit @1 daftar port @0 sbi @0-1,@1 ;konfigurasi baris @1 daftar DDRx .endm untuk output . set_bit PORTB,0 ;setkan port B logik 1 pada baris 0

Arahan .listmac membenarkan paparan lanjutan teks makro dalam fail penyenaraian. Dalam kes ini, kandungan setiap definisi makro yang ditemui dalam program dipaparkan secara keseluruhannya. Jika arahan tidak digunakan, maka kod di dalam makro tidak diberikan.

Directive.listmac
Sintaks penulisan:
.listmac
Contoh penggunaan:

Listmac ; benarkan mengembangkan teks makro dalam fail penyenaraian

Arahan .message, .warning, .error bertujuan untuk menjadi output kepada tetingkap binaan projek maklumat tambahan tentang kemajuan penyusunan program. Arahan .message menjana mesej untuk talian di mana panggilannya ditemui. Menggunakan .warning menghasilkan amaran dan .error menghasilkan mesej ralat. Dalam kes kedua, pembinaan projek berhenti.

Arahan .mesej, .amaran, .ralat
Sintaks penulisan:
.message "(mesej teks)"
.warning "(teks amaran)"
.error "(teks mesej ralat)"
Contoh penggunaan:

Mesej "Makros telah dipanggil di sini." .amaran "Kekerapan terlalu tinggi!" .error "Hujah makro yang salah!"

Sekumpulan arahan kompilasi bersyarat.ifdef, .ifndef, .if, .else, elif, .endif digunakan untuk sisipan kod program bergantung kepada pelbagai syarat. Arahan .ifdef menyemak kehadiran pengisytiharan nama simbolik. Arahan boleh diikuti dengan satu set arahan yang akan dimasukkan ke dalam teks jika keadaan ujian adalah "benar" (nama telah diisytiharkan). Arahan .ifndef adalah bertentangan dengan .ifdef, yang menyemak ketiadaan perisytiharan nama simbolik. Arahan .if melakukan penggantian kod apabila syarat perbandingan yang dinyatakan sebagai parameternya dipenuhi. Perintah yang mesti dilaksanakan jika keadaan arahan .if adalah "palsu" terletak selepas arahan .else. Bercabang seperti "jika" - "maka" boleh mempunyai beberapa peringkat sarang berkat arahan .elif. Setiap blok semak bermula dengan .ifdef, .ifndef, .if mesti ditutup dengan arahan .endif.

Arahan jika, .ifdef, .ifndef, .else, elif, .endif
Sintaks penulisan:
.ifdef (watak) (atau .ifndef (watak))
.jika (syarat)
.else (ungkapan) (atau .elif (keadaan))
.endif
Contoh penggunaan:

Macro del_ms ;makro yang menjana kelewatan masa dalam ms.ifndef FREQ ;jika pemalar FREQ (frekuensi dalam Hz) tidak diisytiharkan, .warning "Undefined FREQ constan!" ;keluarkan amaran dan.equ FREQ = 1000000 ;tetapkan nilai lalai kepada 1 MHz.endif .equ DELAY = (@0*FREQ)/4000 ;nilai tetapan kelewatan masa.jika DELAY > 65535 ;jika DELAY lebih besar daripada 2 bait , kemudian. ralat "Limpahan integer dalam DELAY!" ;pelaksanaan makro tidak mungkin.selain itu tolak XL ;simpan daftar yang berfungsi XL, XH tolak XH ldi XH,tinggi(KELEWATAN) ;kitaran kelewatan masa ldi XL,rendah(KELEWATAN) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;pulihkan daftar kerja XH, XL daripada tindanan .endif .endm . .equ FREQ = 2000000 ;ad kekerapan jam 2 MHz. del_ms 25 ;pembentukan kelewatan masa 25 ms

Pemasang MASM, TASM dan WASM berbeza antara satu sama lain. Walau bagaimanapun, mencipta program mudah untuk mereka hampir tidak mempunyai perbezaan, kecuali pemasangan dan menghubungkan dirinya sendiri.

Jadi program pertama kami untuk MASM, TASM dan WASM yang menghasilkan surat Inggeris"A" pada kedudukan kursor semasa, iaitu, di sebelah kiri bucu atas skrin:

Model kecil .kod ORG 100j mula: MOV AH,2 MOV DL,41j INT 21j INT 20j END mula Teks ini boleh ditaip dalam mana-mana bahasa mudah penyunting teks- contohnya, dalam NotePad daripada WINDOWS (tetapi bukan dalam Word atau yang lain "canggih"). Walau bagaimanapun, saya mengesyorkan editor teks "lanjutan" dengan penyerlahan sintaks, seperti PSPad (lihat bahagian). Kemudian kami menyimpan fail ini dengan sambungan .asm, sebagai contoh, dalam folder MYPROG. Mari kita panggil fail atest. Jadi, kami mendapat: C:\MYPROG\atest.asm.

CATATAN
Sila ambil perhatian bahawa dalam arahan pertama kami menulis 2 dan bukannya 02h. MASM, TASM dan WASM, seperti Emu8086, membenarkan "kebebasan" sedemikian. Walaupun anda boleh menulis 02h - tidak akan ada ralat.

Penerangan untuk program:

.model kecik– baris pertama. Arahan .model mentakrifkan model memori untuk jenis fail tertentu. Dalam kes kami, ini ialah fail dengan sambungan COM, jadi kami memilih model kecil, yang menggabungkan kod, data dan segmen tindanan. Model kecil direka untuk mencipta fail jenis COM.

.kod– baris ke-2. Arahan ini memulakan segmen kod.

ORG 100j– baris ke-3. Perintah ini menetapkan pembilang program kepada 100j kerana apabila memuatkan fail COM ke dalam memori, DOS memperuntukkan 256 bait pertama kepada blok data PSP ( nombor perpuluhan 256 adalah sama dengan 100h perenambelasan). Kod program terletak hanya selepas blok ini. Semua program yang disusun ke dalam fail jenis COM mesti bermula dengan arahan ini.

mula: MOV AH, 02h– baris ke-4. Label mula diletakkan sebelum arahan pertama dalam program dan akan digunakan dalam arahan END untuk menunjukkan arahan yang mana program bermula. Arahan MOV meletakkan nilai operan kedua ke dalam operan pertama. Iaitu, nilai 02h diletakkan dalam daftar AN. Mengapa ini dilakukan? 02h ialah fungsi DOS yang memaparkan watak pada skrin. Kami sedang menulis program untuk DOS, jadi kami menggunakan arahan ini sistem operasi(OS). Dan kami menulis fungsi ini (atau lebih tepat nombornya) dalam daftar AH, kerana interrupt 21h menggunakan daftar ini.

MOV DL, 41j– baris ke-5. Kod aksara "A" dimasukkan ke dalam daftar DL. Kod ASCII untuk aksara "A" ialah 41j.

INT 21j– baris ke-6. Ini adalah gangguan yang sama 21j - arahan yang menyebabkan fungsi sistem DOS yang dinyatakan dalam daftar AN (dalam contoh kami ini ialah fungsi 02h). Perintah INT 21h ialah cara utama interaksi antara program dan OS.

INT 20j– baris ke-7. Ini ialah gangguan yang memberitahu sistem pengendalian untuk keluar dari program dan memindahkan kawalan ke aplikasi konsol. Jika program telah disusun dan dilancarkan daripada OS, arahan INT 20h akan mengembalikan kita kepada OS (contohnya, kepada DOS).

TAMAT permulaan– baris ke-8. Arahan END menamatkan program sambil menunjukkan pada titik mana pelaksanaannya harus bermula.