mov DH - Tizimli dasturlash

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