Bellekte 1000:2000H adresinde 500H byte'lık ve 00-0F ile sınırlı bir X dizisi bulunmaktadır. Y=15 x X^2 +71H bağıntısı ile tanımlı Y dizisini 3000:0700H adresine kaydeden program...
ORG 100
MOV AX,1000H
MOV DS,AX
MOV AX,2000H
MOV DI,AX
MOV AX,3000H
MOV SS,AX
MOV AX,0700H
MOV BP,AX
TEKRAR:
MOV AX,[DI]
MOV BX,[DI]
MUL BX
ADD AX,71H
MOV [BP],AX
CMP DI,2500H
JE SON
INC DI
INC BP
INC BP
JMP TEKRAR
SON:
END
Bellekte 3000:7500H adreslerinden başlayan 100 elemanlı bir dizi yer almaktadır. bu dizide yer akan -5 ve +5 arası sayıları 2000:1200H adresinden başlayarak sırasıyla kaydeden program...
ORG 100
MOV AX,3000H
MOV DS,AX
MOV AX,7500H
MOV DI,AX
MOV AX,2000H
MOV SS,AX
MOV AX,1200H
MOV BP,AX
TEKRAR:
CMP [DI],6H
JNL SORGULA
CMP [DI],0FAH
JG KAYDET
JMP SORGULA
KAYDET:
MOV AX,[DI]
MOV [BP],AX
SORGULA:
CMP DI,7564H
JNZ ARTTIR
JMP SON
ARTTIR:
INC DI
INC BP
JMP TEKRAR
SON:
END
Bellekte 1000:1500H adresşnden başlayan 100 elemanlı bir dizi yer almaktadır. Bu dizi içerisindeki 49'dan küçük sayıları 2000:1200H, büyük ve eşit sayıları ise 2000:1300H adresinden başlayarak sırasıyla kaydeden program...
ORG 100
MOV AX,1000H
MOV SS,AX
MOV AX,1500H
MOV BP,AX
MOV AX,2000H
MOV DS,AX
MOV AX,1200H
MOV DI,AX
MOV AX,1300H
MOV SI,AX
TEKRAR:
CMP [BP],49
JC KUCUK
MOV AX,[BP]
MOV [SI],AX
INC SI
JMP SORGULA
KUCUK:
MOV AX,[BP]
MOV [DI],AX
INC DI
SORGULA:
CMP BP,1564H
JNC SON
INC BP
JMP TEKRAR
SON:
END
Bellekte 35000H adreside 100byte'lık bir dizi bulunmaktadır. Dizi içerisindeki en küçük ve en büyük sayıyı bularak 75000 adresine kaydeden program...
ORG 100
MOV AX,3000H
MOV SS,AX
MOV AX,5000H
MOV BP,AX
MOV AX,7000H
MOV DS,AX
MOV AX,5000H
MOV DI,AX
TEKRAR:
MOV AX,DI
CMP [BP],AX
JC KUCUK
JNZ BUYUK
JMP SORGULA
KUCUK:
MOV AX,[BP]
MOV [DI],AX
JMP SORGULA
BUYUK:
INC DI
MOV AX,[BP]
MOV [DI],AX
DEC DI
SORGULA:
CMP BP,5064H
JNC SON
INC BP
JMP TEKRAR
SON:
END
uykusuz ellerine sağlık çok kral adamsın.sayende geçicez bu dersi:)
Rica ederim olmecabelarus, sizlerin de katkılarınızı bekleriz, yazdıkça ekleyiverin ;)
1000:0300 adresine 2000:5000 adresindeki veriyi Stack Memory kullanarak taşıyan program:
ORG 100
MOV BX,2000H
MOV DS,BX
MOV SI,5000H
MOV DI,0300H
MOV CX,700H
TEKRAR:
MOV AL,[SI]
PUSH DS
MOV BX,1000H
MOV DS,BX
MOV [DI],AL
POP DS
INC SI
INC DI
LOOP TEKRAR
END
2000:3000H ve 4000:5000H adresinde iki farklı dizi yer almaktadır. Bu iki dizinin aynı olup olmadığını inceleyen ve eğer farklı ise ilk farklı elemanın adresini stack memorye kaydeden program...
ORG 100
MOV AX,2000H
MOV DS,AX
MOV DI,3000H ;BIRINCI DIZI BASLANFICI
MOV AX,4000H
MOV SS,AX
MOV BP,5000H ;IKINCI DIZI BASLANGICI
MOV CX,100D ;DIZI UZUNLUGU
TEKRAR:
MOV AX,[DI]
CMP AX,[BP]
JNE KAYDET ;ESIT DEGILSE KAYDET
INC DI
INC BP
LOOP TEKRAR
JMP SON
KAYDET:
PUSH DI
PUSH DS
SON:
END
5 basamaklı iki sayı basamaklar halinde sırası ile 21000H ve 22000H'den başlayan adreslere dizi olarak kaydedilmiştir. Bu iki sayıyı toplayarak 23000H'dan başlayan adreslere kaydeden program...
ORG 100
MOV AX,2000H
MOV DS,AX
MOV SS,AX
MOV DI,1000H ;BIRINCI SAYININ BIRLER BASAMAGI
MOV SI,2000H ;IKINCI SAYININ BIRLER BASAMAGI
MOV BP,3000H ;SONUCUN BIRLER BASAMAGI
MOV AX,0
MOV CX,5D ;BASAMAK SAYISI
TEKRAR:
MOV AL,[DI]
ADD AL,[SI]
CMP AL,10
JC DEVAM ;10'DAN KUCUK MU?
SUB AL,10D
INC BP ;BUYUK
INC [BP] ;
DEC BP
DEVAM:
MOV [BP],AL
INC DI
INC SI
INC BP
LOOP TEKRAR
SON:
END
M0VSB ve REP komularına örnek program
[2000:1000] adresinden [1000:1000] adresine 1000H Byte veriyi kopyalayan program.
ORG 100H
MOV AX,2000H
MOV DS,AX
MOV SI,1000H
MOV CX,0100H
DEVAM:
MOV [SI],10
INC SI
LOOP DEVAM
MOV AX,1000H
MOV ES,AX
MOV DI,1000H
MOV AX,2000H
MOV DS,AX
MOV SI,1000H
MOV CX,0100H
CLD
REP MOVSB
END
CMPBS ve REPE komularına örnek program
[2000:1000] adresinden [1000:1000] adresine 1000H Byte veriyi karşılaştıran fark bulduğunda döngüyü sonlandıran program.
ORG 100H
MOV AX,1000H
MOV SS,AX
MOV BP,1000H
MOV AX,2000H
MOV DS,AX
MOV SI,1000H
MOV CX,0100H
DEVAM:
MOV [SI],10
MOV [BP],10
INC SI
INC BP
LOOPNE DEVAM
MOV AX,1000H
MOV ES,AX
MOV DI,1000H
MOV AX,2000H
MOV DS,AX
MOV SI,1000H
MOV CX,0100H
CLD
REPE CMPSB
END
2000:3000H ve 4000:5000H adreslerinde 2 dizi yer almaktadır. Bu iki dizinin aynı olup olmadığını inceleyen ve eğer farklı ise iki elemanın adresini stack'e kaydeden programı oluşturunuz. Program işleyişini açıklayınız.
; baslangicta butun adreslerin icerigi sıfır.
; bunun icin programin calistigini gormek amaciyla oncelikle 2. dizide
; bir elemani degistiriyoruz. ayrica dizilerimizin boyutu soruda verilmemis
; bunun icin 64h uzunlugunda kabul ettik.
mov bx, 4000h
mov ds, bx ; ikinci dizimiz 4000h segmentinde oldugu icin ds'ye 4000h atadik.
mov al, 33h
mov [5043h], al ; 4000:5043 adresine al'deki degeri yani 33h'i yazdik.
; si ve di genellikle veri transferi amaciyla kullanilsa da biz burada karsilastirma
; amaciyla kullanacagiz.
mov cx, 64h ; loop (down counter) dongusu kullandigimiz icin cx'e 64h yukledik.
mov si, 3000h ; 1. dizinin baslangic adresini si'ye yazdik.
mov di, 5000h ; 2. dizinin baslangic adresini de di'ye yazdik.
ayni:
mov bx, 2000h
mov ds, bx ; 1. dizimizden veri okumak icin ds'ye 2000 atadik.
mov al, [si] ; si'nin gosterdigi adresteki veriyi al'ye yazdik.
mov bx, 4000h
mov ds, bx ; simdi de 2. dizimizden veri okumak icin ds'ye 4000 atadik.
cmp al, [di] ; al'de 1. dizimizden aldigimiz veri vardi. bunu di'nin
; gosterdigi adresteki deger ile karsilastirdik.
jne farkli ; eger iki deger birbirine esit degilse farkli'ya atla dedik.
inc si ; 1. dizinin sonraki degerini okumak icin si'yi 1 artirdik.
inc di ; 2. dizinin sonraki degerini okumak icin di'yi 1 artirdik.
loop ayni ; iki deger esitse ayni'ya donuyoruz.
farkli:
push si ; dizideki farkli elemanlarin adreslerini push ile stack'e gonderdik.
push di
2005 Vize
Bellekteki bir X dizisi yine bellekte yer alan bilgiler ile tanımlıdır. Bu tanıma göre dizi başlangıç adresi 2500:0100H ve dizi uzunluğu ise 2500:0200H adresinde bulunmaktadır. Dizi elemanları içerisinde 40h < x < 57h şartını sağlayan x sayılarını 2 ile çarparak farklı bir dizi olarak kaydeden programı yazınız. Program işleyişini açıklayınız.
mov bx, 2500h
mov ds, bx ; dizimiz 2500:0100'de bulundugu icin ds'ye 2500 yazdik.
mov al, 50h ; programin calistigini gormek icin dizinin ilk 4 elemanina
mov [100h], al ; degerler atadik.
mov al, 54h
mov [101h], al
mov al, 12h
mov [102h], al
mov al, 64h
mov [103h], al
mov al, 0Fh ; dizi uzunlugumuzu 0Fh olarak belirledik.
mov [200h], al ; bu uzunluk degerini de 200h adresine yazdik.
mov si, 100h ; kaynak dizimiz 100h adresinden basladigi icin si'ye 100h yazdik.
mov di, 300h ; hedef dizimizin baslangic adresini 300h varsaydik ve di'ye yazdik.
mov cx, [200h] ; dizi uzunlugunu 200h'dan okuduk.
; ve bu degeri loop (down counter) dongusu icin cx'e kaydettik.
sonraki:
mov al, [si] ; si'nin gosterdigi adresteki veriyi al'ye atadik.
cmp al, 40h ; al içerigi ile 40h sayisini karsilastirdik.
jbe atla ; eger 40h'dan kucuk veya esitse atla dedik.
cmp al, 57h
jae atla ; degilse 57h'dan buyuk veya esitse yine atla dedik.
; o da degilse zaten dizi elemanimiz 40h ile 57h arasindadir.
mov bl, 02h
mul bl ; dizi elemani bu durumu sagliyorsa 2 ile carptik
mov [di], al ; ve sonucu di'nin gosterdigi adrese yazdik.
inc di ; di'yi 1 arttirdik.
atla:
inc si ; sonraki elemani karsilastirmak icin si'yi 1 arttirdik.
loop sonraki
2006 Vize
Bellekte 1000:2000H adresinde 500H byte'lık ve 00-0F ile sınırlı bir X dizisi bulunmaktadır. Y=15x² + 71H bağıntısı ile tanımlı Y dizisini 3000:700H adresine kaydeden programı yazınız. Program işleyişini açıklayınız.
mov bx, 1000h
mov ds, bx ; kaynak dizimizin baslangici 1000:2000h oldugu icin ds'ye 1000h atadik.
mov al, 03h
mov 2000h, al ; programin calistigini gormek icin dizimizin ilk 3 elemanina degerler atadik.
mov al, 05h
mov 2001h, al
mov al, 04h
mov 2002h, al
mov si, 2000h ; kaynak dizimizin baslangic adresini si'ye atadik.
mov di, 700h ; hedef dizimizin baslangic adresini di'ye atadik.
mov cx, 10h ; dizimiz 500h byte uzunlugunda oldugundan loop dongusu icin cx'e 500h atadik.
devam:
mov bx, 1000h
mov ds, bx ; ds'miz surekli degistigi icin tekrar 1000h atadik.
mov al, [si] ; si'nin gosterdigi adresteki veriyi al'ye aldik.
mul al ; al'yi kendisiyle carptik. (x*x)
mov bl, 0Fh ; bu sonucu 15 ile carpmak icin bl'ye 0Fh atadik.
mul bl ; al ile bl'yi carptik (x*x*15)
add ax, 71h ; ax'i 71h ile topladik. (x*x*15 + 71h)
inc si ; sonraki dizi elemani icin si'yi 1 arttirdik.
mov bx, 3000h ; sonucu hesapladigimiza gore artik hedef diziye yazabiliriz.
mov ds, bx ; hedef dizinin segmenti 3000h oldugundan ds'ye 3000h atadik.
; sonuclar 16bit'e tasmis olabileceginden her sonuc icin 2 byte kullandik.
mov [di], ah ; accumulatorun high-byte'ini di'nin gosterdigi adrese,
inc di
mov [di], al ; low-byte'ini ise bir sonraki adrese yazdik.
inc di
loop devam
2004 vize
Bellekte 5000:6000H adresinden başlayan ve işaretli sayılardan oluşan 700H byte uzunluğunda bir dizi bulunmaktadır. Dizi içerisinde 4Ah <= x <= 75h şartını sağlayan x sayılarına high-byte olarak C3h eklenecek ve 2 byte halinde başlangıç adresi 7000:8200h olan Y dizisi oluşturulacaktır. İşlemi gerçekleştiren programı yazınız. Program işleyişini açıklayınız.
MOV CX, 10h ; soruda dizi 700h uzunlugunda fakat islem uzun surdugu icin biz 10h kabul ettik.
MOV SI, 6000h
MOV DI, 8200h
MOV BX, 5000h ; dizide birkac elemana degerler atadik.
MOV DS, BX
MOV AL, 23h
MOV [SI], AL
MOV AL, 70h
MOV [SI+1], AL
MOV AL, 4Ah
MOV [SI+2], AL
MOV AL, 0FFh
MOV [SI+3], AL
MOV AL, 00h
MOV [SI+4], AL
MOV AL, 4Bh
MOV [SI+5],AL
devam:
MOV BX, 5000h
MOV DS, BX
MOV AL, [SI]
CMP AL, 4Ah
JL atla ; isaretli sayilarda calisigimiz icin jb yerine jl,
CMP AL, 75h
JG atla ; ja yerine de jg kullandik
MOV AL, [SI]
ADD AH, 0C3h ; accumulatorun high-byteina c3h ekledik.
MOV BX, 7000h
MOV DS, BX
MOV [DI], AH
INC DI
MOV [DI], AL
INC DI
atla:
INC SI
CMP CX, 700h
LOOP devam
2007 Mikroislemciler II Final - Soru 1
1700h adresli porttan okunan 300h byte'lık veri iki ayrı dizi olarak kaydedilecektir. 22h'dan büyük pozitif sayılar 3 ile çarpılarak 5000:0100h, negatif sayılar ise pozitife çevrilerek 1000:5000h adreslerine dizi olarak kaydedilecektir. İşlemi gerçekleştiren programı yazınız. Program işleyişini açıklayınız.
; Soruda okunacak port adresi 1700h verilmis.
; Biz bunun yerine 110h adresini kullandik.
; emu8086'da bu port adresine sanal olarak veri yazabiliyoruz.
; Bunun icin 'emulate' komutunu verdigimizde karsimiza gelen
; pencereden 'virtual devices' kismindaki 'Simple.exe' yi aciyoruz.
; Bu program ile port 110'a istedigimiz degeri girip
; yazdigimiz programi deneyebiliyoruz.
MOV CX, 300h ;LOOP sayaci CX'e 300h yükle.
yeni: MOV DX, 110h ;Port adresini DX'e ata. (Yukarida bahsettigimiz sanal port)
IN AL, DX ;Porttan veriyi oku AL'ye yükle.
CMP AL, 80h ;Okunan degerin negatif-pozitifligi incele.
JAE negtf ;DEGER >= 80h ise negtf'e dallan.
CMP AL, 22h ;DEGER < 80h ise pozitiftir, 22h ile karsilastir.
JA carp ;DEGER > 22h ise carp etiketine dallan.
LOOP yeni ;Bu da degilse CX'i bir azaltip porttan yeni deger oku.
HLT ;CX=00h, programi sonlandir.
carp: MOV BX, 0003h ;AL'yi 3 ile carpmak icin BL'ye 03h yukle.
MUL BL ;AL = AL x 03h
MOV BX, 5000h ;Sonucun yazilacagı dizi adresi 5000:0100h,
MOV DS, BX ;Bunun icin DS'ye 5000h yukle.
MOV DI, [500h] ;Elimizde 2 diziye adresleme yapacak ve kullanilmayan 2 register yok.
;Bunun icin RAM'deki 5000:0500h adresini sayac gibi kullanacagiz.
MOV [100h+DI], AL ;AL icerigini 100h+DI adresine yaz.
INC DI ;DI += 1
MOV [500h], DI ;DI icerigini 500h adresine yaz.
LOOP yeni ;Yeni deger okumak uzere yeni'ye dallan.
HLT ;CX=00h, programi sonlandir.
negtf: NEG AL ;AL'deki negatif sayiyi pozitife cevir.
MOV BX, 1000h ;Sonuclarin yazilacagı dizi adresi 1000:5000h,
MOV DS, BX ;Bunun icin DS'ye 1000h yukle.
MOV DI, [500h] ;1000:0500h adresindeki sayac degerini DI'ye yukle.
MOV [5000h+DI], AL ;AL icerigini 5000h+DI adresine yaz.
INC DI ;DI += 1
MOV [500h], DI ;DI icerigini 1000:500h adresine yaz.
LOOP yeni ;Yeni deger okumak uzere yeni'ye dallan.
HLT ;CX=00h, programi sonlandir.
NEGATİF SAYIYI POZİTİFE ÇEVİREN SATIRI (negtf ETİKETİNİN OLDUĞU SATIR) NEG AL KOMUTU (POZİTİFİ NEGATİF, NEGATİFİ DE POZİTİF YAPAR. KISACASI 2'YE GÖRE TÜMLEME ALIR) İLE DEĞİŞTİRDİM. AND AL,7F MANTIĞI YANLIŞ. BİLGİLERİNİZE...
2003 Mikroislemciler II Final - Soru 1
2000:3000h ve 4000:5000h adreslerinde iki dizi yer almaktadır. Bu iki dizinin aynı olup olmadığını inceleyen ve eğer farklı ise ilk farklı elemanın adresini stack'e kaydeden programı oluşturunuz. Program işleyişini açıklayınız.
MOV CX,100h ;Dizileri 100h byte kabul ettik. CX=100h
MOV SI,3000h ;1. dizinin offset adresini SI'ya,
MOV DI,5000h ;2. dizinin offset adresini DI'ya yukle.
next: MOV BX,2000h
MOV DS,BX ;1. dizinin segment adresini DS'ye yukle.
;MOV [SI+10h],45h ;Bu satir 1. dizinin 10h. elemanini farkli bir sayi yapar.
MOV AL,[SI] ;1. dizide SI'nin gosterdigi adresteki veriyi AL'ye al.
MOV BX,4000h
MOV DS,BX ;2. dizinin segment adresini DS'ye yukle.
MOV BL,[DI] ;2.dizide DI'nin gosterdigi adresteki veriyi BL'ye al.
INC DI ;DI=DI+1
INC SI ;SI=SI+1
CMP AL,BL ;AL ile BL'i karsilastir.
LOOPE next ;AL=BL ve CX!=0 ise next etiketine dallan.
CMP CX,0000h ;Dongunun bitis nedeni CX'in sifirlanmasi ise diziler aynidir.
JE bitir ;CX=0 ise programi sonlandır.
;AL!=BL ve CL!=0 ise diziler farklidir.
DEC SI ;Yukarida arttirdigimiz SI'yi tekrar azalt.
;Farkli elemanin adresinin dogru olarak yazmak icin.
DEC DI ;Ayni sekilde DI'yi da azalt.
PUSH SI ;SI icerigini stack'e at.
PUSH DI ;DI icerigini stack'e at.
bitir: HLT ;Programi sonlandir.
bellekte 35000h adresinde 0-120d arası sayılardan olusan 1000h byte lık bir x dizisi bulunmaktadır. Y = Є 3*x^2 + 15 bağıntısı ile tanımlanan toplam Y degerini hesaplayan ve 52000h adresine kaydeden programı yazınız..
Söylediğin DX AX sadece çarpma işlemi sonucu 16 bit'i de aşarsa oluyo bildiğim kadarıyla. Ama burda çarpma işlemi en yüksek sayı olarak 120d = 78h bile olsa maksimum 3840h yani 16 bit oluyo. Bu yüzden tek register yetiyo. Ama sonuç sürekli eski sonuçla toplandığı için yine taşıyo. Bunu da bir register'ı veya ram'deki bir adresin içeriğini her elde gelişinde 1 artırarak çözebiliriz. Çözümde de bunu kullandım. Kolay gelsin
MOV AX,3000h
MOV DS,AX
MOV SI,5000h
MOV AL,78h
MOV [5000h],AL
MOV [5001h],AL
MOV [5002h],AL
MOV [5003h],AL
MOV [5004h],AL ;Ornek verileri yukleme...
MOV CX,1000h ;LOOP dongusu icin CX=1000h
next: MOV AX,3000h
MOV DS,AX ;35000h adresi = 3000:5000h
XOR AX,AX ;AX=0
MOV BX,03h ;BX=03h
MOV AL,[SI] ;SI'nin gosterdigi degeri AL'ye yukle.
MUL AX ;AX = AX*AX
MUL BX ;AX = AX*3
ADD AX,15h ;AX = AX+15 (AX = 3*x^2+15)
PUSH AX ;AX icerigini stack'e yedekle
MOV AX,5000H
MOV DS,AX ;Sonucun yazilacagi adres 52000h=5000:2000h icin DS'yi degistir.
POP AX ;AX icerigini stack'ten geri al.
ADD AX,[2000h] ;AX = AX + [2000h icerisindeki deger]
MOV [2000H],AX ;Sonucu tekrar 2000h icerisine yaz. (2000h <- AL,2001h <- AH)
INC SI ;Sonraki dizi elemani icin SI=SI+1
JC elde ;Eger yukaridaki toplama sonucunda (MOV AX,[2000h])
;elde gelirse elde etiketine dallan.
LOOP next ;Sonraki dizi degeri icin basa don
elde: INC [2002h] ;Her elde gelisinde 2002h adresini 1 arttir.
LOOP next ;Sonraki dizi degeri icin basa don