mov dx, ofset xabari - Tizimli dasturlash

|
Tizimli dasturlash
|
bet | 25/64 | Sana | 13.05.2024 | Hajmi | 183,36 Kb. | | #230077 |
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
|
|
|
|
| |