Tizimli dasturlash




Download 183,36 Kb.
bet25/64
Sana13.05.2024
Hajmi183,36 Kb.
#230077
1   ...   21   22   23   24   25   26   27   28   ...   64
Bog'liq
Системное программирование, практика

mov dx, ofset xabari

;DS:DX - manzil chiziqlar


mov ah, 9

; ANdagi DOS funksiya raqami


int 21 soat

; tezkor xabarni ko'rsatish1


mov dx, ofset buferi

;DS:DX - manzil chiziqlar


mov ah, 0Ah

; ANdagi DOS funksiya raqami


int 21 soat

; buferga belgilar qatorini o'qing


mov dx, ofset crlf

;DS:DX - manzil chiziqlar


mov ah, 9

; ANdagi DOS funksiya raqami


int 21 soat

; qator tarjimasi

; ASCII formatidagi sonni buferdan ikkilik raqamga AX da o'zgartirish




xor di, di

; DI = 0 - buferdagi bayt raqami


xor bolta, bolta

; AX = 0 - joriy natija qiymati


mov cl, uzunlik





xor ch,ch

; aniq registr ch


xor bx, bx

; registrni tiklash bx


mov si, cx

; SI - bufer uzunligi


mov cl, 10

; CL = 10, MUL uchun multiplikator


asc2hex:

; blok boshlash belgisi asc2hex:


mov bl,bayt ptr bcontents[di]





subbl,'0'

; raqam = raqamli kod - belgilar kodi "0",


jb asc_error

; agar belgi kodi "0" kodidan kichik bo'lsa,


cmp bl.9

; yoki "9" dan ortiq


va asc_error

; xato xabari bilan dasturdan chiqing,


mul cx

; aks holda: joriy natijani 10 ga ko'paytiring,


ax, bx qo'shing

; unga yangi raqam qo'shing,


inc di

; hisoblagichni oshirish


cmp di,si

; agar hisoblagich+1 belgilar sonidan kam bo'lsa -


jb asc2hex

; Davom etish (hisoblagich 0 dan boshlanadi)

; satr xabarini ko'rsatish2


boltani surish

; konvertatsiya natijasini saqlang


mov ah, 9

; ANdagi DOS funksiya raqami


mov dx, ofset xabari2

;DS:DX - manzil chiziqlar


int 21 soat

; tezkor xabarni ko'rsatish2


pop bolta

; to'plamdan hisoblash

; AX registridagi raqamni ko'rsatish




boltani surish

; stack uchun suring


xchg ah, al

; yuqori baytni AL ga qo'ying


print_al ga qo'ng'iroq qiling

; uni ekranda ko'rsatish


pop bolta

; past baytni AL ga tiklang


print_al ga qo'ng'iroq qiling

; uni ekranda ko'rsatish


ret

; COM faylini to'ldirish


asc_error:

; asc_error blokining boshlanishi :


mov dx, ofset err_msg

;DS:DX - manzil chiziqlar


mov ah, 9

; ANdagi DOS funksiya raqami


int 21 soat

; xato xabarini ko'rsatish


ret

;dasturni tugatish

; Protsedura print_al
; AL registridagi raqamni o'n oltilik formatda ko'rsatadi, AX va DX registrlarining qiymatlarini o'zgartiradi


print_al:

; print_al blokining boshlanish belgisi :


mov dh,al

; al registrining qiymatini dh ga kiriting


va dh,0Fh

; DH - kamida muhim 4 bit


shr al,4

; AL - katta


print_nibble ga qo'ng'iroq qiling

; eng muhim raqamni chop eting


mov al,dh

; endi AL kamida muhim 4 bitni o'z ichiga oladi


print_nibble:

; 4 bitli (on oltilik raqamli) chiqish protsedurasi


cmp al,10

; raqamni AL ga aylantiruvchi uchta buyruq


sbb al,69h

; mos keladigan ASCII kodiga


das

; (DAS buyrug'ining tavsifiga qarang)


mov dl,al

; DL-dagi belgilar kodi


mov ah, 2

; ANdagi DOS funksiya raqami


int 21 soat

; belgilar chiqishi


ret

; Bu RET ikki marta ishlaydi - bir marta yuqori raqamda chaqirilgan print_nibble tartibidan qaytish uchun va ikkinchi marta print_al dan qaytish uchun


messagel db "O'nlik: $"

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


message2 db "O'n oltilik raqam: $"

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


err_msg db "Kirish xatosi"

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


crlf db 0Dh,0Ah, '$'

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


Bufer db 6

; maksimal kirish buferi hajmi


uzunligi db?

; o'qishdan keyin bufer hajmi


b tarkibi:

; buferning mazmuni COM fayli tugaganidan keyin joylashgan


tugatish boshlanishi

; dastur kodini tugatish belgisi

0Ah funktsiyasi ma'lumotlarni kiritish uchun qulay, ammo cheklangan usulni taqdim etadi. Ko'pincha, belgilarni ekranda ko'rsatishni, dasturning funktsiyaga javobini va boshqaruv tugmachalarini va boshqalarni boshqarishga imkon beruvchi belgilarni belgilar kiritish funktsiyalaridan foydalaniladi.
funktsiyasi 01h - aks-sado bilan STDIN dan belgilarni o'qing, kuting va Ctrl-Break-ni tekshiring

Kiritish:

AN = 01 soat

Xulosa:

AL = ASCII belgilar kodi yoki 0. Agar AL = 0 bo'lsa, ushbu funktsiyaga ikkinchi qo'ng'iroq AL- dagi kengaytirilgan ASCII belgilar kodini qaytaradi.

Ushbu funktsiyadan foydalangan holda o'qilganda, kiritilgan belgi avtomatik ravishda ekranda darhol ko'rsatiladi (STDOUT qurilmasiga yuboriladi - shuning uchun uni faylga yo'naltirish mumkin). Ctrl-C yoki Ctrl-Break tugmalarini bosish INT 23h buyrug'ini bajaradi . Agar biron bir belgiga mos kelmaydigan tugma bosilsa (strelkalar, Ins, Del funktsional tugmalari va boshqalar), u holda 0 AL ga qaytariladi va kengaytirilgan ASCII kodini olish uchun funksiya yana bir marta chaqirilishi kerak (1-ilovaga qarang). ).
Ushbu funktsiyaning keyingi uchta versiyasida belgilar kodi xuddi shu printsipdan foydalangan holda AL ga qaytariladi.
funktsiyasi 08h - STDIN dan aks-sadosiz belgilarni o'qing, kuting va Ctrl-Break-ni tekshiring

Kiritish:

AN = 08 soat

Xulosa:

AL = belgilar kodi

DOS funktsiyasi 07h - STDIN dan aks-sadosiz, kutish va Ctrl-Break-ni tekshirmasdan belgilarni o'qish

Kiritish:

AN = 07 soat

Xulosa:

AL = belgilar kodi

funktsiyasi 06h - STDIN-dan belgini aks-sadosiz, kutmasdan va Ctrl-Break-ni tekshirmasdan o'qing

Kiritish:

AN = 07 soat
DL = 0FFh

Xulosa:

Agar hech qanday tugma bosilmasa ZF = 1 va AL = 00
Agar tugma bosilsa, ZF = 0. Bu holda AL = belgilar kodi

Klaviatura bilan ishlash uchun DOS yordamchi dasturlari.
Klaviatura bilan ishlash uchun sanab o'tilgan funksiyalardan tashqari ba'zi DOS yordamchi dasturlari ham qo'llaniladi.
DOS funktsiyasi 0Bh - Klaviatura holatini tekshiring

Kiritish:

AN = 0Bh

Xulosa:

Hech qanday tugma bosilmasa, AL = 0
Agar tugma bosilsa AL = 0FFh

Klaviatura bosilishini kutmaslik uchun bu funksiyadan 01, 07 va 08 funksiyalaridan oldin foydalanish qulay. Bundan tashqari, ushbu funktsiyani chaqirish klaviaturadan belgini o'qimasdan, Ctrl-Break tugmalar birikmasi bosilganligini tekshirish imkonini beradi; agar bu sodir bo'lsa, uzilish 23 soat bajariladi.
DOS funksiyasi 0Ch - Buferni tozalash va belgini o'qish

Kiritish:

AN = 0Ch
AL = DOS funksiya raqami (01, 06, 07, 08, 0Ah)

Xulosa:

Chaqirilgan funktsiyaga bog'liq

0Ch funksiyasi klaviatura buferini tozalaydi, shunda keyingi belgilarni o'qish funktsiyasi hali qayta ishlanmagan, avval bosilgan belgidan foydalanish o'rniga klaviatura kiritishni kutadi. Masalan, bu "Foydalanuvchi diskni formatlashni xohlayotganiga ishonchi komilmi?" Degan savolga javobni o'qish uchun ishlatiladigan funksiya.
Echosiz belgi-belgi funksiyalari dasturni interaktiv boshqarish uchun ishlatilishi mumkin.


.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



Download 183,36 Kb.
1   ...   21   22   23   24   25   26   27   28   ...   64




Download 183,36 Kb.