Bir assembler proqramında modullar arası əlaqənin yaradılması
Çox böyük həcmli mətn proqramını bir neçə fayla (modula) bölüb, onu emal etmək daha əlverişlidir. Məsələn, əvvəlki paraqrafdakı proqramı bir neçə prosedura bölüb ayrı-ayrı fayllarda saxlamaq olar. Bunun üçün string_enter prosedurunu ENTERS.ASM adlı, conv prosedurunu SNUMBER.ASM adlı, convert prosedurunu NUMBERS.ASM adlı fayllarda və main prosedurunu isə əsas faylda saxlayaq. Sonra bu prosedurları əsas proqrama çağırmaq üçün INCLUDE direktivindən istifadə etməklə modullar arasında əlaqə yaratmaq olar. Onda əsas proqram mətnini aşağıdakı kimi tərtib etmək mümkündür:
MASM MODEL SMALL .STACK 256 .DATA string DB 7 DUP (?) string1 DB 6 DUP (?) str_len DW 0 result DW 0 mes1 DB "ədədi daxil et: $" mes2 DB 0Ah,0Dh DB "səhv ədəd (modula görə)" DB " 32767-dən kiçik olmalıdır!" DB 0Ah,0Dh,'$' mes3 DB 0Ah,0Dh,”səhv:daşma!', 0Ah,0Dh,'$' mes4 DB 0Ah,0Dh,"daxil edilən ədəd, 10 vahid azaldılır: ",'$' .CODE INCLUDE C:\ASS\ENTERS.ASM ;string_enter proseduru INCLUDE C:\ASS\SNUMBER.ASM ; conv proseduru INCLUDE C:\ASS\NUMBERS.ASM ;convert proseduru ;ƏSAS PROSEDUR main PROC MOV AX,@DATA MOV DS,AX LEA DX,mes1 MOV AH,9 INT 21h LEA BX,string1 CALL string_enter LEA BX,string1 MOV CX,str_len CALL convert MOV AX,result SUB AX,10 JNO fox LEA DX,mes3 MOV AH,9 INT 21h JMP exit fox: LEA BX,string CALL conv MOV AH,9 LEA DX,mes4 INT 21h LEA DX,string INT 21h exit: MOV AH,4Ch INT 21h main ENDP END main
W1.ASM və W2.ASM kimi iki moduldan ibarət olan daha bir proqrama baxaq. Bu proqram sistem taymerin göstərişini (saat: dəqiqə: saniyə) ekranın sıfırıncı sətrin 50 –ci möqeyindən ekrana çıxarır.
W1.asm faylının mətni:
CODE SEGMENT EXTRN kurpos:FAR ; FAR atributunu mütləq ; əlavə etmək ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX proc_timer PROC CALL kurpos ; və ya CALL FAR PTR kurpos MOV AH,2Ch ;sistem vaxtını göstərmək INT 21h MOV AX,0 MOV AL,CH ; saatı AL qeyd etmək LEA BX,timer CALL bin_ascii MOV AH,2Ch ;sistem vaxtını göstərmək INT 21h MOV AX,0 MOV AL,CL ; dəqiqəni AL qeyd etmək LEA BX,timer+3 CALL bin_ascii MOV AH,2Ch ; sistem vaxtını göstərmək INT 21h MOV AX,0 MOV AL,DH ; saniyəni AL qeyd etmək LEA BX,timer+6 CALL bin_ascii LEA DX,timer MOV AH,9 INT 21h MOV AH,4Ch INT 21h RET proc_timer ENDP bin_ascii PROC PUSH DX PUSH SI PUSH AX MOV CX,2 full_buff: MOV BYTE PTR[BX],' ' INC BX LOOP full_buff MOV SI,10 clr_dvd:SUB DX,DX DIV SI ADD DL,'0' DEC BX MOV [BX],DL OR AX,AX JNZ clr_dvd POP AX POP SI POP DX RET bin_ascii ENDP code ENDS data SEGMENT PUBLIC timer DB 2 DUP (?),':',2 DUP (?),':' DB 2 DUP (?), '$' data ENDS END W2.asm faylının mətni: ; kursoru lazımı yerə çıxaran prosedur CODE SEGMENT ; PUBLIC əlavə etmək olar PUBLIC kurpos ASSUME CS:CODE kurpos PROC FAR ; FAR məcburi atributdur MOV DH,0 ; sıfırıncı sətr MOV DL,50 ; əllinci sütün MOV AH,2 ; kursoru ekranın lazımı yerində ;qeyd etmək INT 10h RET kurpos ENDP code ENDS END
Bu iki modulu bir icra moduluna yığmaq üçün aşağıdakı mərhələr ardıcıllığını icra etmək lazımdır:
1) W1.ASM modunu translyasiya edərək W1.OBJ obyekt modulunu almaq;
2) W2.ASM modunu translyasiya edərək W2.OBJ obyekt modulunu almaq;
3) TLINK utilitinin löməyi ilə əmrlər sətrini:
TLINK /v W1.OBJ+W2.OBJ kimi verərək birləşdirə bilərik.
Nəticədə W1.EXE modulu yaranacaq.
Seqmentləmənin sadələşmiş direktivlərindən istifadə edərək W1.ASM modulunu W3.ASM modulu ilə, W2.ASM modulunu isə W4.ASM modulu ilə əvəz edək.
-qayıtma zamanı BX registrində çeviriləcək çıxış sətrinin ünvanı, CX registrində isə sətrlərin uzunluğu olur.
-başqa registrlər isə qiymətini saxlanır.
W3.asm faylının mətni: MASM MODEL SMALL .STACK 256 .DATA timer DB 2 DUP (?),':',2 DUP (?),':' DB 2 DUP (?), '$' .CODE EXTRN kurpos:FAR MOV AX,@DATA MOV DS,AX proc_timer PROC CALL FAR PTR kurpos ; və ya CALL kurpos MOV AH,2Ch INT 21h ...;fraqment sonra dəyişməz qalır MOV AH,4Ch INT 21h RET proc_timer ENDP bin_ascii PROC ...;fraqment sonra dəyişməz qalır RET bin_ascii ENDP END W4.asm faylının mətni: MASM MODEL SMALL .CODE PUBLIC kurpos kurpos PROC FAR; FAR məcburi atribut ;əks halda, prosedurdan, stekdən qayıtdıqda yalnız IP ;qiyməti oxunacaq MOV DH,0 MOV DL,50 MOV AH,2 INT 10h RET kurpos ENDP END