Assembler
BilgiPedi sitesinden
[değiştir] Assembler
Düşük seviyeli bir programlama dilidir (konuşma dilinden uzaklaştıkça seviye düşer, yaklaştıkça artar). Makina dilinden sonra ortaya çıkmıştır. Temelde makina diline getirilen İngilizce kelimelerle yapılan kısaltmalarla (mnemonic) oluşmuştur.
Derleyici (İng: Compiler) ile makina diline derlenen bir dildir. Derleyicisin adı "Assembler" dir. Donanım programlamada kullanılır. Makina diline yakınlığı bakımından yazılan kodlar son derece hızlı şekilde derlenir ve bu dilde yazılan programlar orta ve yüksek seviyeli programlama dillerine göre çok daha hızlı çalışır. Ancak anlaşılmasının güçlüğü ve kodlamanın çok uzun olması nedeniyle kullanımı zor bir dildir. Örneğin C dili ile yazılan 8-10 satırlık kodun makinaya verdiği mesajı bu dilde ancak 80-90 satır kod ile verilebilir.
Assembler, çalışma mantığı olarak işlemci ile yüz yüze konuşmak gibidir. Her yapılması istenen olay işlemciye teker teker anlatılır. Bu biraz zahmetli ve karışık bir süreç gerektirir, buna karşın gereksiz rutinler otomatik eklenmediği için işlemciden en uygun verimle faydalanılabilir.
Örneğin, özellikle kontrol edilmezse hiçbir zaman sıfıra bölme hatası otomatik engellemez. Delphi ve Basic gibi yüksek seviyeli diller bunu engeller ve kontrollü şekilde düzenler. Bu ve benzeri hatalar yüksek seviyeli dillerde kendiliğinden giderildiğinden Assembler daha yalın ve profesyonel bir dildir.
Her ne kadar her kod bilgisayar koduna zaten bir şekilde dönüştürülse de, dönüşümdeki kaybı engellemek için bazı durumlarda Assembler kodları yazılır. Örneğin işletim sistemlerinin çekirdekleri assembler ile yazılarak güçlü bir temel elde edinilmesini amaçlar.
Bu düşünce tarzıyla en ideal programlama dilleri, kendi kodlama sistemi içerisindeki bilgiyi en uygun çeviri ile Assemblere uygulayabilen dillerdir. Bu sınıflandırmaya göre en zor ve en alt dil grubu olan Assembler'i sırasıyla; B, C, Pascal (Delphi) ve Basic izler.
[değiştir] Örnek Program
En büyük ortak böleni hesaplayan Assembler programı
TITLE: GreatestCommonDivisor<GCD> (GCD.asm)
;------------------------------------------------------------
; Filename: GCD.asm
; Description: My fifth assembly program. A test program that
; will call the PROC findGCD, passing in the integer
; values input by the user and then it will diplay
; the results to the screen.
; From Assembly Language For Intel-Based Computers,
; 4th Ed. by Kip R. Irvine. Problem #6 on pg. 257.
;------------------------------------------------------------
INCLUDE Irvine32.inc
.data
int1 sdword ?
int2 sdword ?
caseTable byte '1' ;lookup value
dword enterInt ;address of lookup value
entrySize = ($ - caseTable )
byte '2'
dword endTest
numberOfEntries = 2
msgIntro byte "This is Your Name's fifth assembly program. A test program that",0dh,0ah
byte "will call the PROC findGCD, passing in the integer values input by",0dh,0ah
byte "the user and then it will display the results to the screen.",0dh,0ah,0
msgSelMn byte "---------------------------------",0dh,0ah
byte "Select 1 to Run Prog or 2 to Quit ",0dh,0ah
byte "---------------------------------",0dh,0ah
byte "Enter Selection: ",0
msgInt1 byte "Enter first integer: ",0
msgInt2 byte "Enter second integer: ",0
msgAns byte "Greatest common divisor is: ",0
msgEnd byte "GoodBye",0dh,0ah,0
.code
main PROC
;///////Intro Message/////////////////////////////////
mov edx,OFFSET msgIntro ;intro message into edx
call WriteString ;display msgIntro
call Crlf ;endl
call WaitMsg ;pause message
call Clrscr ;clear screen
call Menu ;menu procedure
ExitProg::exit ;global label to exit
main ENDP
;------------------------------------------------
Menu PROC
;
; Receives: Nothing
; Returns: Nothing
;------------------------------------------------
mov edx,OFFSET msgSelMn ;ask user for input
call WriteString ;display msgSelMn
call ReadChar ;read one character
call Clrscr
mov ebx,OFFSET caseTable;point EBX to the table
mov ecx,numberOfEntries ;loop counter
L1:
cmp al,[ebx] ;match found?
jne L2 ;no: continue
call NEAR PTR [ebx + 1] ;yes: call the procedure
call WriteString ;display message
call Crlf ;endl
call Clrscr ;clear screen
jmp L3 ;exit the search
L2:
add ebx,5 ;point to the next entry
loop L1 ;repeat until ECX = 0
L3:
jmp Menu ;run Menu again
Menu ENDP
;------------------------------------------------
enterInt PROC
;
; Finds the GCD
; Receives: EAX = 1, EBX = 1
; Returns: EAX = GCD
;------------------------------------------------
push edx
mov edx,OFFSET msgInt1 ;ask user for input
call WriteString ;display msgInt1
call ReadInt ;read integer
mov int1,eax
mov edx,OFFSET msgInt2 ;ask user for input
call WriteString ;display msgInt2
call ReadInt ;read integer
mov int2,eax
mov eax,int1
mov ebx,int2
call findGCD
mov edx,OFFSET msgAns
call WriteString
call WriteDec
call Crlf
call WaitMsg
pop edx
enterInt ENDP
;------------------------------------------------
findGCD PROC
;
; Finds the GCD
; Receives: EAX = 1, EBX = 1
; Returns: EAX = GCD
;------------------------------------------------
push ebx
push edx
or eax,eax ;explicitly set sign flag
.IF SIGN? ;in the event of a neg int
neg eax
.ENDIF
or ebx,ebx
.IF SIGN?
neg ebx
.ENDIF
L1:
mov edx,0
div ebx ;divide int1 by int2
cmp edx,0 ;does remainder = 0 ?
je L2 ;yes: quit
mov eax,ebx ;no: prepare for
mov ebx,edx ;next iteration
jmp L1
L2:
mov eax,ebx ;EAX = GCD
pop edx
pop ebx
ret
findGCD ENDP
;------------------------------------------------
endTest PROC
;
; Receives: Nothing
; Returns: EDX = offset of message
; Sets CF = 1 to signal end of program
;------------------------------------------------
mov edx,OFFSET msgEnd ;msgEnd into edx
call WriteString ;display message
call Crlf ;endl
stc ;CF = 1
jc ExitProg ;if CF=1 then jump to Global ExitProg
endTest ENDP
END main

