|
Tizimli dasturlash
|
bet | 27/64 | Sana | 13.05.2024 | Hajmi | 183,36 Kb. | | #230077 |
Bog'liq Системное программирование, практикаJamoa
|
Maqsad
|
Markaziy protsessor
|
LOOP yorlig‘i
|
Tsikllarni tashkil qilish
|
8086
| 8-jadval - Assembler tilida siklik o'tishni ( cx registridagi hisoblagich bilan ) tashkil qilishning eng oddiy misoli :
|
.model kichkina
|
; kod, ma'lumotlar va stek segmentlari birlashtirilgan xotira modeli.
|
|
.kod
|
; ma'lumotlarni o'z ichiga olgan kod segmenti.
|
|
org 100h
|
; COM faylining boshlanishi
|
|
boshlanishi:
|
; dastur kodini boshlash belgisi
|
|
mov cx, 10
|
; takrorlash sonini (hisoblagich registriga) CX ga yuklang (hisoblash 10 dan 0 gacha bo'ladi)
|
|
Yorliq1:
|
; yorliq yaratish (Yorliq).
|
|
mov ah, 9
|
; AN registriga DOS funksiyasining “chiqish liniyasi (9)” raqamini joylashtiramiz.
|
|
mov dx, ofset String
|
DX registriga ma'lumotlar segmentining boshlanishiga nisbatan String yorlig'ining ofsetini joylashtiradi
|
|
int 21 soat
|
; DOS funktsiyasi "chiziq chiqishi"
|
|
Loop Label1
|
; sikl bayonoti CX ni bittaga kamaytiradi va agar u nolga teng bo'lmasa, Label1 ga o'tadi (6-qator)
|
|
ret
|
; DOS funktsiyasi "dasturni tugatish"
|
|
string db ' privet $'
|
; chiqish ma'lumotlarini o'z ichiga olgan c qator.
|
|
oxiri boshlanadi
|
; dastur kodini tugatish belgisi
|
(5) qatorda biz takrorlash sonini CX ga yuklaymiz (ortga hisoblash 10 dan 0 gacha bo'ladi). (6) qatorda biz yorliq (Label) yaratamiz. Keyingi (7)-(9) qatorlar) biz xabarni ko'rsatamiz. Va (10) qatorda sikl bayonoti CX ni bittaga kamaytiradi va agar u nolga teng bo'lmasa, Label1 ga o'tadi (6-qator). Shu tarzda chiziq o'n marta chop etiladi. Dastur (11) qatorga o'tganda CX registri nolga teng bo'ladi.
JMP buyrug'i yordamida tsiklni tashkil qilish ( Ikkinchi usul ).
jmp buyrug'i boshqaruvni o'sha yoki boshqa dastur segmentidagi belgilangan nuqtaga o'tkazadi. Qaytish manzili saqlanmaydi. Buyruq protsessor bayroqlariga ta'sir qilmaydi.
jmp buyrug'ining beshta varianti mavjud:
- to'g'ridan-to'g'ri o'tish qisqa (-128... + 127 bayt ichida);
- to'g'ridan-to'g'ri yaqin o'tish (joriy dastur segmenti ichida);
- to'g'ridan-to'g'ri uzoq masofaga o'tish (dasturning boshqa segmentiga);
- bilvosita yaqin o'tish;
- bilvosita uzoq masofaga o'tish.
O'tishning barcha turlari bir xil jmp mnemonikaga ega , garchi ular turli xil opkodlarga ega. Ko'p hollarda tarjimon kontekstga qarab o'tish turini aniqlashi mumkin bo'lgan hollarda, atribut operatorlaridan foydalanish kerak ( short - to'g'ridan-to'g'ri qisqa o'tish; near ptr - to'g'ridan-to'g'ri yaqin o'tish; far ptr - to'g'ridan-to'g'ri uzoq o'tish ; ptr so'zi - bilvosita yaqin o'tish dword ptr - bilvosita uzoq masofaga o'tish);
Jamoa
|
Maqsad
|
Markaziy protsessor
|
JMP yorlig'i
|
Shartsiz sakrash
|
8086
|
1.
|
.model kichkina
|
;kod, ma'lumotlar va stek segmentlari birlashtirilgan xotira modeli.
|
|
.kod
|
;ma'lumotlarni o'z ichiga olgan kod segmenti.
|
|
org 100h
|
; COM faylining boshlanishi
|
|
boshlanishi:
|
;dastur kodining bosh belgisi
|
|
label1:
|
;yorliq yaratish
|
|
mov ah, 9
|
;DOS funksiya raqamini “chiqish liniyasi (9)” AN registriga joylashtiring .
|
|
mov dx, ofset String
|
DX registriga ma'lumotlar segmentining boshlanishiga nisbatan String yorlig'ining ofsetini joylashtiradi
|
|
int 21 soat
|
DOS funktsiyasi "chiziq chiqishi"
|
|
jmp Yorliq 1
|
; Yorliq 1 bilan qatorga o'ting
|
|
qo'shish cx .12
|
cx qiymatiga 12 raqamini qo'shing
(bu buyruq bajarilmaydi)
|
|
dek cx
|
cx registrining qiymatini 1 ga kamaytiring
(bu buyruq bajarilmaydi)
|
|
ret
|
DOS funktsiyasi "dasturni tugatish"
|
|
string db "PRIVET",13,10,'$'
|
; chiqish ma'lumotlarini o'z ichiga olgan c qator.
|
|
oxiri boshlanadi
|
; dastur kodini tugatish belgisi
|
Dasturning bajarilishi natijasida (6) - (10) qatorlar bloki halqalanadi ( PRIVET liniyasining chiqishi ko'p marta) (10)-(11) qatorlar.
DEC va JNZ buyruqlari yordamida tsiklni tashkil qilish ( Uchinchi usul ).
Loop operatoriga qaraganda tezroq ishlaydigan tsikllarni yaratishingiz mumkin . DEC va JNZ jamoalarining birgalikdagi ishi CX registrining mazmunini 1 ga kamaytiradi va agar CX nolga teng bo'lmasa, yorliqga o'tadi .
DEC buyrug'i , shuningdek, bayroq registridagi nol bayrog'ini 0 yoki 1 ga o'rnatadi. Keyin JNZ ko'rsatmasi bu sozlamani tekshiradi.
JMP va LOOP ko'rsatmalariga o'xshab , JNZ yo'riqnomasidagi operand JNZ yo'riqnomasining oxiri va buyruq ko'rsatgichiga qo'shiladigan o'tish manzili ( Label 1 ) orasidagi masofa qiymatini o'z ichiga oladi. Bu masofa -128 va +127 bayt orasida bo'lishi kerak.
Quyidagi misol №1.1 misol bilan bir xil ishlaydi, faqat tezroq.
1.
|
.model kichkina
|
; kod, ma'lumotlar va stek segmentlari birlashtirilgan xotira modeli.
|
|
.kod
|
; ma'lumotlarni o'z ichiga olgan kod segmenti.
|
|
org 100h
|
; COM faylining boshlanishi
|
|
boshlanishi:
|
; dastur kodini boshlash belgisi
|
|
mov cx, 10
|
; takrorlash sonini (hisoblagich registriga) CX ga yuklang (hisoblash 10 dan 0 gacha bo'ladi)
|
|
Yorliq1:
|
; yorliq yaratish (Yorliq).
|
|
mov ah, 9
|
; AN registriga DOS funktsiyasining "chiqish chizig'i (9)" raqamini joylashtiramiz .
|
|
mov dx, ofset String
|
DX registriga ma'lumotlar segmentining boshlanishiga nisbatan String yorlig'ining ofsetini joylashtiradi
|
|
int 21 soat
|
; DOS funktsiyasi "chiziq chiqishi"
|
|
dec cx
|
; DEC operatori CX ni bittaga kamaytiradi va agar u nolga teng bo'lmasa, Label1 ga o'tadi
|
|
jnz Label1
|
; shartli Yorliq 1 bilan qatorga o'ting
|
|
ret
|
; DOS funktsiyasi "dasturni tugatish"
|
|
string db 'priver ',13,10, '$'
|
; chiqish ma'lumotlarini o'z ichiga olgan c qator
|
|
oxiri boshlanadi
|
; dastur kodini tugatish belgisi
|
Amalga oshirish tartibi
Ekranda barcha ASCII belgilarni ko'rsatadigan dastur yozamiz (har bir satrda 16 belgidan iborat 16 qator).
1.
|
.model kichkina
|
; kod, ma'lumotlar va stek segmentlari birlashtirilgan xotira modeli.
|
|
.kod
|
; ma'lumotlarni o'z ichiga olgan kod segmenti.
|
|
org 100h
|
; COM faylining boshlanishi
|
|
boshlanishi:
|
; dastur kodini boshlash belgisi
|
|
mov cx, 256
|
; hisoblagich qiymatini o'rnating (256 belgi)
|
|
mov dl,0
|
; birinchi belgi 00 kodi bilan
|
|
mov ah, 2
|
; DOS funktsiyasi raqami "belgi chiqishi"
|
|
yopilish: int 21 soat
|
; DOS qo'ng'irog'i
|
|
inc dl
|
; DLni 1 ga oshiring - keyingi belgi
|
|
test dl,0Fh
|
; agar DL 16 ga karrali bo'lmasa
|
|
jnz continue_loop;
|
;davom etish tsikl ,
|
|
dx-ni bosing
|
; boshqa: joriy belgini saqlang
|
|
mov dl,0Dh
|
; chiqish CR
|
|
int 21 soat
|
; DOS qo'ng'irog'i
|
|
mov dl,0Ah
|
; chiqish LF
|
|
int 21 soat
|
; DOS qo'ng'irog'i
|
|
pop dx
|
; joriy belgini tiklash
|
|
continue_loop:
|
; yorliq
|
|
|
|
| |