Копирование в память.

Тема в разделе "WASM.RESEARCH", создана пользователем XVilka, 21 май 2011.

  1. XVilka

    XVilka New Member

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

    Вот сама offset_TBL:
    Код (Text):
    1. BOOTBLK:FFD0 5F          offset_TBL      db  5Fh ; _                                 ; DATA XREF: code_prepare+16o
    2. BOOTBLK:FFD0                                                                         ; code_prepare+7Co
    3. BOOTBLK:FFD1 43                          db  43h ; C
    4. BOOTBLK:FFD2 45                          db  45h ; E
    5. BOOTBLK:FFD3 49                          db  49h ; I
    6. BOOTBLK:FFD4 16                          db  16h
    7. BOOTBLK:FFD5 00                          db    0
    8. BOOTBLK:FFD6 C5 B3 FE FF                 dd 0FFFEB3C5h
    9. BOOTBLK:FFDA E0 40 FF FF                 dd 0FFFF40E0h
    10. BOOTBLK:FFDE 00 00                       dw 0
    11. BOOTBLK:FFE0 FE FF                       dw 0FFFEh
    12. BOOTBLK:FFE2 00 00                       dw 0
    13. BOOTBLK:FFE4 E0 FF                       dw 0FFE0h
    14. BOOTBLK:FFE6 8D A4                       dw 0A48Dh
    15. BOOTBLK:FFE8 24 00                       dw 24h
    16. BOOTBLK:FFEA 00 00                       dw 0
    17. BOOTBLK:FFEC 00 8D                       dw 8D00h
    18. BOOTBLK:FFEE 49 00                       dw 49h