• 1.2 - rasm. Dasturni Assembler tilidagi dastur yaratish bosqichlari Dasturlarni tuzish va otladkasi
  • NAZORAT SAVOLLARI
  • ASSEMBLER TILIDA DASTUR ISHLAB CHIQISH




    Download 62,48 Kb.
    bet3/3
    Sana16.05.2024
    Hajmi62,48 Kb.
    #238591
    1   2   3
    Bog'liq
    14-amaliy mashg`ulot

    ASSEMBLER TILIDA DASTUR ISHLAB CHIQISH.

    Assembler tilida dasturlarni ishlab chiqish yuqori darajadagi tillardagi yozish dasturlaridan farq qiladi, chunki xotira va registrlarning mazmunini kuzatishda ko'p e'tibor va tartiblilikni talab etiladi. Shu bilan birga, dasturni ishlab chiqishning keyingi bosqichlarini kuzatish kerak:
    • vazifani belgilash va dasturni tuzish;
    • har qanday matn muharriri yordamida dasturning matni bilan fayl yaratish;
    • Assemblerdan foydalanib dasturni tarjima qilish, xatolar aniqlanganda - ularni matn muharririda to'g'rilab, yana tarjima qilish;
    • assemblerning natijasini dasturchi modul yordamida bajariladigan modulga aylantirish;
    • ijro etuvchi dasturni ishga tushirish;
    • natijalarni tekshirish. Hech narsa topilmasa, xatoni tuzatuvchidan foydalanib, xato topishingiz kerak.
    Assembler kodlari bilan yozilgan dasturga manba dasturi deyiladi va uning aylantirilgan shakli mikroprotsessor buyruqlar qatoriga ob'ekt yoki dastur moduli kiradi. Yig’uvchi fayl yoki bajariladigan modul yaratishga imkon beradi. Otladchik - ekranda kerakli o'zgaruvchilar qadriyatlarini ko'rishga, dasturni bosqichma-bosqich bajarishda, barcha registrlarni va xotiralarining holatini olishni, dasturga o'zgartirishlar kiritishni, to’xtash nuqtalarini belgilashni va yana ko'p narsalarni beradigan dasturdir.
    Ushbu ma’ruzada Assembler tilida dasturlarni yaratish uchun Borland Int. firmasidan olingan dasturiy mahsulot Turbo Assembler. Turbo Assembler kompilyatori TASM.EXE faylida joylashgan yig’uvchi dastur bo'lib, TLINK.EXE faylida joylashgan. Otladchik tuzuvchisi TD.EXE faylida joylashgan. Assembler tili dasturini kompilyatsiya qilish va ishlash jarayoni quyidagicha.





    1.2 - rasm. Dasturni Assembler tilidagi dastur yaratish bosqichlari


    Dasturlarni tuzish va otladkasi
    Kompilyatsiya bilan ishlashga qulay bo'lishi uchun, mos variantlar bilan kompilyatsiyalovchi va kompilyatsiyani chaqirish o'z ichiga olgan ommaviy ish faylini yaratishingiz mumkin. Bu quyidagicha amalga oshirilishi mumkin.
    Matn tahririyatida kengaytmasi bilan matnli fayl yaratish (Uzoq menedjerda). Buni chaqirish, masalan, .bat. Quyidagi satrlarni yozing (tuzish va tuzishchi C: \ ASM katalogida joylashgan):
    @ echo off
    C: \ ASM \ tasm / zi% 1.asm,% 1.obj,% 1.lst
    C: \ ASM \ tlink / v% 1.obj
    Ikkinchi satrda kompilyatsiya buyruq satrida ko'rsatiladigan manba dasturiga ega fayl uchun kerakli variantlar bilan chaqiriladi. Uchinchi yo'nalish, birlashtiruvchini exe fayli yaratish uchun chaqiradi. Buyruqlar satriga dasturni kompilyatsiya qilish uchun .bat Myprog yozing (agar manba dasturi Myprog.asm faylida saqlansa)
    Tarjimadan so'ng kengaytmali .lst, .map, .exe fayllari joriy katalogda paydo bo'ladi. .Lst kengaytmasi bo'lgan faylda xatolar haqida ma'lumot mavjud. Dasturdagi xatolar ro'yxatidagi faylga qarashga ishonch hosil qiling, keyin ularni to'g'rilashingiz va dasturni qayta tarqatishingiz kerak. Hech qanday xato topilmasa, yaratilgan exe faylini bajarish uchun ishlatishingiz mumkin.
    Xatolarni tuzatish uchun Turbo tuzatuvchidan foydalanishingiz mumkin. Buyruqning satriga C: \ASM \ td Myprog.exe yozing. Sizga qulaylik uchun bu chaqirishni ommaviy ish fayli sifatida tashkil qilishingiz mumkin. Ushbu buyruqni bajarganingizdan so'ng disk raskadrovka qilinadi.
    Registratsiya tarkibini Veiw\CPU komandasi bilan tanishtiring. Dasturni bosqichma-bosqich bajarish - F8. Chiqaruvchilarni o'chirish - ALT-X.
    Assembler tili «Hello world» dasturida
    .386
    .model flat, stdcall
    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib
    .data
    msg_title db "Title", 0
    msg_message db "Hello world", 0
    .code
    start:
    invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK
    invoke ExitProcess, 0
    end start
    Assembler tilida ikkita sonni qo’shish
    .486
    .model flat, stdcall
    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib

    include /masm32/macros/macros.asm


    uselib masm32, comctl32, ws2_32

    .data

    .code
    start:
    mov eax, 123
    mov ebx, -90
    add eax, ebx
    test eax, eax
    jz zero
    invoke MessageBox, 0, chr$("В eax не 0!"), chr$("Info"), 0
    jmp lexit
    zero:
    invoke MessageBox, 0, chr$("В eax 0!"), chr$("Info"), 0
    lexit:
    invoke ExitProcess, 0

    end start


    Bu erda biz ularni (jz, jmp, test) foydalanib, belgilar va maxsus buyruqlardan foydalanamiz. Biz batafsilroq tahlil qilamiz:


    • test - baytlar, so'zlar yoki juft so'zlar shaklida o'zgaruvchan (operandlar) mantiqiy taqqoslash uchun ishlatiladi. Taqqoslash uchun, buyruq mantiqiy ko'payishdan foydalanadi va bitlarga qaraydi: 1 ga teng bo'lsa, unda natijalar biti 1 ga teng bo'ladi, aks holda - 0. Agar biz 0 qabul qilinsak, bayroqlar ZF (nol bayroq) Keyin natijalar ZF asosida tahlil qilinadi.
    • jnz - agar ZF bayrog'i biron joyda o'rnatilmagan bo'lsa, bu yorliqqa o'tish amalga oshiriladi. Ko'pincha bu buyruqlar dasturda ZF natijasiga ta'sir ko'rsatadigan taqqoslash operatsiyalari mavjud bo'lsa qo'llaniladi. Ular faqat sinov va cmp.
    • jz - ZF bayrog'i hali o'rnatilmagan bo'lsa, sanasi bilan o'tish amalga oshiriladi.
    • jmp - ZF yoki yo'qligidan qat'i nazar, bu tegga o'tish amalga oshiriladi.
    Assemblerdagi raqamlarning umumiy summasi
    Ikkita o'zgaruvchini qo’shish jarayonini ko'rsatadigan dastur:
    .486
    .model flat, stdcall
    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib

    include /masm32/macros/macros.asm


    uselib masm32, comctl32, ws2_32
    .data
    msg_title db "Title", 0
    A DB 1h
    B DB 2h
    buffer db 128 dup(?)
    format db "%d",0
    .code
    start:
    MOV AL, A
    ADD AL, B
    invoke wsprintf, addr buffer, addr format, eax
    invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK

    invoke ExitProcess, 0


    end start


    .486
    .model flat, stdcall


    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib

    include /masm32/macros/macros.asm


    uselib masm32, comctl32, ws2_32
    .data
    .code
    start:
    call GetCommandLine ; результат будет помещен в eax
    push 0
    push chr$("Command Line")
    push eax ; текст для вывода берем из eax
    push 0
    call MessageBox
    push 0
    call ExitProcess

    end start


    .486
    .model flat, stdcall


    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib

    include /masm32/macros/macros.asm


    uselib masm32, comctl32, ws2_32

    .data
    .code


    start:
    call GetCommandLine ; результат будет помещен в eax
    invoke GetCommandLine
    invoke MessageBox, 0, eax, chr$("Command Line"), 0
    invoke ExitProcess, 0
    push 0
    call ExitProcess

    end start


    Assembler sikl dasturi:


    .data
    msg_title db "Title", 0
    A DB 1h
    buffer db 128 dup(?)
    format db "%d",0
    .code
    start:

    mov AL, A


    .REPEAT
    inc AL

    .UNTIL AL==7


    invoke wsprintf, addr buffer, addr format, AL


    invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK
    invoke ExitProcess, 0

    end start


    .data

    msg_title db "Title", 0


    buffer db 128 dup(?)
    format db "%d",0
    .code
    start:

    mov eax, 1


    mov edx, 1

    .WHILE edx==1


    inc eax
    .IF eax==7
    .BREAK
    .ENDIF
    .ENDW
    invoke wsprintf, addr buffer, addr format, eax
    invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK
    invoke ExitProcess, 0
    Assemblerda massiv elementlarini qo’shish

    .486
    .model flat, stdcall


    option casemap: none
    include /masm32/include/windows.inc
    include /masm32/include/user32.inc
    include /masm32/include/kernel32.inc
    includelib /masm32/lib/user32.lib
    includelib /masm32/lib/kernel32.lib

    include /masm32/macros/macros.asm


    uselib masm32, comctl32, ws2_32

    .data
    msg_title db "Title", 0


    A DB 1h
    x dd 0,1,2,3,4,5,6,7,8,9,10,11
    n dd 12

    buffer db 128 dup(?)


    format db "%d",0

    .code
    start:


    mov eax, 0
    mov ecx, n
    mov ebx, 0
    L: add eax, x[ebx]
    add ebx, type x
    dec ecx
    cmp ecx, 0
    jne L
    invoke wsprintf, addr buffer, addr format, eax
    invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK
    invoke ExitProcess, 0

    end start




    NAZORAT SAVOLLARI



    1. Dasturlashtirish tili tasnifi?

    2. Assembler tilida dastur ishlab chiqishning ketma-ketligi.

    3. Assembler tilida ikkita sonni qo’shish.

    4. Assemblerda massiv elementlarini qo’shish.

    5. Assembler sikl dasturlari.

    Download 62,48 Kb.
    1   2   3




    Download 62,48 Kb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    ASSEMBLER TILIDA DASTUR ISHLAB CHIQISH

    Download 62,48 Kb.