Assembly ile yazdığım hatrı sayılır ilk programım. Yazılanı ters çevirip tekrar ekrana yazma kodu. Assembly dilinin mantığını ve bazı komutları anlamak açısından öğretici bir kod oldu bence. (fasm) İçine de bol bol açıklama yazdım...
format mz ; derlenecek dosya exe olsun istiyoruz.
org 100h ; programın makine kodunu ram üzerinde 0100 offsetinden
; (16lık tabanda 0100, 10luktabanda 256) başlayarak yerleştir,
; çünkü windows ilk 256 baytlık kısımı programla ilgili bazı
; verilere ayırır.
; aşağıdaki kod ekrana yazı yazdırma fonksiyonu için. bu fonksiyon
; dx registerını yazdırılacak yazının başlangıç ofsetini tutacak
; değişken olarak kullanır.
mov dx,basla
mov ah,09
int 21h ; Dos kesmesi
mov bx,0 ; bx registerını sıfırladık.
tekrar:
mov ah,01h ; ekrandan karakter alma fonksiyonu.
int 21h
inc bx ; bx registerı bizim karakter sayacımız, onu bir arttırıyoruz.
mov [ds:bx],al ; Data yığınının (data stack) bx değerli
; offsetine al değerini atıyoruz, fonksiyon karakter
; kodunu ax registerının low kısmına (al) döndürür.
cmp al,13 ; Karşılaştır(compare) bakalım, basılan tuş enter mı?
jnz tekrar ; Eğer basılan tuş enter ise al=13 demektir. Bu durumda
; bayrak registerının sıfır biti veya bayrağı 1 olur. jnz
; (jump if not zero), bu bit 0 değilse tekrara atlar.
; Yani entera basılana kadar karakter alıyoruz.
mov dx,alta_gec ; ekrana yazdırma fonksiyonu
mov ah,09 ; dos için altsatır iki karakterden oluşur : Cr+Lf (10,13)
int 21h
mov dx,alta_gec ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
mov dx,yazi ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
mov dx,alta_gec ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
; gelelim ters çevirme kodlarına, loop komutu gizlice cx registerını
; kullanır. cx 0 olunca durur. Bu bir döngü komutu. Döngümüz ne
; kadar karakter yazıldıysa o kadar dönmeli. Zaten loop cx'i azaltarak
; ilerler. Böylece harfler tersten yazılır.
mov cx,bx
yaz:
mov bx,cx ;cx'i direkt kullanamıyoruz, o yüzden bx=cx
mov dl,[ds:bx] ; direkt ds:cx diyemiyoruz, işlemci rezervasyon yapmış :D
mov ah,02h ; karakter yazma fonksiyonu, dl içindeki karakteri yazar.
int 21h
loop yaz ; cx registerı 0 oluncaya kadar devam.
mov dx,alta_gec ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
mov dx,alta_gec ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
mov dx,bitti ; ekrana yazdırma fonksiyonu
mov ah,09
int 21h
mov ah,00h ; tuş bekle fonksiyonu
int 16h ; klavye kesmesi(interrupt)
int 20h ; programdan çık
; aşağıda da kullandığımız yazılar var. İşlemci hiçbir zaman
; direkt bunlarla karşılaşmamalı!
basla db "Ters cevrilecek yaziyi giriniz : $"
yazi db "Yazdiginiz yazinin tersi : $"
alta_gec db 10,13,"$"
bitti db "Program bitti, cikmak icin herhangi bir tusa basabilirsiniz...$" Okunma Sayısı: 800
Yayınlanma Tarihi: Blogun eski sürümü ile yazılmış, tarih kaydı bulunmuyor...
Anahtar Kelimeler: assembly, tersten, string, yazıyı, yazan, döngü, loop, kullanımı
Onaylı yorum bulunmuyor.
Yorum/Görüş Bildir