• mov cx, 10 ; takrorlash sonini (hisoblagich registriga) CX ga yuklang
  • mov dx, ofset String DX
  • Loop Label1 ; sikl
  • string db privet $ ;
  • CX ni bittaga kamaytiradi
  • string db "PRIVET",13,10,$ ;
  • PRIVET liniyasining chiqishi
  • JNZ korsatmasi
  • mov ah, 9 ; AN
  • dec cx ; DEC
  • string db priver ,13,10, $ ;
  • Tizimli dasturlash




    Download 183,36 Kb.
    bet27/64
    Sana13.05.2024
    Hajmi183,36 Kb.
    #230077
    1   ...   23   24   25   26   27   28   29   30   ...   64
    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



    Download 183,36 Kb.
    1   ...   23   24   25   26   27   28   29   30   ...   64




    Download 183,36 Kb.