Yazar |
|
enginkdal
Kayıt: 09.01.2008 |
|
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
Kayıt: 09.01.2008 |
|
mov ah,01
int 16H
bunu nasıl kullanacağiz?
B?ZLER PAZARLiK DEGiL MEZARLIK DOSTLARIYIZ.
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
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
İstanbul
Kayıt: 12.02.2006 |
|
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
|
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.
|
|
Yazar |
|
burock
Kayıt: 21.06.2007 |
|
arkadaşlar 5.1 .ci bölümde ne var tam oalrak anlatabilecek var mı?
|
|
Yazar |
|
aslanera
istanbul
Kayıt: 01.06.2006 |
|
evet ali dediğin gibi azalacak.işte push pop eşit olmadıgı için dogru çalışmaz.
|
|
Yazar |
|
antirunje
Kayıt: 16.11.2006 |
|
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
Kayıt: 21.06.2007 |
|
pushf ne işe yarar?
|
|
Yazar |
|
gultekinm
Kayıt: 02.02.2006 |
|
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
istanbul
admin
Kayıt: 17.11.2005 |
|
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. |
bu soruyu biri açıklayabilirmi iki push tan sonra stack nası değişiyor?
N/A
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
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
adana
Kayıt: 21.01.2006 |
|
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. |
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
emra çekiç
|
|
Yazar |
|
aliprinter
İstanbul
Kayıt: 12.02.2006 |
|
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
İstanbul
Kayıt: 12.02.2006 |
|
emracekic yazdi |
2FFF ->1F
3000 ->00
3001 ->BC
3002 ->1F
bu işlemi neden yapmamız gerekiyor
açıklaması oaln varsa paylaşırsa sevinirim |
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
Kayıt: 21.06.2007 |
|
uygulama sınavında her gruba aynı soru mu soruldu.. büyük harf küçük harf çevirmesi soruldu mu daha doğrusu
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | | | | | | |