Код (Text): BOOTBLK:FF3E ; =============== S U B R O U T I N E ======================================= BOOTBLK:FF3E BOOTBLK:FF3E BOOTBLK:FF3E code_prepare proc near ; CODE XREF: CPU_init+D5j BOOTBLK:FF3E ; CPU_init+201j BOOTBLK:FF3E B0 02 mov al, 2 BOOTBLK:FF40 E6 80 out 80h, al ; manufacture's diagnostic checkpoint BOOTBLK:FF42 B8 18 00 mov ax, 18h BOOTBLK:FF45 8E D0 mov ss, ax BOOTBLK:FF47 assume ss:nothing BOOTBLK:FF47 66 BC C0 FF+ mov esp, 0DFFC0h BOOTBLK:FF4D 66 83 EC 24 sub esp, 24h BOOTBLK:FF51 66 8B EC mov ebp, esp BOOTBLK:FF54 BE D0 FF mov si, offset offset_TBL BOOTBLK:FF57 66 2E 8B 44+ mov eax, cs:[si+0Eh] BOOTBLK:FF5C 67 66 89 45+ mov [ebp+0], eax BOOTBLK:FF61 66 F7 D8 neg eax BOOTBLK:FF64 67 66 89 45+ mov [ebp+4], eax BOOTBLK:FF69 66 2E 8B 44+ mov eax, cs:[si+12h] BOOTBLK:FF6E 67 66 89 45+ mov [ebp+8], eax BOOTBLK:FF73 66 F7 D8 neg eax BOOTBLK:FF76 67 66 89 45+ mov [ebp+0Ch], eax BOOTBLK:FF7B 67 66 C7 45+ mov dword ptr [ebp+10h], 0DE000h BOOTBLK:FF84 67 66 C7 45+ mov dword ptr [ebp+14h], 2000h BOOTBLK:FF8D 67 66 89 6D+ mov [ebp+18h], ebp BOOTBLK:FF92 67 66 C7 45+ mov dword ptr [ebp+1Ch], 2000h BOOTBLK:FF9B 67 66 C7 45+ mov dword ptr [ebp+20h], 0 BOOTBLK:FFA4 8C C8 mov ax, cs BOOTBLK:FFA6 66 0F B7 F0 movzx esi, ax BOOTBLK:FFAA 66 C1 E6 04 shl esi, 4 BOOTBLK:FFAE 66 81 C6 20+ add esi, 0FB20h BOOTBLK:FFB5 66 6A 08 push large 8 BOOTBLK:FFB8 66 56 push esi BOOTBLK:FFBA BE D0 FF mov si, offset offset_TBL BOOTBLK:FFBD 66 2E 8B 74+ mov esi, cs:[si+6] BOOTBLK:FFC2 66 CB retfd ; enable 32-bit mode BOOTBLK:FFC2 BOOTBLK:FFC2 code_prepare endp BOOTBLK:FFC2 BOOTBLK:FFC2 ; --------------------------------------------------------------------------- А вот, он же (правда назван code_unpack) запущен в отладчике с помощью эмулятора ( я параметров ему никаких не передавал - он же вроде их не берет) Код (Text): 00000001 BOOTBLK:code_unpack+2 out 80h, al ; manufacture's diagnostic checkpoint 00000001 BOOTBLK:code_unpack+4 mov ax, 18h EAX=FFFE0018 00000001 BOOTBLK:code_unpack+7 mov ss, ax SS=0018 00000001 BOOTBLK:code_unpack+9 mov esp, 0DFFC0h ESP=000DFFC0 00000001 BOOTBLK:code_unpack+F sub esp, 24h ESP=000DFF9C PF=1 AF=1 00000001 BOOTBLK:code_unpack+13 mov ebp, esp EBP=000DFF9C 00000001 BOOTBLK:code_unpack+16 mov si, offset offset_TBL ESI=FFFFFFD0 00000001 BOOTBLK:code_unpack+19 mov eax, cs:[si+0Eh] EAX=FFFE0000 00000001 BOOTBLK:code_unpack+1E mov [ebp+0], eax 00000001 BOOTBLK:code_unpack+23 neg eax EAX=00020000 CF=1 AF=0 00000001 BOOTBLK:code_unpack+26 mov [ebp+4], eax 00000001 BOOTBLK:code_unpack+2B mov eax, cs:[si+12h] EAX=FFE00000 00000001 BOOTBLK:code_unpack+30 mov [ebp+8], eax 00000001 BOOTBLK:code_unpack+35 neg eax EAX=00200000 00000001 BOOTBLK:code_unpack+38 mov [ebp+0Ch], eax 00000001 BOOTBLK:code_unpack+3D mov dword ptr [ebp+10h], 0DE000h 00000001 BOOTBLK:code_unpack+46 mov dword ptr [ebp+14h], 2000h 00000001 BOOTBLK:code_unpack+4F mov [ebp+18h], ebp 00000001 BOOTBLK:code_unpack+54 mov dword ptr [ebp+1Ch], 2000h 00000001 BOOTBLK:code_unpack+5D mov dword ptr [ebp+20h], 0 00000001 BOOTBLK:code_unpack+66 mov ax, cs EAX=0020F000 00000001 BOOTBLK:code_unpack+68 movzx esi, ax ESI=0000F000 00000001 BOOTBLK:code_unpack+6C shl esi, 4 ESI=000F0000 CF=0 00000001 BOOTBLK:code_unpack+70 add esi, 0FB20h ESI=000FFB20 PF=0 00000001 BOOTBLK:code_unpack+77 push large 8 ESP=000DFF98 00000001 BOOTBLK:code_unpack+7A push esi ESP=000DFF94 00000001 BOOTBLK:code_unpack+7C mov si, offset offset_TBL ESI=000FFFD0 00000001 BOOTBLK:code_unpack+7F mov esi, cs:[si+6] ESI=FFFEB3C5 00000001 BOOTBLK:code_unpack+84 retfd ; enable 32-bit mode ESP=000DFF9C CS=0008 00000001 BOOTBLK:FB20 push bp ESP=000DFF98 В чем сакральный смысл этой функции? Я понял что он копирует в память кусок, но непонятно какой, и куда потом прыгает. Вот сама offset_TBL: Код (Text): BOOTBLK:FFD0 5F offset_TBL db 5Fh ; _ ; DATA XREF: code_prepare+16o BOOTBLK:FFD0 ; code_prepare+7Co BOOTBLK:FFD1 43 db 43h ; C BOOTBLK:FFD2 45 db 45h ; E BOOTBLK:FFD3 49 db 49h ; I BOOTBLK:FFD4 16 db 16h BOOTBLK:FFD5 00 db 0 BOOTBLK:FFD6 C5 B3 FE FF dd 0FFFEB3C5h BOOTBLK:FFDA E0 40 FF FF dd 0FFFF40E0h BOOTBLK:FFDE 00 00 dw 0 BOOTBLK:FFE0 FE FF dw 0FFFEh BOOTBLK:FFE2 00 00 dw 0 BOOTBLK:FFE4 E0 FF dw 0FFE0h BOOTBLK:FFE6 8D A4 dw 0A48Dh BOOTBLK:FFE8 24 00 dw 24h BOOTBLK:FFEA 00 00 dw 0 BOOTBLK:FFEC 00 8D dw 8D00h BOOTBLK:FFEE 49 00 dw 49h