Konu: Çizgiromanlarda Teknik Temalar Üzerine

  1. #31
    Ç. R. Düzenleme
    Üyelik Tarihi
    Nov 2015
    Mesajlar
    474

    Seviye: 39 
    Tecrübe: 1,667,284
    Sonraki Seviye: 1,757,916

    Beğenmiş
    2,185
    Beğenilmiş
    1,988
    Adı Geçen
    0 Konu
    Etiketlendiği
    0 Konu



    Atlantis BA23: Dorian Gray Operasyonu' nda bay Jinx ne diyordu_?

    Yaptığım son derece basit hatta saçma bir program...

    Bir kez daha ne diyordu_?

    Dediğim gibi bu çocukça bir program. Bunu yapmak için birkaç saniye yetti...

    OPDRNGRY.BAS:


    Kod:
    The IBM Personal Computer Basic 
    Version A2.00 Copyright IBM Corp. 1981, 1982, 1983
    60429 Bytes free 
    
    Ok 
    LOAD "OPDRNGRY.BAS"
    Ok
    LIST
    10 FOR X=1 TO 100
    20 PRINT "OPERATION DORIAN GRAY";X
    30 NEXT X
    Ok 
    RUN
    OPERATION DORIAN GRAY 1
    OPERATION DORIAN GRAY 2
    OPERATION DORIAN GRAY 3
    OPERATION DORIAN GRAY 4
    
    . . . . . . . . . . . . . . . . . . . . .
    . . . . . . . . . . . . . . . . . . . . .
    
    OPERATION DORIAN GRAY 97
    OPERATION DORIAN GRAY 98
    OPERATION DORIAN GRAY 99
    OPERATION DORIAN GRAY 100
    Ok 
    
    1LIST   2RUN<-   3LOAD"  4SAVE"  5CONT<-  6,"LPT1 7TRON<-  8TROFF<- 9KEY    0SCREEN




    Bay Jinx birkaç on yıl önce buna benzer bir program yapmak isteseydi, böyle düşünemeyecekti. Neden_? Çünkü o zamanlar, bu program, şu şekilde yazılırdı.

    OPDRNGRY.ASM:


    Kod:
    _TEXT	segment para public 'CODE'
    
    assume	CS:_TEXT, DS:_TEXT, SS:_TEXT
    
    org	100h
    
    main	proc near
    
    DB 11101011B
    DW 1001000000010111B
    
    DW 0101000001001111B
    DW 0101001001000101B
    DW 0101010001000001B
    DW 0100111101001001B
    DW 0010000001001110B
    DW 0100111101000100B
    DW 0100100101010010B
    DW 0100111001000001B
    DW 0100011100100000B
    DW 0100000101010010B
    DW 0010000001011001B
    
    
    DB 10111001B
    DW 0000000001100100B
    DB 10111011B
    DW 0000000000001010B
    
    DB 01010001B
    
    DB 10111001B
    DW 0000000000010110B
    
    DB 10111110B
    DW 0000000100000011B
    
    DW 0001010010001010B
    DW 0000001010110100B
    DW 0010000111001101B
    
    DB 01000110B
    DW 1111011111100010B
    
    DW 1100011111111110B
    DW 1110010000110010B
    DW 1100011110001010B
    DW 1111001111110110B
    
    DW 1100001100111010B
    DW 0001000001110101B
    
    DB 01010000B
    DW 0010011100000100B
    DW 1101000010001010B
    DW 0000001010110100B
    DW 0010000111001101B
    DB 01011000B
    
    DW 1111001111110110B
    DW 1100100011111110B
    DW 0000011001110100B
    
    DW 1111101100111010B
    DW 0000001001111101B
    DW 0000101001111100B
    
    DB 01010000B
    DW 0011000000000100B
    DW 1101000010001010B
    DW 0000001010110100B
    DW 0010000111001101B
    DB 01011000B
    
    DB 10000000B
    DW 0011000011000100B
    DW 1101010010001010B
    DW 0000001010110100B
    DW 0010000111001101B
    
    DW 0000110110110010B
    DW 0000001010110100B
    DW 0010000111001101B
    
    
    DW 0000101010110010B
    DW 0000001010110100B
    DW 0010000111001101B
    
    DB 01011001B
    
    DW 1010110011100010B
    
    DW 0010000011001101B
    
    main	endp
    
    _TEXT	ends
    
    end	main

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>ASM.EXE OPDRNGRY.ASM,,;
    The IBM Personal Computer Assembler
    Version 1.00 (C)Copyright IBM Corp 1981
    
    
    Warning Severe
    Errors  Errors
    0       0
    
    C:\>LINK.EXE
    IBM Personal Computer Linker
    Version 1.00 (C) Copyright IBM Corp 1981
    Object Modules: OPDRNGRY.OBJ
    Run File: OPDRNGRY.EXE
    List File [OPDRNGRY.MAP] :
    Libraries [ ] :
    Publics [No]: Y
    Line Numbers [No]: Y
    Stack size [Object file stack]:
    Load Low [Yes]: Y
    DSAllocation [No]: Y
    
    There were    1 errors detected
    
    C:\>EXE2BIN.EXE OPDRNGRY.EXE OPDRNGRY.COM
    
    C:\>OPDRNGRY.COM
    Program belleğe sığmayacak kadar büyük
    
    C:\>DEBUG.EXE OPDRNGRY.EXE
    -
    -R
    AX=0000  BX=0000  CX=0180  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DD2  ES=0DD2  SS=0DE2  CS=0DE2  IP=0100   NV UP EI PL NZ NA PO NC
    0DE2:0100 EB17          JMP     0119
    -
    -S CS:0100 017F CD 20
    0DE2:0173
    -
    -NOPDRNGRY.COM
    -RCX
    CX 0180
    :0075
    -
    -W CS:0100
    00075 bayt yazılıyor
    -
    -Q
    
    C:\>OPDRNGRY.COM
    OPERATION DORIAN GRAY 1
    OPERATION DORIAN GRAY 2
    OPERATION DORIAN GRAY 3
    OPERATION DORIAN GRAY 4
    
    . . . . . . . . . . . . . . . . . . . . .
    . . . . . . . . . . . . . . . . . . . . .
    
    OPERATION DORIAN GRAY 97
    OPERATION DORIAN GRAY 98
    OPERATION DORIAN GRAY 99
    OPERATION DORIAN GRAY 100
    
    C:\>
    N.B.: Antika Linker' in " There were 1 errors detected " uyarısı geçersizdir.





    Teknik yazılardan bunalan dostlarımız ve eski dostumuz Fındıkfındık için:





    Ne de olsa Mandrake bir başka. : )





    İ ç t e n l i k l e...

    Sevgiyle...

  2. #32
    Ç. R. Düzenleme
    Üyelik Tarihi
    Nov 2015
    Mesajlar
    474

    Seviye: 39 
    Tecrübe: 1,667,284
    Sonraki Seviye: 1,757,916

    Beğenmiş
    2,185
    Beğenilmiş
    1,988
    Adı Geçen
    0 Konu
    Etiketlendiği
    0 Konu
    UNDOCUMENTED DOS IV:





    Atlantis BA30: Santa Claus 9000' de, Martin Mystère' in PC ekranındaki ' virüs tarafından gönderilen ' mesaj ne idi_?

    Şu andan itibaren verilerinizin yüzde beşi silinmiş bulunuyor.

    Martin Mystère ne diyordu_?

    11400 KB... Az öncesine kadar 12000 idi. Kayıtların yüzde beşini silmiş...

    12000 (1 - (5 /100)) KB = 11400 KB

    Bir zamanlar, Rus bir yazılımcının yazdığı ve hem Martin Mystère zamanına ' 80' ler ' hem de sonraki devirlere ' 90' lar ' ait buna benzer antika bir MS-DOS virüsünü analiz etmiştik, ki bu virüs, önce orijinal MBR' u ' Master Boot Record ' okuyacak, sonra bu orijinali diske kaydedecek, ardından da pseudo MBR' u ' virüs bomba kodlarını ' orijinal MBR' a yazacak ' i.e., bulaşacak ' ve klavyeden girilen tarihe erişildiğinde de orijinal MBR' u havaya uçuracaktı.

    Ne var ki antik bilgisayarımızdaki ' Windows XP Professional, SP3 ' meşhur MS-DEBUG ile, virüs yazılımını çalıştırıp, klavyeden tarih girmemize ' i.e., birebir tatbik etmemize ' rağmen, nerede kaldı ki klavyeden girilen tarihe erişilince MBR' u havaya uçurmak, MBR' u okumayı bile beceremedi. : )

    Her nedense aklımıza bay Dawkins' in bazı sözleri geldi. Peki ne diyordu_? ' Kör Saatçi /The Blind Watchmaker /Horologiarius Caecus '

    Bu, aslında II. Bölüm'de karşılaştığımız, oldukça dokunaklı "Kişisel Kuşkuculuk Yaklaşımı"nın bir başka biçimidir. Örneğin, Zürafanın Boynunda ' The Neck of the Giraffe ', göz konusundaki bölümden hemen sonra bombacıböceğe geçiliyor.

    (Bu böcek) düşmanının suratına öldürücü bir hidrokinon ve hidrojen peroksit karışımı fışkırtıyor. Bu iki kimyasal maddde karıştıklarında kelimenin tam anlamıyla patlıyorlar. . . .

    Biyokimyacı bir arkadaşım bana bir şişe hidrojen peroksit ve 50 bombacıböceğe yetecek kadar hidrokinon verdi. Şu anda, bu iki kimyasalı karıştırmak üzereyim. Yukarıda yazılanlara göre benim suratımda patlayacaklar. İşte, karıştırıyorum ve... Görüyorsunuz ya, hâlâ buradayım. Hidrojen peroksiti hidrokinonun içine döktüm ve hiçbir şey olmadı; ısınmadı bile. Böyle olacağını elbette biliyordum: o kadar da çılgın değilim!


    Bu arada, neme lazım, olmaz olmaz deme olmaz olmaz derler ya, işte o misal, yazıyı okuyan herhangi bir END USER heyecana kapılıp denemeye kalkar, daha da fenası antik bilgisayarımızdakinden bile daha eski bir işletim sistemi kullanır, ki bir şey olur falan filan, işte bu ve benzeri nedenlerden dolayı, bu virüs ve analizini kamuya açık bir şekilde maalesef sunamıyoruz. : )

    Fakat bir fikir vermek için, MBR' a yazmak haricinde benzer kodlamaları içeren bir kitabın içeriği inceleyeceğiz.*

    * Daha önceden de denildiği gibi sembolik makina dili komutlarındaki [Flavor Anglice] READ kelimesi hemen her zaman güvenilirdir, lakin [Flavor Anglice] WRITE öyle d e ğ i l.

    Y. Elektronik Mühendisi Ferdâ M. Tanyeri, MS-DOS için ASSEMBLY adlı kitabında ne diyordu_?


    INT 13h : DİSK SERVİSLERİ

    DOS işletim sistemini tüm anlamıyla 'by-pass' eden 13h interrupt'ı sistemin en güçlü interrupt'larından biridir. Doğrudan doğruya BIOS ile iletişim sağladığından, bazı BIOS versiyonlarında problemler doğurabilir. Virüs üreticilerinin en fazla kullandıkları tekniklerden birisidir. DOS sistemi hard diskin her tarafına ulaşamadığından bu interrupt genelde 21h'nın yetersiz kaldığı alanlarda kullanılır. Geçen sayfalarda bir örneğini sunduğum 13h interrupt'ını kullanırken oldukça dikkatli olmak gerekir. Yapılan en ufak bir yanlış hard disk'in silinmesine, bozulmasına veya hiç kullanılamaz hale gelmesine neden olabilir.


    Y. Elektronik Mühendisi Ferdâ M. Tanyeri, MS-DOS için ASSEMBLY adlı kitabında ne diyordu_?

    Şimdi DEBUG ile bir hard disk üzerindeki bir partition'ın boot record'una göz atalım. Hard disk üzerindeki boot record sıfırıncı logical sector'da bulunmakta:

    Kod:
    C:\>DEBUG
    
    -L 100 2 0 1
    
    2393:0100 EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 08 01 00 .<.MSDOS5.0.....
    2393:0110 02 00 02 00 00 F8 AF 00-32 00 0A 00 32 00 00 00 ........2...2...
    2393:0120 56 72 05 00 80 00 29 DD-07 3E 2C 49 4E 54 45 52 Vr....)..>,INTER
    2393:0130 53 4F 46 54 5F 37 46 41-54 31 36 20 20 20 FA 33 SOFT_7FAT16 .3
    2393:0140 C0 8E D0 BC 00 7C 16 07-BB 78 00 36 C5 37 1E 56 .....|...x.6.7.V
    2393:0150 16 53 BF 3E 7C B9 0B 00-FC F3 A4 06 1F C6 45 FE .S.>|.........E.
    2393:0160 0F 8B 0E 18 7C 88 4D F9-89 47 02 C7 07 3E 7C FB ....|.M..G...>|.
    2393:0170 CD 13 72 79 33 C0 39 06-13 7C 74 08 8B 0E 13 7C ..ry3.9..|t....|
    -Q
    Yukarıdaki örnekte hard diskin MSDOS 5.0 ile formatlandığı görülüyor. Fiziksel sürücü numarasının (physical drive number) ise 80h olduğu ofset 0124h da bulunan byte'tan anlaşılmakta. (Bu aynı zamanda incelenen hard diskten sistemin açılabileceği anlamına da gelmekte.

    Bazı zamanlarda hard diskin gerçek yapısıyla (partition'lardan bağımsız olarak!) da çalışma yapmamız gerekebilir. Böyle bir işlem için bir BIOS interrupt'ı olan 13h'yı kullanabiliriz. Bu interrupt hard diskin partition'larını önemsemez, silindir ve kafa numaralarını kullanarak istenen yere ulaşabilir.

    Her hard disk (BIOS silindir 0, kafa 0, sector 1) bir boot record ve partition tablosu (table) ile başlar. Bu boot record'u DOS partition'ının boot record'u değildir. Master Boot Record adı verilen bu boot record'da hangi partition'un gerçek boot bilgisini içerdiği belirlenmiştir. Maksimal 4 partition'dan yalnızca bir tanesi boot işlemini yapabildiğinden master boot record bu partition'ı bulup kontrolu ona devreder.

    Master boot record 55AAh ile sona erer. Buna boot imzası anlamına gelen boot signature'da denir. Partition tablosu, boot signature'dan hemen bir önce gelir. (Ofset 01BEh ve 01FDh adreslerinde!) Partition tablosu, partition hakkında çeşitli bilgiler içerir.





    Y. Elektronik Mühendisi Ferdâ M. Tanyeri, MS-DOS için ASSEMBLY adlı kitabında ne diyordu_?

    Şimdi yazacağımız bir program ile INT 13h'ya bir örnek verelim ve master boot record'u okuyup hard diskimiz hakkındaki bilgileri nasıl edinebileceğimizi öğrenelim.

    Bu yeni programımıza hdinfo.asm adını vereceğiz. Hard disk hakkında bizlere bilgi (information) verecek olan bu program ile çeşitli hard diskler ve onların partition'larını rahatça inceleyebileceğiz.





    Âlâ! Âlâ!

    Rus yazılımcı misali, Hard Disk' e bodoslama dalacağız demek ki. Ne güzel. Öyleyse ne duruyoruz_? : )

    _16-bit Sembolik Makina Dili

    hdinfo.asm:


    Kod:
    ;******************************************************
    ; HARD DİSK BİLGİLERİ PROGRAMI
    ;
    ; Bu program BIOS INT 13h'nın 2 numaralı fonksiyonuna bir örnektir!
    ;
    ;******************************************************
    ;------------------------------------------------------------------------
    ; DATA ve EXTRA segmentlerinin tanımlanması
    
    dhdinfo	segment
    
    buffer	db	512 dup ('0')
    mesaj1	db	'Hard diskten DOS yüklenemez'
      	db	0Dh,0Ah,'$'
    mesaj2	db	'Hard diskten DOS yüklenebilir'
      	db	0Dh,0Ah,'$'
    mesaj3	db	'Partitiondaki FAT tipi tanınmıyor'
      	db	0Dh,0Ah,'$'
    mesaj4	db	'Partitiondaki FAT tipi 12-bit'
      	db	0Dh,0Ah,'$'
    mesaj5	db	'Partitiondaki FAT tipi 16-bit, '
      	db	'hard disk 32 MB den ufak',0Dh,0Ah,'$'
    mesaj6	db	'Partition bir Extended DOS Partition'
      	db	0Dh,0Ah,'$'
    mesaj7	db	'Partitiondaki FAT tipi 16-bit, '
      	db	'hard disk 32 MB den büyük', 0Dh,0Ah,'$'
    mesaj9	db	'Partitiondaki FAT DOS açısından '
      	db	'belirsiz!',0Dh,0Ah,'$'
    
    dhdinfo	ends
    ;------------------------------------------------------------------------
    ; CODE segmentinin tanımlanması
    
    hdinfo	segment
    
    ana_prog proc	far
    
    assume	cs:hdinfo
    assume	ds:dhdinfo
    assume	es:dhdinfo
    
    basla:
    push	ds			;Geri dönüş adreslerini
    sub	ax, ax			;stack içine sakla!
    push	ax
    
    mov	ax, dhdinfo		;DS ve ES segmentlerinin
    mov	ds, ax			;gerçek adreslerini
    mov	es, ax			;belirle!
    call	$cls			;Ekranı sil!
    mov	dl, 80h			;1. Hard disk (C:)
    mov	dh, 0			;Head : 0
    mov	ch, 0			;Cylinder : 0
    mov	cl, 1			;Sector : 1
    mov	al, 1			;1 sector oku
    mov	ah, 2			;Sector okuma servisi
    lea	bx, buffer		;Okunan bilginin yerleşeceği adres
    
    int	13h			;BIOS'tan yardım iste!
    jnc	devam_et		;Herşey normalse devam et!
    ret				;Anormal çıkış!
    devam_et:
    add	bx, 1BEh		;BX'i 1.partition başına pozisyonla
    
    cmp	byte ptr [bx], 80h	;BX'in işaretlediği byte'ı kontrol et!
    
    je	dos_part		;Bu byte 80h ise diskten
    				;sistem yüklenebilir
    lea	dx, mesaj1		;mesajını seç!
    jmp	boot_tamam		;Boot kontrolu sonuna git!
    
    dos_part:
    lea	dx, mesaj2		;Sistem yüklenemez mesajını seç!
    
    boot_tamam:
    mov	ah, 9			;mesaj1 veya mesaj2
    int	21h			;içeriğini ekrana yolla!
    
    add	bx, 4			;FAT bilgisinin adresini BX'e yükle!
    
    cmp	byte ptr [bx], 00	;FAT bilgisini 00 ile karşılaştır!
    
    jne	fat_bul1		;Bu byte 00 değilse devam!
    lea	dx, mesaj3		;Gereken mesajı yükle
    jmp	fat_bulundu		;Daha fazla araştırma!
    
    fat_bul1:
    cmp	byte ptr [bx], 01	;FAT bilgisini 01 ile karşılaştır!
    
    jne	fat_bul2		;Bu byte 01 değilse devam!
    lea	dx, mesaj4		;Gereken mesajı yükle
    jmp	fat_bulundu		;Daha fazla araştırma!
    
    fat_bul2:
    cmp	byte ptr [bx], 04	;FAT bilgisini 04 ile karşılaştır!
    
    jne	fat_bul3		;Bu byte 04 değilse devam!
    lea	dx, mesaj5		;Gereken mesajı yükle
    jmp	fat_bulundu		;Daha fazla araştırma!
    
    fat_bul3:
    cmp      byte ptr [bx], 05	;FAT bilgisini 05 ile karşılaştır!
    
    jne	fat_bul4		;Bu byte 05 değilse devam!
    lea	dx, mesaj6		;Gereken mesajı yükle
    jmp	fat_bulundu		;Daha fazla araştırma!
    
    fat_bul4:
    cmp	byte ptr [bx], 06	;FAT bilgisini 06 ile karşılaştır!
    
    jne	fat_hatasi		;Bu byte 05 değilse devam!
    lea	dx, mesaj7		;Gereken mesajı yükle
    jmp	fat_bulundu		;Daha fazla araştırma!
    
    fat_hatasi:
    lea	dx, mesaj9		;Hata mesajını yükle!
    
    fat_bulundu:
    mov	ah, 9			;Fat mesajını ekrana yolla 
    int	21h
    
    ret				;DOS'a geri dön!
    
    ana_prog	endp
    ;------------------------------------------------------------------------
    $cls	proc	near
    
    mov	ax, 0600h
    mov	cx, 0000
    mov	dx, 184Fh
    mov	bh, 7
    ret
    $cls	endp
    
    hdinfo	ends			;CODE segmentinin sonu
    ;******************************************************
    end	basla

    Ne yazık ki ne MS-DEBUG L 100 2 0 1 ne de hdinfo.asm ' INT 13h ' işe yarar, ki demek ki hiçbir şey yapamayacağız! Neden_?


    DEBUG.EXE:


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\WINDOWS\SYSTEM32>DEBUG.EXE
    -?
    assemble     A [adres]
    compare      C aralık adresi
    dump         D [aralık]
    enter        E adres [liste]
    fill         F aralık liste
    go           G [=adres] [adresler]
    hex          H değer1 değer2
    input        I bağlantınoktası
    load         L [adres] [sürücü] [ilkkesim] [numara]
    Kod:
    -
    -L 0100 2 0 1

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\WINDOWS\SYSTEM32>DEBUG.EXE
    -
    -L 0100 2 0 1
    N.B.: L[oad] [DS:]0100 [C:] 2 [logical sector] 0 [number] 1 [only load one sector = 0200h bytes]


    HDINFO.EXE:

    _ Compile ' MASM.EXE -> hdinfo.obj ' & Link ' LINK.EXE -> hdinfo.exe ' & DEBUG.EXE:


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>DEBUG.EXE HDINFO.EXE
    -L
    -R
    AX=0000  BX=0000  CX=03DF  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DD2  ES=0DD2  SS=0DE2  CS=0E17  IP=0000   NV UP EI PL NZ NA PO NC
    0E17:0000 1E            PUSH    DS
    -
    -U CS:0000
    0E17:0000 1E            PUSH    DS
    0E17:0001 2BC0          SUB     AX,AX
    0E17:0003 50            PUSH    AX
    0E17:0004 B8E20D        MOV     AX,0DE2
    0E17:0007 8ED8          MOV     DS,AX
    0E17:0009 8EC0          MOV     ES,AX
    0E17:000B E87500        CALL    0083
    0E17:000E B280          MOV     DL,80
    0E17:0010 B600          MOV     DH,00
    0E17:0012 B500          MOV     CH,00
    0E17:0014 B101          MOV     CL,01
    0E17:0016 B001          MOV     AL,01
    0E17:0018 B402          MOV     AH,02
    0E17:001A 8D1E0000      LEA     BX,[0000]
    0E17:001E CD13          INT     13
    -
    -G CS:001E
    
    AX=0201  BX=0000  CX=0001  DX=0080  SP=FFFC  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0E17  IP=001E   NV UP EI PL ZR NA PE NC
    0E17:001E CD13          INT     13
    -P
    _ Adresler Makina Dili Sembolik Makina Dili Comment

    Kod:
    
    0E17:000E B280          MOV     DL,80
    0E17:0010 B600          MOV     DH,00
    0E17:0012 B500          MOV     CH,00
    0E17:0014 B101          MOV     CL,01
    0E17:0016 B001          MOV     AL,01
    0E17:0018 B402          MOV     AH,02
    0E17:001A 8D1E0000      LEA     BX,[0000]	; ES:[0000] = buffer
    0E17:001E CD13          INT     13		; DISK - READ SECTORS INTO MEMORY
    						; AL = number of sectors to read, CH = track, CL = sector
    						; DH = head, DL = drive, ES:BX -> buffer to fill
    						; Return: CF set on error, AH = status,	AL = number of sectors read
    
    						; AH = status ' AH values for disk operation status ':
    						; 00h    successful completion
    						; 01h    invalid function in AH or invalid parameter
    						; 02h    address mark not found
    						; 03h    disk write-protected
    						; 04h    sector not found/read error
    						; 05h    reset failed (hard disk)
    						; 05h    data did not verify correctly (TI Professional PC)
    						; 06h    disk changed (floppy)
    						; 07h    drive parameter activity failed (hard disk)
    						; 08h    DMA overrun
    						; 09h    data boundary error (attempted DMA across 64K boundary or >80h sectors)
    						; 0Ah    bad sector detected (hard disk)
    						; 0Bh    bad track detected (hard disk)
    						; 0Ch    unsupported track or invalid media
    						; 0Dh    invalid number of sectors on format (PS/2 hard disk)
    						; 0Eh    control data address mark detected (hard disk)
    						; 0Fh    DMA arbitration level out of range (hard disk)
    						; 10h    uncorrectable CRC or ECC error on read
    						; 11h    data ECC corrected (hard disk)
    						; 20h    controller failure
    						; 31h    no media in drive (IBM/MS INT 13 extensions)
    						; 32h    incorrect drive type stored in CMOS (Compaq)
    						; 40h    seek failed
    						; 80h    timeout (not ready)
    						; AAh    drive not ready (hard disk)
    						; B0h    volume not locked in drive (INT 13 extensions)
    						; B1h    volume locked in drive (INT 13 extensions)
    						; B2h    volume not removable (INT 13 extensions)
    						; B3h    volume in use (INT 13 extensions)
    						; B4h    lock count exceeded (INT 13 extensions)
    						; B5h    valid eject request failed (INT 13 extensions)
    						; B6h    volume present but read protected (INT 13 extensions)
    						; BBh    undefined error (hard disk)
    						; CCh    write fault (hard disk)
    						; E0h    status register error (hard disk)
    						; FFh    sense operation failed (hard disk)




    ;................................................. .................................................. ..........................................

    DEBUG.EXE: L[oad] [DS:]0100 [C:] 2 [logical sector] 0 [number] 1 [only load one sector = 0200h bytes]

    16-bit [Sembolik] Makina Dili: P[roceed]

    Her iki direktif de çalıştırıldığında, işletim sistemi, şu uyarı mesajını ekrana gönderir.


    16 bit MS-DOS Alt Sistemi

    C:\command.com
    Uygulama desteklenmeyen bir eylem gerçekleştirdi: Sabit diske doğrudan erişim.
    Bu, uygulamanın yanlış çalışmasına neden olabilir. Uygulamayı bitirmek için Kapat'ı seçin.

    Kapat Yoksay

    Bir başka deyişle_?

    _ Hard disk ' C: ' üzerindeki 0. logical sector DEBUG.EXE' de, DS:0100 - DS:02FF adres aralığına okunamaz.

    _ INT 13h ;BIOS'tan yardım iste[nemez]!, i.e., hdinfo.asm' deki bu ve sonraki sembolik makina dili komutları çalıştırılamaz.


    ;................................................. .................................................. ..........................................

    Ya 16 bit MS-DOS Alt Sistemi uyarısında " Kapat " değil de " Yoksay " tıklanırsa_? Bir şey değişir mi ki_?


    DEBUG.EXE


    Kod:
    -
    -L 0100 2 0 1
    C sürücüsünü okumada disk hatası
    -

    COMMAND.COM:

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>HDINFO.EXE
    
    C:\>

    DEBUG.EXE:

    ;................................................. .................................................. ..........................................

    N.B.:

    DEBUG.EXE HDINFO.EXE
    L
    R
    U CS:0000
    G CS:001E
    P[roceed]

    komutları, işe yaramaz zira COMMAND.COM anında kapanır.


    ;................................................. .................................................. ..........................................

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>DEBUG.EXE
    -
    -NHDINFO.EXE
    -L
    -R
    AX=0000  BX=0000  CX=03DF  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DD2  ES=0DD2  SS=0DE2  CS=0E17  IP=0000   NV UP EI PL NZ NA PO NC
    0E17:0000 1E            PUSH    DS
    -
    -U CS:0000
    0E17:0000 1E            PUSH    DS
    0E17:0001 2BC0          SUB     AX,AX
    0E17:0003 50            PUSH    AX
    0E17:0004 B8E20D        MOV     AX,0DE2
    0E17:0007 8ED8          MOV     DS,AX
    0E17:0009 8EC0          MOV     ES,AX
    0E17:000B E87500        CALL    0083
    0E17:000E B280          MOV     DL,80
    0E17:0010 B600          MOV     DH,00
    0E17:0012 B500          MOV     CH,00
    0E17:0014 B101          MOV     CL,01
    0E17:0016 B001          MOV     AL,01
    0E17:0018 B402          MOV     AH,02
    0E17:001A 8D1E0000      LEA     BX,[0000]
    0E17:001E CD13          INT     13
    -
    -G CS:001E
    
    AX=0201  BX=0000  CX=0001  DX=0080  SP=FFFC  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0E17  IP=001E   NV UP EI PL ZR NA PE NC
    0E17:001E CD13          INT     13
    -P
    
    AX=8001  BX=0000  CX=0001  DX=0080  SP=FFFC  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0E17  IP=0020   NV UP DI NG NZ AC PO CY
    0E17:0020 7301          JNB     0023
    -T
    
    AX=8001  BX=0000  CX=0001  DX=0080  SP=FFFC  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0E17  IP=0022   NV UP DI NG NZ AC PO CY
    0E17:0022 CB            RETF
    -T
    
    AX=8001  BX=0000  CX=0001  DX=0080  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0DD2  IP=0000   NV UP DI NG NZ AC PO CY
    0DD2:0000 CD20          INT     20
    -P
    
    Program normal olarak sonlandırıldı
    -




    ;................................................. .................................................. ..........................................

    DEBUG.EXE' de INT 13 komutu çalıştırıldığı anda ' P[roceed] ' ne oldu_?

    AH values for disk operation status: AH = 80h -> timeout (not ready)

    Return: C[arry]F[lag] set on error, i.e. N[ot]C[arry] ' clear ' -> C[arry]Y[es] ' set '. Bu, geçersiz ya da hatalı bir şeylerin olduğuna işaret eder.

    Zaten Y. Elektronik Mühendisi Ferdâ M. Tanyeri, hdinfo.asm dosyasındaki kodların açıklamalarında ' comment ' ne diyordu_?


    Kod:
    int	13h			;BIOS'tan yardım iste!
    jnc	devam_et		;Herşey normalse devam et!
    ret				;Anormal çıkış!
    ;................................................. .................................................. ..........................................

    Kısacası fırıldak çevirmek işe yaramaz. : )

    Özetle, sabit diske bodoslama erişebilen bu ve benzeri sembolik makina dili komutları, ancak ve ancak 80' ler & 90' lardaki işletim sistemlerinde çalışır, günümüzdekilerde çalışmaz, bu yüzden de yerli ve yabancı eski sembolik makina dili kitaplarındaki bu ve benzeri sabit diske bodoslama erişen kod örneklerinin tümü artık g e ç e r s i z d i r.

    Ne demek istiyoruz_?

    Martin Mystère zamanına ait olan bu ve benzeri virüsler ' [TIME | LOGIC] bombs ', hâlihazırda hiçbir şey yapamazdı, zira asri işletim sistemleri bu ve benzeri kodlara karşı çok hassastır.


    ;................................................. .................................................. ..........................................

    ' Batılı yazılımcılara özentiden mütevellit ' fiyakasından geçilmeyen Rus bir yazılımcının yazdığı virüs kodunda Microsoft's Rich Header misali bir şifreleme metodu vardır, ki programdaki adresi ve makina dili karşılığı da şudur:

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>DEBUG.EXE
    -
    -E CS:046A 3F 32 3E 36 21 20 53 3E 26 20 27 53 37 3A 36 5D
    -
    -D CS:046A 0479
    0D8D:0460                                3F 32 3E 36 21 20             ?2>6!
    0D8D:0470  53 3E 26 20 27 53 37 3A-36 5D                     S>& 'S7:6]
    -
    -Q
    
    C:\>
    Deşifresi nedir_?*

    İpucu: Her byte, bir başka byte ile XOR' lanacaktır, şöyle ki:

    3Fh XOR HexNumber

    32h XOR HexNumber

    ...................................
    ...................................

    36h XOR HexNumber

    5Dh XOR HexNumber

    00 <= HexNumber <= FFh

    Burada HexNumber' ı ve hâliyle Rus yazılımcı tarafından sözüm ona gizlenmiş [Flavor Anglice] mesajı istiyoruz tabii ki. : )

    * Zor olmasa da uğraştırıcı bir sorudur.



    İ ç t e n l i k l e...

    Sevgiyle...

  3. #33
    Ç. R. Düzenleme
    Üyelik Tarihi
    Nov 2015
    Mesajlar
    474

    Seviye: 39 
    Tecrübe: 1,667,284
    Sonraki Seviye: 1,757,916

    Beğenmiş
    2,185
    Beğenilmiş
    1,988
    Adı Geçen
    0 Konu
    Etiketlendiği
    0 Konu
    UNDOCUMENTED DOS V:





    Atlantis BA30: Santa Claus 9000' de Noel Baba ne diyordu_?

    "Baytlar"... Hafızada ayrılmış ilgili sahalara gidiyorlar!

    Rus yazılımcı ve Y. Elektronik Mühendisi Ferdâ M. Tanyeri' nin ' MS-DOS için ASSEMBLY ', Hard Disk' e şu şekildeki bodoslama dalma kodları, sistem tarafından engellediğinden, bir işe yaramadığı aşikârdır.

    Kod:
    AH = 02h	; Function No
    INT 13h		; DISK - READ SECTORS INTO MEMORY

    N.B.:

    Enteresandır ki, MBR' u okumayı bile beceremeyen bu Rus yazılımcı, klavyeden girilmesi istenilen tarihin USSR standardında olmasını istiyordu.

    Bay Bill ve benzeri Batılı yazılımcılara özentiden mütevellit fiyakasından geçilmeyen bu Rus yazılımcı, sözde efsane özde alelade şifreleme numarasında, trajikomik [Flavor Anglice] ibare yerine, ' kimi benzeri yazılımcıların yaptığı gibi ' kendisiyle iletişim kurulabilecek bir bağlantı noktasını ' mail, etc. ' kodlara gömseydi ' embedded codes ', bir daha hayatı boyunca USSR standardından bahsedemeyecekti, zira bu standart fücceten gidecek, tarafımızca bilkuvve ve bilfiil havaya uçurulacaktı. : )

    Ne demek istiyoruz_?

    Şu anda felsefeyle iştigal etmeye ne zamanımız ne de niyetimiz var, lakin sanal alemin derinliklerinde yok olup giden eski yazılarımızda defalarca tanıtladığımız gibi, çağın paradigması Ortak Atalardan Türeme Hipotezi' nden ' Descendentiae de Antecessoribus Communibus Hypotheticis ' türeyen ve dünyayı fethetmesine de ramak kalan ' Paneuropeanismus' un, binlerce yıllık Porphyrios Ağacından ' Arbor Porphyrii ' türeyen Filogenetik Ağaçtan ' Arbor Phylogenetica ' türeyen Hint-Avrupa Dillerinin Soyağacı ' Stemma linguarum Indoeuropaearum ' hipotezine göre Rusça diye bir dil y o k t u r, ki demek ki USSR standardı diye bir şey de yoktur, zira türemiştir, ki üremiştir, ki ıraksamış ıradır ' characteris [diductio, divergentis, divergentiae] ', ki hükümsüzdür.

    Her neyse.

    Peki Hard Disk' e erişilemez mi ki_? L[ow] L[evel] [programming] L[anguage]' de ' [[Sembolik] Makina Dili] ' imkânsız diye bir şey y o k t u r.

    MASM32' yi indirip kuruyoruz.

    32-bit Sembolik Makina Dili ' SUBSYSTEM: CONSOLE ':



    Kod:
    	TITLE	rbsmbr.asm
    	.386P
    includelib \masm32\lib\msvcrt.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\shell32.lib
    if @Version gt 510
    .model	FLAT
    else
    _TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
    _TEXT	ENDS
    _DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
    _DATA	ENDS
    CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
    CONST	ENDS
    _BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
    _BSS	ENDS
    _TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
    _TLS	ENDS
    FLAT	GROUP _DATA, CONST, _BSS
    	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
    endif
    PUBLIC	_main
    EXTRN	_printf:NEAR
    EXTRN	_swprintf:NEAR
    EXTRN	_wcslen:NEAR
    EXTRN	__wcsnicmp:NEAR
    EXTRN	__imp__GetStdHandle@4:NEAR
    EXTRN	__imp__WriteFile@20:NEAR
    EXTRN	__imp__ReadFile@20:NEAR
    EXTRN	__imp__CloseHandle@4:NEAR
    EXTRN	__imp__GetCommandLineW@0:NEAR
    EXTRN	__imp__GlobalAlloc@8:NEAR
    EXTRN	__imp__GetLastError@0:NEAR
    EXTRN	__imp__CommandLineToArgvW@8:NEAR
    EXTRN	__imp__CreateFileW@28:NEAR
    
    _DATA	SEGMENT
    	align 4
    LC0	DB 'Boot-sector and MBR read utility.', 0Ah, 0Ah, 00
    	align 4
    LC1	DB 'rbsmbr[.exe] [DriveLetter: | mbr<number>:] [Filename[.ext]]', 0Ah, 00
    	align 2
    LC2	DB 'm', 00, 'b', 00, 'r', 00, 00, 00
    	align 4
    LC3	DB '\', 00, '\', 00, '.', 00, '\', 00, 'P', 00, 'h', 00, 'y', 00 
    	DB 's', 00, 'i', 00, 'c', 00, 'a', 00, 'l', 00, 'D', 00, 'r', 00
    	DB 'i', 00, 'v', 00, 'e', 00, '%', 00, 's', 00, 00, 00
    	align 2
    LC4	DB '\', 00, '\', 00, '.', 00, '\', 00, '%', 00, 's', 00, 00, 00
    LC5	DB 'Can not open %S', 0Ah, 00
    LC6	DB 'Error %d', 0Ah, 00
    LC7	DB 'Read %d bytes instead of %d', 0Ah, 00
    LC8	DB 'Can not access STDOUT', 0Ah, 00
    LC9	DB 'Can not create output file %S', 0Ah, 00
    	align 4
    LC10	DB 'Written %d bytes instead of %d', 0Ah, 00
    _DATA	ENDS
    
    _TEXT	SEGMENT
    _start:
    _main	PROC	NEAR
    	push	ebp					;
    	mov	ebp, esp				;,
    	sub	esp, 48h				;,
    	and	esp, 0FFFFFFF0h				;,
    	mov	eax, 0					; tmp0,
    	add	eax, 0Fh				; tmp1,
    	add	eax, 0Fh				; tmp2,
    	shr	eax, 4					; tmp3,
    	sal	eax, 4					; tmp4,
    	mov	DWORD PTR [ebp-40], eax			;, tmp4
    	mov	eax, DWORD PTR [ebp-40]			;,
    	call	DWORD PTR __imp__GetCommandLineW@0	;
    	mov	DWORD PTR [ebp-4], eax			; CmdLineW, tmp5
    	lea	eax, [ebp-12]				; tmp6,
    	mov	DWORD PTR [esp+4], eax			;, tmp6
    	mov	eax, DWORD PTR [ebp-4]			; CmdLineW, CmdLineW
    	mov	DWORD PTR [esp], eax			;, CmdLineW
    	call	DWORD PTR __imp__CommandLineToArgvW@8	;
    	sub	esp, 8					;,
    	mov	DWORD PTR [ebp-8], eax			; argv,
    	cmp	DWORD PTR [ebp-12], 1			; argc,
    	jg	L1					;,
    	mov	DWORD PTR [esp], OFFSET FLAT:LC0	;,
    	call	_printf					;
    	mov	DWORD PTR [esp], OFFSET FLAT:LC1	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFFh		; <result>,
    	jmp	L0					;
    L1:
    	mov	DWORD PTR [esp+8], 3			;,
    	mov	DWORD PTR [esp+4], OFFSET FLAT:LC2	;,
    	mov	eax, DWORD PTR [ebp-8]			; tmp7, argv
    	add	eax, 4					; tmp7,
    	mov	eax, DWORD PTR [eax]			; tmp8,
    	mov	DWORD PTR [esp], eax			;, tmp8
    	call	__wcsnicmp				;
    	test	eax, eax				; tmp9
    	jnz	L2					;,
    	mov	eax, DWORD PTR [ebp-8]			; tmp10, argv
    	add	eax, 4					; tmp10,
    	mov	eax, DWORD PTR [eax]			; tmp11,
    	mov	DWORD PTR [esp], eax			;, tmp11
    	call	_wcslen					;
    	add	eax, eax				; tmp12
    	add	eax, 24h				; tmp13,
    	mov	DWORD PTR [esp+4], eax			;, tmp13
    	mov	DWORD PTR [esp], 0			;,
    	call	DWORD PTR __imp__GlobalAlloc@8		;
    	sub	esp, 8					;,
    	mov	DWORD PTR [ebp-16], eax			; Path,
    	mov	eax, DWORD PTR [ebp-8]			; tmp14, argv
    	add	eax, 4					; tmp14,
    	mov	eax, DWORD PTR [eax]			; tmp15,
    	add	eax, 6					; tmp15,
    	mov	DWORD PTR [esp+8], eax			;, tmp15
    	mov	DWORD PTR [esp+4], OFFSET FLAT:LC3	;,
    	mov	eax, DWORD PTR [ebp-16]			; Path, Path
    	mov	DWORD PTR [esp], eax			;, Path
    	call	_swprintf				;
    	mov	DWORD PTR [ebp-32], eax			; n,
    	cmp	DWORD PTR [ebp-32], 0			; n,
    	jz	L3					;,
    	mov	eax, DWORD PTR [ebp-32]			; n, n
    	add	eax, eax				; tmp16
    	add	eax, DWORD PTR [ebp-16]			; tmp17, Path
    	sub	eax, 2					; tmp18,
    	mov	WORD PTR [eax], 0			;,
    	jmp	L3					;
    L2:
    	mov	eax, DWORD PTR [ebp-8]			; tmp19, argv
    	add	eax, 4					; tmp19,
    	mov	eax, DWORD PTR [eax]			; tmp20,
    	mov	DWORD PTR [esp], eax			;, tmp20
    	call	_wcslen					;
    	add	eax, eax				; tmp21
    	add	eax, 0Ah				; tmp22,
    	mov	DWORD PTR [esp+4], eax			;, tmp22
    	mov	DWORD PTR [esp], 0			;,
    	call	DWORD PTR __imp__GlobalAlloc@8		;
    	sub	esp, 8					;,
    	mov	DWORD PTR [ebp-16], eax			; Path,
    	mov	eax, DWORD PTR [ebp-8]			; tmp23, argv
    	add	eax, 4					; tmp23,
    	mov	eax, DWORD PTR [eax]			; tmp24,
    	mov	DWORD PTR [esp+8], eax			;, tmp24
    	mov	DWORD PTR [esp+4], OFFSET FLAT:LC4	;,
    	mov	eax, DWORD PTR [ebp-16]			; Path, Path
    	mov	DWORD PTR [esp], eax			;, Path
    	call	_swprintf				;
    L3:
    	mov	DWORD PTR [esp+4], 200h			;,
    	mov	DWORD PTR [esp], 0			;,
    	call	DWORD PTR __imp__GlobalAlloc@8		;
    	sub	esp, 8					;,
    	mov	DWORD PTR [ebp-24], eax			; buf,
    	mov	DWORD PTR [esp+24], 0			;,
    	mov	DWORD PTR [esp+20], 0			;,
    	mov	DWORD PTR [esp+16], 3			;,
    	mov	DWORD PTR [esp+12], 0			;,
    	mov	DWORD PTR [esp+8], 3			;,
    	mov	DWORD PTR [esp+4], 80000000h		;,
    	mov	eax, DWORD PTR [ebp-16]			; Path, Path
    	mov	DWORD PTR [esp], eax			;, Path
    	call	DWORD PTR __imp__CreateFileW@28		;
    	sub	esp, 1Ch				;,
    	mov	DWORD PTR [ebp-20], eax			; h, tmp25
    	cmp	DWORD PTR [ebp-20], 0			; h,
    	jz	L5					;,
    	cmp	DWORD PTR [ebp-20], 0FFFFFFFFh		; h,
    	jz	L5					;,
    	jmp	L4					;
    L5:
    	mov	eax, DWORD PTR [ebp-16]			; Path, Path
    	mov	DWORD PTR [esp+4], eax			;, Path
    	mov	DWORD PTR [esp], OFFSET FLAT:LC5	;,
    	call	_printf					;
    	call	DWORD PTR __imp__GetLastError@0		;
    	mov	DWORD PTR [esp+4], eax			;, tmp26
    	mov	DWORD PTR [esp], OFFSET FLAT:LC6	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFEh		; <result>,
    	jmp	L0					;
    L4:
    	mov	DWORD PTR [esp+16], 0			;,
    	lea	eax, [ebp-28]				; tmp27,
    	mov	DWORD PTR [esp+12], eax			;, tmp27
    	mov	DWORD PTR [esp+8], 200h			;,
    	mov	eax, DWORD PTR [ebp-24]			; buf, buf
    	mov	DWORD PTR [esp+4], eax			;, buf
    	mov	eax, DWORD PTR [ebp-20]			; h, h
    	mov	DWORD PTR [esp], eax			;, h
    	call	DWORD PTR __imp__ReadFile@20		;
    	sub	esp, 14h				;,
    	mov	eax, DWORD PTR [ebp-20]			; h, h
    	mov	DWORD PTR [esp], eax			;, h
    	call	DWORD PTR __imp__CloseHandle@4		;
    	sub	esp, 4					;,
    	cmp	DWORD PTR [ebp-28], 200h		; dw,
    	jz	L6					;,
    	mov	DWORD PTR [esp+8], 200h			;,
    	mov	eax, DWORD PTR [ebp-28]			; dw, dw
    	mov	DWORD PTR [esp+4], eax			;, dw
    	mov	DWORD PTR [esp], OFFSET FLAT:LC7	;,
    	call	_printf					;
    	call	DWORD PTR __imp__GetLastError@0		;
    	mov	DWORD PTR [esp+4], eax			;, tmp28
    	mov	DWORD PTR [esp], OFFSET FLAT:LC6	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFEh		; <result>,
    	jmp	L0					;
    L6:
    	cmp	DWORD PTR [ebp-12], 2			; argc,
    	jnz	L7					;,
    	mov	DWORD PTR [esp], 0FFFFFFF5h		;,
    	call	DWORD PTR __imp__GetStdHandle@4		;
    	sub	esp, 4					;,
    	mov	DWORD PTR [ebp-20], eax			; h, tmp29
    	cmp	DWORD PTR [ebp-20], 0			; h,
    	jz	L8					;,
    	cmp	DWORD PTR [ebp-20], 0FFFFFFFFh		; h,
    	jz	L8					;,
    	jmp	L9					;
    L8:
    	mov	DWORD PTR [esp], OFFSET FLAT:LC8	;,
    	call	_printf					;
    	call	DWORD PTR __imp__GetLastError@0		;
    	mov	DWORD PTR [esp+4], eax			;, tmp30
    	mov	DWORD PTR [esp], OFFSET FLAT:LC6	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFEh		; <result>,
    	jmp	L0					;
    L7:
    	mov	DWORD PTR [esp+24], 0			;,
    	mov	DWORD PTR [esp+20], 0			;,
    	mov	DWORD PTR [esp+16], 1			;,
    	mov	DWORD PTR [esp+12], 0			;,
    	mov	DWORD PTR [esp+8], 0			;,
    	mov	DWORD PTR [esp+4], 40000000h		;,
    	mov	eax, DWORD PTR [ebp-8]			; tmp31, argv
    	add	eax, 8					; tmp31,
    	mov	eax, DWORD PTR [eax]			; tmp32,
    	mov	DWORD PTR [esp], eax			;, tmp32
    	call	DWORD PTR __imp__CreateFileW@28		;
    	sub	esp, 28					;,
    	mov	DWORD PTR [ebp-20], eax			; h, tmp33
    	cmp	DWORD PTR [ebp-20], 0			; h,
    	jz	L10					;,
    	cmp	DWORD PTR [ebp-20], 0FFFFFFFFh	 	; h,
    	jz	L10					;,
    	jmp	L9					;
    L10:
    	mov	eax, DWORD PTR [ebp-8]			; tmp34, argv
    	add	eax, 8					; tmp34,
    	mov	eax, DWORD PTR [eax]			; tmp35,
    	mov	DWORD PTR [esp+4], eax			;, tmp35
    	mov	DWORD PTR [esp], OFFSET FLAT:LC9	;,
    	call	_printf					;
    	call	DWORD PTR __imp__GetLastError@0		;
    	mov	DWORD PTR [esp+4], eax			;, tmp36
    	mov	DWORD PTR [esp], OFFSET FLAT:LC6	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFEh		; <result>,
    	jmp	L0					;
    L9:
    	mov	DWORD PTR [esp+16], 0			;,
    	lea	eax, [ebp-28]				; tmp37,
    	mov	DWORD PTR [esp+12], eax			;, tmp37
    	mov	DWORD PTR [esp+8], 200h			;,
    	mov	eax, DWORD PTR [ebp-24]			; buf, buf
    	mov	DWORD PTR [esp+4], eax			;, buf
    	mov	eax, DWORD PTR [ebp-20]			; h, h
    	mov	DWORD PTR [esp], eax			;, h
    	call	DWORD PTR __imp__WriteFile@20		;
    	sub	esp, 20					;,
    	cmp	DWORD PTR [ebp-28], 200h		; dw,
    	jz	@F					;,
    	mov	DWORD PTR [esp+8], 200h			;,
    	mov	eax, DWORD PTR [ebp-28]			; dw, dw
    	mov	DWORD PTR [esp+4], eax			;, dw
    	mov	DWORD PTR [esp], OFFSET FLAT:LC10	;,
    	call	_printf					;
    	call	DWORD PTR __imp__GetLastError@0		;
    	mov	DWORD PTR [esp+4], eax			;, tmp38
    	mov	DWORD PTR [esp], OFFSET FLAT:LC6	;,
    	call	_printf					;
    	mov	DWORD PTR [ebp-36], 0FFFFFFFEh		; <result>,
    	jmp	L0					;
    @@:
    	mov	eax, DWORD PTR [ebp-20]			; h, h
    	mov	DWORD PTR [esp], eax			;, h
    	call	DWORD PTR __imp__CloseHandle@4		;
    	sub	esp, 4					;,
    L0:
    	mov	eax, DWORD PTR [ebp-36]			; <result>, <result>
    	leave
    	ret
    _main	ENDP
    _TEXT	ENDS
    END	_start

    _ Compile ' ml.exe -> rbsmbr.obj ' & Link ' link.exe -> rbsmbr.exe '

    _ DEBUG.EXE: L[oad] [DS:]0100 [C:] 2 [logical sector] 0 [number] 1 [only load one sector = 0200h bytes]

    Y. Elektronik Mühendisi Ferdâ M. Tanyeri' nin MS-DOS için ASSEMBLY adlı eserindeki bu direktif çalıştırıldığında, işletim sistemi, şu uyarı mesajını ekrana gönderir.


    Kod:
    -
    -L 0100 2 0 1
    16 bit MS-DOS Alt Sistemi

    C:\WINDOWS\system32\debug.exe
    Uygulama desteklenmeyen bir eylem gerçekleştirdi: Sabit diske doğrudan erişim.
    Bu, uygulamanın yanlış çalışmasına neden olabilir. Uygulamayı bitirmek için Kapat'ı seçin.

    Kapat Yoksay

    Kapat tıklanırsa DEBUG.EXE anında kapanır. Yoksay tıklanırsa da, DEBUG.EXE şu mesajı görüntüler:

    Kod:
    -
    -L 0100 2 0 1
    C sürücüsünü okumada disk hatası
    -
    Bir başka deyişle_?

    _ Hard disk ' C: ' üzerindeki 0. logical sector DEBUG.EXE' de, DS:0100 - DS:02FF adres aralığına okunamaz.

    Fakat RBSMSR.EXE, sistemin bu ve benzeri müdahalelerinden bağımsızdır. ' Neden_? Hard Disk' e bodoslama dalmaz da ondan. '

    N.B.: C[:]L[ogical]S[e]CT[o]R0.EXC


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\MASM32\BIN>RBSMBR.EXE
    Boot-sector and MBR read utility.
    
    rbsmbr[.exe] [DriveLetter: | mbr<number>:] [Filename[.ext]]
    
    C:\MASM32\BIN>RBSMBR.EXE C: CLSCTR0.EXC
    
    C:\MASM32\BIN>DEBUG.EXE CLSCTR0.EXC
    -
    -D CS:0100 02FF
    0D8D:0100  EB 52 90 4E 54 46 53 20-20 20 20 00 02 08 00 00   .R.NTFS    .....
    0D8D:0110  00 00 00 00 00 F8 00 00-3F 00 FF 00 3F 00 00 00   ........?...?...
    0D8D:0120  00 00 00 00 80 00 80 00-33 0A 80 02 00 00 00 00   ........3.......
    0D8D:0130  00 00 0C 00 00 00 00 00-A3 00 28 00 00 00 00 00   ..........(.....
    0D8D:0140  F6 00 00 00 01 00 00 00-8A CC DA 40 00 DB 40 F0   ...........@..@.
    0D8D:0150  00 00 00 00 FA 33 C0 8E-D0 BC 00 7C FB B8 C0 07   .....3.....|....
    0D8D:0160  8E D8 E8 16 00 B8 00 0D-8E C0 33 DB C6 06 0E 00   ..........3.....
    0D8D:0170  10 E8 53 00 68 00 0D 68-6A 02 CB 8A 16 24 00 B4   ..S.h..hj....$..
    0D8D:0180  08 CD 13 73 05 B9 FF FF-8A F1 66 0F B6 C6 40 66   ...s......f...@f
    0D8D:0190  0F B6 D1 80 E2 3F F7 E2-86 CD C0 ED 06 41 66 0F   .....?.......Af.
    0D8D:01A0  B7 C9 66 F7 E1 66 A3 20-00 C3 B4 41 BB AA 55 8A   ..f..f. ...A..U.
    0D8D:01B0  16 24 00 CD 13 72 0F 81-FB 55 AA 75 09 F6 C1 01   .$...r...U.u....
    0D8D:01C0  74 04 FE 06 14 00 C3 66-60 1E 06 66 A1 10 00 66   t......f`..f...f
    0D8D:01D0  03 06 1C 00 66 3B 06 20-00 0F 82 3A 00 1E 66 6A   ....f;. ...:..fj
    0D8D:01E0  00 66 50 06 53 66 68 10-00 01 00 80 3E 14 00 00   .fP.Sfh.....>...
    0D8D:01F0  0F 85 0C 00 E8 B3 FF 80-3E 14 00 00 0F 84 61 00   ........>.....a.
    0D8D:0200  B4 42 8A 16 24 00 16 1F-8B F4 CD 13 66 58 5B 07   .B..$.......fX[.
    0D8D:0210  66 58 66 58 1F EB 2D 66-33 D2 66 0F B7 0E 18 00   fXfX..-f3.f.....
    0D8D:0220  66 F7 F1 FE C2 8A CA 66-8B D0 66 C1 EA 10 F7 36   f......f..f....6
    0D8D:0230  1A 00 86 D6 8A 16 24 00-8A E8 C0 E4 06 0A CC B8   ......$.........
    0D8D:0240  01 02 CD 13 0F 82 19 00-8C C0 05 20 00 8E C0 66   ........... ...f
    0D8D:0250  FF 06 10 00 FF 0E 0E 00-0F 85 6F FF 07 1F 66 61   ..........o...fa
    0D8D:0260  C3 A0 F8 01 E8 09 00 A0-FB 01 E8 03 00 FB EB FE   ................
    0D8D:0270  B4 01 8B F0 AC 3C 00 74-09 B4 0E BB 07 00 CD 10   .....<.t........
    0D8D:0280  EB F2 C3 0D 0A 44 69 73-6B 20 6F 6B 75 6D 61 20   .....Disk okuma
    0D8D:0290  68 61 74 61 73 8D 00 0D-0A 4E 54 4C 44 52 20 65   hatas....NTLDR e
    0D8D:02A0  6B 73 69 6B 00 0D 0A 4E-54 4C 44 52 20 73 8D 6B   ksik...NTLDR s.k
    0D8D:02B0  8D 9F 74 8D 72 8D 6C 64-8D 00 0D 0A 59 65 6E 69   ..t.r.ld....Yeni
    0D8D:02C0  64 65 6E 20 62 61 9F 6C-61 74 3A 20 43 74 72 6C   den ba.lat: Ctrl
    0D8D:02D0  2B 41 6C 74 2B 44 65 6C-0D 0A 00 65 6C 20 74 6F   +Alt+Del...el to
    0D8D:02E0  20 72 65 73 74 61 72 74-0D 0A 00 00 00 00 00 00    restart........
    0D8D:02F0  00 00 00 00 00 00 00 00-83 97 A5 BA 00 00 55 AA   ..............U.
    -
    -Q
    
    C:\MASM32\BIN>




    N.B.: DriveLetter: C:, D:, E:, . . .

    Y. Elektronik Mühendisi Ferdâ M. Tanyeri' nin MS-DOS için ASSEMBLY adlı eserindeki INT 13h' ı içeren tüm sembolik makina dili kaynak kod dosyaları ' *.ASMs, ee.g., hdinfo.asm ve diğerleri ', yürütülebilir dosyalara dönüştürülüp ' *.COM, *.EXE ' çalıştırıldıklarında, işletim sistemi, şu uyarı mesajını ekrana gönderir.

    16 bit MS-DOS Alt Sistemi

    C:\command.com
    Uygulama desteklenmeyen bir eylem gerçekleştirdi: Sabit diske doğrudan erişim.
    Bu, uygulamanın yanlış çalışmasına neden olabilir. Uygulamayı bitirmek için Kapat'ı seçin.

    Kapat Yoksay

    Kapat tıklanırsa COMMAND.COM anında kapanır. Yoksay tıklanırsa da, COMMAND.COM ana dizine geri döner. ' i.e., hdinfo.exe çalışmaz '*

    * Arka planda neler olduğu önceki yazımızda açıklanmıştı, şöyle ki:

    DEBUG.EXE' de INT 13h çalıştırıldığı anda ' P[roceed] ' ne olmuştu_?

    _ 16 bit MS-DOS Alt Sistemi mesajı görüntülenmiş ve Kapat tıklanmışsa, DEBUG.EXE anında kapanmıştı.

    _ Ya da DEBUG.EXE: NHDINFO.EXE ile INT 13h' ın adresinden ' CS:001E ' sonraki adreslere CS:0020, CS:0022,... ' erişmeye ' program çalıştırılmaya ' zorlanmışsa, program sonlandırılmış ve şu hatalar görüntülenmişti.

    AH values for disk operation status: AH = 80h -> timeout (not ready)

    Return: C[arry]F[lag] set on error, i.e. N[ot]C[arry] ' clear ' -> C[arry]Y[es] ' set '. Bu, geçersiz ya da hatalı bir şeylerin olduğuna işaret eder.


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>HDINFO.EXE

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>DEBUG.EXE HDINFO.EXE
    -L
    -G CS:001E
    
    AX=0201  BX=0000  CX=0001  DX=0080  SP=FFFC  BP=0000  SI=0000  DI=0000
    DS=0DE2  ES=0DE2  SS=0DE2  CS=0E17  IP=001E   NV UP EI PL ZR NA PE NC
    0E17:001E CD13          INT     13
    -P

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>HDINFO.EXE
    
    C:\>

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>DEBUG.EXE
    -
    -NHDINFO.EXE
    -
    -G CS:0020
    
    Program normal olarak sonlandırıldı
    -




    Fakat RBSMSR.EXE, sistemin bu ve benzeri müdahalelerinden bağımsızdır. ' Neden_? Hard Disk' e bodoslama dalmaz da ondan. '

    N.B.: C[:]P[hysical]S[e]CT[o]R0.EXC

    Rus yazılımcının önce okuyup, sonra diske kaydedip ' filename.ext ', pseudo' sunu üzerine yazıp klavyeden girilen tarihe erişildiğinde de havaya uçurmaya çalıştığı meşhur MBR ' Master Boot Record ' işte budur. : )


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\MASM32\BIN>RBSMBR.EXE
    Boot-sector and MBR read utility.
    
    rbsmbr[.exe] [DriveLetter: | mbr<number>:] [Filename[.ext]]
    
    C:\MASM32\BIN>RBSMBR.EXE MBR0: CPSCTR0.EXC
    
    C:\MASM32\BIN>DEBUG.EXE CPSCTR0.EXC
    -
    -D CS:0100 02FF
    0D8D:0100  33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C   3.....|.P.P....|
    0D8D:0110  BF 1B 06 50 57 B9 E5 01-F3 A4 CB BD BE 07 B1 04   ...PW...........
    0D8D:0120  38 6E 00 7C 09 75 13 83-C5 10 E2 F4 CD 18 8B F5   8n.|.u..........
    0D8D:0130  83 C6 10 49 74 19 38 2C-74 F6 A0 B5 07 B4 07 8B   ...It.8,t.......
    0D8D:0140  F0 AC 3C 00 74 FC BB 07-00 B4 0E CD 10 EB F2 88   ..<.t...........
    0D8D:0150  4E 10 E8 46 00 73 2A FE-46 10 80 7E 04 0B 74 0B   N..F.s*.F..~..t.
    0D8D:0160  80 7E 04 0C 74 05 A0 B6-07 75 D2 80 46 02 06 83   .~..t....u..F...
    0D8D:0170  46 08 06 83 56 0A 00 E8-21 00 73 05 A0 B6 07 EB   F...V...!.s.....
    0D8D:0180  BC 81 3E FE 7D 55 AA 74-0B 80 7E 10 00 74 C8 A0   ..>.}U.t..~..t..
    0D8D:0190  B7 07 EB A9 8B FC 1E 57-8B F5 CB BF 05 00 8A 56   .......W.......V
    0D8D:01A0  00 B4 08 CD 13 72 23 8A-C1 24 3F 98 8A DE 8A FC   .....r#..$?.....
    0D8D:01B0  43 F7 E3 8B D1 86 D6 B1-06 D2 EE 42 F7 E2 39 56   C..........B..9V
    0D8D:01C0  0A 77 23 72 05 39 46 08-73 1C B8 01 02 BB 00 7C   .w#r.9F.s......|
    0D8D:01D0  8B 4E 02 8B 56 00 CD 13-73 51 4F 74 4E 32 E4 8A   .N..V...sQOtN2..
    0D8D:01E0  56 00 CD 13 EB E4 8A 56-00 60 BB AA 55 B4 41 CD   V......V.`..U.A.
    0D8D:01F0  13 72 36 81 FB 55 AA 75-30 F6 C1 01 74 2B 61 60   .r6..U.u0...t+a`
    0D8D:0200  6A 00 6A 00 FF 76 0A FF-76 08 6A 00 68 00 7C 6A   j.j..v..v.j.h.|j
    0D8D:0210  01 6A 10 B4 42 8B F4 CD-13 61 61 73 0E 4F 74 0B   .j..B....aas.Ot.
    0D8D:0220  32 E4 8A 56 00 CD 13 EB-D6 61 F9 C3 47 65 87 65   2..V.....a..Ge.e
    0D8D:0230  72 73 69 7A 20 62 94 6C-81 6D 20 74 61 62 6C 6F   rsiz b.l.m tablo
    0D8D:0240  73 75 00 98 9F 6C 65 74-69 6D 20 73 69 73 74 65   su...letim siste
    0D8D:0250  6D 69 20 79 81 6B 6C 65-6D 65 20 68 61 74 61 73   mi y.kleme hatas
    0D8D:0260  8D 00 98 9F 6C 65 74 69-6D 20 73 69 73 74 65 6D   ....letim sistem
    0D8D:0270  69 20 79 6F 6B 00 79 73-74 65 6D 00 00 00 00 00   i yok.ystem.....
    0D8D:0280  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0D8D:0290  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0D8D:02A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0D8D:02B0  00 00 00 00 00 2C 43 62-CA 0F CA 0F 00 00 80 01   .....,Cb........
    0D8D:02C0  01 00 07 FE FF FF 3F 00-00 00 34 0A 80 02 00 00   ......?...4.....
    0D8D:02D0  C1 FF 0F FE FF FF 73 0A-80 02 8D 9B D0 06 00 00   ......s.........
    0D8D:02E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0D8D:02F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.
    -
    -Q
    
    C:\MASM32\BIN>




    N.B.: mbr<number>: mbr0, mbr1, mbr2, . . .

    Y. Elektronik Mühendisi Ferdâ M. Tanyeri' nin MS-DOS için ASSEMBLY adlı eserinde dediği gibi, MBR' un 55 AA ile sona erdiğine dikkat edilmelidir.

    Hülasa, RBSMBR.EXE, her lojik sürücünün boot record' unu ve her fiziksel sürücünün tüm sektörlerini okur ve dosya olarak da diske kaydeder ve sistem kendisine karışmaz. Doğrusu enteresan. : )


    Teknik yazılardan bunalan dostlarımız ve eski dostumuz Victoryv için:






    İ ç t e n l i k l e...

    Sevgiyle...

  4. #34
    Ç. R. Düzenleme
    Üyelik Tarihi
    Nov 2015
    Mesajlar
    474

    Seviye: 39 
    Tecrübe: 1,667,284
    Sonraki Seviye: 1,757,916

    Beğenmiş
    2,185
    Beğenilmiş
    1,988
    Adı Geçen
    0 Konu
    Etiketlendiği
    0 Konu
    UNDOCUMENTED DOS VI:





    Atlantis BA32: Mucize Çocuk' ta Vincent Phybes ne diyordu_?

    Hangi bilgisayar olursa olsun, birçok dili konuşabilir. Assembler, Pascal vs. gibi diller... Bunlar kompütere harika programlar uygulamasını sağlar... Oysa bu dilleri çok az kişi bilir. Programcıların çoğu öğrenmesi kolay ama kısıtlı bir dil olan BASIC'den yararlanırlar.

    Y. Elektronik Mühendisi Ferdâ M. Tanyeri, Assembly - Programlama Sanatı adlı eserinde ne diyordu_?

    BÖLÜM XII-- BASIC -- ASSEMBLY İŞBİRLİĞİ

    Bu bölümün içeriği : BASIC programlarından ASSEMBLY alt programlarına erişim.

    Bir çok programcı ilk olarak BASIC programlama dilini öğrenmiştir. En kolay öğrenebilinen BASIC dili bilgisayar programcılığına soyunan her öğrencinin genelde ilk adımıdır. Zaten bu dilin tüm anlamı da çiçeği burnunda programcı adaylarına programcılık hakkında ilk fikirleri vermektir.

    Kitabın bu bölümünde daha çok BASIC programlarından ASSEMBLY rutinlerine bilgi aktarmayı, bu bilgileri ASSEMBLY dilinde yazılmış programlarla işlemeyi ve sonucu BASIC programına aktarmayı öğrenecek, birkaç örnekle BASIC-ASSEMBLY işbirliği üzerinde çalışmalar yapacağız.

    BASIC derleyici (compiler) değil yorumlayıcı (interpreter) prensibine göre çalışan bir programlama dilidir.

    Derleyici prensibiyle çalışan programlama dilleri (COBOL, PASCAL, C ve hatta ASSEMBLY) MS-DOS işletim sisteminde derleme sonucu olarak genelde .OBJ türü bir dosya meydana getirirler. Bu tür dosyaları LINK sistem programı ile .EXE dosyaları yani icra edilebilir makine kodu dosyalarına çevirir ve çalıştırırız.

    Buna karşılık yorumlayıcı (interpreter) prensibine göre çalışan BASIC programlama lisanının kendisi aslında çalışan programdır. Programcının 'program satırları' BASIC programının bilgilerini (data) meydana getirir ve bu satırları birer birer icra eder. BASIC'te .OBJ veya .EXE türü dosyalar olmayacağından diğer programlama dillerinde yazılmış dosyalarla BASIC'in işbirliği yapması oldukça zordur.

    Ana belleğe (RAM) çağırılan programı işletim sistemi bulduğu uygun bir yere yerleştirir. Çeşitli dillerle yazılıp derlenmiş ve .OBJ dosyaları yaratılmış programlar LINK ile kombine edilip tek program haline geldiklerinden elde edilen .EXE dosyası bir bütündür ve işletim sistemi bunu yüklemekte zorluk çekmez.

    BASIC'te bunu gerçekleştiremediğimiz için izlememiz gereken yol oldukça uzar. BASIC dışı dillerden ASSEMBLY'e ulaşmak için CALL, BASIC'ten ise USR komutu kullanılır. (Bazı değişik BASIC versionlarında CALL komutu da bulunur, fakat biz tüm versionlar için geçerli olan USR komutuyla çalışacağız!) En büyük zorluğu da bu komutun kullanımında yaşayacağız. Çünkü BASIC programına çağırılacak olan ASSEMBLY programının ana bellekte bulunabileceği adresi biz bir programcı olarak bildirmeye mecburuz. Unutmayın ki bu tür programlararası alışverişlerde fiziksel olarak birbirinden ayrı iki program çalışmakta ve işletim sistemi sadece birini (BASIC) ana belleğe yüklemekte. Buna karşılık .OBJ dosyalarından LINK ile yaratılmış olan .EXE dosyası işletim sistemi tarafından bir bütün olarak görülüyor ve ana belleğe yüklenmesi esnasında (istersek birçok .OBJ dosyasını kombine etmiş olalım!) hiçbir güçlük ortaya çıkmıyor.





    ;................................................. .................................................. ..........................................

    N.B.:

    Her ne kadar hem Vincent Phybes hem de Y. Elektronik Mühendisi Ferdâ M. Tanyeri, haklı olsalar da göz ardı edilmemesi gereken bir şey de vardır, ki şudur:

    L[ow] L[evel] [programming] L[anguage] ' [Sembolik] Makina Dili: [ASSEMBLY] ' ile H[igh] L[evel] [programming] L[anguages] ' [Sembolik] Makina Dili haricindekiler ', en azından bize göre, karşılaştırılamaz. Neden_?

    Antik Yunan Filozofu ' philosophus Graecus antiquus /Muallim-i Evvel ' Aristoteles' in kıyas teorisine göre ' theoria syllogismi categorici in logica Aristotelicae ', HLLs birbirleriyle kıyaslanabilir, HLLs ile LLL d e ğ i l.


    ;................................................. .................................................. ..........................................

    Hemen ardından da Y. Elektronik Mühendisi Ferdâ M. Tanyeri tarafından iki misal sunulur, ki şunlardır:

    _ Desimal - Heksadesimal çeviri:

    DESIHEKS.BAS [BASIC] & BINHEKS.ASM [ASSEMBLY]:

    Desimal - Heksadesimal çeviri için sunulan bu dosyalarda herhangi bir sorun yok.






    _ Heksadesimal - Decimal çeviri:

    HEKSIDES.BAS [BASIC] & HEKSBIN.ASM [ASSEMBLY]:

    Nihayetinde ne deniliyordu_? : )


    Haydi bakalım, kolay gelsin. Bu programı ' HEKSIDES.BAS [BASIC] & HEKSBIN.ASM [ASSEMBLY] ' çalıştırabilirseniz bir önceki örneği ' DESIHEKS.BAS [BASIC] & BINHEKS.ASM [ASSEMBLY] ' anlamışsınız demektir. Programı 'süslemek' sizlerin becerisine kalmış!!


    Y. Elektronik Mühendisi Ferdâ M. Tanyeri, Assembly - Programlama Sanatı' nda ne diyordu_?

    HEKSIDES PROGRAMI

    Daha az bir açıklama ile sizlere başka bir örnekle HEKSIDES programını sunuyoruz. Adından da belli olduğu gibi bu program heksadesimal bir değeri desimal bir değere çevirip ekrana yansıtıyor. BASIC ve ASSEMBLY programlarının listesini ardarda sıralıyor, aralarındaki bilgi alışverişi için gereken işlemleri siz okuyucuların çabasına bırakıyoruz!

    Tamam da, Heksadesimal - Decimal çeviri dosyaları h a f a k a n, zira, dizgi hatasından olsa gerek, hatalarla doludur. Velhasıl, öncelik, nerede kaldı ki programları 'süslemek', düzeltmektir, şöyle ki:


    BASIC HEKSIDES.BAS programı ' ya şudur ':


    Kod:
    10 DEFINT A-Z
    20 DEF SEG = &H0
    30 DEF USR0 = 0
    40 INPUT "Heksadesimal Numarayi Girin "; N
    50 D = USR0 (N) : PRINT
    60 PRINT "Desimal karsiligi : "; N
    70 PRINT
    80 GOTO 40
    BASIC HEKSIDES.BAS programı ' ya da budur ':

    Kod:
    10 DEFINT A-Z
    20 DEF SEG = &H0
    30 DEF USR0 = 0
    40 INPUT "Heksadesimal Numarayi Girin "; D
    50 N = USR0 (D) : PRINT
    60 PRINT "Desimal karsiligi : "; D
    70 PRINT
    80 GOTO 40
    Görüldüğü gibi bu program önce ASSEMBLY rutinini çağırıyor sonra geri gelen değeri ekrana gönderiyor.

    ASSEMBLY HEKSBIN&.ASM programı ' da budur ':

    _ 16-bit Sembolik Makina Dili:


    Kod:
    ;HEKSBIN& -- Heksadesimal değerleri biner değere çevirip
    ; sonucu çağıran BASIC programına yollayan ASSEMBLY rutini.
    ;
    ; !!!!!! Yalnız BASIC programlarından çağırılır !!!!!!
    ;
    ;******************************************************
    ;
    heksbin   segment
    
    ana_prog  proc far
    
      assume  cs:heksbin
    ;
    ;Klavyeden heksadesimal değer gir ve bu değeri biner değere çevir!
    ;
    ;DX rejisterini başlangıç değeri olarak sıfırla!
    ;
      mov	dx, 0
    ;
    klavye_giris:
    ;
      mov	ah, 01
    
      int	21h
    ;
    ;Girilen ASCII karakterini biner değere çevir:
    ;
      sub	al, 30h
    ;
    ;Sıfırdan ufaksa program sonuna git!
    ;
      jl	cikis
    ;
    ;Girilen değer 10 sayısından ufak mı?
    ;
      cmp	al, 10
    ;
    ;Eğer ufaksa doğru bir rakam girilmiştir!
    ;
      jl	topla
    ;
    ;0 - 9 arasındaki sayıların kontrolünü yaptık.
    ;Girilen değer A - F arasında olabileceğinden
    ;ve bunun da geçerli bir heksadesimal rakamı
    ;olabileceğinden ötürü ikinci bir kontrol yapıyoruz:
    ;
      sub	al, 7h
    ;
    ;AL' deki değer 0Ah' mı?
    ;
      cmp	al, 0ah
    ;
    ;Eğer ufaksa harf değil!
    ;
      jl	cikis
    ;
    ;AL' deki değer 0Fh' dan büyük mü?
    ;
    cmp	al, 0fh
    
      jge	cikis
    ;
    ;A - F arasında geçerli bir heksadesimal rakama
    ;rastladık. Toplama işlemine devam edebiliriz!
    ;
    topla:
    ;Girilmiş olan rakamı DX rejisterindeki sayıya ilave et!
    ;
      mov	cl, 4
    
      shl	dx, cl
    
      mov	ah, 0
    
      add	dx, ax
    
      jmp	klavye_giris
    ;
    cikis:
    ;
    ;Sonucu (ki DX rejisterinde bulunmakta!) BX rejisterinin
    ;işaretlediği offset adrese yerleştir. BASIC programı
    ;geri dönen sonuç değerini bu adreste arayacaktır!
    ;
     mov	[bx], dx
    ;
    ;BASIC programına geri dön!
    ;
     retf
    
    heksbin	  ends
    ;
    ;******************************************************
    ;
    
    ;ana_prog endp
    
    end
    N.B.: Anlatım, Y. Elektronik Mühendisi Ferdâ M. Tanyeri' nin jargonuyla paraleldir.

    1. ADIM: ASSEMBLY programını editörünüzle yazıp bir .ASM kaynak kodu yaratın!

    HEKSBIN.ASM

    N.B.: Editör ile kastedilen antik [EDIT.COM | WRITE.EXE]. Hâlihazırda bunlardan ziyade NOTEPAD EXE ya da benzerleri kullanılır.

    2. ADIM: Yazdığınız programı MASM ile derleyip bir .OBJ dosyası yaratın!

    MASM.EXE HEKSBIN.ASM;

    3. ADIM: .OBJ dosyasından LINK ile bir .EXE dosyası yaratın, fakat bu işlemi yaparken LINK programının /HIGH parametresini kullanın!

    LINK.EXE HEKSBIN.OBJ /HIGH;

    Yaratılan programı BASIC bulma zorunluğunda. Belleğin hangi segment ve ofset adreslerinde bu programın bulunması gerektiğini BASIC programına bildirmek zorundayız.

    4. ADIM: DEBUG programını çağırın:

    DEBUG.EXE HEKSBIN.EXE

    5. ADIM: R komutu ile segment ve ofset adreslerini tesbit edelim:

    Kod:
    C:\>DEBUG.EXE HEKSBIN.EXE
    -
    -R
    AX=0000  BX=0000  CX=0026  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DD8  ES=0DD8  SS=9FDF  CS=9FDF  IP=0000   NV UP EI PL NZ NA PO NC
    9FDF:0000 BA0000        MOV     DX,0000
    -
    CS rejisterinin değeri 9FDF (programın segment adresi).
    IP rejisterinin değeri ise 0000 (programın ofset adresi).

    6. ADIM: Şimdi GWBASIC (veya BASICA) programını yüklemek için program ismini DEBUG'a bildirelim!

    -NGWBASIC.EXE

    7. ADIM: BASIC yorumlayıcısını yükleyelim!

    -L

    8. ADIM: BASIC yorumlayıcısını çağıralım!

    -G

    BASIC çalışmaya başlayacak ekrandaki tüm görüntüler yok olacak ve BASIC ortamının tanınmış ekranı belirecektir.

    9. ADIM: Yazdığımız BASIC programını çağıralım:

    Kod:
    Ok
    LOAD "HEKSIDES.BAS"
    Bu işlem sonunda hem BASIC hem de ASSEMBLY programları ana belleğin içinde bulunuyor. Bir sonraki adımda BASIC programına ASSEMBLY programını hangi adreste bulabileceğini bildireceğiz.

    10. ADIM: ASSEMBLY programının segment adresini BASIC programına bildirelim:

    Kod:
    20 DEF SEG = &H9FDF
    11. ADIM: ASSEMBLY programının ofset adresini BASIC programına bildirelim:

    Kod:
    30 DEF USR0 = 0
    N.B.: Aslen 11. ADIM gereksiz, zira .BAS içeriğinde mevcut. Olasılıkla " Yazım tarzı doğru olması gerektiğinden burada bulunuyor. "

    Artık programımız şu şekilde olacaktır:

    Kod:
    10 DEFINT A-Z
    20 DEF SEG = &H9FDF
    30 DEF USR0 = 0
    40 INPUT "Heksadesimal Numarayi Girin "; D
    50 N = USR0 (D) : PRINT
    60 PRINT "Desimal karsiligi : "; D
    70 PRINT
    80 GOTO 40
    12. ADIM: BASIC programımızı yeni şekliyle kaydediyoruz:

    Kod:
    Ok
    SAVE "HEKSIDES.BAS"
    Artık ilk denemeleri yapma zamanı geldi:

    13. ADIM: BASIC programınızı çalıştırın:

    Kod:
    Ok
    RUN
    Heksadesimal Numarayi Girin ? &H1000
    
    Desimal karsiligi :  4096
    
    Heksadesimal Numarayi Girin ? &H7FFF
    
    Desimal karsiligi :  32767
    
    Heksadesimal Numarayi Girin ?
    Break in 40
    Ok
    N.B.: 0000 <= Heksadesimal Numara <= 7FFFh

    Tabii ki çalışmalar her zaman bu kadar düzgün gitmeyecek ve hata arama işlemlerine başlamak zorunda kalacaksınız! 13. adımda ASSEMBLY programınız istenilen şekilde çalışmıyorsa

    -G 9FDF:0000

    DEBUG komutuyla direk olarak ASSEMBLY programının başlangıcına sıçrayabilir buradan da ASSEMBLY rutinini adım adım takip edebiliriz.

    Henüz işimiz bitmedi. Programı her seferinde DEBUG'la çağırmamak için ASSEMBLY rutinini BASIC'in beklediği bir alana direk olarak yükleyebilmek için BSAVE ve BLOAD BASIC komutlarını kullanmamız gerekiyor.

    Ana bellekte herzaman aynı adrese yüklenebilen ASSEMBLY programlarına 'biner dosyalar (binary files)' adı verilir ve bu dosyalar genelde .BIN türündendir. BASIC'ten bu tür dosyaları kaydetmek için BSAVE, tekrar geri yükleyebilmek için de BLOAD komutları kullanılır. Programın doğru çalıştığına emin olduktan sonra:

    14. ADIM: BASIC'ten ASSEMBLY rutinini BSAVE komutuyla herzaman aynı adreste çalışmak üzere kaydedelim:

    Kod:
    Ok
    DEF SEG = &H9FDF
    Ok
    BSAVE "HEKSBIN.BIN",0, &H26
    Sıfır parametresi programın ofset adresini, &h26 ise programın uzunluğunu belirtiyor. Program uzunluğunu ASSEMBLY programı derlerken yaratabilinen .LST türü dosyadan öğrenebiliriz.

    ;................................................. .................................................. ..........................................

    N.B.:

    Tüm dosyaların C' de olduğu varsayılırsa MASM' ın o değil şu kullanımıyla .LST türü dosya elde edilebilir.


    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>MASM.EXE HEKSBIN.ASM, ,;

    Kod:
    Open procedures: ANA_PROG
    Open procedures: ANA_PROG
    
      50416 + 440416 Bytes symbol space free
    
          0 Warning Errors
          1 Severe  Errors
    
    C:\>DIR HEKSBIN.*
     C sürücüsündeki birimin etiketi yok.
     Birim Seri Numarası: 40DA-CC8A
    
     C:\ dizini
    
    05/17/2025  00:00             1,775 HEKSBIN.ASM
    05/17/2025  00:00             4,192 HEKSBIN.LST
                   2 Dosya            5,967 bayt
                   0 Dizin   12,275,200,000 bayt boş
    
    C:\>

    .OBJ & .LST oluşması gerekirken sadece .LST dosyası oluştu. Hatanın nedeni de .ASM' nin şu satırındaki ; yüzündendir:

    ;ana_prog endp

    ; kaldırılırsa hata önlenir ve .OBJ & .LST dosyaları oluşur.

    Ne var ki, .ASM, özde tekil ya da bağımsız bir modül değildir, bu yüzden de ANA_PROG prosedürü kapatılmamalıdır. Hülasa,

    _ Burada Severe Error falan yoktur, bu bir. " .OBJ oluşturulamadığından bu mesaj ekrana gönderilmektedir. "

    _ ; kaldırılmamalıdır, bu iki.

    _ MASM.EXE HEKSBIN.ASM; ile .OBJ, ardından da MASM.EXE HEKSBIN.ASM, ,; kullanımıyla HEKSBIN.LST oluşturulur, bu da üç.

    Aslında ; kaldırılsa da kaldırılmasa da, en azından bu .BAS & .ASM ikilisi için değişen bir şey olmaz. Zaten benzeri bir durum " DESIHEKS.BAS: 60 D = USR0 (N) " için Y. Elektronik Mühendisi Ferdâ M. Tanyeri ne diyordu_? : )


    Heksadesimal sayıyı ekrana gönderme işini ASSEMBLY'den yapacağımızdan bu satırdaki D değişkeninin bir kullanımı yok. Yazım tarzı doğru olması gerektiğinden burada bulunuyor.

    ;................................................. .................................................. ..........................................

    Tabii ki BASIC programına da ASSEMBLY rutinini hangi adreste araması gerektiğini bildirmemiz lazım:

    15. ADIM: BASIC programına bir satır ilave ediyoruz:

    Kod:
    25 BLOAD "HEKSBIN.BIN",0
    BSAVE komutunda olduğu gibi program uzunluğunu belirtmemize gerek yok!

    16. ADIM: BASIC programımızı son şekliyle kaydediyoruz:

    Kod:
    Ok
    SAVE "HEKSIDES.BAS"
    Ok
    BASIC programımızın son şekli şöyle olacaktır:

    Kod:
    10 DEFINT A-Z
    20 DEF SEG = &H9FDF
    25 BLOAD "HEKSBIN.BIN",0
    30 DEF USR0 = 0
    40 INPUT "Heksadesimal Numarayi Girin "; D
    50 N = USR0 (D) : PRINT
    60 PRINT "Desimal karsiligi : "; D
    70 PRINT
    80 GOTO 40
    Herşeyi tamamladık. Artık BASIC programımızı direk olarak çalıştırabiliriz:

    GWBASIC HEKSIDES

    komutu ile bu çağırma işlemini gerçekleştiririz. Unutmayalım ki biner bir dosya olarak sakladığımız 'HEKSBIN&.BIN' dosyası içinde bulunduğumuz çalışma alanında olmalıdır.

    Kod:
    Microsoft(R) Windows DOS
    (C)Telif Hakkı Microsoft Corp 1990-2001.
    
    C:\>MASM.EXE HEKSBIN.ASM;

    Kod:
    Open procedures: ANA_PROG
    
      50960 + 439872 Bytes symbol space free
    
          0 Warning Errors
          0 Severe  Errors
    Kod:
    C:\>LINK.EXE HEKSBIN.OBJ /HIGH;
    Kod:
    LINK : warning L4021: no stack segment
    
    C:\>DEBUG.EXE HEKSBIN.EXE
    -
    -R
    AX=0000  BX=0000  CX=0026  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
    DS=0DD8  ES=0DD8  SS=9FDF  CS=9FDF  IP=0000   NV UP EI PL NZ NA PO NC
    9FDF:0000 BA0000        MOV     DX,0000
    -
    -NGWBASIC.EXE
    -L
    -G
    
    GW-BASIC 3.23
    (C) Copyright Microsoft 1983,1984,1985,1986,1987,1988
    60300 Bytes free
    Ok
    LOAD "HEKSIDES.BAS"
    Ok
    20 DEF SEG = &H9FDF
    30 DEF USR0 = 0
    SAVE "HEKSIDES.BAS"
    Ok
    RUN
    Heksadesimal Numarayi Girin ? &H1000
    
    Desimal karsiligi :  4096
    
    Heksadesimal Numarayi Girin ? &H7FFF
    
    Desimal karsiligi :  32767
    
    Heksadesimal Numarayi Girin ?
    Break in 40
    Ok
    DEF SEG = &H9FDF
    Ok
    BSAVE "HEKSBIN.BIN",0, &H26
    Ok
    25 BLOAD "HEKSBIN.BIN",0
    SAVE "HEKSIDES.BAS"
    Ok
    LIST
    10 DEFINT A-Z
    20 DEF SEG = &H9FDF
    25 BLOAD "HEKSBIN.BIN",0
    30 DEF USR0 = 0
    40 INPUT "Heksadesimal Numarayi Girin "; D
    50 N = USR0 (D) : PRINT
    60 PRINT "Desimal karsiligi : "; D
    70 PRINT
    80 GOTO 40
    Ok
    
    1LIST   2RUN<-   3LOAD"  4SAVE"  5CONT<-  6,"LPT1 7TRON<-  8TROFF<- 9KEY    0SCREEN
    DS=0DD8  ES=0DD8  SS=9FDF  CS=9FDF  IP=0000   NV UP EI PL NZ NA PO NC
    9FDF:0000 BA0000        MOV     DX,0000
    -
    -NGWBASIC.EXE
    -L
    -G




    Teknik yazılardan bunalan dostlarımız ve eski dostumuz Anthis için:





    İ ç t e n l i k l e...

    Sevgiyle...

FACEBOOK'TA PAYLAŞ

Konuya Mesaj Yazanlar: 1

profesyonel web tasarım
© Copyright 2021. Tüm Hakları Saklıdır. Çizgili Kitap | Çizgili Kitap Forum Kuralları