Diskuze: Zápis souborového systému na disk

Assembler Zápis souborového systému na disk

Avatar
Domiy
Neregistrovaný
Avatar
Domiy:

Zdravím...
Místo dlouhého studování existujících systémů se mi vyplatí udělat svůj vlastní a pro 3 základní platformy ovladače k němu... Tedy vpodstatě jej již mám - ostatně co je na tom těžkého... Jediné co netuším - jak jej na disk zapsat? Tedy vymyslel jsem si řád adres, souborů atd. Jasně - bude to asi přes přerušení, či tak něco. Ovšem jak?
Díky.

 
Odpovědět 13.6.2013 14:34
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ahoj,

mohl bys to trochu rozvést? V jakém formátu ty ovladače toho souborového systému máš? A problém máš tedy s formátováním svazku (oddílu) tím tvým systémem? Nebo je ti jinak?

U Windows je to tak, že pokud u nějakého diskového oddílu nerozpoznají souborový systém, tak se ten oddíl namountuje se souborovým systémem RAW, který dovoluje zápis a čtení sektorů. Namountovat by se to mělo normálně pod písmenem jako jiné svazky. Pak by stačilo přímým přístupem k tomu oddílu provést formátování (Windows API funkce CreateFile, WriteFile a CloseHandle).

Bohužel jsem vlastní souborový systém nikdy nepsal a ani se nesnažil manuálně integrovat do Windows (ani jiného OS), takže tady asi nepomůžu.

Nahoru Odpovědět 13.6.2013 18:18
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Domiy:

Souborový systém mám zapsaný v Assembly tím způsobem - jako by disk již byl naformátovaný. Potřebuji jen disk naformátovat... Jak jsem psal - na té a té adrese očekávám to a to... (Jen to tam musí být.) Jinak - na mě jedině s Unixem.

 
Nahoru Odpovědět 13.6.2013 18:25
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Na Unixu (pokud to není věc pouze Linuxu, v těchto OSech se prakticky neorientuju) by ten zápis mohl jít řešit zápisem do souboru /dev/sdaX či /dev/hdaX (X je přirozené číslo), které reprezentují zařízení pevných disků (asi budou existovat i soubory reprezentující jednotlivé diskové oddíly). Pak by asi stačilo použít standardní Cčkové funkce (fopen, fseek, fwrite, fclose) na provedení formátování.

Pokud to chceš formátovat v rámci kernel driveru, tak asi bude třeba posílat příslušnému diskovému zařízení požadavky na zápis na dané adresy. Ale tady vůbec nevím, jak to funguje. Vím, jak to funguje na Windows a myslím si, že to na jiných operačních systémech bude implementováno podobným způsobem.

Přes přerušení se, pokud vím, přistupovalo k disku (a k jiným službám) v operačním systému MS-DOS (přerušení 13h pro disk). Nemyslím, že by tento způsob byl přenositelný na *NIX. Tedy, pokud chceš formátovat z usermodu (třeba přes ty standardní funkce), tak to možná přes přerušení bude realizováno, protože bude docházet k systémovým voláním (na Linuxu snad ještě pořád přerušení 50h, nebo nějaké speciální instrukce typu SYSTENTER či SYSCALL).

Nahoru Odpovědět 14.6.2013 11:53
2 + 2 = 5 for extremely large values of 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Domiy
Kit:

Zkus nějakou databázi, například SQLite, na kterou se připojíš přes FUSE.

Nahoru Odpovědět 14.6.2013 13:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Kit
Domiy:

Jak mi pomůže databáze? Chci jen vytvořit tabulku přerušení, asi 10 souborů pro správu identifikace, přístupu atd. A pak dynamický prostor pro systémové funkce, které budou mít data přerušení v té tabulce, co bude v prvním sektoru. Pak budu moci přerušovat jako v Unixu do kernelu - zde do funkcí... (Do BIOSu dám jen most.) To znamená, že vše jsou vlastně soubory + adresa HDD paměti pro normální soubory a složky... (Jejich adresy již budou spravovány v několika z těch cca 10 souborů.) Přistupovat k těm 10ti souborům by bylo nejpohodlnější zase přes nějaké přerušení... (Spravující spustitelné soubory by byly v té dynamické paměti s polu s dalšími funkcemi jako TTY výpis (Mnohem prorpacovanější, než "10h AH = 09h".) atp.)

 
Nahoru Odpovědět 14.6.2013 14:13
Avatar
Domiy
Neregistrovaný
Avatar
Domiy:

Jeee - dd - no jasně... :)

Jen - jak to udělám s tím hlavním adresářem?

 
Nahoru Odpovědět 14.6.2013 14:45
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Kit
Domiy:

Tak jsem disassembleroval FAT32 a dostal:

00000000  EB58              jmp short 0x5a
00000002  90                nop
00000003  46                inc si
00000004  52                push dx
00000005  44                inc sp
00000006  4F                dec di
00000007  53                push bx
00000008  352E31            xor ax,0x312e
0000000B  0002              add [bp+si],al
0000000D  0820              or [bx+si],ah
0000000F  0002              add [bp+si],al
00000011  0000              add [bx+si],al
00000013  0000              add [bx+si],al
00000015  F8                clc
00000016  0000              add [bx+si],al
00000018  3F                aas
00000019  0012              add [bp+si],dl
0000001B  002C              add [si],ch
0000001D  C7                db 0xc7
0000001E  A800              test al,0x0
00000020  BCFA63            mov sp,0x63fa
00000023  00F3              add bl,dh
00000025  1800              sbb [bx+si],al
00000027  0000              add [bx+si],al
00000029  0000              add [bx+si],al
0000002B  0002              add [bp+si],al
0000002D  0000              add [bx+si],al
0000002F  0001              add [bx+di],al
00000031  00060000          add [0x0],al
00000035  0000              add [bx+si],al
00000037  0000              add [bx+si],al
00000039  0000              add [bx+si],al
0000003B  0000              add [bx+si],al
0000003D  0000              add [bx+si],al
0000003F  00800029          add [bx+si+0x2900],al
00000043  FB                sti
00000044  0B4837            or cx,[bx+si+0x37]
00000047  46                inc si
00000048  52                push dx
00000049  45                inc bp
0000004A  45                inc bp
0000004B  44                inc sp
0000004C  4F                dec di
0000004D  53                push bx
0000004E  3230              xor dh,[bx+si]
00000050  3132              xor [bp+si],si
00000052  46                inc si
00000053  41                inc cx
00000054  54                push sp
00000055  3332              xor si,[bp+si]
00000057  2020              and [bx+si],ah
00000059  20FC              and ah,bh
0000005B  FA                cli
0000005C  29C0              sub ax,ax
0000005E  8ED8              mov ds,ax
00000060  BD007C            mov bp,0x7c00
00000063  B8E01F            mov ax,0x1fe0
00000066  8EC0              mov es,ax
00000068  89EE              mov si,bp
0000006A  89EF              mov di,bp
0000006C  B90001            mov cx,0x100
0000006F  F3A5              rep movsw
00000071  EA7A7CE01F        jmp word 0x1fe0:0x7c7a
00000076  0000              add [bx+si],al
00000078  60                pushaw
00000079  008ED88E          add [bp-0x7128],cl
0000007D  D08D66E0          ror byte [di-0x1f9a],1
00000081  FB                sti
00000082  885640            mov [bp+0x40],dl
00000085  BEC17D            mov si,0x7dc1
00000088  E8F400            call word 0x17f
0000008B  6631C0            xor eax,eax
0000008E  66894644          mov [bp+0x44],eax
00000092  8B460E            mov ax,[bp+0xe]
00000095  6603461C          add eax,[bp+0x1c]
00000099  66894648          mov [bp+0x48],eax
0000009D  6689464C          mov [bp+0x4c],eax
000000A1  668B4610          mov eax,[bp+0x10]
000000A5  66F76E24          imul dword [bp+0x24]
000000A9  6601464C          add [bp+0x4c],eax
000000AD  B80002            mov ax,0x200
000000B0  3B460B            cmp ax,[bp+0xb]
000000B3  7408              jz 0xbd
000000B5  01C0              add ax,ax
000000B7  FF06347D          inc word [0x7d34]
000000BB  EBF3              jmp short 0xb0
000000BD  668B462C          mov eax,[bp+0x2c]
000000C1  6650              push eax
000000C3  E89400            call word 0x15a
000000C6  724D              jc 0x115
000000C8  C45E76            les bx,[bp+0x76]
000000CB  E8B700            call word 0x185
000000CE  31FF              xor di,di
000000D0  B90B00            mov cx,0xb
000000D3  BEF17D            mov si,0x7df1
000000D6  F3A6              repe cmpsb
000000D8  7415              jz 0xef
000000DA  83C720            add di,byte +0x20
000000DD  83E7E0            and di,byte -0x20
000000E0  3B7E0B            cmp di,[bp+0xb]
000000E3  75EB              jnz 0xd0
000000E5  4A                dec dx
000000E6  75E0              jnz 0xc8
000000E8  6658              pop eax
000000EA  E83400            call word 0x121
000000ED  EBD2              jmp short 0xc1
000000EF  26FF7509          push word [es:di+0x9]
000000F3  26FF750F          push word [es:di+0xf]
000000F7  6658              pop eax
000000F9  29DB              sub bx,bx
000000FB  6650              push eax
000000FD  E85A00            call word 0x15a
00000100  720D              jc 0x10f
00000102  E88000            call word 0x185
00000105  4A                dec dx
00000106  75FA              jnz 0x102
00000108  6658              pop eax
0000010A  E81400            call word 0x121
0000010D  EBEC              jmp short 0xfb
0000010F  8A5E40            mov bl,[bp+0x40]
00000112  FF6E76            jmp word far [bp+0x76]
00000115  BEEE7D            mov si,0x7dee
00000118  E86400            call word 0x17f
0000011B  30E4              xor ah,ah
0000011D  CD16              int 0x16
0000011F  CD19              int 0x19
00000121  06                push es
00000122  57                push di
00000123  53                push bx
00000124  89C7              mov di,ax
00000126  C1E702            shl di,0x2
00000129  50                push ax
0000012A  8B460B            mov ax,[bp+0xb]
0000012D  48                dec ax
0000012E  21C7              and di,ax
00000130  58                pop ax
00000131  66C1E807          shr eax,0x7
00000135  66034648          add eax,[bp+0x48]
00000139  BB0020            mov bx,0x2000
0000013C  8EC3              mov es,bx
0000013E  29DB              sub bx,bx
00000140  663B4644          cmp eax,[bp+0x44]
00000144  7407              jz 0x14d
00000146  66894644          mov [bp+0x44],eax
0000014A  E83800            call word 0x185
0000014D  268065030F        and byte [es:di+0x3],0xf
00000152  26668B05          mov eax,[es:di]
00000156  5B                pop bx
00000157  5F                pop di
00000158  07                pop es
00000159  C3                ret
0000015A  663DF8FFFF0F      cmp eax,0xffffff8
00000160  7315              jnc 0x177
00000162  6648              dec eax
00000164  6648              dec eax
00000166  660FB6560D        movzx edx,byte [bp+0xd]
0000016B  6652              push edx
0000016D  66F7E2            mul edx
00000170  665A              pop edx
00000172  6603464C          add eax,[bp+0x4c]
00000176  C3                ret
00000177  F9                stc
00000178  C3                ret
00000179  31DB              xor bx,bx
0000017B  B40E              mov ah,0xe
0000017D  CD10              int 0x10
0000017F  AC                lodsb
00000180  3C00              cmp al,0x0
00000182  75F5              jnz 0x179
00000184  C3                ret
00000185  52                push dx
00000186  56                push si
00000187  57                push di
00000188  6650              push eax
0000018A  89E7              mov di,sp
0000018C  6A00              push byte +0x0
0000018E  6A00              push byte +0x0
00000190  6650              push eax
00000192  06                push es
00000193  53                push bx
00000194  6A01              push byte +0x1
00000196  6A10              push byte +0x10
00000198  89E6              mov si,sp
0000019A  8A5640            mov dl,[bp+0x40]
0000019D  B442              mov ah,0x42
0000019F  CD13              int 0x13
000001A1  89FC              mov sp,di
000001A3  6658              pop eax
000001A5  7308              jnc 0x1af
000001A7  50                push ax
000001A8  30E4              xor ah,ah
000001AA  CD13              int 0x13
000001AC  58                pop ax
000001AD  EBD9              jmp short 0x188
000001AF  6640              inc eax
000001B1  035E0B            add bx,[bp+0xb]
000001B4  7307              jnc 0x1bd
000001B6  8CC2              mov dx,es
000001B8  80C610            add dh,0x10
000001BB  8EC2              mov es,dx
000001BD  5F                pop di
000001BE  5E                pop si
000001BF  5A                pop dx
000001C0  C3                ret
000001C1  4C                dec sp
000001C2  6F                outsw
000001C3  61                popaw
000001C4  64696E672046      imul bp,[fs:bp+0x67],word 0x4620
000001CA  7265              jc 0x231
000001CC  6544              gs inc sp
000001CE  4F                dec di
000001CF  53                push bx
000001D0  2000              and [bx+si],al
000001D2  0000              add [bx+si],al
000001D4  0000              add [bx+si],al
000001D6  0000              add [bx+si],al
000001D8  0000              add [bx+si],al
000001DA  0000              add [bx+si],al
000001DC  0000              add [bx+si],al
000001DE  0000              add [bx+si],al
000001E0  0000              add [bx+si],al
000001E2  0000              add [bx+si],al
000001E4  0000              add [bx+si],al
000001E6  0000              add [bx+si],al
000001E8  0000              add [bx+si],al
000001EA  0000              add [bx+si],al
000001EC  0000              add [bx+si],al
000001EE  4E                dec si
000001EF  6F                outsw
000001F0  204B45            and [bp+di+0x45],cl
000001F3  52                push dx
000001F4  4E                dec si
000001F5  45                inc bp
000001F6  4C                dec sp
000001F7  2020              and [bx+si],ah
000001F9  53                push bx
000001FA  59                pop cx
000001FB  53                push bx
000001FC  0000              add [bx+si],al
000001FE  55                push bp
000001FF  AA                stosb
00000200  52                push dx
00000201  52                push dx
00000202  61                popaw
00000203  41                inc cx
00000204  0000              add [bx+si],al
00000206  0000              add [bx+si],al
00000208  0000              add [bx+si],al
0000020A  0000              add [bx+si],al
0000020C  0000              add [bx+si],al
0000020E  0000              add [bx+si],al
00000210  0000              add [bx+si],al
00000212  0000              add [bx+si],al
00000214  0000              add [bx+si],al
00000216  0000              add [bx+si],al
00000218  0000              add [bx+si],al
0000021A  0000              add [bx+si],al
0000021C  0000              add [bx+si],al
0000021E  0000              add [bx+si],al
00000220  0000              add [bx+si],al
00000222  0000              add [bx+si],al
00000224  0000              add [bx+si],al
00000226  0000              add [bx+si],al
00000228  0000              add [bx+si],al
0000022A  0000              add [bx+si],al
0000022C  0000              add [bx+si],al
0000022E  0000              add [bx+si],al
00000230  0000              add [bx+si],al
00000232  0000              add [bx+si],al
00000234  0000              add [bx+si],al
00000236  0000              add [bx+si],al
00000238  0000              add [bx+si],al
0000023A  0000              add [bx+si],al
0000023C  0000              add [bx+si],al
0000023E  0000              add [bx+si],al
00000240  0000              add [bx+si],al
00000242  0000              add [bx+si],al
00000244  0000              add [bx+si],al
00000246  0000              add [bx+si],al
00000248  0000              add [bx+si],al
0000024A  0000              add [bx+si],al
0000024C  0000              add [bx+si],al
0000024E  0000              add [bx+si],al
00000250  0000              add [bx+si],al
00000252  0000              add [bx+si],al
00000254  0000              add [bx+si],al
00000256  0000              add [bx+si],al
00000258  0000              add [bx+si],al
0000025A  0000              add [bx+si],al
0000025C  0000              add [bx+si],al
0000025E  0000              add [bx+si],al
00000260  0000              add [bx+si],al
00000262  0000              add [bx+si],al
00000264  0000              add [bx+si],al
00000266  0000              add [bx+si],al
00000268  0000              add [bx+si],al
0000026A  0000              add [bx+si],al
0000026C  0000              add [bx+si],al
0000026E  0000              add [bx+si],al
00000270  0000              add [bx+si],al
00000272  0000              add [bx+si],al
00000274  0000              add [bx+si],al
00000276  0000              add [bx+si],al
00000278  0000              add [bx+si],al
0000027A  0000              add [bx+si],al
0000027C  0000              add [bx+si],al
0000027E  0000              add [bx+si],al
00000280  0000              add [bx+si],al
00000282  0000              add [bx+si],al
00000284  0000              add [bx+si],al
00000286  0000              add [bx+si],al
00000288  0000              add [bx+si],al
0000028A  0000              add [bx+si],al
0000028C  0000              add [bx+si],al
0000028E  0000              add [bx+si],al
00000290  0000              add [bx+si],al
00000292  0000              add [bx+si],al
00000294  0000              add [bx+si],al
00000296  0000              add [bx+si],al
00000298  0000              add [bx+si],al
0000029A  0000              add [bx+si],al
0000029C  0000              add [bx+si],al
0000029E  0000              add [bx+si],al
000002A0  0000              add [bx+si],al
000002A2  0000              add [bx+si],al
000002A4  0000              add [bx+si],al
000002A6  0000              add [bx+si],al
000002A8  0000              add [bx+si],al
000002AA  0000              add [bx+si],al
000002AC  0000              add [bx+si],al
000002AE  0000              add [bx+si],al
000002B0  0000              add [bx+si],al
000002B2  0000              add [bx+si],al
000002B4  0000              add [bx+si],al
000002B6  0000              add [bx+si],al
000002B8  0000              add [bx+si],al
000002BA  0000              add [bx+si],al
000002BC  0000              add [bx+si],al
000002BE  0000              add [bx+si],al
000002C0  0000              add [bx+si],al
000002C2  0000              add [bx+si],al
000002C4  0000              add [bx+si],al
000002C6  0000              add [bx+si],al
000002C8  0000              add [bx+si],al
000002CA  0000              add [bx+si],al
000002CC  0000              add [bx+si],al
000002CE  0000              add [bx+si],al
000002D0  0000              add [bx+si],al
000002D2  0000              add [bx+si],al
000002D4  0000              add [bx+si],al
000002D6  0000              add [bx+si],al
000002D8  0000              add [bx+si],al
000002DA  0000              add [bx+si],al
000002DC  0000              add [bx+si],al
000002DE  0000              add [bx+si],al
000002E0  0000              add [bx+si],al
000002E2  0000              add [bx+si],al
000002E4  0000              add [bx+si],al
000002E6  0000              add [bx+si],al
000002E8  0000              add [bx+si],al
000002EA  0000              add [bx+si],al
000002EC  0000              add [bx+si],al
000002EE  0000              add [bx+si],al
000002F0  0000              add [bx+si],al
000002F2  0000              add [bx+si],al
000002F4  0000              add [bx+si],al
000002F6  0000              add [bx+si],al
000002F8  0000              add [bx+si],al
000002FA  0000              add [bx+si],al
000002FC  0000              add [bx+si],al
000002FE  0000              add [bx+si],al
00000300  0000              add [bx+si],al
00000302  0000              add [bx+si],al
00000304  0000              add [bx+si],al
00000306  0000              add [bx+si],al
00000308  0000              add [bx+si],al
0000030A  0000              add [bx+si],al
0000030C  0000              add [bx+si],al
0000030E  0000              add [bx+si],al
00000310  0000              add [bx+si],al
00000312  0000              add [bx+si],al
00000314  0000              add [bx+si],al
00000316  0000              add [bx+si],al
00000318  0000              add [bx+si],al
0000031A  0000              add [bx+si],al
0000031C  0000              add [bx+si],al
0000031E  0000              add [bx+si],al
00000320  0000              add [bx+si],al
00000322  0000              add [bx+si],al
00000324  0000              add [bx+si],al
00000326  0000              add [bx+si],al
00000328  0000              add [bx+si],al
0000032A  0000              add [bx+si],al
0000032C  0000              add [bx+si],al
0000032E  0000              add [bx+si],al
00000330  0000              add [bx+si],al
00000332  0000              add [bx+si],al
00000334  0000              add [bx+si],al
00000336  0000              add [bx+si],al
00000338  0000              add [bx+si],al
0000033A  0000              add [bx+si],al
0000033C  0000              add [bx+si],al
0000033E  0000              add [bx+si],al
00000340  0000              add [bx+si],al
00000342  0000              add [bx+si],al
00000344  0000              add [bx+si],al
00000346  0000              add [bx+si],al
00000348  0000              add [bx+si],al
0000034A  0000              add [bx+si],al
0000034C  0000              add [bx+si],al
0000034E  0000              add [bx+si],al
00000350  0000              add [bx+si],al
00000352  0000              add [bx+si],al
00000354  0000              add [bx+si],al
00000356  0000              add [bx+si],al
00000358  0000              add [bx+si],al
0000035A  0000              add [bx+si],al
0000035C  0000              add [bx+si],al
0000035E  0000              add [bx+si],al
00000360  0000              add [bx+si],al
00000362  0000              add [bx+si],al
00000364  0000              add [bx+si],al
00000366  0000              add [bx+si],al
00000368  0000              add [bx+si],al
0000036A  0000              add [bx+si],al
0000036C  0000              add [bx+si],al
0000036E  0000              add [bx+si],al
00000370  0000              add [bx+si],al
00000372  0000              add [bx+si],al
00000374  0000              add [bx+si],al
00000376  0000              add [bx+si],al
00000378  0000              add [bx+si],al
0000037A  0000              add [bx+si],al
0000037C  0000              add [bx+si],al
0000037E  0000              add [bx+si],al
00000380  0000              add [bx+si],al
00000382  0000              add [bx+si],al
00000384  0000              add [bx+si],al
00000386  0000              add [bx+si],al
00000388  0000              add [bx+si],al
0000038A  0000              add [bx+si],al
0000038C  0000              add [bx+si],al
0000038E  0000              add [bx+si],al
00000390  0000              add [bx+si],al
00000392  0000              add [bx+si],al
00000394  0000              add [bx+si],al
00000396  0000              add [bx+si],al
00000398  0000              add [bx+si],al
0000039A  0000              add [bx+si],al
0000039C  0000              add [bx+si],al
0000039E  0000              add [bx+si],al
000003A0  0000              add [bx+si],al
000003A2  0000              add [bx+si],al
000003A4  0000              add [bx+si],al
000003A6  0000              add [bx+si],al
000003A8  0000              add [bx+si],al
000003AA  0000              add [bx+si],al
000003AC  0000              add [bx+si],al
000003AE  0000              add [bx+si],al
000003B0  0000              add [bx+si],al
000003B2  0000              add [bx+si],al
000003B4  0000              add [bx+si],al
000003B6  0000              add [bx+si],al
000003B8  0000              add [bx+si],al
000003BA  0000              add [bx+si],al
000003BC  0000              add [bx+si],al
000003BE  0000              add [bx+si],al
000003C0  0000              add [bx+si],al
000003C2  0000              add [bx+si],al
000003C4  0000              add [bx+si],al
000003C6  0000              add [bx+si],al
000003C8  0000              add [bx+si],al
000003CA  0000              add [bx+si],al
000003CC  0000              add [bx+si],al
000003CE  0000              add [bx+si],al
000003D0  0000              add [bx+si],al
000003D2  0000              add [bx+si],al
000003D4  0000              add [bx+si],al
000003D6  0000              add [bx+si],al
000003D8  0000              add [bx+si],al
000003DA  0000              add [bx+si],al
000003DC  0000              add [bx+si],al
000003DE  0000              add [bx+si],al
000003E0  0000              add [bx+si],al
000003E2  0000              add [bx+si],al
000003E4  7272              jc 0x458
000003E6  41                inc cx
000003E7  61                popaw
000003E8  AA                stosb
000003E9  340C              xor al,0xc
000003EB  003B              add [bp+di],bh
000003ED  1100              adc [bx+si],ax
000003EF  0000              add [bx+si],al
000003F1  0000              add [bx+si],al
000003F3  0000              add [bx+si],al
000003F5  0000              add [bx+si],al
000003F7  0000              add [bx+si],al
000003F9  0000              add [bx+si],al
000003FB  0000              add [bx+si],al
000003FD  0055AA            add [di-0x56],dl
00000400  0000              add [bx+si],al
00000402  0000              add [bx+si],al
00000404  0000              add [bx+si],al
00000406  0000              add [bx+si],al
00000408  0000              add [bx+si],al
0000040A  0000              add [bx+si],al
0000040C  0000              add [bx+si],al
0000040E  0000              add [bx+si],al
00000410  0000              add [bx+si],al
00000412  0000              add [bx+si],al
00000414  0000              add [bx+si],al
00000416  0000              add [bx+si],al
00000418  0000              add [bx+si],al
0000041A  0000              add [bx+si],al
0000041C  0000              add [bx+si],al
0000041E  0000              add [bx+si],al
00000420  0000              add [bx+si],al
00000422  0000              add [bx+si],al
00000424  0000              add [bx+si],al
00000426  0000              add [bx+si],al
00000428  0000              add [bx+si],al
0000042A  0000              add [bx+si],al
0000042C  0000              add [bx+si],al
0000042E  0000              add [bx+si],al
00000430  0000              add [bx+si],al
00000432  0000              add [bx+si],al
00000434  0000              add [bx+si],al
00000436  0000              add [bx+si],al
00000438  0000              add [bx+si],al
0000043A  0000              add [bx+si],al
0000043C  0000              add [bx+si],al
0000043E  0000              add [bx+si],al
00000440  0000              add [bx+si],al
00000442  0000              add [bx+si],al
00000444  0000              add [bx+si],al
00000446  0000              add [bx+si],al
00000448  0000              add [bx+si],al
0000044A  0000              add [bx+si],al
0000044C  0000              add [bx+si],al
0000044E  0000              add [bx+si],al
00000450  0000              add [bx+si],al
00000452  0000              add [bx+si],al
00000454  0000              add [bx+si],al
00000456  0000              add [bx+si],al
00000458  0000              add [bx+si],al
0000045A  0000              add [bx+si],al
0000045C  0000              add [bx+si],al
0000045E  0000              add [bx+si],al
00000460  0000              add [bx+si],al
00000462  0000              add [bx+si],al
00000464  0000              add [bx+si],al
00000466  0000              add [bx+si],al
00000468  0000              add [bx+si],al
0000046A  0000              add [bx+si],al
0000046C  0000              add [bx+si],al
0000046E  0000              add [bx+si],al
00000470  0000              add [bx+si],al
00000472  0000              add [bx+si],al
00000474  0000              add [bx+si],al
00000476  0000              add [bx+si],al
00000478  0000              add [bx+si],al
0000047A  0000              add [bx+si],al
0000047C  0000              add [bx+si],al
0000047E  0000              add [bx+si],al
00000480  0000              add [bx+si],al
00000482  0000              add [bx+si],al
00000484  0000              add [bx+si],al
00000486  0000              add [bx+si],al
00000488  0000              add [bx+si],al
0000048A  0000              add [bx+si],al
0000048C  0000              add [bx+si],al
0000048E  0000              add [bx+si],al
00000490  0000              add [bx+si],al
00000492  0000              add [bx+si],al
00000494  0000              add [bx+si],al
00000496  0000              add [bx+si],al
00000498  0000              add [bx+si],al
0000049A  0000              add [bx+si],al
0000049C  0000              add [bx+si],al
0000049E  0000              add [bx+si],al
000004A0  0000              add [bx+si],al
000004A2  0000              add [bx+si],al
000004A4  0000              add [bx+si],al
000004A6  0000              add [bx+si],al
000004A8  0000              add [bx+si],al
000004AA  0000              add [bx+si],al
000004AC  0000              add [bx+si],al
000004AE  0000              add [bx+si],al
000004B0  0000              add [bx+si],al
000004B2  0000              add [bx+si],al
000004B4  0000              add [bx+si],al
000004B6  0000              add [bx+si],al
000004B8  0000              add [bx+si],al
000004BA  0000              add [bx+si],al
000004BC  0000              add [bx+si],al
000004BE  0000              add [bx+si],al
000004C0  0000              add [bx+si],al
000004C2  0000              add [bx+si],al
000004C4  0000              add [bx+si],al
000004C6  0000              add [bx+si],al
000004C8  0000              add [bx+si],al
000004CA  0000              add [bx+si],al
000004CC  0000              add [bx+si],al
000004CE  0000              add [bx+si],al
000004D0  0000              add [bx+si],al
000004D2  0000              add [bx+si],al
000004D4  0000              add [bx+si],al
000004D6  0000              add [bx+si],al
000004D8  0000              add [bx+si],al
000004DA  0000              add [bx+si],al
000004DC  0000              add [bx+si],al
000004DE  0000              add [bx+si],al
000004E0  0000              add [bx+si],al
000004E2  0000              add [bx+si],al
000004E4  0000              add [bx+si],al
000004E6  0000              add [bx+si],al
000004E8  0000              add [bx+si],al
000004EA  0000              add [bx+si],al
000004EC  0000              add [bx+si],al
000004EE  0000              add [bx+si],al
000004F0  0000              add [bx+si],al
000004F2  0000              add [bx+si],al
000004F4  0000              add [bx+si],al
000004F6  0000              add [bx+si],al
000004F8  0000              add [bx+si],al
000004FA  0000              add [bx+si],al
000004FC  0000              add [bx+si],al
000004FE  0000              add [bx+si],al
00000500  0000              add [bx+si],al
00000502  0000              add [bx+si],al
00000504  0000              add [bx+si],al
00000506  0000              add [bx+si],al
00000508  0000              add [bx+si],al
0000050A  0000              add [bx+si],al
0000050C  0000              add [bx+si],al
0000050E  0000              add [bx+si],al
00000510  0000              add [bx+si],al
00000512  0000              add [bx+si],al
00000514  0000              add [bx+si],al
00000516  0000              add [bx+si],al
00000518  0000              add [bx+si],al
0000051A  0000              add [bx+si],al
0000051C  0000              add [bx+si],al
0000051E  0000              add [bx+si],al
00000520  0000              add [bx+si],al
00000522  0000              add [bx+si],al
00000524  0000              add [bx+si],al
00000526  0000              add [bx+si],al
00000528  0000              add [bx+si],al
0000052A  0000              add [bx+si],al
0000052C  0000              add [bx+si],al
0000052E  0000              add [bx+si],al
00000530  0000              add [bx+si],al
00000532  0000              add [bx+si],al
00000534  0000              add [bx+si],al
00000536  0000              add [bx+si],al
00000538  0000              add [bx+si],al
0000053A  0000              add [bx+si],al
0000053C  0000              add [bx+si],al
0000053E  0000              add [bx+si],al
00000540  0000              add [bx+si],al
00000542  0000              add [bx+si],al
00000544  0000              add [bx+si],al
00000546  0000              add [bx+si],al
00000548  0000              add [bx+si],al
0000054A  0000              add [bx+si],al
0000054C  0000              add [bx+si],al
0000054E  0000              add [bx+si],al
00000550  0000              add [bx+si],al
00000552  0000              add [bx+si],al
00000554  0000              add [bx+si],al
00000556  0000              add [bx+si],al
00000558  0000              add [bx+si],al
0000055A  0000              add [bx+si],al
0000055C  0000              add [bx+si],al
0000055E  0000              add [bx+si],al
00000560  0000              add [bx+si],al
00000562  0000              add [bx+si],al
00000564  0000              add [bx+si],al
00000566  0000              add [bx+si],al
00000568  0000              add [bx+si],al
0000056A  0000              add [bx+si],al
0000056C  0000              add [bx+si],al
0000056E  0000              add [bx+si],al
00000570  0000              add [bx+si],al
00000572  0000              add [bx+si],al
00000574  0000              add [bx+si],al
00000576  0000              add [bx+si],al
00000578  0000              add [bx+si],al
0000057A  0000              add [bx+si],al
0000057C  0000              add [bx+si],al
0000057E  0000              add [bx+si],al
00000580  0000              add [bx+si],al
00000582  0000              add [bx+si],al
00000584  0000              add [bx+si],al
00000586  0000              add [bx+si],al
00000588  0000              add [bx+si],al
0000058A  0000              add [bx+si],al
0000058C  0000              add [bx+si],al
0000058E  0000              add [bx+si],al
00000590  0000              add [bx+si],al
00000592  0000              add [bx+si],al
00000594  0000              add [bx+si],al
00000596  0000              add [bx+si],al
00000598  0000              add [bx+si],al
0000059A  0000              add [bx+si],al
0000059C  0000              add [bx+si],al
0000059E  0000              add [bx+si],al
000005A0  0000              add [bx+si],al
000005A2  0000              add [bx+si],al
000005A4  0000              add [bx+si],al
000005A6  0000              add [bx+si],al
000005A8  0000              add [bx+si],al
000005AA  0000              add [bx+si],al
000005AC  0000              add [bx+si],al
000005AE  0000              add [bx+si],al
000005B0  0000              add [bx+si],al
000005B2  0000              add [bx+si],al
000005B4  0000              add [bx+si],al
000005B6  0000              add [bx+si],al
000005B8  0000              add [bx+si],al
000005BA  0000              add [bx+si],al
000005BC  0000              add [bx+si],al
000005BE  0000              add [bx+si],al
000005C0  0000              add [bx+si],al
000005C2  0000              add [bx+si],al
000005C4  0000              add [bx+si],al
000005C6  0000              add [bx+si],al
000005C8  0000              add [bx+si],al
000005CA  0000              add [bx+si],al
000005CC  0000              add [bx+si],al
000005CE  0000              add [bx+si],al
000005D0  0000              add [bx+si],al
000005D2  0000              add [bx+si],al
000005D4  0000              add [bx+si],al
000005D6  0000              add [bx+si],al
000005D8  0000              add [bx+si],al
000005DA  0000              add [bx+si],al
000005DC  0000              add [bx+si],al
000005DE  0000              add [bx+si],al
000005E0  0000              add [bx+si],al
000005E2  0000              add [bx+si],al
000005E4  0000              add [bx+si],al
000005E6  0000              add [bx+si],al
000005E8  0000              add [bx+si],al
000005EA  0000              add [bx+si],al
000005EC  0000              add [bx+si],al
000005EE  0000              add [bx+si],al
000005F0  0000              add [bx+si],al
000005F2  0000              add [bx+si],al
000005F4  0000              add [bx+si],al
000005F6  0000              add [bx+si],al
000005F8  0000              add [bx+si],al
000005FA  0000              add [bx+si],al
000005FC  0000              add [bx+si],al
000005FE  55                push bp
000005FF  AA                stosb
00000600  0000              add [bx+si],al
00000602  0000              add [bx+si],al
00000604  0000              add [bx+si],al
00000606  0000              add [bx+si],al
00000608  0000              add [bx+si],al
0000060A  0000              add [bx+si],al
0000060C  0000              add [bx+si],al
0000060E  0000              add [bx+si],al
00000610  0000              add [bx+si],al
00000612  0000              add [bx+si],al
00000614  0000              add [bx+si],al
00000616  0000              add [bx+si],al
00000618  0000              add [bx+si],al
0000061A  0000              add [bx+si],al
0000061C  0000              add [bx+si],al
0000061E  0000              add [bx+si],al
00000620  0000              add [bx+si],al
00000622  0000              add [bx+si],al
00000624  0000              add [bx+si],al
00000626  0000              add [bx+si],al
00000628  0000              add [bx+si],al
0000062A  0000              add [bx+si],al
0000062C  0000              add [bx+si],al
0000062E  0000              add [bx+si],al
00000630  0000              add [bx+si],al
00000632  0000              add [bx+si],al
00000634  0000              add [bx+si],al
00000636  0000              add [bx+si],al
00000638  0000              add [bx+si],al
0000063A  0000              add [bx+si],al
0000063C  0000              add [bx+si],al
0000063E  0000              add [bx+si],al
00000640  0000              add [bx+si],al
00000642  0000              add [bx+si],al
00000644  0000              add [bx+si],al
00000646  0000              add [bx+si],al
00000648  0000              add [bx+si],al
0000064A  0000              add [bx+si],al
0000064C  0000              add [bx+si],al
0000064E  0000              add [bx+si],al
00000650  0000              add [bx+si],al
00000652  0000              add [bx+si],al
00000654  0000              add [bx+si],al
00000656  0000              add [bx+si],al
00000658  0000              add [bx+si],al
0000065A  0000              add [bx+si],al
0000065C  0000              add [bx+si],al
0000065E  0000              add [bx+si],al
00000660  0000              add [bx+si],al
00000662  0000              add [bx+si],al
00000664  0000              add [bx+si],al
00000666  0000              add [bx+si],al
00000668  0000              add [bx+si],al
0000066A  0000              add [bx+si],al
0000066C  0000              add [bx+si],al
0000066E  0000              add [bx+si],al
00000670  0000              add [bx+si],al
00000672  0000              add [bx+si],al
00000674  0000              add [bx+si],al
00000676  0000              add [bx+si],al
00000678  0000              add [bx+si],al
0000067A  0000              add [bx+si],al
0000067C  0000              add [bx+si],al
0000067E  0000              add [bx+si],al
00000680  0000              add [bx+si],al
00000682  0000              add [bx+si],al
00000684  0000              add [bx+si],al
00000686  0000              add [bx+si],al
00000688  0000              add [bx+si],al
0000068A  0000              add [bx+si],al
0000068C  0000              add [bx+si],al
0000068E  0000              add [bx+si],al
00000690  0000              add [bx+si],al
00000692  0000              add [bx+si],al
00000694  0000              add [bx+si],al
00000696  0000              add [bx+si],al
00000698  0000              add [bx+si],al
0000069A  0000              add [bx+si],al
0000069C  0000              add [bx+si],al
0000069E  0000              add [bx+si],al
000006A0  0000              add [bx+si],al
000006A2  0000              add [bx+si],al
000006A4  0000              add [bx+si],al
000006A6  0000              add [bx+si],al
000006A8  0000              add [bx+si],al
000006AA  0000              add [bx+si],al
000006AC  0000              add [bx+si],al
000006AE  0000              add [bx+si],al
000006B0  0000              add [bx+si],al
000006B2  0000              add [bx+si],al
000006B4  0000              add [bx+si],al
000006B6  0000              add [bx+si],al
000006B8  0000              add [bx+si],al
000006BA  0000              add [bx+si],al
000006BC  0000              add [bx+si],al
000006BE  0000              add [bx+si],al
000006C0  0000              add [bx+si],al
000006C2  0000              add [bx+si],al
000006C4  0000              add [bx+si],al
000006C6  0000              add [bx+si],al
000006C8  0000              add [bx+si],al
000006CA  0000              add [bx+si],al
000006CC  0000              add [bx+si],al
000006CE  0000              add [bx+si],al
000006D0  0000              add [bx+si],al
000006D2  0000              add [bx+si],al
000006D4  0000              add [bx+si],al
000006D6  0000              add [bx+si],al
000006D8  0000              add [bx+si],al
000006DA  0000              add [bx+si],al
000006DC  0000              add [bx+si],al
000006DE  0000              add [bx+si],al
000006E0  0000              add [bx+si],al
000006E2  0000              add [bx+si],al
000006E4  0000              add [bx+si],al
000006E6  0000              add [bx+si],al
000006E8  0000              add [bx+si],al
000006EA  0000              add [bx+si],al
000006EC  0000              add [bx+si],al
000006EE  0000              add [bx+si],al
000006F0  0000              add [bx+si],al
000006F2  0000              add [bx+si],al
000006F4  0000              add [bx+si],al
000006F6  0000              add [bx+si],al
000006F8  0000              add [bx+si],al
000006FA  0000              add [bx+si],al
000006FC  0000              add [bx+si],al
000006FE  0000              add [bx+si],al
00000700  0000              add [bx+si],al
00000702  0000              add [bx+si],al
00000704  0000              add [bx+si],al
00000706  0000              add [bx+si],al
00000708  0000              add [bx+si],al
0000070A  0000              add [bx+si],al
0000070C  0000              add [bx+si],al
0000070E  0000              add [bx+si],al
00000710  0000              add [bx+si],al
00000712  0000              add [bx+si],al
00000714  0000              add [bx+si],al
00000716  0000              add [bx+si],al
00000718  0000              add [bx+si],al
0000071A  0000              add [bx+si],al
0000071C  0000              add [bx+si],al
0000071E  0000              add [bx+si],al
00000720  0000              add [bx+si],al
00000722  0000              add [bx+si],al
00000724  0000              add [bx+si],al
00000726  0000              add [bx+si],al
00000728  0000              add [bx+si],al
0000072A  0000              add [bx+si],al
0000072C  0000              add [bx+si],al
0000072E  0000              add [bx+si],al
00000730  0000              add [bx+si],al
00000732  0000              add [bx+si],al
00000734  0000              add [bx+si],al
00000736  0000              add [bx+si],al
00000738  0000              add [bx+si],al
0000073A  0000              add [bx+si],al
0000073C  0000              add [bx+si],al
0000073E  0000              add [bx+si],al
00000740  0000              add [bx+si],al
00000742  0000              add [bx+si],al
00000744  0000              add [bx+si],al
00000746  0000              add [bx+si],al
00000748  0000              add [bx+si],al
0000074A  0000              add [bx+si],al
0000074C  0000              add [bx+si],al
0000074E  0000              add [bx+si],al
00000750  0000              add [bx+si],al
00000752  0000              add [bx+si],al
00000754  0000              add [bx+si],al
00000756  0000              add [bx+si],al
00000758  0000              add [bx+si],al
0000075A  0000              add [bx+si],al
0000075C  0000              add [bx+si],al
0000075E  0000              add [bx+si],al
00000760  0000              add [bx+si],al
00000762  0000              add [bx+si],al
00000764  0000              add [bx+si],al
00000766  0000              add [bx+si],al
00000768  0000              add [bx+si],al
0000076A  0000              add [bx+si],al
0000076C  0000              add [bx+si],al
0000076E  0000              add [bx+si],al
00000770  0000              add [bx+si],al
00000772  0000              add [bx+si],al
00000774  0000              add [bx+si],al
00000776  0000              add [bx+si],al
00000778  0000              add [bx+si],al
0000077A  0000              add [bx+si],al
0000077C  0000              add [bx+si],al
0000077E  0000              add [bx+si],al
00000780  0000              add [bx+si],al
00000782  0000              add [bx+si],al
00000784  0000              add [bx+si],al
00000786  0000              add [bx+si],al
00000788  0000              add [bx+si],al
0000078A  0000              add [bx+si],al
0000078C  0000              add [bx+si],al
0000078E  0000              add [bx+si],al
00000790  0000              add [bx+si],al
00000792  0000              add [bx+si],al
00000794  0000              add [bx+si],al
00000796  0000              add [bx+si],al
00000798  0000              add [bx+si],al
0000079A  0000              add [bx+si],al
0000079C  0000              add [bx+si],al
0000079E  0000              add [bx+si],al
000007A0  0000              add [bx+si],al
000007A2  0000              add [bx+si],al
000007A4  0000              add [bx+si],al
000007A6  0000              add [bx+si],al
000007A8  0000              add [bx+si],al
000007AA  0000              add [bx+si],al
000007AC  0000              add [bx+si],al
000007AE  0000              add [bx+si],al
000007B0  0000              add [bx+si],al
000007B2  0000              add [bx+si],al
000007B4  0000              add [bx+si],al
000007B6  0000              add [bx+si],al
000007B8  0000              add [bx+si],al
000007BA  0000              add [bx+si],al
000007BC  0000              add [bx+si],al
000007BE  0000              add [bx+si],al
000007C0  0000              add [bx+si],al
000007C2  0000              add [bx+si],al
000007C4  0000              add [bx+si],al
000007C6  0000              add [bx+si],al
000007C8  0000              add [bx+si],al
000007CA  0000              add [bx+si],al
000007CC  0000              add [bx+si],al
000007CE  0000              add [bx+si],al
000007D0  0000              add [bx+si],al
000007D2  0000              add [bx+si],al
000007D4  0000              add [bx+si],al
000007D6  0000              add [bx+si],al
000007D8  0000              add [bx+si],al
000007DA  0000              add [bx+si],al
000007DC  0000              add [bx+si],al
000007DE  0000              add [bx+si],al
000007E0  0000              add [bx+si],al
000007E2  0000              add [bx+si],al
000007E4  0000              add [bx+si],al
000007E6  0000              add [bx+si],al
000007E8  0000              add [bx+si],al
000007EA  0000              add [bx+si],al
000007EC  0000              add [bx+si],al
000007EE  0000              add [bx+si],al
000007F0  0000              add [bx+si],al
000007F2  0000              add [bx+si],al
000007F4  0000              add [bx+si],al
000007F6  0000              add [bx+si],al
000007F8  0000              add [bx+si],al
000007FA  0000              add [bx+si],al
000007FC  0000              add [bx+si],al
000007FE  0000              add [bx+si],al
00000800  0000              add [bx+si],al
00000802  0000              add [bx+si],al
00000804  0000              add [bx+si],al
00000806  0000              add [bx+si],al
00000808  0000              add [bx+si],al
0000080A  0000              add [bx+si],al
0000080C  0000              add [bx+si],al
0000080E  0000              add [bx+si],al
00000810  0000              add [bx+si],al
00000812  0000              add [bx+si],al
00000814  0000              add [bx+si],al
00000816  0000              add [bx+si],al
00000818  0000              add [bx+si],al
0000081A  0000              add [bx+si],al
0000081C  0000              add [bx+si],al
0000081E  0000              add [bx+si],al
00000820  0000              add [bx+si],al
00000822  0000              add [bx+si],al
00000824  0000              add [bx+si],al
00000826  0000              add [bx+si],al
00000828  0000              add [bx+si],al
0000082A  0000              add [bx+si],al
0000082C  0000              add [bx+si],al
0000082E  0000              add [bx+si],al
00000830  0000              add [bx+si],al
00000832  0000              add [bx+si],al
00000834  0000              add [bx+si],al
00000836  0000              add [bx+si],al
00000838  0000              add [bx+si],al
0000083A  0000              add [bx+si],al
0000083C  0000              add [bx+si],al
0000083E  0000              add [bx+si],al
00000840  0000              add [bx+si],al
00000842  0000              add [bx+si],al
00000844  0000              add [bx+si],al
00000846  0000              add [bx+si],al
00000848  0000              add [bx+si],al
0000084A  0000              add [bx+si],al
0000084C  0000              add [bx+si],al
0000084E  0000              add [bx+si],al
00000850  0000              add [bx+si],al
00000852  0000              add [bx+si],al
00000854  0000              add [bx+si],al
00000856  0000              add [bx+si],al
00000858  0000              add [bx+si],al
0000085A  0000              add [bx+si],al
0000085C  0000              add [bx+si],al
0000085E  0000              add [bx+si],al
00000860  0000              add [bx+si],al
00000862  0000              add [bx+si],al
00000864  0000              add [bx+si],al
00000866  0000              add [bx+si],al
00000868  0000              add [bx+si],al
0000086A  0000              add [bx+si],al
0000086C  0000              add [bx+si],al
0000086E  0000              add [bx+si],al
00000870  0000              add [bx+si],al
00000872  0000              add [bx+si],al
00000874  0000              add [bx+si],al
00000876  0000              add [bx+si],al
00000878  0000              add [bx+si],al
0000087A  0000              add [bx+si],al
0000087C  0000              add [bx+si],al
0000087E  0000              add [bx+si],al
00000880  0000              add [bx+si],al
00000882  0000              add [bx+si],al
00000884  0000              add [bx+si],al
00000886  0000              add [bx+si],al
00000888  0000              add [bx+si],al
0000088A  0000              add [bx+si],al
0000088C  0000              add [bx+si],al
0000088E  0000              add [bx+si],al
00000890  0000              add [bx+si],al
00000892  0000              add [bx+si],al
00000894  0000              add [bx+si],al
00000896  0000              add [bx+si],al
00000898  0000              add [bx+si],al
0000089A  0000              add [bx+si],al
0000089C  0000              add [bx+si],al
0000089E  0000              add [bx+si],al
000008A0  0000              add [bx+si],al
000008A2  0000              add [bx+si],al
000008A4  0000              add [bx+si],al
000008A6  0000              add [bx+si],al
000008A8  0000              add [bx+si],al
000008AA  0000              add [bx+si],al
000008AC  0000              add [bx+si],al
000008AE  0000              add [bx+si],al
000008B0  0000              add [bx+si],al
000008B2  0000              add [bx+si],al
000008B4  0000              add [bx+si],al
000008B6  0000              add [bx+si],al
000008B8  0000              add [bx+si],al
000008BA  0000              add [bx+si],al
000008BC  0000              add [bx+si],al
000008BE  0000              add [bx+si],al
000008C0  0000              add [bx+si],al
000008C2  0000              add [bx+si],al
000008C4  0000              add [bx+si],al
000008C6  0000              add [bx+si],al
000008C8  0000              add [bx+si],al
000008CA  0000              add [bx+si],al
000008CC  0000              add [bx+si],al
000008CE  0000              add [bx+si],al
000008D0  0000              add [bx+si],al
000008D2  0000              add [bx+si],al
000008D4  0000              add [bx+si],al
000008D6  0000              add [bx+si],al
000008D8  0000              add [bx+si],al
000008DA  0000              add [bx+si],al
000008DC  0000              add [bx+si],al
000008DE  0000              add [bx+si],al
000008E0  0000              add [bx+si],al
000008E2  0000              add [bx+si],al
000008E4  0000              add [bx+si],al
000008E6  0000              add [bx+si],al
000008E8  0000              add [bx+si],al
000008EA  0000              add [bx+si],al
000008EC  0000              add [bx+si],al
000008EE  0000              add [bx+si],al
000008F0  0000              add [bx+si],al
000008F2  0000              add [bx+si],al
000008F4  0000              add [bx+si],al
000008F6  0000              add [bx+si],al
000008F8  0000              add [bx+si],al
000008FA  0000              add [bx+si],al
000008FC  0000              add [bx+si],al
000008FE  0000              add [bx+si],al
00000900  0000              add [bx+si],al
00000902  0000              add [bx+si],al
00000904  0000              add [bx+si],al
00000906  0000              add [bx+si],al
00000908  0000              add [bx+si],al
0000090A  0000              add [bx+si],al
0000090C  0000              add [bx+si],al
0000090E  0000              add [bx+si],al
00000910  0000              add [bx+si],al
00000912  0000              add [bx+si],al
00000914  0000              add [bx+si],al
00000916  0000              add [bx+si],al
00000918  0000              add [bx+si],al
0000091A  0000              add [bx+si],al
0000091C  0000              add [bx+si],al
0000091E  0000              add [bx+si],al
00000920  0000              add [bx+si],al
00000922  0000              add [bx+si],al
00000924  0000              add [bx+si],al
00000926  0000              add [bx+si],al
00000928  0000              add [bx+si],al
0000092A  0000              add [bx+si],al
0000092C  0000              add [bx+si],al
0000092E  0000              add [bx+si],al
00000930  0000              add [bx+si],al
00000932  0000              add [bx+si],al
00000934  0000              add [bx+si],al
00000936  0000              add [bx+si],al
00000938  0000              add [bx+si],al
0000093A  0000              add [bx+si],al
0000093C  0000              add [bx+si],al
0000093E  0000              add [bx+si],al
00000940  0000              add [bx+si],al
00000942  0000              add [bx+si],al
00000944  0000              add [bx+si],al
00000946  0000              add [bx+si],al
00000948  0000              add [bx+si],al
0000094A  0000              add [bx+si],al
0000094C  0000              add [bx+si],al
0000094E  0000              add [bx+si],al
00000950  0000              add [bx+si],al
00000952  0000              add [bx+si],al
00000954  0000              add [bx+si],al
00000956  0000              add [bx+si],al
00000958  0000              add [bx+si],al
0000095A  0000              add [bx+si],al
0000095C  0000              add [bx+si],al
0000095E  0000              add [bx+si],al
00000960  0000              add [bx+si],al
00000962  0000              add [bx+si],al
00000964  0000              add [bx+si],al
00000966  0000              add [bx+si],al
00000968  0000              add [bx+si],al
0000096A  0000              add [bx+si],al
0000096C  0000              add [bx+si],al
0000096E  0000              add [bx+si],al
00000970  0000              add [bx+si],al
00000972  0000              add [bx+si],al
00000974  0000              add [bx+si],al
00000976  0000              add [bx+si],al
00000978  0000              add [bx+si],al
0000097A  0000              add [bx+si],al
0000097C  0000              add [bx+si],al
0000097E  0000              add [bx+si],al
00000980  0000              add [bx+si],al
00000982  0000              add [bx+si],al
00000984  0000              add [bx+si],al
00000986  0000              add [bx+si],al
00000988  0000              add [bx+si],al
0000098A  0000              add [bx+si],al
0000098C  0000              add [bx+si],al
0000098E  0000              add [bx+si],al
00000990  0000              add [bx+si],al
00000992  0000              add [bx+si],al
00000994  0000              add [bx+si],al
00000996  0000              add [bx+si],al
00000998  0000              add [bx+si],al
0000099A  0000              add [bx+si],al
0000099C  0000              add [bx+si],al
0000099E  0000              add [bx+si],al
000009A0  0000              add [bx+si],al
000009A2  0000              add [bx+si],al
000009A4  0000              add [bx+si],al
000009A6  0000              add [bx+si],al
000009A8  0000              add [bx+si],al
000009AA  0000              add [bx+si],al
000009AC  0000              add [bx+si],al
000009AE  0000              add [bx+si],al
000009B0  0000              add [bx+si],al
000009B2  0000              add [bx+si],al
000009B4  0000              add [bx+si],al
000009B6  0000              add [bx+si],al
000009B8  0000              add [bx+si],al
000009BA  0000              add [bx+si],al
000009BC  0000              add [bx+si],al
000009BE  0000              add [bx+si],al
000009C0  0000              add [bx+si],al
000009C2  0000              add [bx+si],al
000009C4  0000              add [bx+si],al
000009C6  0000              add [bx+si],al
000009C8  0000              add [bx+si],al
000009CA  0000              add [bx+si],al
000009CC  0000              add [bx+si],al
000009CE  0000              add [bx+si],al
000009D0  0000              add [bx+si],al
000009D2  0000              add [bx+si],al
000009D4  0000              add [bx+si],al
000009D6  0000              add [bx+si],al
000009D8  0000              add [bx+si],al
000009DA  0000              add [bx+si],al
000009DC  0000              add [bx+si],al
000009DE  0000              add [bx+si],al
000009E0  0000              add [bx+si],al
000009E2  0000              add [bx+si],al
000009E4  0000              add [bx+si],al
000009E6  0000              add [bx+si],al
000009E8  0000              add [bx+si],al
000009EA  0000              add [bx+si],al
000009EC  0000              add [bx+si],al
000009EE  0000              add [bx+si],al
000009F0  0000              add [bx+si],al
000009F2  0000              add [bx+si],al
000009F4  0000              add [bx+si],al
000009F6  0000              add [bx+si],al
000009F8  0000              add [bx+si],al
000009FA  0000              add [bx+si],al
000009FC  0000              add [bx+si],al
000009FE  0000              add [bx+si],al
00000A00  0000              add [bx+si],al
00000A02  0000              add [bx+si],al
00000A04  0000              add [bx+si],al
00000A06  0000              add [bx+si],al
00000A08  0000              add [bx+si],al
00000A0A  0000              add [bx+si],al
00000A0C  0000              add [bx+si],al
00000A0E  0000              add [bx+si],al
00000A10  0000              add [bx+si],al
00000A12  0000              add [bx+si],al
00000A14  0000              add [bx+si],al
00000A16  0000              add [bx+si],al
00000A18  0000              add [bx+si],al
00000A1A  0000              add [bx+si],al
00000A1C  0000              add [bx+si],al
00000A1E  0000              add [bx+si],al
00000A20  0000              add [bx+si],al
00000A22  0000              add [bx+si],al
00000A24  0000              add [bx+si],al
00000A26  0000              add [bx+si],al
00000A28  0000              add [bx+si],al
00000A2A  0000              add [bx+si],al
00000A2C  0000              add [bx+si],al
00000A2E  0000              add [bx+si],al
00000A30  0000              add [bx+si],al
00000A32  0000              add [bx+si],al
00000A34  0000              add [bx+si],al
00000A36  0000              add [bx+si],al
00000A38  0000              add [bx+si],al
00000A3A  0000              add [bx+si],al
00000A3C  0000              add [bx+si],al
00000A3E  0000              add [bx+si],al
00000A40  0000              add [bx+si],al
00000A42  0000              add [bx+si],al
00000A44  0000              add [bx+si],al
00000A46  0000              add [bx+si],al
00000A48  0000              add [bx+si],al
00000A4A  0000              add [bx+si],al
00000A4C  0000              add [bx+si],al
00000A4E  0000              add [bx+si],al
00000A50  0000              add [bx+si],al
00000A52  0000              add [bx+si],al
00000A54  0000              add [bx+si],al
00000A56  0000              add [bx+si],al
00000A58  0000              add [bx+si],al
00000A5A  0000              add [bx+si],al
00000A5C  0000              add [bx+si],al
00000A5E  0000              add [bx+si],al
00000A60  0000              add [bx+si],al
00000A62  0000              add [bx+si],al
00000A64  0000              add [bx+si],al
00000A66  0000              add [bx+si],al
00000A68  0000              add [bx+si],al
00000A6A  0000              add [bx+si],al
00000A6C  0000              add [bx+si],al
00000A6E  0000              add [bx+si],al
00000A70  0000              add [bx+si],al
00000A72  0000              add [bx+si],al
00000A74  0000              add [bx+si],al
00000A76  0000              add [bx+si],al
00000A78  0000              add [bx+si],al
00000A7A  0000              add [bx+si],al
00000A7C  0000              add [bx+si],al
00000A7E  0000              add [bx+si],al
00000A80  0000              add [bx+si],al
00000A82  0000              add [bx+si],al
00000A84  0000              add [bx+si],al
00000A86  0000              add [bx+si],al
00000A88  0000              add [bx+si],al
00000A8A  0000              add [bx+si],al
00000A8C  0000              add [bx+si],al
00000A8E  0000              add [bx+si],al
00000A90  0000              add [bx+si],al
00000A92  0000              add [bx+si],al
00000A94  0000              add [bx+si],al
00000A96  0000              add [bx+si],al
00000A98  0000              add [bx+si],al
00000A9A  0000              add [bx+si],al
00000A9C  0000              add [bx+si],al
00000A9E  0000              add [bx+si],al
00000AA0  0000              add [bx+si],al
00000AA2  0000              add [bx+si],al
00000AA4  0000              add [bx+si],al
00000AA6  0000              add [bx+si],al
00000AA8  0000              add [bx+si],al
00000AAA  0000              add [bx+si],al
00000AAC  0000              add [bx+si],al
00000AAE  0000              add [bx+si],al
00000AB0  0000              add [bx+si],al
00000AB2  0000              add [bx+si],al
00000AB4  0000              add [bx+si],al
00000AB6  0000              add [bx+si],al
00000AB8  0000              add [bx+si],al
00000ABA  0000              add [bx+si],al
00000ABC  0000              add [bx+si],al
00000ABE  0000              add [bx+si],al
00000AC0  0000              add [bx+si],al
00000AC2  0000              add [bx+si],al
00000AC4  0000              add [bx+si],al
00000AC6  0000              add [bx+si],al
00000AC8  0000              add [bx+si],al
00000ACA  0000              add [bx+si],al
00000ACC  0000              add [bx+si],al
00000ACE  0000              add [bx+si],al
00000AD0  0000              add [bx+si],al
00000AD2  0000              add [bx+si],al
00000AD4  0000              add [bx+si],al
00000AD6  0000              add [bx+si],al
00000AD8  0000              add [bx+si],al
00000ADA  0000              add [bx+si],al
00000ADC  0000              add [bx+si],al
00000ADE  0000              add [bx+si],al
00000AE0  0000              add [bx+si],al
00000AE2  0000              add [bx+si],al
00000AE4  0000              add [bx+si],al
00000AE6  0000              add [bx+si],al
00000AE8  0000              add [bx+si],al
00000AEA  0000              add [bx+si],al
00000AEC  0000              add [bx+si],al
00000AEE  0000              add [bx+si],al
00000AF0  0000              add [bx+si],al
00000AF2  0000              add [bx+si],al
00000AF4  0000              add [bx+si],al
00000AF6  0000              add [bx+si],al
00000AF8  0000              add [bx+si],al
00000AFA  0000              add [bx+si],al
00000AFC  0000              add [bx+si],al
00000AFE  0000              add [bx+si],al
00000B00  0000              add [bx+si],al
00000B02  0000              add [bx+si],al
00000B04  0000              add [bx+si],al
00000B06  0000              add [bx+si],al
00000B08  0000              add [bx+si],al
00000B0A  0000              add [bx+si],al
00000B0C  0000              add [bx+si],al
00000B0E  0000              add [bx+si],al
00000B10  0000              add [bx+si],al
00000B12  0000              add [bx+si],al
00000B14  0000              add [bx+si],al
00000B16  0000              add [bx+si],al
00000B18  0000              add [bx+si],al
00000B1A  0000              add [bx+si],al
00000B1C  0000              add [bx+si],al
00000B1E  0000              add [bx+si],al
00000B20  0000              add [bx+si],al
00000B22  0000              add [bx+si],al
00000B24  0000              add [bx+si],al
00000B26  0000              add [bx+si],al
00000B28  0000              add [bx+si],al
00000B2A  0000              add [bx+si],al
00000B2C  0000              add [bx+si],al
00000B2E  0000              add [bx+si],al
00000B30  0000              add [bx+si],al
00000B32  0000              add [bx+si],al
00000B34  0000              add [bx+si],al
00000B36  0000              add [bx+si],al
00000B38  0000              add [bx+si],al
00000B3A  0000              add [bx+si],al
00000B3C  0000              add [bx+si],al
00000B3E  0000              add [bx+si],al
00000B40  0000              add [bx+si],al
00000B42  0000              add [bx+si],al
00000B44  0000              add [bx+si],al
00000B46  0000              add [bx+si],al
00000B48  0000              add [bx+si],al
00000B4A  0000              add [bx+si],al
00000B4C  0000              add [bx+si],al
00000B4E  0000              add [bx+si],al
00000B50  0000              add [bx+si],al
00000B52  0000              add [bx+si],al
00000B54  0000              add [bx+si],al
00000B56  0000              add [bx+si],al
00000B58  0000              add [bx+si],al
00000B5A  0000              add [bx+si],al
00000B5C  0000              add [bx+si],al
00000B5E  0000              add [bx+si],al
00000B60  0000              add [bx+si],al
00000B62  0000              add [bx+si],al
00000B64  0000              add [bx+si],al
00000B66  0000              add [bx+si],al
00000B68  0000              add [bx+si],al
00000B6A  0000              add [bx+si],al
00000B6C  0000              add [bx+si],al
00000B6E  0000              add [bx+si],al
00000B70  0000              add [bx+si],al
00000B72  0000              add [bx+si],al
00000B74  0000              add [bx+si],al
00000B76  0000              add [bx+si],al
00000B78  0000              add [bx+si],al
00000B7A  0000              add [bx+si],al
00000B7C  0000              add [bx+si],al
00000B7E  0000              add [bx+si],al
00000B80  0000              add [bx+si],al
00000B82  0000              add [bx+si],al
00000B84  0000              add [bx+si],al
00000B86  0000              add [bx+si],al
00000B88  0000              add [bx+si],al
00000B8A  0000              add [bx+si],al
00000B8C  0000              add [bx+si],al
00000B8E  0000              add [bx+si],al
00000B90  0000              add [bx+si],al
00000B92  0000              add [bx+si],al
00000B94  0000              add [bx+si],al
00000B96  0000              add [bx+si],al
00000B98  0000              add [bx+si],al
00000B9A  0000              add [bx+si],al
00000B9C  0000              add [bx+si],al
00000B9E  0000              add [bx+si],al
00000BA0  0000              add [bx+si],al
00000BA2  0000              add [bx+si],al
00000BA4  0000              add [bx+si],al
00000BA6  0000              add [bx+si],al
00000BA8  0000              add [bx+si],al
00000BAA  0000              add [bx+si],al
00000BAC  0000              add [bx+si],al
00000BAE  0000              add [bx+si],al
00000BB0  0000              add [bx+si],al
00000BB2  0000              add [bx+si],al
00000BB4  0000              add [bx+si],al
00000BB6  0000              add [bx+si],al
00000BB8  0000              add [bx+si],al
00000BBA  0000              add [bx+si],al
00000BBC  0000              add [bx+si],al
00000BBE  0000              add [bx+si],al
00000BC0  0000              add [bx+si],al
00000BC2  0000              add [bx+si],al
00000BC4  0000              add [bx+si],al
00000BC6  0000              add [bx+si],al
00000BC8  0000              add [bx+si],al
00000BCA  0000              add [bx+si],al
00000BCC  0000              add [bx+si],al
00000BCE  0000              add [bx+si],al
00000BD0  0000              add [bx+si],al
00000BD2  0000              add [bx+si],al
00000BD4  0000              add [bx+si],al
00000BD6  0000              add [bx+si],al
00000BD8  0000              add [bx+si],al
00000BDA  0000              add [bx+si],al
00000BDC  0
 
Nahoru Odpovědět 14.6.2013 15:12
Avatar
Dumdych
Neregistrovaný
Avatar
Dumdych:

Dál se již jen opakuje:

add [bx+si],al

Jasně - to dorovnává prázdné místo - jaké velikosti však odpovídá jedna tato instrukce?

 
Nahoru Odpovědět 14.6.2013 15:17
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ten výstup z disassembleru vypadá jako první sektor oddílu formátovaného FAT32. Část dat jsi ale interpretoval jako instrukce. Strukturu prvního sektoru pro FAT12, FAT(16) a FAT32 najdeš třeba tady:
http://www.jadro-windows.cz/…load/fat.zip
Je to myslím oficiální popis souborových systémů FAT.

Pokud by tě zajímalo NTFS (včetně struktury prvního sektoru), tak
http://www.jadro-windows.cz/…sdoc-0.5.zip
ale to je neoficiální popis.

Nahoru Odpovědět 14.6.2013 15:19
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Ale já nechci FAT... :) Chci si na disk zapsat tabulku přerušení, 10 ovládacích souborů, hlavní adresář a dynamické místo pro funkce systému... A v neposlední řadě BootSector - který propojí BIOS a tento souborový systém a tak přeruší do kernelu. V kernelu již je správa spouštění, ukládání atd. Přerušováním do té tabulky přerušení... (Z kernelu používám systémové funkce.)

 
Nahoru Odpovědět 14.6.2013 15:51
Avatar
Kit
Redaktor
Avatar
Odpovídá na Dumdych
Kit:

Tak tohle jsi disasembloval úplně špatně. To není jedna instrukce, ale dva nulové byty.

První instrukci programu po prvním skoku máš chybně dekódovanou. Pak už se vezeš mimo.

Nahoru Odpovědět 14.6.2013 15:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Zapsat tabulku přerušení na disk? Nějak nerozumím, čeho přesně chceš dosáhnout. Tabulka vektorů přerušení se na disk neukládá. Krom toho její umístění (a způsob získání) závisí na režimu procesoru, ve kterém je vykonáván kód.

Boot. sektor (aspoň u Windows) "nepřerušuje" do kernelu. Pouze načte boot loader (soubor bootmgr či ntldr, závisí na verzi Windows) a předá mu řízení. boot loader na konci své činnosti načte kernel (popř. program winload.exe), čímž v podstatě začíná proces inicializace vlastního operačního systému.

Nahoru Odpovědět 14.6.2013 20:32
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vždyť píši, že do BIOSu dám most. V Unixu je přerušení 80h. Já chci místo spouštění mnoha funkcí do nich přerušovat - bude to přehlednější. Ale do BIOSu bych je nedostal. Tak si rozšířím tabulku přerušení do toho souborového systému... A rovnou bych to použil ke spuštění kernelu...

 
Nahoru Odpovědět 14.6.2013 21:07
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vím přesně, jak funguje přerušení:

.model tiny
.code
.186

org 100h

start:

        jmp short Interrupt.LoadIntoMemory
;*******************************************************************
;;;; our interrupt code and data goes here
.even ; lets align it on the next word boundary

Interrupt.Main:

        cli
        push ds ; save data seg
        push cs ; point ds to cs
        pop ds
        or ah, ah ; if ah = 0 then service 0
        je short Service0
        cmp ah, 01 ; if ah = 1 then service 1
        je short Service1
        cmp ah, 02 ; if ah = 2 then service 2
        je short Service2

Interrupt.End:

        pop ds ; else just return
        sti
        iret

Service0:

        mov dx, 00h ; do something simple for example
        jmp short Interrupt.End
        ; our service #1 (ah = 01h)
Service1:

        mov dx, 01h ; do something simple for example
        jmp short Interrupt.End
        ; our service #2 (ah = 02h)
Service2:

        mov dx, 02h ; do something simple for example
        jmp short Interrupt.End

OurEnd:

        ;;;; end of our interrupt code and data
;*******************************************************************

Interrupt.LoadIntoMemory:

        mov si, offset initialMessage ; display start up string
        call Console.Write
        xor bx, bx ; make es:bx point to 0000:00D0h
        mov es, bx
        mov bx, 00D0h
        mov cx, 204 ; 256 interrupts (00-FF)(-34h)

.searchIRET: ; IRET = empty record in interrupts table

        mov si, es:[bx] ; get interrupt vector address
        inc bx ; offset first (little endian)
        inc bx
        mov ax, es:[bx] ; segment second (little endian)
        inc bx
        inc bx
        cmp ax, 0F000h ; if segment => F000h then in ROM-BIOS
        jae short .notIRERT ; (if in BIOS then skip it)
        push es
        mov es, ax ; see if IRET
        mov dl, es:[si]
        pop es
        cmp dl, 0CFh ; is it IRET
        je short .foundIRET ; if so, then not used

.notIRERT:

        inc byte cIntVNum ; inc for next time
        loop .searchIRET
        mov si, offset noSpaceString ; didn't find one
        call Console.Write
        jmp short DoneErr

.foundIRET:

        mov si, offset stringFoundIRET
        call Console.Write
        mov ax, bx
        sub ax, 04 ; backup to first of vector
        call Console.WriteHex
        mov si, offset intNumString
        call Console.Write
        mov al, cIntVNum ; display current int number
        call Console.WriteHexs
        mov dl, 'h' ; print 'h'
        mov ah, 02
        int 21h
        push cs
        pop ds
        mov al, cIntVNum ; vector to change
        mov ah, 25h
        mov dx, offset cs:Interrupt.Main
        int 21h
        mov ah, 62h ; get and free environment block
        int 21h
        mov es, bx
        mov ax, es:[2Ch]
        mov es, ax
        mov ah, 49h
        int 21h
        mov dx, offset cs:OurEnd ; offset of end of our code
        shr dx, 04 ; div by 16 (make it a paragraph #)
        inc dx ; just in case
        add dx, 16 ; The PSP
        mov ax, 3100h ; service number and RC = 0
        int 21h ; TSR service

DoneErr:

        mov ah, 4Ch ; exit to DOS (no TSR)
        int 21h

Console.Write proc near uses ax dx si

.writeChar:

        mov dl, [si] ; Get character
        inc si ; Point to next one

        or dl, dl ; End of string?
        jz short .writeEnd

        mov ah, 02h
        int 21h
        jmp short .writeChar

.writeEnd:

        ret

Console.Write endp

Console.WriteHexs proc near uses ax bx dx cx

        mov bx, offset hex
        push ax
        shr al, 04h
        xlatb

        mov dl, al
        mov ah, 02
        int 21h

        pop ax
        and al, 0Fh
        xlatb

        mov dl, al
        mov ah, 02
        int 21h

        ret

Console.WriteHexs endp

Console.WriteHex proc near uses ax bx cx dx

        mov bx, offset hex
        mov cx, 04h

.hexLoop:

        push ax
        mov al, ah
        shr al, 04h
        xlatb

        mov dl, al
        mov ah, 02
        int 21h

        pop ax
        shl ax, 04h
        loop .hexLoop

        ret

Console.WriteHex endp

cIntVNum db 34h ; starting with int 34h
initialMessage db 13, 10, 'Interrupt installation started', 0
noSpaceString db 13, 10, "Empty space for interrupt not found!"
stringFoundIRET db 13, 10, ' Found an unused interrupt at:0000:', 0
intNumString db 13, 10, ' Interrupt number:', 0
hex db '0123456789ABCDEF'

.end start
 
Nahoru Odpovědět 14.6.2013 21:09
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

A tabulka se na disk ukládá - nepřišel jsem s tím první. Znám několik OS, co své funkce alespoň v základu řeší přes přerušení. Než bych se doparametrizoval a dovolal ke spuštění každé funkce, kód by s zprasil k nepoznání. Takhle jen udělám:

mov, si, System.FileSystem.ReadSector
int 100h
  • parapetrizace té funkce, ale nebudu si to kazit ještě spouštěním, které by samo o sobě potřebovalo parametrizovat... (Nehledě na zbytečnou náročnost - neustálé vyhledávání atd. V tabulce je to jasně dané...)
 
Nahoru Odpovědět 14.6.2013 21:18
Avatar
Domiy
Neregistrovaný
Avatar
Domiy:

mov, si, = mov si,

kód by s = kód by se

 
Nahoru Odpovědět 14.6.2013 21:19
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Mohl bys svůj záměr vysvětlit nějak šířejí (a třeba na příkladu)? Já totiž stále nechápu, čeho přesně chceš dosáhnout.

Jinak myslím, že přerušení 21h není při bootování dostupné, protože se nejedná o přerušení BIOSu, ale DOSu.

Nahoru Odpovědět 14.6.2013 21:22
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Děláš si srandu? To je pro uložení do prázdného místa v BIOSu. Ne pro spuštění. A jak jsi mě poučoval... :) Tohle jednou zapíši do BIOSu a tím končím... Kdyby se muselo pořád ukládat do BIOSu, jak by asi mohla fungovat ta tabulka?

Co chci jsem napsal jasně - přerušovat do funkcí systému. Místo jejich zbytečného spouštění. Tedy místo zbytečného zdržování se v rámci souborového systému s funkcemi operačního systému. To znamená, že uživatelské soubory budu pak řešit nějakou z těhto funkcí, která bude pracovat s jedním z 10 hlavních souborů souborového systému. V jednom souboru budou třeba jen jména souborů a jejich privilégia. Uživatelksé soubory chci ukládat jen pod adresou počátku a konce. Ale jméno a další data nechám v těch hlavních souborech. Tím ušetřím místo a zbavím se mnohých omezení... To jediné co potřebuji je, abych mohl z BootSectoru přerušit do svého kernelu. A z kernelu přerušovat do funkcí systému. A ty funkce systému mi umožní pracovat s diskem. Číst uživatelské soubory budu jak jsem psal - vezmu adresu začátku souboru a dosadím k ní data z hlavních 10 souborů... Konzistenci budu řešit žurnálováním...

 
Nahoru Odpovědět 14.6.2013 21:37
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Jako by tu byl nějaký Matěj se mi tak zdá...

Nahoru Odpovědět 14.6.2013 21:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
vodacek
Redaktor
Avatar
Odpovídá na David Čápka
vodacek:

jsem z toho celý přerušen, aneb někdo se naučil slovo přerušení a ted ho cpe všude

 
Nahoru Odpovědět 14.6.2013 22:51
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

No, bohužel stále nerozumíš, co přesně chceš realizovat, resp. v čem máš problém. Hlavně nechápu výraz "přerušit do svého kernelu" a "přerušovat do funkcí systému." Proto jsem se zajímal o nějaký příklad.

Nebo tím "přerušováním do funkcí systému" myslíš přímé použití přerušení 80h? Tohle já navýzám systémovým voláním.

Děláš si srandu? To je pro uložení do prázdného místa v BIOSu. Ne pro
spuštění. A jak jsi mě poučoval... Tohle jednou zapíši do BIOSu a tím
končím... Kdyby se muselo pořád ukládat do BIOSu, jak by asi mohla fungovat
ta tabulka?

A tomuhle také bohužel moc nerozumím. A do BIOSu bych být tebou zapisovat moc nezkoušel, to může být velký průšvih, pokud tam něco zapíšeš špatně, protože už bys nemuse ldostat šanci to opravit.

Ale s tou tabulkou vektorů přerušení to prostě nechápu.

Asi to celé necháme být.

Nahoru Odpovědět 14.6.2013 22:55
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Přerušení se do BIOSu zapisuje běžně - každý OS má své přerušení - nechci Unixové - chci své... A poslal jsem ti, jaké... 100h

int kernel

Co je na tom k nepochopení?

 
Nahoru Odpovědět 15.6.2013 5:49
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Jak bych to mohl zapsat špatně, když nezapisuji já? Zapisuje se přes 21h a 16h... A to do prázdného místa v tabulce přerušení. (Kdyžtak nebude fungovat to jedno přerušení no...) Jediné co potřebuji - aby mi BootSector přerušil do BIOSu a tam by byl sezman adres tabulky přerušení a 10ti souborů onoho souborového systému. Nemusel bych pak nic načítat - použil bych jedno pěkné přerušení...

 
Nahoru Odpovědět 15.6.2013 5:54
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Tedy BootSector musím nechat doběhnout - jde mi o vytvoření toho mostu...

 
Nahoru Odpovědět 15.6.2013 5:56
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Prostě chci jen zapsat sektory, které pak budu moci číst přerušením... :) Jenže dd neumí pracovat se sektory - jen tupě klonuje... Chci jen zapsat každý z 10ti souborů se zarovnáním podle velikosti sektoru. To v jakém sektoru začíná každý soubor a kolik sektorů zabírá bude spravovat kernel. A uživatelská data pak budou spravována těmito soubory...

 
Nahoru Odpovědět 15.6.2013 8:23
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Přerušení se do BIOSu zapisuje běžně - každý OS má své přerušení - nechci
Unixové - chci své... A poslal jsem ti, jaké... 100h

Tabulka vektorů přerušení (Interrupt Vector Table, Interrupt Descriptor Table) je datovou strukturou používanou procesorem. Do BIOSu se nezapisuje. Procesor musí znát adresu této struktury, aby byl schopen volat obslužné rutiny jednotlivých přerušení.

V reálném režimu procesoru se tabulka vektorů přerušení nachází na adrese 0x0000:0x0000 (což je fyzická adresa 0). V chráněných režimech procesoru se informace o tabulce nacházejí v registru IDTR, se kterým se pracuje pomocí instrukcí SIDT a LIDT (asi to půjde i v reálném režimu procesoru).

Mluvím o procesorech x86. Jinde to může být (a je) jinak. Procesory x86 AFAIK dovolují definovat obslužné rutiny maximálně pro 256 přerušení, tudíž vektor 100h neexistuje.

Při startu počítače po provedení POST je tabulka vektorů přerušení vyplněna asi inicializačním kódem BIOSu tak, aby vykonáním přerušení bylo možné provést určitou operaci týkajícíc se různých oblastí (obrazovka, klávesnice, disky, disketa...). V chráněném režimu to už udělat takhle jednoduše nelze.

Prostě chci jen zapsat sektory, které pak budu moci číst přerušením...
Jenže dd neumí pracovat se sektory - jen tupě klonuje... Chci jen zapsat
každý z 10ti souborů se zarovnáním podle velikosti sektoru. To v jakém
sektoru začíná každý soubor a kolik sektorů zabírá bude spravovat kernel.
A uživatelská data pak budou spravována těmito soubory...

Pokud ti stačí ty sektory zapsat za běhu operačního systému, tak bych zkusil použít standardní Cčkovské rutiny pro práci se soubory na zařízení daného disku (či diskového oddílu, pokud každý diskový oddíl v Unixu také má zařízení. U fyzického zařízení disku se ještě musí řešit případný MBR/GPT). Přerušením BIOSu se dá číst libovolný sektor disku v případě, že disk podporuje LBA, což dnes asi budou všechny disky. Jinak se přes BIOS dostaneš jen k prvním cca 1023 cylindrům (možná ještě méně).

Nahoru Odpovědět 15.6.2013 11:07
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vpodstatě by stačilo nakopírovat všechny systémové soubory v určeném pořadí - a při změně pozice se jen updatují data. Ovšem první věc je zarovnání do velikosti sektoru. Snažím se to spočítat manuálně jako v BootSectoru ($-$$) ovšem tak nějak netuším jak na to... Protože bych to musel jedině nějak dělit, zahodit čárku atd. Takže první věc - zarovnání do celých sektorů a druhá věc - přecijen nějaká správa. BOOT.CAT se mi vytvořil mimo souborový systém - tak netuším, co to je... (Co je tedy v prvním sectoru - když ne BOOT.CAT) Mám to vše v ISO - FLP obraz se soubory a BOOT.CAT A hlavně nevím, jak moc se dá spolehnout na to, že se mi sectory napasují přesně na sebe. Vznikají švy? Chtěl bych se vyvarovat hledání souborů - do BootSectoru bych nadefinoval jaké sectory načíst do RAM a tím by to pro mne zkončilo... Proto mi musí sectory sedět... Uživatelksé soubory bych pak řešil z těch načtených v RAM...

 
Nahoru Odpovědět 15.6.2013 11:23
Avatar
Domiy
Neregistrovaný
Avatar
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Pomocí tohoto makra můžeš zarovnat velikost dat na nejbližší vyšší násobek čehokoliv.

#define ALIGN_UP(p, alignment) \
    (((uintptr_t)(p) + (alignment)-1) & ~((alignment)-1))

Pokud chceš zarovnat třeba velikost souboru, lze to řešit třeba takto:

FileSizeAligned = ALIGN_UP(FileSize, 512);

Zároveň se také dozvíš, kolik bajtů bude v sektoru vyplněných prázdným místem.

EmptyBytes = FileSizeAligned - FileSize;

Otázka samozřejmě je, zda budeš své soubory vytvářet tak, aby jejich velikost již byla zarovnána ne sektory, nebo tento problém budeš řešit při zápisu na disk. Záleží na tom, kdy tam budeš ty soubory zapisovat. Pokud v prostředí operačního systému, dělal bych to tím druhým způsobem.

Mezi sektory žádné švy nejsou. Ani žádné překryvy. Co se týče práce s diskem přes přerušení 13h, tak se lze podívat třeba sem:

http://en.wikipedia.org/wiki/Int_13h#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive

Ale počítám, že tady zdroje máš (a lepší než je v tomto případě Wikipedie).

Nahoru Odpovědět 15.6.2013 12:02
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Já 13h znám. Dále je nesmyslné zarovnávat každý soubor. Důvod proč chci zarovnat systémové soubory je ten, že se nezdá, že by existoval nástroj na práci se sektory - což je divné... O zaplnění se pak již postará 13h. Tudíž první věc - skutečně neexistuje něco jako fdisk, ale i pro zápis? Abych nastavil velikost sectoru, počet hlav a drah a on podle toho rozdělí vstupní data? Další věc - jak násilím dostat z binární podoby BootLoaderu BootSector BOOT.CAT? Tedy aby zaplnil první sektor té diskety... (Aktuálně vytvořím disketu do které ukládám všehna data a tu pak vložím do ISO a najednou se k ní přidá i BOOT.CAT.) Pokud to, že si ISO vycucne BOOT.CAT nezmění fakt, že je BootLoader v prvním sektoru té diskety, není co řešit...

Koukal jsem po knihovnách a nakonec to tedy hold napíši v C. Blbé je, že to nechci do disku, ale do souboru, který bych případně klonoval. (Nemám volný partition na hrátky.) Zdá se ale, že rozdělení na sektory je imaginární - nijak není vyjádřeno. Pak tedy jak jsem psal - stačí jen zapsat data ve správném pořadí...

 
Nahoru Odpovědět 15.6.2013 12:26
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Tvůj kód se mi nezdá jako Assembly - opravdu to tam půjde? Kde jsou všechny ty proměnné deklarované? A kde se ztratila makra $ $$?
Díky.

 
Nahoru Odpovědět 15.6.2013 12:28
Avatar
HellCoder
Neregistrovaný
Avatar
HellCoder:

To co pise neni Assembler, nybrz C;

 
Nahoru Odpovědět 15.6.2013 12:31
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na HellCoder
Domiy:

A to mi v Assembly asi moc nepomůže... :) V C bych si s $-$$ hrál do alelůja...

 
Nahoru Odpovědět 15.6.2013 12:53
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Ha! dd má skip - jen v clusterech - takře vynásobím velikostí sektoru a asi tedy vše poběží... :) (Spočítám si v DASHi, kolik má přeskočit za každým souborem...)

 
Nahoru Odpovědět 15.6.2013 13:13
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Můj kód není Assembly, nýbrž C. Myslel jsem, že máš problém s tím, jak to zarovnávání řešit algoritmicky a že když sem hodím definici makra ALIGN_UP, tak si ho přepíšeš do Assembleru, pokud to budeš potřebovat.

Nejedná se o přeložitelný kód, ale o pseudokód. Proměnná FileSize udává přesnou velikost souboru, FileSizeAligned velikost souboru zarovnanou na nejbližší vyšší násobek velikosti sektoru.

Jelikož Unixy neznám, tak nevím, co je to BOOT.CAT a nemůžu ti tedy s tímhle poradit. Jediné, co jsem v této oblasti dělal, je úprava Master Boot Recordu na stroji bootujícím konkrétní verzi Windows (http://www.jadro-windows.cz/…ference-2003).

Nevím, zda existuje nějaký nástroj pro zápis sektorů. Když něco takového potřebuju, naprogramuju si to.

Rozdělení na sektory je skryto vrstvami software mezi disekm a tvým programem. V podstatě jediné, co od tebe disk požaduje, když do něj chceš přímo zapisovat, je udávat velikost zapisovaných dat v násobcích sektorů.

Mimochodem, velikost sektoru nemusí být nutně 512 bajtů, u CD/DVD jsem narazil i na 2 KB.

Nahoru Odpovědět 15.6.2013 13:23
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Nemám zatím velké soubory. Navíc je to docela prasárna - do těch přebytků bych narval klidně i 7 operačních systémů... :)

Neuvědomil jsem si, že dd zase nebere různé velikosti souborů - zkusím zapojit ještě cat...

 
Nahoru Odpovědět 15.6.2013 13:27
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

To ze mě děláš pěkného vola - já to spočítat umím. Ale takové počty v definici times použít nemohu... samozřejmě - budu to muset předpočítat - ovšem do raději vymyslím něco v DASHi...

 
Nahoru Odpovědět 15.6.2013 13:29
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Už to mám - spočítám dorovnání v DASHi, zarovnám nulami zařízením /dev/zero a spojím catem. Takže prasárna, ale jede to! :)

 
Nahoru Odpovědět 15.6.2013 13:31
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

To ze mě děláš pěkného vola - já to spočítat umím. Ale takové počty v
definici times použít nemohu... samozřejmě - budu to muset předpočítat -
ovšem do raději vymyslím něco v DASHi...

To se omlouvám, vola jsem z tebe dělat nechtěl. Jen jsem z tvého příspěvku dospěl k závěru, že hlavní problém je s tím genericky napsat to zarovnávání. Pokud to chceš v x86 Assembleru, tak by to šlo asi nějak takto (v registru AX je hodnota, kterou ccheme zarovnat):

push bx
mov bx, alignment
dec bx
add ax, bx
not bx
and ax, bx
pop bx
Nahoru Odpovědět 15.6.2013 13:52
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Jak píši - udělal jsem to v DASHi. Jen mi teď nic nefunguje - tak nemohu potvrdit úspěch. (Musím předělat hodně věcí.)

 
Nahoru Odpovědět 15.6.2013 13:57
Avatar
Domiy
Neregistrovaný
Avatar
Domiy:

Tím, že to jede jsem myslel, že se souborový systém vytvoří - ovšem, jestli jede... :)

 
Nahoru Odpovědět 15.6.2013 14:10
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Jako docela se modlím - výstup disassembleru se jeví skvěle, ale velikosti vůbec nesedí... (Přitom BootSector splňuje 512 a na kernel používám modulo - oba sami jsou OK, ale spolu...)

 
Nahoru Odpovědět 15.6.2013 14:41
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Jo a jak mi operační systém detekuje BootSector? Je to naprosto tutově vždy prvních 512 byte? (Poběží mi to? :) ) Nedaří se mi totiž udělat bootovatelné ISO, když již to není floppy, ale slepenec... :)

(Vím, že BootSector je prvních 512 byte - jen ujištění...)

 
Nahoru Odpovědět 15.6.2013 15:00
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Domiy
Domiy:

Teda počítač - docela mi už hrabe z toho... :)

 
Nahoru Odpovědět 15.6.2013 15:12
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

BIOS postupuje tak, že postupně hledá zařízení podle toho, jak má nastavené pořadí bootování. Jakmile nějaké zařízení najde, načte jeho první sektor na adresu 0x0000:0x7C00 (fyzická adresa 0x7C000) a předá řízení na jeho první bajt.

Obvykle je prvním sektorem disku MBR (Master Boot Record), který krom bootovacího kódu obsahuje i tabulku s informacemi o diskových oddílech. MBR obvykle najde aktivní diskový oddíl, načte jeho první sektor (opět na adresu 0x0000:0x7C00) a předá řízení na jeho první bajt.

Bootovací kód pro ISO jsem nikdy nepsal, takže nevím, jaké tam jsou zákony. Jestli třeba nejsou sektory velké 2 KB.

Nevím, jak to funguje v případě bootování přes (U)EFI. Tuhle oblast jsem vůbec nestudoval.

Nahoru Odpovědět 15.6.2013 15:46
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Domiy:
BITS 16

jmp short Boot
nop

OEMLabel db "SMA-BOOT"                          ; Disk label
BytesPerSector dw 512                           ; Bytes per sector
SectorsPerCluster db 1                          ; Sectors per Cluster
ReservedForBoot dw 1                            ; Reserved sectors for boot record
RootDirEntries dw 224                           ; Number of entries in root dir
                                                                ; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880                          ; Number of logical sectors
MediumByte db 0F0h                                      ; Medium descriptor byte
SectorsPerTrack dw 18                           ; Sectors per track (36/cylinder)
Sides dw 2                                              ; Number of sides/heads
HiddenSectors dd 0                                      ; Number of hidden sectors
LargeSectors dd 0                                       ; Number of LBA sectors
DriveNo dw 0                                            ; Drive No: 0
Signature db 41                                         ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP     "
FileSystem db "DSP     "

SMA.Load:

        mov ah, 02h
        mov al, 37
        mov ch, 1
        mov cl, 2
        mov dh, 1
        int 13h

        ret

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        mov ax, 07C0h                                   ; Set data segment to where we're loaded
        mov ds, ax
                                                                ; NOTE: A few early BIOSes are reported to improperly set DL

        cmp dl, 0
        je NoChange

        mov [BootDev], dl                               ; Save boot device number
        mov ah, 8h                                      ; Get drive parameters

        int 13h
        jc FatalDiskError

        mov cx, 32768
        call SMA.Load

        mov ax, 0
        mov bx, 0
        mov cx, 0
        mov dx, 0
        mov di, 0
        pop si

        jmp 32768

NoChange:

        mov eax, 0

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb
        cmp al, 0
        je .done
        int 10h
        jmp short .write

.done:

        popa
        ret

FatalDiskError:

        mov si, DiskError
        call PrintString

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke
        mov ax, 0
        int 19h

KernelFname db "SMA     BIN"

DiskError db "HDD error! Press any key.", 0
KernelMiss db "Kernel file SMA.BIN missing.", 0

BootDev db 0                                    ; Boot device number
Cluster dw 0                                    ; Cluster of the file we want to load
Pointer dw 0                                    ; Pointer into Buffer, for loading kernel

times 510-($-$$) db 0                   ; Pad remainder of boot sector with zeros
dw 0AA55h                                       ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)

Dal jsem to jako první sektor - druhý je kernel. Proto jsem dal cl na 2 a zabírá to 37 sektorů. Tak myslíš, že to pojede?

S MBR i VBR si hraji dnes a denně... Tedy máš pravdu - to znamená - před BootSector mám ještě nacpat MBR? (Ten asi ukradnu FATu.)

 
Nahoru Odpovědět 15.6.2013 15:57
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Nee - blbnu... Zde MBR nemám a ani mít nemohu - toto tedy je partition. V prvním sektoru to mám, tak pokud je kód vpořádku, musí to jet...

 
Nahoru Odpovědět 15.6.2013 16:01
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

MBR není nutnou součástí disku. Stačí, když bude začínat rovnou boot sektorem, tedy tím tvým kódem.

U tvého kódu si nejsem moc jistý správností rutiny SMA.Load. Nevím, zda jsi správně specifikoval sektor, hlavu a číslo rozhraní (drive). To musíš vědět sám. Nikde tam ale nevidm, že by jsi specifikoval adresu, kam ty sektory chceš v paměti načíst, což se udává dvojicí registrů ES:BX.

Nahoru Odpovědět 15.6.2013 16:19
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:
mov cx, 32768

Mám to už nevím odkud, ale bylo to ve VFAT. Jediné co se změní se změnou souborového systému je vyhledávání souborů - ale načítání by mělo být stejné... Takže jsem jen zahodil vyhledávání a nacvakal pevné údaje. Jak jsem ostatně již psal. Od té doby (co se vše nacvakané v BootSectoru načte) se již ostatní soubory budou zapisovat do načtených...

Ale zdá se, že je to chyba. V kernelu již používám proměnnou DiskBuffer...

Takže:

mov si, 32768
mov bx, si

?

Děkuji.

 
Nahoru Odpovědět 15.6.2013 16:36
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Jistý si buď sektorem - ostatním si nejsem jist ani já. Vzal jsem to z logiky - první dráhu to překročit nemohlo. A jak to je v praxi s halvou... :) (Já jen na sebe nalepil všechny soubory tak, jak bylo třeba - netuším, jak je to na disku. Žádný nástroj jsem právě nenašel.)

 
Nahoru Odpovědět 15.6.2013 16:43
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Disk je přeci tady:

mov [BootDev], dl
mov ah, 8h
int 13h

Později to snad nějak rozvětvím...

 
Nahoru Odpovědět 15.6.2013 16:47
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Já to s těma CHS adresama také moc neumím. Zkoušel jsem to cca před pěti lety a ani nevím, zda jsem to tehdy naprogramoval dobře, protože pár dní na to díky chybě v synchronizaci zmizela většina souborového systému z disku...

Myslím, že by bylo lepší se problémy s cylindry, hlavami, stopami a sektory vyhnout tím, že pro čtení využiješ funkci 42h (Extended Read) viz http://en.wikipedia.org/wiki/Int_13h#…. Pak se stačí jen zadat číslo sektoru a je hotovo.

U toho tvého kódu ještě nevidím nastavovaní registru ES, který bys mohl třeba vynulovat předtím, než načítáš ty sektory (aby ES:BX ukazovalo na nějaou rozumnou adresu).

Nahoru Odpovědět 15.6.2013 17:55
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Nevidím tam registr pro parametr sektoru a počtu sektorů k načtení do paměti... Paměť je mi jedno jaká to bude - prostě do ní pak skočím... (Jak sám jistě vidíš...)

 
Nahoru Odpovědět 15.6.2013 17:59
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Ale já tu adresu nastavil - ne? :)

mov si, 32768
mov bx, si

Nebo alespoň to jsem tam měl před změnou souborového systému a běželo to...

 
Nahoru Odpovědět 15.6.2013 18:03
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vyčištěno:

BITS 16

jmp short Boot
nop

OEMLabel db "SMA-BOOT"                          ; Disk label
BytesPerSector dw 512                           ; Bytes per sector
SectorsPerCluster db 1                          ; Sectors per Cluster
ReservedForBoot dw 1                            ; Reserved sectors for boot record
LogicalSectors dw 2880                          ; Number of logical sectors
MediumByte db 0F0h                                      ; Medium descriptor byte
SectorsPerTrack dw 18                           ; Sectors per track (36/cylinder)
Sides dw 2                                              ; Number of sides/heads
HiddenSectors dd 0                                      ; Number of hidden sectors
LargeSectors dd 0                                       ; Number of LBA sectors
DriveNo dw 0                                            ; Drive No: 0
Signature db 41                                         ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP     "
FileSystem db "DSP     "

SMA.Load:

        mov ah, 42h
        mov al, 37
        mov cl, 2
        mov si, 32768
        mov bx, si
        int 13h

        ret

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        mov ax, 07C0h                                   ; Set data segment to where we're loaded
        mov ds, ax
                                                                ; NOTE: A few early BIOSes are reported to improperly set DL

        cmp dl, 0
        je NoChange

        mov [bootDev], dl                               ; Save boot device number
        mov ah, 8h                                      ; Get drive parameters
        int 13h

        jc FataldiskError

NoChange:

        mov eax, 0

        mov cx, 32768
        call SMA.Load

        jc FataldiskError

        mov ax, 0
        mov bx, 0
        mov cx, 0
        mov dx, 0
        mov di, 0
        mov si, 0

        jmp 32768

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb

        cmp al, 0
        je .done

        int 10h
        jmp short .write

.done:

        popa
        ret

FataldiskError:

        mov si, diskError
        call PrintString

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke

        mov ax, 0
        int 19h

diskError db "Disk error! Press any key...", 0
bootDev db 0                                            ; Boot device number

times 510-($-$$) db 0                           ; Pad remainder of boot sector with zeros
dw 0AA55h                                               ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)

Jediné čím si nejsem jist - zda se správně nastaví buffer. To se dozvím později... :)

 
Nahoru Odpovědět 15.6.2013 18:23
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ten buffer pro načtená data je určen registry ES:BX. Nevidím tam nikde, že bys nastavoval registr ES. Ale je možné, že tento registr je ve výchozím nastavení nulový, takže není pořádně co nastavovat.

Ta funkce 42h (Extended Read) funguje jinak - parametry operace se ukládají do paměti, ne do registrů AFAIK.

Tohle je část mého MBR, která načítá originální MBR, který je uložen na sektoru 1 (druhý sektor).

        mov ax, 04200h
        push ax
        mov dx, 80h
        mov si, @data
        add si, 6000h
        push si
        int 13h
        pop si
        jmp nekam_dal
data:
        dw 10h       ; structure length
        dw 1         ; sector count
        dw 7c00h     ; buffer address (offset)
        dw 0         ; buffer address (segment)
        dd 1         ; Secntor number (low 32 bits)
        dd 0         ; Sector number (high 32 bits)
nekam_dal:
Editováno 15.6.2013 18:54
Nahoru Odpovědět 15.6.2013 18:50
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Nechceš mi poslat kód pro můj případ? (Jsem zničen z toho dorovnání kernelu. Vše je při stavění správně, ale výsledek je větší o 2 sektory - poslední navíc není plný...)

 
Nahoru Odpovědět 15.6.2013 19:02
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Je to tam! :) Ještě to zobecním pro všechny vstupy a juknu se na toto...

 
Nahoru Odpovědět 15.6.2013 19:38
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:
SMA.Load:

        mov ah, 42h
        mov si, .SMA.Load.Params
        mov dl, bootDev
        int 13h

        ret

.SMA.Load.Params:

        dw 10h                                          ; structure length
        dw 38                                           ; sector count
        dw 7c00h                                                ; buffer address (offset)
        dw 0                                                    ; buffer address (segment)
        dd 1                                                    ; Secntor number (low 32 bits)
        dd 0                                                    ; Sector number (high 32 bits)

Skáči tedy na 7c00h, jenže nic se nenačte... První věc - jedná se o druhý, nebo první sektor? Tedy má myšlenka - když nastavím velikost sektoru na 1024, tak VBR přeci bude pořád 512 - ne? Takže mám VBR zahrnovat? Druhá věc - co znamená údaj "structure length"?
Děkuji.

 
Nahoru Odpovědět 16.6.2013 6:46
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Skáči tedy na 7c00h

Jakým způsobem to spouštíš a ladíš? Na jaké adrese se nachází tento boot. sektor?

První věc - jedná se o druhý, nebo první sektor?

Druhý sektor. U LBA se sektory číslují od nuly.

co znamená údaj "structure length"?

Velikost struktury s parametry služby 42h, předávané v DS:SI. Viz Wikipedie nebo třeba Ralph Brown's Interrupt List (či jiná dokumentace, kde se popisují přerušení BIOSu).

Nahoru Odpovědět 16.6.2013 11:16
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Pokud se čísluje od 0, tak je to 1. sektor - ne? (0 = BootSector, 1 = Kernel - kernel je hned za VBR) Jde mi o to, že když dám velikost sektoru 1024, VBR bude stejně 512 - ne? A jak by mohl číst 512byte sektor s nastaveným sektorem 1024... Nehádám se - jen si potřebuji udělat jasno. VBR se tedy počítá?

Aktuální stav:

BITS 16

SMA.Load.Params:

        dw 10h                                          ; structure length
        dw 38                                           ; sector count
        dw 7c00h                                                ; buffer address (offset)
        dw 0                                                    ; buffer address (segment)
        dd 0                                                    ; Secntor number (low 32 bits)
        dd 2                                                    ; Sector number (high 32 bits)

jmp short Boot
nop

OEMLabel db "SMA-BOOT"                          ; Disk label
BytesPerSector dw 512                           ; Bytes per sector
SectorsPerCluster db 1                          ; Sectors per Cluster
ReservedForBoot dw 1                            ; Reserved sectors for boot record
LogicalSectors dw 2880                          ; Number of logical sectors
MediumByte db 0F0h                                      ; Medium descriptor byte
SectorsPerTrack dw 18                           ; Sectors per track (36/cylinder)
Sides dw 2                                              ; Number of sides/heads
HiddenSectors dd 0                                      ; Number of hidden sectors
LargeSectors dd 0                                       ; Number of LBA sectors
DriveNo dw 0                                            ; Drive No: 0
Signature db 41                                         ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP     "
FileSystem db "DSP     "

SMA.Load:

        mov ah, 42h
        mov si, SMA.Load.Params
        mov dl, bootDev
        int 13h

        ret

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        cmp dl, 0                                               ; A few early BIOSes are reported to improperly set DL
        je NoChange

        mov [bootDev], dl                               ; Save boot device number
        mov ah, 8h                                      ; Get drive parameters
        int 13h

        jc FataldiskError

NoChange:

        mov eax, 0

        call SMA.Load

        jc FataldiskError

        mov ax, 0
        mov bx, 0
        mov cx, 0
        mov dx, 0
        mov di, 0
        mov si, 0

        jmp 7c00h

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb

        cmp al, 0
        je .done

        int 10h
        jmp short .write

.done:

        popa
        ret

FataldiskError:

        mov si, diskError
        call PrintString

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke

        mov ax, 0
        int 19h

diskError db "Disk error! Press any key...", 0xA, 0
bootDev db 0                                            ; Boot device number

times 510-($-$$) db 0                           ; Pad remainder of boot sector with zeros
dw 0AA55h                                               ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)

Jak jsem psal již někde nahoře - chci jen ušetřit zbytečné hledání a přesně vytyčit co z BootSectoru načíst. (Kernel jen pro začátek.) Kernel si pak již přečte načtené atd.

A aktuálně skládám soubory do systému přeložením do binární podoby, dorovnáním do čísla dělitelného 512 a přilepením do fronty... Jak se mi podaří spustit kernel, přidám své vysněné soubory a systémové funkce... (Stejným způsobem.)

 
Nahoru Odpovědět 16.6.2013 11:36
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

A mám na tebe ještě jeden dotaz. Jak si vezme počítač ty parametry nahoře:

OEMLabel db "SMA-BOOT"                         ; Disk label
BytesPerSector dw 512                          ; Bytes per sector
SectorsPerCluster db 1                         ; Sectors per Cluster
ReservedForBoot dw 1                           ; Reserved sectors for boot record
LogicalSectors dw 2880                         ; Number of logical sectors
MediumByte db 0F0h                                     ; Medium descriptor byte
SectorsPerTrack dw 18                          ; Sectors per track (36/cylinder)
Sides dw 2                                             ; Number of sides/heads
HiddenSectors dd 0                                     ; Number of hidden sectors
LargeSectors dd 0                                      ; Number of LBA sectors
DriveNo dw 0                                           ; Drive No: 0
Signature db 41                                                ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP     "
FileSystem db "DSP     "

Nikde jsem nenašel jak to funguje. Záleží na čem? Na pojmenování? (minimálně case je všude jiné) Myslíš, že mám vše potřebné ke správnému čtení clusterů a hlavně sektorů?

Díky.

 
Nahoru Odpovědět 16.6.2013 11:42
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

A mám na tebe ještě jeden dotaz. Jak si vezme počítač ty parametry nahoře

komponentě zodpovědné za práci se souborovými systémy FAT je srdečně jedno, jak si jednotlivé položky v boot. sektoru pojmenuješ. Klidně si můžeš vzít Erbenova Vodníka a jako názvy jednotlivých položek zvolit jeho úvodní vere. Operační systém názvy nevidí, vidí jen výslednou strukturu boot. sektoru po překladu. Takže pro něj je důležité, aby všechny položky byly na správném místě a aby obsahovaly správná data.

V tom kódu výše jsi předřadil ta data pro 13h Extended Read začátku toho boot. sektoru, takže se v tom FAT driver absolutně nevyzná. Ta data umisti někam do bootovacího kódu. A tak, jak jsi je upravil, tak se bude driver pokoušet načíst sektor s číslem 200000000h (číslováno od nuly), což asi nechceš. x86 je little-endian platforma.

Nechci se tě dotknout, ale doporučoval bych ti si přečíst nějakou knížku o obecných pricnipech, které se v operačních systémech používají (včetně souborových systémů). Docela dobrá knížka je třeba http://www.amazon.com/…p/0131429388. V mojí knize je toho také docela dost platného nejen pro Windows, ale ta cena za to je pro tebe moc vysoká.

Nahoru Odpovědět 16.6.2013 13:02
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Já si to myslel... (Že to bere jako celek.)

Pozice struktury parametrů jsem se snažil zařadit tak, aby to nevzalo co nemá... Takže:

BITS 16

jmp short Boot
nop

OEMLabel db "SMA-BOOT"                          ; Disk label
BytesPerSector dw 512                           ; Bytes per sector
SectorsPerCluster db 1                          ; Sectors per Cluster
ReservedForBoot dw 1                            ; Reserved sectors for boot record
NumberOfDSPs db 2                                       ; Number of copies of the DSP
RootDirEntries dw 224                           ; Number of entries in root dir
                                                                ; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880                          ; Number of logical sectors
MediumByte db 0F0h                                      ; Medium descriptor byte
SectorsPerDSP dw 9                                      ; Sectors per DSP
SectorsPerTrack dw 18                           ; Sectors per track (36/cylinder)
Sides dw 2                                              ; Number of sides/heads
HiddenSectors dd 0                                      ; Number of hidden sectors
LargeSectors dd 0                                       ; Number of LBA sectors
DriveNo dw 0                                            ; Drive No: 0
Signature db 41                                         ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP     "
FileSystem db "DSP     "

SMA.Load:

        mov ah, 42h
        mov si, .SMA.Load.Params
        mov dl, bootDev
        int 13h

        ret

.SMA.Load.Params:

        dw 10h                                          ; structure length
        dw 38                                           ; sector count
        dw 7c00h                                                ; buffer address (offset)
        dw 0                                                    ; buffer address (segment)
        dd 0                                                    ; Secntor number (low 32 bits)
        dd 2                                                    ; Sector number (high 32 bits)

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        cmp dl, 0                                               ; A few early BIOSes are reported to improperly set DL
        je NoChange

        mov [bootDev], dl                               ; Save boot device number
        mov ah, 8h                                      ; Get drive parameters
        int 13h

        jc FataldiskError

NoChange:

        mov eax, 0

        call SMA.Load

        jc FataldiskError

        mov ax, 0
        mov bx, 0
        mov cx, 0
        mov dx, 0
        mov di, 0
        mov si, 0

        jmp 7c00h

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb

        cmp al, 0
        je .done

        int 10h
        jmp short .write

.done:

        popa
        ret

FataldiskError:

        mov si, diskError
        call PrintString

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke

        mov ax, 0
        int 19h

diskError db "Disk error! Press any key...", 0xA, 0
bootDev db 0                                            ; Boot device number

times 510-($-$$) db 0                           ; Pad remainder of boot sector with zeros
dw 0AA55h                                               ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)

?

 
Nahoru Odpovědět 16.6.2013 13:13
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:
dw 10h                                          ; structure length
dw 38                                           ; sector count
dw 7c00h                                                ; buffer address (offset)
dw 0                                                    ; buffer address (segment)
dd 0                                                    ; Secntor number (low 32 bits)
dd 2

bych upravil na

dw 10h                                          ; structure length
dw 38                                           ; sector count
dw 7c00h                                                ; buffer address (offset)
dw 0                                                    ; buffer address (segment)
dd 2                                                    ; Secntor number (low 32 bits)
dd 0

pokud chceš načíst sektor s číslem 2 (který předcházejí sektory s číslem 0 a 1).

Nahoru Odpovědět 17.6.2013 14:54
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Už mi pomohl ten kamarád, co mi opravil disk. Sector a Secntor je jako AX a AL.

.SMA.Load.Params:

        dw 10h                                          ; structure length
        dw 38                                           ; sector count
        dw 7c00h                                                ; buffer address (offset)
        dw 0                                                    ; buffer address (segment)
        dd 1                                                    ; Secntor number (low 32 bits)
        dd 0                                                    ; Sector number (high 32 bits)

Nejde. Kernel je hned za VBR a má 38 sektorů. (disk s VBR 39) Chci načíst ten kernel. Tak jak? (zoufale) :)

Díky.

 
Nahoru Odpovědět 17.6.2013 15:28
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Jakým způsobem to spouštíš? Ono by to asi chtělo si rozchodit nějaké ladící prostředí pro tyto účely (nevím, zda bude stačit zkompilovat Bochs v debug módu).

Nahoru Odpovědět 17.6.2013 16:37
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vždyť tu vše je - načtu to do adresy, na kterou pak skočím... Vše je napsané v Assembly - takže kernel překládám do binárního souboru. Když to bylo ve VFATu, vše jelo. Změnil jsem pouze to, že již nehledám hlavní adresář a kernel.

 
Nahoru Odpovědět 17.6.2013 16:52
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Vždyť tu vše je

Já se jen snažím naznačit, že je někdy dobré si ten kód odkrokovat, aby člověk věděl, co se opravdu děje. Zvláště v těchto případech. A to zastáncem používání debuggermu nejsem.

Napadá mě ještě pár věcí:

  1. na jaké adrese tvůj bootsektor předpokládá, že poběží? Na 0x7C00?
  2. Pe takovým způsobem opravdu kompilován (tzn. absolutní adresy jsou překládány na 7Cxxh? Zvláště u SMA.Load.Params)?
  3. Pokud je tvůj bootsector na adrese 0x7c00 a kernel načítáš také na adresu 0x7c00, nepřepíšeš si tím kód tvého bootsektoru, takže do kernelu nikdy neskočíš (když si třeba disassembluješ MBR, tak ten se hned během prvních několika instrukcí kopíruje (relokuje) z 0x7c00 na 0x600)?
  4. Není chybně nastavován zásobník (registry SS:SP)? Provádíš to kódem:
mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli                                                     ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti

což znamená, že vrchol zásobníku je na 0x9e0:0x1000 = 0xAE00 (pokud dobře počítám). Přijde mi, že pokud má kernel 38 sektorů a jeho začátek je načten na 0x7c00, tak přepíše všechno až do adresy 0xC800, tedy i tvůj zásobník. Navíc případné pokusy o ukládání na zásobník přepisují kód kernelu.

Programování (zvláště v případech, kdy se těžko ladí) je podle mého názoru hodně o pokoře a o tom, že se snažíš nepředpokládat, že nejaká část tvého kódu je dobře, dokud to opravdu neověříš. Emoce sem nepatří.

Nahoru Odpovědět 17.6.2013 17:30
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Já jsem sem nepřivedl 7c00h. Ve VFAT verzi mám tu adresu 2000h. Kde píši, že je jaký kus kódu vpořádku? Copak se naopak neustále neptám, zda je to OK? Kde vidíš mé emoce?

 
Nahoru Odpovědět 17.6.2013 17:44
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

I když ti já řeknu, že je to OK, tak to nic neznamená, protože jsem si ten kód nedal do VBR a nespustil. Což dělat nebudu, protože tu nemám připravené ladící prostředí (když jsem psal MBR, tak jsem to zkoušel bez ladění; stálo to více času, ale nakonec se to podařilo).

V poslední verzi tvého kódu jsem objevil ty věci, které jsem psal v minulém příspěvku. Pokud jsi je opravil a stále to nefunguje, je asi čas si to zkusit prokrokovat. Což není legrace, protože nainstalovat nějaké prostředí, ve kterém to půjde, asi nebude snadné.

Nahoru Odpovědět 17.6.2013 18:16
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Vzal jsem vše potřebné z VFAT a stejně k ničemu... :)

BITS 16

jmp short Boot
nop

db "SMA-BOOT" ; Disk label
dw 512 ; Bytes per sector
db 1 ; Sectors per Cluster
dw 1 ; Reserved sectors for boot record
db 2 ; Number of copies of the DSP
dw 0 ; Number of root directory entires
dw 39 ; Number of logical sectors
db 0F0h ; Medium descriptor byte
dw 0 ; Sectors per FAT
dw 63 ; Sectors per track
dw 2 ; Number of sides/heads
dd 0 ; Number of hidden sectors
dd 0 ; Number of LBA sectors
dw 0 ; Drive No: 0
db 41 ; Drive signature: 41 for disk
dd 00000000h ; Volume ID
db "SMA-OP     " ; Volume label
db "DSP     " ; File System

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        cmp dl, 0                                               ; A few early BIOSes are reported to improperly set DL
        je NoChange

        mov ah, 8h                                      ; Get drive parameters
        int 13h

        jc FataldiskError

NoChange:

        mov eax, 0                                              ; Prepare to enter loop

        call SMA.Load

        jc FataldiskError

        jmp 2000h:0000h

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb

        cmp al, 0
        je .done

        int 10h
        jmp short .write

.done:

        popa
        ret

SMA.Load:

        mov ah, 42h
        mov si, .SMA.Load.Params
        int 13h

        ret

.SMA.Load.Params:

        dw 10h                                          ; structure length
        dw 38                                           ; sector count
        dw Buffer                                               ; buffer address (offset)
        dw 2000h                                                ; buffer address (segment)
        dd 1                                                    ; Secntor number (low 32 bits)
        dd 0                                                    ; Sector number (high 32 bits)

FataldiskError:

        mov si, diskError
        call PrintString

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke

        mov ax, 0
        int 19h

diskError db "Disk error! Press any key...", 0

times 510-($-$$) db 0                           ; Pad remainder of boot sector with zeros
dw 0AA55h                                               ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)
BITS 16

jmp short Boot
nop

OEMLabel db "SMA-BOOT"                          ; Disk label
BytesPerSector dw 512                           ; Bytes per sector
SectorsPerCluster db 1                          ; Sectors per Cluster
ReservedForBoot dw 1                            ; Reserved sectors for boot record
NumberOfFATs db 2                                       ; Number of copies of the FAT
RootDirEntries dw 224                           ; Number of entries in root dir
                                                                ; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880                          ; Number of logical sectors
MediumByte db 0F0h                                      ; Medium descriptor byte
SectorsPerFAT dw 9                                      ; Sectors per FAT
SectorsPerTrack dw 18                           ; Sectors per track (36/cylinder)
Sides dw 2                                              ; Number of sides/heads
HiddenSectors dd 0                                      ; Number of hidden sectors
LargeSectors dd 0                                       ; Number of LBA sectors
DriveNo dw 0                                            ; Drive No: 0
Signature db 41                                         ; Drive signature: 41 for disk
VolumeID dd 00000000h                           ; Volume ID: any number
VolumeLabel db "SMA-OP     "                    ; Volume Label: any 11 chars
FileSystem db "FAT12   "                                ; File system type: don't change!

Boot:

        mov ax, 07C0h                                   ; Set up 4K of stack space above Buffer
        add ax, 544                                     ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
        cli                                                     ; Disable interrupts while changing stack
        mov ss, ax
        mov sp, 4096
        sti                                                     ; Restore interrupts

        mov ax, 07C0h                                   ; Set data segment to where we're loaded
        mov ds, ax
                                                                ; NOTE: A few early BIOSes are reported to improperly set DL

        cmp dl, 0
        je NoChange
        mov [BootDev], dl                               ; Save boot device number
        mov ah, 8                                       ; Get drive parameters
        int 13h
        jc FatalDiskError
        and cx, 3Fh                                     ; Maximum sector number
        mov [SectorsPerTrack], cx               ; Sector numbers start at 1
        movzx dx, dh                                    ; Maximum head number
        add dx, 1                                               ; Head numbers start at 0 - add 1 for total
        mov [Sides], dx

NoChange:

        mov eax, 0                                      ; Needed for some older BIOSes

                                                                ; First, we need to load the root directory from the disk. Technical details:
                                                                ; Start of root = ReservedForBoot + NumberOfFATs * SectorsPerFAT = logical 19
                                                                ; Number of root = RootDirEntries * 32 bytes/entry / 512 bytes/sector = 14
                                                                ; Start of user data = (start of root) + (number of root) = logical 33

DiskOK:                                                 ; Ready to read first block of data

        mov ax, 19                                      ; Root dir starts at logical sector 19
        call l2hts

        mov si, Buffer                                  ; Set ES:BX to point to our Buffer (see End of code)
        mov bx, ds
        mov es, bx
        mov bx, si

        mov ah, 2                                       ; Params for int 13h: read disk sectors
        mov al, 14                                      ; And read 14 of them

        pusha                                           ; Prepare to enter loop


ReadRootDir:

        popa                                                    ; In case registers are altered by int 13h
        pusha

        stc                                                     ; A few BIOSes do not set properly on error
        int 13h                                         ; Read sectors using BIOS

        jnc SearchDir                                   ; If read went OK, skip ahead
        call ResetDisk                                  ; Otherwise, reset disk controller and try again
        jnc ReadRootDir                         ; Floppy reset OK?

        jmp Reboot                                      ; If not, Fatal double error

SearchDir:

        popa

        mov ax, ds                                      ; Root dir is now in [Buffer]
        mov es, ax                                      ; Set DI to this info
        mov di, Buffer

        mov cx, word [RootDirEntries]           ; Search all (224) entries
        mov ax, 0                                       ; Searching at offset 0


NextRootEntry:

        xchg cx, dx                                     ; We use CX in the inner loop...

        mov si, KernelFname                     ; Start searching for kernel filename
        mov cx, 11
        rep cmpsb
        je FoundFileToLoad                              ; Pointer DI will be at offset 11

        add ax, 32                                      ; Bump searched entries by 1 (32 bytes per entry)

        mov di, Buffer                                  ; Point to next entry
        add di, ax

        xchg dx, cx                                     ; Get the original CX back
        loop NextRootEntry

        mov si, KernelMiss                              ; If kernel is not found, bail out
        call PrintString
        jmp Reboot

FoundFileToLoad:                                        ; Fetch Cluster and load FAT into RAM

        mov ax, word [es:di+0Fh]                ; Offset 11 + 15 = 26, contains 1st Cluster
        mov word [Cluster], ax

        mov ax, 1                                       ; Sector 1 = first sector of first FAT
        call l2hts

        mov di, Buffer                                  ; ES:BX points to our Buffer
        mov bx, di

        mov ah, 2                                       ; int 13h params: read (FAT) sectors
        mov al, 9                                               ; All 9 sectors of 1st FAT

        pusha                                           ; Prepare to enter loop


ReadFAT:

        popa                                                    ; In case registers are altered by int 13h
        pusha

        stc
        int 13h                                         ; Read sectors using the BIOS

        jnc ReadFAT_OK                          ; If read went OK, skip ahead
        call ResetDisk                                  ; Otherwise, reset disk controller and try again
        jnc ReadFAT                                     ; Floppy reset OK?

FatalDiskError:

        mov si, DiskError                               ; If not, print error message and Reboot
        call PrintString
        jmp Reboot                                      ; Fatal double error


ReadFAT_OK:

        popa

        mov ax, 2000h                                   ; Segment where we'll load the kernel
        mov es, ax
        mov bx, 0

        mov ah, 2                                       ; int 13h disk read params
        mov al, 1

        push ax                                         ; Save in case we (or int calls) lose it

                                                                ; Now we must load the FAT from the disk. Here's how we find out where it starts:
                                                                ; FAT Cluster 0 = media descriptor = 0F0h
                                                                ; FAT Cluster 1 = filler Cluster = 0FFh
                                                                ; Cluster start = ((Cluster number) - 2) * SectorsPerCluster + (start of user)
                                                                        ; = (Cluster number) + 31
LoadFileSector:

        mov ax, word [Cluster]                  ; Convert sector to logical
        add ax, 31

        call l2hts                                              ; Make appropriate params for int 13h

        mov ax, 2000h
        mov es, ax
        mov bx, word [Pointer]

        pop ax
        push ax

        stc
        int 13h

        jnc CalculateNextCluster

        call ResetDisk
        jmp LoadFileSector

CalculateNextCluster:

        mov ax, [Cluster]
        mov dx, 0
        mov bx, 3
        mul bx
        mov bx, 2
        div bx                                          ; DX = [Cluster] mod 2
        mov si, Buffer
        add si, ax                                      ; AX = word in FAT for the 12 bit entry
        mov ax, word [ds:si]

        or dx, dx                                               ; If DX = 0 [Cluster] is Even; if DX = 1 then it's Odd

        jz Even                                         ; If [Cluster] is Even, drop last 4 bits of word
                                                                ; with next Cluster; if Odd, drop first 4 bits
Odd:

        shr ax, 4                                               ; Shift out first 4 bits (they belong to another entry)
        jmp short NextClusterCont

Even:

        and ax, 0FFFh                                   ; Mask out final 4 bits

NextClusterCont:

        mov word [Cluster], ax                  ; Store Cluster

        cmp ax, 0FF8h                                   ; FF8h = End of file marker in FAT12
        jae End

        add word [Pointer], 512                 ; Increase Buffer Pointer 1 sector length
        jmp LoadFileSector

End:                                                            ; We've got the file to load!

        pop ax                                          ; Clean up the stack (AX was pushed earlier)
        mov dl, byte [BootDev]                  ; Provide kernel with boot device info

        jmp 2000h:0000h                         ; Jump to entry point of loaded kernel!

Reboot:

        mov ax, 0
        int 16h                                         ; Wait for keystroke
        mov ax, 0
        int 19h                                         ; Reboot the system

PrintString:

        pusha

        mov ah, 0Eh

.write:

        lodsb
        cmp al, 0
        je .done
        int 10h
        jmp short .write

.done:

        popa
        ret

ResetDisk:

        push ax
        push dx
        mov ax, 0
        mov dl, byte [BootDev]
        stc
        int 13h

        pop dx
        pop ax
        ret

l2hts:                                                  ; Calculate head, track and sector settings for int 13h
                                                                ; IN: logical sector in AX, OUT: correct registers for int 13h
        push bx
        push ax

        mov bx, ax                                      ; Save logical sector

        mov dx, 0                                       ; First the sector
        div word [SectorsPerTrack]
        add dl, 01h                                     ; Physical sectors start at 1
        mov cl, dl                                      ; Sectors belong in CL for int 13h
        mov ax, bx

        mov dx, 0                                       ; Now calculate the head
        div word [SectorsPerTrack]
        mov dx, 0
        div word [Sides]
        mov dh, dl                                      ; Head/side
        mov ch, al                                      ; Track

        pop ax
        pop bx

        mov dl, byte [BootDev]                  ; Set correct device

        ret

KernelFname db "SMA     BIN"

DiskError db "HDD error! Press any key.", 0
KernelMiss db "Kernel file SMA.BIN missing.", 0

BootDev db 0                                            ; Boot device number
Cluster dw 0                                            ; Cluster of the file we want to load
Pointer dw 0                                            ; Pointer into Buffer, for loading kernel

times 510-($-$$) db 0                           ; Pad remainder of boot sector with zeros
dw 0AA55h                                               ; Boot signature (DO NOT CHANGE!)

Buffer:                                                 ; Disk Buffer begins (8k after this, stack starts)

První nejde, druhé ano - kde je rozdíl? :)

 
Nahoru Odpovědět 18.6.2013 7:16
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Podle mě načítáš data kernelu na 0x2000:0x0200, ne na 0x2000:0x0000, kam skáčeš.

Nahoru Odpovědět 18.6.2013 14:39
2 + 2 = 5 for extremely large values of 2
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Nic. Tedy obě verze způsobí vypsání písmene S do TTY, ale netuším, co si o tom mám myslet... :)

 
Nahoru Odpovědět 18.6.2013 15:23
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Martin Dráb
Domiy:

Kernel:

BITS 16

%define InterpreterBAS.Version '6.0'
%define APIVersion 16
                                                        ; This is the location in RAM for kernel disk operations, 24K
                                                        ; after the point where the kernel has loaded; it's 8K in size,
                                                        ; because external programs load after it at the 32K point:
DiskBuffer      equ     24576
                                                        ; The comments show exact locations of instructions in this section,
                                                        ; and are used in programs/smadev.inc so that an external program can
                                                        ; use a SMA-OP system call without having to know its exact position
                                                        ; in the kernel source code...
OsCallVectors:

        jmp Main

        jmp InterpreterBAS.Run                            ; 0003h
        jmp InterpreterBAS.Pause                                ; 0006h
        jmp InterpreterBAS.FatalError                      ; 0009h
        jmp System.ApiVersion                      ; 000Ch

        jmp Console.WaitForKey                    ; 000Fh
        jmp Console.WriteHline                    ; 0012h
        jmp Console.PrintRegs                      ; 0015h
        jmp Console.NewLine                          ; 0018h
        jmp Console.ReadLine                        ; 001Bh
        jmp Console.NibbleAL                        ; 001Eh
        jmp Console.ReadKey                          ; 0021h
        jmp Console.DigitAX                          ; 0024h
        jmp Console.PrintAL                          ; 0027h
        jmp Console.PrintAX                          ; 002Ah
        jmp Console.Space                              ; 002Dh
        jmp Console.Write                              ; 0030h
        jmp Console.Clear                              ; 0033h

        jmp Cursor.Location                          ; 0036h
        jmp Cursor.Move                          ; 0039h
        jmp Cursor.Show                          ; 003Ch
        jmp Cursor.Hide                          ; 003Fh

        jmp String.Join                          ; 0042h
        jmp String.Strip                                ; 0045h
        jmp String.Time                          ; 0048h
        jmp String.Date                          ; 004Bh
        jmp String.Parse                                ; 004Eh
        jmp String.Copy                          ; 0051h
        jmp String.Dump                          ; 0054h
        jmp String.Upper                                ; 0057h
        jmp String.Lower                                ; 005Ah
        jmp String.Length                              ; 005Dh
        jmp String.Chomp                                ; 0060h
        jmp String.Reverse                            ; 0063h
        jmp String.IndexOf                            ; 0066h
        jmp String.TimeFmt                            ; 0069h
        jmp String.DateFmt                            ; 006Ch
        jmp String.Truncate                          ; 006Fh
        jmp String.Tokenize                          ; 0072h
        jmp String.Compare                            ; 0075h
        jmp String.ReplaceChar                    ; 0078h
        jmp String.SubCompare                      ; 007Bh

        jmp Int.Parse                              ; 007Eh
        jmp Int.ToString                                ; 0081h
        jmp SInt.ToString                              ; 0084h
        jmp LInt.ToString                              ; 0087h

        jmp DialogBox.File                            ; 008Ah
        jmp DialogBox.List                            ; 008Dh
        jmp DialogBox.Plain                          ; 0090h
        jmp DialogBox.Input                          ; 0093h
        jmp DialogBox.DrawBlock                  ; 0096h

        jmp Math.Random                          ; 0099h
        jmp Math.BcdToInt                              ; 009Ch
        jmp Math.LIntNegate                          ; 009Fh

        jmp File.Size                              ; 00A2h
        jmp File.Load                              ; 00A5h
        jmp File.Save                              ; 00A8h
        jmp File.Exists                          ; 00ABh
        jmp File.Create                          ; 00AEh
        jmp File.Remove                          ; 00B1h
        jmp File.Rename                          ; 00B4h

        jmp Disk.FileList                              ; 00B7h

        jmp Port.SendByte                              ; 00BAh
        jmp Port.SpeakerOn                            ; 00BDh
        jmp Port.SpeakerOff                          ; 00C0h
        jmp Port.ReceiveByte                        ; 00C3h
        jmp Port.GetViaSerial                      ; 00C6h
        jmp Port.SendViaSerial                    ; 00C9h
        jmp Port.SerialPort.Enable                    ; 00CCh

        jmp Gshell.DrawBack                          ; 00CFh

Main:

        cli                                             ; Clear interrupts
        mov ax, 0
        mov ss, ax                              ; Set stack segment and pointer
        mov sp, 0FFFFh
        sti                                             ; Restore interrupts

        cld                                             ; The default direction for string operations will be 'up' - incrementing address in RAM

        mov ax, 2000h                           ; Set all segments to match where kernel is loaded
        mov ds, ax                              ; After this, we don't need to bother with
        mov es, ax                              ; segments ever again, as SMA-OP and its programs
        mov fs, ax                              ; live entirely in 64K
        mov gs, ax

        cmp dl, 0
        je .NoChange

        mov [bootdev], dl                       ; Save boot device number
        push es
        mov ah, 8                               ; Get drive parameters
        int 13h

        pop es
        and cx, 3Fh                             ; Maximum sector number
        mov [SecsPerTrack], cx          ; Sector numbers start at 1
        movzx dx, dh                            ; Maximum head number
        add dx, 1                                       ; Head numbers start at 0 - add 1 for total
        mov [Sides], dx

.NoChange:

        mov ax, 1003h                           ; Set text output with certain attributes
        mov bx, 0                               ; to be bright, and not blinking
        int 10h


        call Console.Clear
        call Iterp

Fmt1224 db 0                                    ; Non-zero = 24-hr format

FmtDate db 0, '/'                               ; 0, 1, 2 = M/D/Y, D/M/Y or Y/M/D
                                                        ; Bit 7 = use name for months
                                                        ; If bit 7 = 0, second byte = separator character
%include "features/Iterp.asm"
%include "features/System.asm"
%include "features/InterpreterBAS.asm"
%include "features/Gshell.asm"
%include "features/Console.asm"
%include "features/Cursor.asm"
%include "features/DialogBox.asm"
%include "features/Disk.asm"
%include "features/File.asm"
%include "features/Int.asm"
%include "features/Math.asm"
%include "features/Port.asm"
%include "features/String.asm"
 
Nahoru Odpovědět 18.6.2013 15:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 76 zpráv z 76.