V bob Assembler tilida dasturlash
Download 0.51 Mb. Pdf ko'rish
|
10-amaliy
- Bu sahifa navigatsiya:
- Arifmetik amallar
- Bir qiymatli amallar
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 1 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−k ga teng, bu yerda k "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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling