Konuyu görüntüle
IUCODERS FORUM > Duyurular > Okul ile ilgili > Mikroişlemciler
Yazar
enginkdal


avatar

Kayıt: 09.01.2008
13.01.2008-09:51 #34434
arkadaşlar biri ekrandan girilen iki sayırı toplayı yine ekrana basma kodunu yazabilir mi.


; this is a program in 8086 assembly language that
; accepts a character string from the keyboard and
; stores it in the string array. the program then converts
; all the lower case characters of the string to upper case.
; if the string is empty (null), it doesn't do anything.

name "neyse artik"

org 100h


jmp start


; first byte is buffer size,
; second byte will hold number
; of used bytes for string,
; all other bytes are for characters:
string db 20, 22 dup('?')
string2 db 20, 22 dup('?')
data1 db 20,20 dup(?)

new_line db 0Dh,0Ah, '$' ; new line code.

start:

; int 21h / ah=0ah - input of a string to ds:dx,
; fist byte is buffer size, second byte is number
; of chars actually read. does not add '$' in the
; end of string. to print using int 21h / ah=09h
; you must set dollar sign at the end of it and
; start printing from address ds:dx + 2.

lea dx, string

mov ah, 0ah
int 21h

mov bx, dx
;mov ah, 0
mov ax, ds:[bx+1]
add bx, ax ; point to end of string.
mov data1,bx

;mov byte ptr [bx+2], '$' ; put dollar to the end.

; int 21h / ah=09h - output of a string at ds:dx.
; string must be terminated by '$' sign.
lea dx, new_line
mov ah, 09h
int 21h


lea dx, string2

mov ah, 0ah
int 21h



mov bx, dx
;mov ah, 0
mov ax, ds:[bx+1]
add bx, ax ; point to end of string.

lea dx, new_line
mov ah, 09h
int 21h

;lea bx, string

;mov ch, 0
;mov cl, [bx+1] ; get string size.

;jcxz null ; is string is empty?

;add bx, 2 ; skip control chars.

mov data1,bx
mov dx, data1



lea dx, data1
mov ah, 09h

int 21h


; wait for any key press....
mov ah, 0
int 16h


null:
ret ; return to operating system.



 
 
 


birinci sayi 1 girilince diğer sayi en fazla 8 girilince doğru cevap veriyor. birinci sayi 2 girinci diğer sayi 3 girilirse soonuç 4 oluyor. birinci sayi 3 ten fazla bir değer olunca sonuç çok farklı oluyor..

ben yazdım ama bir yerde sapitiyor.
daha basit olanı vardır umarım.


bir de arkadaşlar hocayla konuştum sınavda kod parçası olacakmış. boşluk doldurma şeklinde.





B?ZLER PAZARLiK DEGiL MEZARLIK DOSTLARIYIZ.






Yazar
enginkdal


avatar

Kayıt: 09.01.2008
13.01.2008-10:09 #34435


mov ah,01

int 16H
bunu nasıl kullanacağiz?






B?ZLER PAZARLiK DEGiL MEZARLIK DOSTLARIYIZ.






Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
13.01.2008-11:50 #34439
enginkdal yazdi
 


mov ah,01

int 16H
bunu nasıl kullanacağiz?

01 seçeneğiyle klaveden bir tuşa basılıp basılmadığını kontrol edebilirsin. Örneğin:
again:
mov ah, 01
int 16h
jz again

Klavyeden girilen karakterin ne olduğunu öğrenmek için 0 seçeneğini kullanmalısın. Örneğin:
again:
mov ah, 01
int 16h
jz again
mov ah, 0
int 16h
cmp al, 'Q'
je exit
cmp al, 'q'
je exit
jmp again
exit:
...


(Örnekler kitaptan)





Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
13.01.2008-12:05 #34440
aslanera yazdi
 
orda cx in önceden push edilip edilmemesi önemlimi. o anda pop cx yapılınca stack in en üst degerini cx e yerleştiriyor.

300B ->3E
300A ->45
3009 ->18
3008 ->2A
3007 ->1F
3006 ->00
3005 ->BC
3004 ->1F
SP3003 ->-----

pop cx olduktan sonra
3009 ->18
3008 ->2A
3007 ->1F
3006 ->00
3005 ->BC
3004 ->1F
SP3003 ->----- şeklinde olacagını ve CX=453E olacagını daha sonra

lojik adresin de yıgının en üstünde kalan 16 bit in oldugunu yani 001F:2A18 oldugunu düşündük thinking


Seninle aynı düşüncedeyim. Tek fark SP, PUSH yapıldıkça değeri azalmıyor mu?
Yani mesela SS, POP CX olmadan önceki hali şöyle olması gerekmiyor mu:
2FFB ->3E
2FFC ->45
2FFD ->18
2FFE ->2A
2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F
SP3003 ->-----

Zaten SI'deki değeri bulurken işlemi doğru yapmışsın herhalde buraya yazarken yanlış yazdın.

Şimdi alt program döndükten sonra lojik adres 001F:2A18'midir yani. Ben bundan zevk almadım ama, bari geldiği yere geri dönseydi. laughing





Yazar
burock


avatar

Kayıt: 21.06.2007
13.01.2008-12:17 #34442
arkadaşlar 5.1 .ci bölümde ne var tam oalrak anlatabilecek var mı?





Yazar
aslanera


avatar
istanbul
Kayıt: 01.06.2006
13.01.2008-12:37 #34443
evet ali dediğin gibi azalacak.işte push pop eşit olmadıgı için dogru çalışmaz.





Yazar
antirunje


avatar

Kayıt: 16.11.2006
13.01.2008-15:16 #34456
burock yazdi
 
arkadaşlar 5.1 .ci bölümde ne var tam oalrak anlatabilecek var mı?

MACRO,LOCAL VE INCLUDE var..





Eger ac ve kimsesiz bir kopegi alip bakar ve rahata kavusturursaniz sizi isirmaz. Insan ve kopek arasindaki temel fark budur.






Yazar
burock


avatar

Kayıt: 21.06.2007
13.01.2008-15:41 #34467
pushf ne işe yarar?





Yazar
gultekinm


avatar

Kayıt: 02.02.2006
13.01.2008-16:34 #34477
pushf bayrakları push etmek için kullanılıyomuş ama bir kod içerisinde bakmadım.


http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

işe yarayabilecek bir döküman bence bakmanızda fayda var...





just so tired of being me
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
13.01.2008-16:43 #34479
aliprinter yazdi
 
aslanera yazdi

Seninle aynı düşüncedeyim. Tek fark SP, PUSH yapıldıkça değeri azalmıyor mu?
Yani mesela SS, POP CX olmadan önceki hali şöyle olması gerekmiyor mu:
2FFB ->3E
2FFC ->45
2FFD ->18
2FFE ->2A
2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F
SP3003 ->-----

Zaten SI'deki değeri bulurken işlemi doğru yapmışsın herhalde buraya yazarken yanlış yazdın.

Şimdi alt program döndükten sonra lojik adres 001F:2A18'midir yani. Ben bundan zevk almadım ama, bari geldiği yere geri dönseydi. laughing

bu soruyu biri açıklayabilirmi iki push tan sonra stack nası değişiyor?





N/A
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
13.01.2008-17:30 #34482
aslanera yazdi
 
DS:0100 MOV AX,12F3H
DS:0103 MOV BX,9
DS:0106 PUSH AX
DS:0107 PUSH BX
DS:0108 CALL 010EH
DS:010B XOR AX,AX
DS:010D PUSH AX
DS:010E POP BX
DS:010F POP AX

yıgın bellegindeki degişimi yazabilecek varmı.
işlem sonunda AX ve BX içeriği ne olur
(CS=ES=DS=SS=13BA)
geçen seneki final sorusu.call kısmında stack değişimini beceremedim. call da birsonraki offset adresini kaydediyormuydu.işlem bittikten sonra kendisi onu otomatik pop ediyormu.
kolay gelsin.


CALL 010EH bu komut stack e yeni bir eleman ekledi push 010EH gibi davrandı
emulatorde deneyince
pop lar hiç çalışmamış gibi kalıyor oyle. sebebi nedir yad abu sorunun cevabı o mudur?





N/A
Yazar
emracekic


avatar
adana
Kayıt: 21.01.2006
13.01.2008-17:44 #34486
orhan yazdi
 
aliprinter yazdi
 
aslanera yazdi

Seninle aynı düşüncedeyim. Tek fark SP, PUSH yapıldıkça değeri azalmıyor mu?
Yani mesela SS, POP CX olmadan önceki hali şöyle olması gerekmiyor mu:
2FFB ->3E
2FFC ->45
2FFD ->18
2FFE ->2A
2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F
SP3003 ->-----

Zaten SI'deki değeri bulurken işlemi doğru yapmışsın herhalde buraya yazarken yanlış yazdın.

Şimdi alt program döndükten sonra lojik adres 001F:2A18'midir yani. Ben bundan zevk almadım ama, bari geldiği yere geri dönseydi. laughing

bu soruyu biri açıklayabilirmi iki push tan sonra stack nası değişiyor?


2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F

bu işlemi neden yapmamız gerekiyor

açıklaması oaln varsa paylaşırsa sevinirim applause





emra çekiç



Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
13.01.2008-17:54 #34488
orhan yazdi
 
bu soruyu biri açıklayabilirmi iki push tan sonra stack nası değişiyor?


İlk çözdüğüme göre biraz farklı bir çözüm buldum şimdi. Anlatayım:


SP ilk satırda 3003h değerini alıyor,
CALL FAR PTR SUBR1 komutu ile yığın belleğinin içeriği bir sonraki komutun adresi oluyor. (FAR olduğu için IP ile beraber CS'yi de yığın belleğinde saklıyoruz)

2FFF -> 1F -> Yeni SP
3000-> 00
3001 -> BC
3002 -> 1F
3003 <- Eski SP

PUSH AX ile;
2FFD -> 18
2FFE -> 2A
2FFF -> 1F
3000-> 00
3001 -> BC
3002 -> 1F
3003

PUSH BX ile;
2FFB -> 3E
2FFC -> 45
2FFD -> 18
2FFE -> 2A
2FFF -> 1F
3000-> 00
3001 -> BC
3002 -> 1F
3003


Sonra SI olarak 2FFDh adresi gösteriliyor. Buradaki değer word olarak alındığında 2A18h. Bu değer 8 kez döndürülüyor ROR ile. Sonuç: 182Ah oldu 2FFDh ve 2FFEh arasındaki değer.

2FFB -> 3E
2FFC -> 45
2FFD -> 2A
2FFE -> 18
2FFF -> 1F
3000-> 00
3001 -> BC
3002 -> 1F
3003

Sonra SI bir azalıyor ve 2FFC'yi gösteriyor. Yeni CL 4 oluyor. 2FFC adresindeki veriyi word cinsinden (2A45H) 4 bit döndürünce SONUÇ: 52A4h

2FFB -> 3E
2FFC -> A4
2FFD -> 52
2FFE -> 18
2FFF -> 1F
3000-> 00
3001 -> BC
3002 -> 1F
3003

POP CX ile;
2FFD -> 52
2FFE -> 18
2FFF -> 1F
3000-> 00
3001 -> BC
3002 -> 1F
3003

CX -> A43Eh

RET ile;
3001 -> BC
3002 -> 1F
3003

Lojik adres: 001F: 1852

Şimdi böyle buldum. Önceki çözdüğümde DEC DI ile 2 byte yani word olarak azaltmışım. Halbuki 1 kez azaltıyor. Yanlış varsa düzeltin.





Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
13.01.2008-18:01 #34489
emracekic yazdi
 


2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F

bu işlemi neden yapmamız gerekiyor

açıklaması oaln varsa paylaşırsa sevinirim applause


Alt program çağırılırken ya da başka bir adres CALL ile çağırılırken programın geri dönüş adresini hatırlaması için yığın belleğine IP yani bir sonraki komutun adresi atılır. Eğer NEAR call ise yalnızca IP saklanıyor. Fakat FAR call ise, yani segmentler arası işlem yapılacaksa IP ile beraber CS de saklanıyor. Bu durumda CS=1FBCh, IP=001Fh yığın belleğine little endian'a göre ekleniyor.





Yazar
burock


avatar

Kayıt: 21.06.2007
13.01.2008-18:37 #34492
uygulama sınavında her gruba aynı soru mu soruldu.. büyük harf küçük harf çevirmesi soruldu mu daha doğrusu





1 2 3 4 5 6 7 8 9
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb