V bob Assembler tilida dasturlash


Download 0.51 Mb.
Pdf ko'rish
bet5/5
Sana22.04.2023
Hajmi0.51 Mb.
#1382060
1   2   3   4   5
Bog'liq
10-amaliy

Mantiqiy amallar

| : Bitma-bit mantiqiy qo'shish amali. Assemblerdagi OR buyrug'i bilan ishlash 
tartibi bir xil.
51



^ : Bitma-bit mantiqiy istisnoli qo'shish amali. Assemblerdagi XOR buyrug'i bilan 
ishlash tartibi bir xil.

& : Bitma-bit mantiqiy ko'paytirish amali. Assemblerdagi AND buyrug'i bilan ishlash 
tartibi bir xil.

<< va >> : Bitlarni siljitish amali. Assemblerdagi SHL va SHR buyruqlari bilan mos 
ravishda ishlash tartiblari bir xil.

Arifmetik amallar

+ va ­ : Oddiy qo'shish va ayirish amallari.

*, /, //, % va %% : Ko'paytirish va bo'lish amallari. Bu yerda * ko'paytirish, / 
va // mos ravishda ishorasiz va ishorali sonlarni bo'lish, % va %% esa mos ravishda 
ishorasiz va ishorali sonlarni bo'lishdan qoladigan qoldig'ini topish amallari.

Bir qiymatli amallar

­, ~ va ! : Bu amallar faqat bitta o'zgarmasga ta'sir qilib, eng birinchi bo'lib 
bajariladi. ­ manfiy qiymatga aylantiradi, ~ qiymatning birlamchi to'ldiruvchisini

hisoblaydi va ! mantiqiy inkor. Mantiqiy inkorda agar qiymat noldan farqli bo'lsa, 
natija nolga teng va aksincha, agar qiymat nolga teng bo'lsa natija birga teng.
Ko'rib chiqilgan bitlar ustida amalga oshiriladigan mantiqiy va siljitish amallari «Mantiqiy 
amallar va bitlarni siljitish buyruqlari» bobida keng yoritilgan. Ammo u yerdagi assembler 
buyruqlari bilan ifodalarda qatnashadigan mazkur amallarni chalkashtirmaslik kerak. Ular ma'no 
jihatdan bir xil bo'lsada, ifodalardagi mantiqiy va arifmetik amallarning mashina tiliga 
o'giriladigan assembler buyruqlariga hech qanday aloqasi yo'q! Misollar:
a
db
100 + 4*10
;; a = 140
b
db
210/4 ­ 2
;; b = 50
c
dw
­100 + !100
;; c = ­100
d
dd
~1111_0000b
;; d = 0000_1111b
k
dq
­0x7A // ­0xE
;; k = 0x8
Ifodalarda kasr sonli o'zgarmaslar qatnashishi mumkin emas. Chunki NASM kasr sonlarni 
hisoblay olmaydi. Shuning uchun ham ifodalarda bo'linma yaxlitlab olinadi. Masalan, 
210/4=52.5 emas, balki 50 ga teng.
mov
eax , 0000_0001b << 2
;; EAX 0000_0100b, x<
y
mov
eax , 0000_0100b >> 2
;; EAX 0000_0001b, x>>y = x // 2

y
mov
al , 110b | 101b
;; AL 111b

mov
al , 110b & 101b
;; AL 100b

mov
al , 110b ^ 101b
;; AL 011b

Ifodalarda qatnashishi mumkin bo'lgan yana bir maxsus belgi mavjud: $. Bu belgi o'zi 
ishlatilayotgan dastur qatorining boshlanish offset manzilini beradi.
Ba'zida dastur davomida o'zgarmas qiymatlarni o'zimiz uchun belgilab olishimiz juda foydali 
bo'ladi. Bunday imkoniyatni bizga EQU direktivasi beradi:
belgilash_nomi equ ifoda
Masalan:
equ 25
1
«Ishorali va ishorasiz butun sonlar» mavzusiga qarang.
52


Shu yozuvdan so'ng dasturda uzunlik bu 25 sonini anglatuvchi kattalik bo'ladi. Bu yerda 
hech qanday xotiradan joy ajratilmaydi. Faqat dasturning barcha uzunlik uchraydigan joylari 
assembler tomonidan 25 soniga almashtirib chiqiladi. O'zgaruvchilarni e'lon qilishdan farqli 
o'laroq o'zgarmas kattaliklarni bu usulda aniqlash dasturning istalgan bo'limida amalga oshirilishi 
mumkin. 
Assembler tilida ko'pincha qatorli qiymatlar bilan ishlaganda ularning uzunligini eslab qolish 
talab etiladi. Shuning uchun qatorli o'zgaruvchilarni e'lon qilganda, ularning uzunligini o'zgarmas 
sifatida tezda belgilab qo'ygan ma'qul.
qator
db
"Salom",0
qator_uzunligi equ
$­qator
qator nishonida 'S' belgisining manzili saqlanilayotganini va $ keyin qator boshlanish 
manzilini berishini hisobga olsak, $­qator ifodasi qator uchun ajratilgan baytlar sonini beradi, 
ya'ni 6. O'zgarmaslarni bu kabi belgilab qo'yish juda ham qulay bo'lib, agar qator 
o'zgaruvchining boshlang'ich qiymatini keyinchalik o'zgartirgan taqdiringizda ham 
qator_uzunligi to'g'ri uzunlikni ko'rsatib turadi. 
Yana bir foydali direktivalardan biri TIMES direktivasidir. Bu direktiva o'zidan keyin keladigan 
buyruqlarni berilgan son marta takror bajarilishini ta'minlaydi. Masalan:
chiziq
times
25
resb 1
chiziq o'zgaruvchisi uchun 25 marta bir baytdan joy ajratib chiqiladi. Bu ishni, albatta, 
quyidagicha ham amalga oshirish mumkin:
chiziq
resb
25
Bu ikki usul o'rtasida to'g'ri ishlash nuqtai nazaridan hech qanday farq yo'q. Ammo TIMES 
bilan bo'lgan holat kompilyator tomonidan 25 marta sekinroq yig'iladi. Bu direktiva ishni 
sekinlashtirsada, uning ham kerakli tomonlari bor. Masalan, 25 bayt ajaratish bilan birga har bir 
baytga 1 sonini boshlang'ich qiymat sifatida berish kerak bo'lsa, TIMES asqatadi:
chiziq
times
25
db
1
TIMES ga takrorlanishlar soni ifoda orqali ham berilishi mumkin. Masalan, xotiradan 100 bayt 
joy ajratib, u yerga "Hammaga salom" qatorini boshlang'ich qiymat sifatida yozish va qolgan 
baytlarni nol bilan to'ldirish kerak bo'lsin. Ko'rinib turibdiki, nol o'zlashtirilishi kerak bo'lgan 
baytlar soni 100−ga teng, bu yerda  "Hammaga salom" qatori uzunligiga teng, ya'ni 13.
Demak:
chiziq
db
"Hammaga salom"
times
100­($­chiziq) db
0
Birinchi qatorda chiziq o'zgaruvchisi uchun 13 bayt ajratilib, u yerga berilgan "Hammaga 
salom" qiymati yozilishi tushunarli bo'lsa kerak. Ikkinchi qatorda esa ajratilgan baytlar ketidan 
yana 100­($­chiziq) marta bir baytdan joy ajratilib, u yerga 0 yoziladi. Bizning holatimizda 
100­($­chiziq) ifodasi 87 ga teng.
Eslatma
: Ifodalarda qavslar ham ishlatilishi mumkin.
53

Download 0.51 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling