Assembler proqramlaşdırma dili

Bir assembler proqramında modullar arası əlaqənin yaradılması

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