• DH registrida joylashgan
  • AL ga yozing
  • Jadval JB 0123456789ABCDEF ;
  • Muammoni hal qilish algoritmi: Qiymatini chiqarish kerak bolgan bayt DH registrida joylashgan deb
  • Muammo dastur toplami yordamida hal qilinadi. Qolgan qismini PUSH operatori
  • POP operatori PUSH operatori
  • Tizimli dasturlash




    Download 183,36 Kb.
    bet60/64
    Sana13.05.2024
    Hajmi183,36 Kb.
    #230077
    1   ...   56   57   58   59   60   61   62   63   64
    Bog'liq
    Системное программирование, практика

    mov DH , <55>

    ; dh registriga kiring - har qanday ASCII belgilar kodini


    mov AH,2

    ; AN registriga DOS funktsiyasining "chiqish chizig'i (2)" raqamini joylashtiramiz .


    mov CX,8

    ;loop o'zgaruvchisini ishga tushirish


    @1: mov DL,'0'

    ;DLga '0' belgilar kodini kiriting


    shl DH, 1

    ;1 bitga siljitish


    jnc@2

    ; "0" bo'lsa, o'tish


    inc DL

    ;biz '1' belgisining kodi '0' belgisining kodidan bitta katta ekanligidan foydalanamiz


    @2: int 21 soat

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv;


    LOOP @1

    ; @1 yorlig'iga o'ting


    int 21 soat

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv;


    oxiri boshlanadi

    ; dastur kodini tugatish belgisi

    Eslatma: tavsiflangan tahlil usulida asl raqamning qiymati yo'qoladi. Aks holda, ROL buyrug'i ishlatilishi kerak , lekin har bir bayt uchun 8 marta.
    Bayt qiymatini o'n oltilik yozuvda chop etish
    Muammoni hal qilish algoritmi:
    Faraz qilaylik, qiymati chiqishi kerak bo'lgan bayt DH registrida joylashgan va "0123456789ABCDEF" belgilar jadvali mavjud. Bayt ikkita o'n oltilik raqamdan iborat. Buni hisobga olsak, muammoni shunday hal qilish mumkin: ushbu jadvaldan ikkita belgini ko'rsatish kerak. Birinchidan - raqamning eng muhim nibblesiga teng raqamga ega bo'lgan belgi, keyin esa eng kam ahamiyatli nibblega teng raqam bilan.
    Muammoni hal qilish uchun siz ikkita kichik muammoni hal qilishingiz kerak:
    Kerakli raqam bilan belgini AL ga yozing . Keling, registrning bilvosita manzillash rejimidan ofset bilan foydalanaylik . Buning uchun har bir nibble qiymati BX ga yozilishi kerak ;
    BX ga nibble qiymatini yozing .
    Muammoni hal qilishning eng oddiy usuli.
    22-jadval - 2.1-misol


    .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 dh, 10

    ; ro'yxatga olish dh 10 raqami


    mov bl, dh

    ; ro'yxatga olish bl 10 raqami


    xor bh, bh

    ; Kirishni tiklash


    va bl, 0F0h

    dh ni 0 f 0 h ga mantiqiy (bit bo'yicha) ko'paytirishni bajaring .


    shr bl, 4

    ; o'ngga 4 bitga siljiting


    mov al, jadval[bx]

    ; al registriga kiring ma'lumotlar qatorining qiymati


    int 29h

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv


    mov bl, dh

    ; ro'yxatga olish bl dh registr qiymati


    va bl, 0Fh

    dh ni 0 fh ga mantiqiy (bit bo‘yicha) ko‘paytirishni bajaring .


    mov al, jadval[bx]

    ; al registriga kiring ma'lumotlar qatorining qiymati


    int 29h

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv;


    mov al, 13

    ; al registriga kiring 13 raqami


    int 29h

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv;


    mov al, 10

    ; al registriga kiring 10 raqami


    int 29h

    ; DOS qo'ng'irog'ini uzish - belgili chaqiruv


    ret

    ; DOS funktsiyasi "dasturni tugatish"


    Jadval JB '0123456789ABCDEF'

    ; chiqish ma'lumotlarini o'z ichiga olgan c qator.


    oxiri boshlanadi

    ; dastur kodini tugatish belgisi

    Bayt qiymatini kasrli yozuvda ko'rsatish
    Muammoni hal qilish algoritmi:
    Qiymatini chiqarish kerak bo'lgan bayt DH registrida joylashgan deb faraz qilamiz . Biroq, endi biz ekranda raqam belgisini ko'rsatishning boshqa usulidan foydalanishimiz mumkin: biz raqamlarni bildiruvchi belgilarning kodlari ulardan 30 soat farq qilishidan foydalanamiz . Ammo bu erda muammo boshqacha: qancha raqamni ko'rsatish kerakligi oldindan ma'lum emas, bitta yoki uchta. Bayt 0 dan 255 gacha qiymatga ega bo'lishi mumkin. Yana bir muammo bor. Muayyan sanoq sistemasida pozitsion belgilar tizimidan foydalangan holda raqam yozishda quyidagi amallarni bajaring: sonni tizim asosiga bo‘lishdan qolgan qoldiqlarni hisoblang va yozing. Bu bo'linish qismi nolga teng bo'lguncha bajariladi. Keyin qoldiqlar qabul qilingan teskari tartibda yoziladi.
    Misol:
    raqam = 251.
    10 ga bo'linadi. 25 qism, qolgan "1". 10 ga bo'linadi. 2-qism, qolgan "5" 10 ga bo'linadi. 0 ga, qolgan "2". "2", "5", "1" ni ko'rsatishingiz kerak.
    Muammo dastur to'plami yordamida hal qilinadi. Qolgan qismini PUSH operatori yordamida dastur stekiga suramiz . Shu bilan birga, biz stackga qo'yilgan qoldiqlar sonini hisoblaymiz . Hisoblagich - CX . Keyin biz undan siklni tashkil qilish uchun foydalanamiz, unda qolgan qismini POP operatori yordamida stekdan chiqaramiz . Stack shunday tashkil etilganki, POP operatori PUSH operatori tomonidan u yerga surilgan oxirgi so'zni chiqaradi . E'tibor bering, PUSH operatori so'zni (WORD) yoki qo'sh so'zni (DWORD) stekga suradi. POP operatori ham xuddi shunday ishlaydi.

    Download 183,36 Kb.
    1   ...   56   57   58   59   60   61   62   63   64




    Download 183,36 Kb.