BM 310 Mikroişlemciler Dersi Laboratuvarı (LAB2) 1ÖN ÇALIŞMA SORUSU Mutlu sayı; bir pozitif tamsayının rakamlarının karesi alınıp topladığımızda ve bu işlemi bir kaç kere gerçekleştirdiğimizde bu kare toplamları 1'e eşit oluyorsa o sayı mutludur Mutlu sayıya örnek olarak;, sayımız 7 olsun 7 (7²=49) 49 (4²+9²=97) 97 (9²+7²=130) 130 (1²+3²=10) 10 1 7 sayısı mutlu bir sayıdır 139 mutludur çünkü 139 sayısının rakamları 1,3 ve 9 ile başlıyoruz 1² + 3² + 9² = 91, 91 sayısının rakamları 9 ve 1 ile devam ediyoruz 9² + 1² = 82, 82 sayısının rakamları 8 ve 2 ile devam ediyoruz 8² + 2² = 68, 68 sayısının rakamları 6 ve 8 ile devam ediyoruz 6² + 8² = 100, 100 sayısınının rakamları 1,0 ve 0 ile devam ediyoruz 1² + 0² + 0² = 1 son bulduğumuz cevap 1 olduğu için 139 mutlu sayıdır 4 (4²=16) 16 (1²+6²=37) 37 (3²+7²=58) 58 (5²+8²=89) 89 (8²+9²=145) 145 (1²+4²+5²=42) 42 (4²+2²=20) 20 4 4 sayısı mutsuz bir sayıdır SORU: 200 den küçük kaç tane mutlu sayı olduğunu bulan programı emu 8086 da yazın 2ÖN ÇALIŞMA 21 PUSH, POP KOMUTLARI 22 BAYRAK YAZMAÇLARI 23 DENETİM AKTARMA BUYRUKLARI 24 CMP KOMUTU
21 STACK: PUSHING ve POPPING OPERASYONLARI Yığın(Stack) nedir ve neden ihtiyaç duyulur? SS (yığın segmenti) ve SP (stack pointer) yığına erişmek için bellekte yüklü olması gerekir CPU daki her register (Segment register ve SP hariç) yığına saklanabilir veya yığından yüklenebilir Sınırlı sayıda yazmaç olduğu için CPU bu depolama alanlarına ihtiyacı duyar Yığına İTME(Pushing) yapma Yığında CPU yazmaçlarına saklama işlemi PUSH olarak adlandırılır Örn: SP(STACK POINTER)=1236, AX=24B6, DI=85C2, ve DX=5F93, Aşağıdaki komutlar çalıştığında yığının durumu nasıl olur? PUSH AX PUSH DI PUSH DX Cevap: SS:1230 93 SS:1231 5 F SS:1232 C 2 C 2 SS:1233 85 85 SS ; 1234 SS ; 1235 SS:1236 B 6 24 B 6 24 B 6 24 START Sonra Sonra Sonra PUSH AX PUSH DI PUSH DX SP=1236 SP=1234 SP=1232 SP=1230 Not:8086 da alt bayt küçük adreste saklanır Yığına ÇEKME(Popping) yapma Yığında CPU yazmaçlarından yükleme işlemi POP olarak adlandırılır Ex: SP=18FA, Aşağıdaki komutlar çalıştığında yığının durumu nasıl olur? POP CX POP DX POP BX Cevap:
SS:18FA SS:18FB SS:18FC SS:18FD SS ; 18 FE SS ; 18 FF SS:1900 23 14 6 B 2 C 91 F 6 6 B 2 C 91 F 6 9 1 F 6 S START After After After POP CX POP DX POP BX SP=18FA SP=18FC SP=18FE SP=1900 CX=1423 DX=2C6B BX=F691 22 BAYRAK YAZMAÇLARI CF, the Carry Flag: Toplama ve çıkarma işleminde taşma bitini tutar PF, the Parity Flag: Odd Parity(Tekt eşlik) için 0, Even Parity(Çift eşlik) için 1 AF, the Auxiliary Carry Flag: BCD toplama ve çıkarma işleminde kullanılır ZF, the Zero Flag: Aritmetik ve mantık işleminin sonucu sıfır olduğunu(z=1 için) belirtir Diğer durumda (Z=0) işlem sonucu sıfırdan farklıdır SF, the Sign Flag: Aritmetik ve mantık işleminin sonucunun işaretini tutar (S=1 negatif, S=0 pozitif) TF, the Trap Flag: Mikroişlemcinin debug modunda çalışmasını(t=1) sağlar IF, Interrupt Enable Flag: Interupt biti INTR giriş pinini kontrol eder DF, the Direction Flag: DI, SI registerlarının artma veya azalma modunda olmasını denetler(di=1 için registerlar azalır, 0 için artar) OF, the Overflow Flag: Taşmayı gösterir 23 DENETİM AKTARMA BUYRUKLARI FAR ve NEAR : (given CS:IP) NEAR: Mevcut code segmentinin içerisindeki atlamalarda kullanılır IP değişir FAR: Mevcut code segmentinin dışarısına atlamalarda kullanılır Hem CS hem de IP değişir Koşullu Atlamalar Koşullu atlama, belirli bir koşul gerçekleştiğinde kontrol(program sayacı) istenilen yere atlar JC (jump if carry) [CF is checked], JNZ (jump if not zero) [ZF is checked]
Mnemonic Condition Tested Jump if JA/JNBE (CF=0) and (ZF=0) above/not below nor equal JAE/JNB CF=0 above or equal/not below JB/JNAE CF=1 below/not above nor equal JBE/JNA (CF or ZF)=1 below or equal/not above JC CF=1 carry JE/JZ ZF=1 equal/zero JG/JNLE ((SF xor OF) or ZF) = 0 greater/not less nor equal JGE/JNL ((SF xor OF) = 0 greater or equal/not less JL/JNGE ((SF xor OF) = 1 less/not greater nor equal JLE/JNG ((SF xor OF) or ZF) = 1 less or equal/not greater JNC CF=0 not carry JNE/JNZ ZF=0 not equal/not zero JNO OF=0 not overflow JNP/JPO PF=0 not parity/parity odd JNS SF=0 not sign JO OF=1 overflow JP/JPE PF=1 parity/parity equal JS SF=1 sign Not: above ve below işaretsiz sayılarda ; greater and less işaretli sayılarda kullanılır Kısa Atlamalar Tüm koşullu atlamalar kısa atlamadır Kısa atlamada hedefteki adres belleğin 128 - +127 değerleri arasında olmalıdır Koşullu atlama 2 baytlık bir komuttur: İlk baytı J koşulunun işlem kodudur(opcode) İkinci baytıda 00 ile FF arasında alabileceği değerdir Bir geriye doğru atlamada ikinci bayt öteleme değerinin 2 ye tümleyenidir Koşulsuz Atlama JMP label program akışının koşulsuz olarak hedef etikete geçtiği atlamadır Aşağıdaki gibi gösterimleri vardır 1 KISA ATLAMA, JMP SHORT label formatıyla gösterilir Hedef adres o anki mevcut IP nin - 128 ile +127 aralığında olabilir 2 YAKIN ATLAMA, JMP label Mevcut Code Segmentin içinde atlar Aynı kısa atlama gibi ama farkı hedef adres o anki mevcut IP nin +32767 ile 32768 aralığında olabilir 3 UZAK ATLAMA, JMP FAR PTR label formatıyla gösterilir Burada hem Code segment değeri hem de IP değeri değişir CALL STATEMENTS CALL Etiket Etiket: #Mevcut adresi yığına atar(push) ve Etiket e atar
Ret #Ret komutu geldiğinde yığına atılan adresi yığıntan çeker ve o adrese gider Not: Etiketten sonra herhangi bir PUSH veya POP işlemi yaparsak yığın değişeceği için ret komutu geldiğinde program yanlış adrese geri dönecektir 24 CMP KOMUTU CMP operand1 - operand2 Sonuçlar yazılmaz sadece sonuca göre bayrak yazmaçları değişir(of, SF, ZF, AF, PF, CF) Örnek MOV AL, 5 MOV BL, 5 CMP AL, BL ; AL-BL=0 olduğu için, ZF = 1 olacak(o zaman eşittir) RET 3 ÇALIŞMA SORUSU Soru: 100'den küçük 3'e ve da 2'e tam bölünebilen doğal sayıların toplamını bulan ve bu toplamı DX yazmacına yazan program yazın