Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Прошу помощи в понимании кода


Автор: SomeOtherOne 04.08.15, 16:37
Прошу помочь разобраться с кодом
IDA выдает вот такой листинг
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    F000:0000 ;
    F000:0000 ; +-------------------------------------------------------------------------+
    F000:0000 ; |     This file is generated by The Interactive Disassembler (IDA)        |
    F000:0000 ; |     Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com>        |
    F000:0000 ; +-------------------------------------------------------------------------+
    F000:0000 ;
    F000:0000 ; Input MD5   : 28987D85E87427A762221DFAFD273A9A
    F000:0000
    F000:0000 ; File Name   : C:\-*censored*-\SN140-AE002.BIN
    F000:0000 ; Format      : Binary file
    F000:0000 ; Base Address: F000h Range: F0000h - 100000h Loaded length: 10000h
    F000:0000
    F000:0000                 .8086
    F000:0000                 .model small
    F000:0000 .intel_syntax noprefix
    F000:0000
    F000:0000 ; ===========================================================================
    F000:0000
    F000:0000 ; Segment type: Pure code
    F000:0000 seg000          segment byte public 'CODE'
    F000:0000                 assume cs:seg000
    F000:0000                 assume es:nothing, ss:nothing, ds:nothing
    F000:0000
    F000:0000 ; =============== S U B R O U T I N E =======================================
    F000:0000
    F000:0000 ; Attributes: noreturn
    F000:0000
    F000:0000 sub_F0000       proc near               ; CODE XREF: entry_near+DE j
    F000:0000                 mov     ax, 1
    F000:0003                 mov     ax, 0AF9h
    F000:0006                 mov     ax, 0F000h
    F000:0009                 mov     ax, 200h
    F000:000C                 mov     ax, 0F000h
    F000:000F                 mov     ds, ax
    F000:0011                 assume ds:nothing
    F000:0011                 mov     bx, 4           ; DS:0F000h
    F000:0014                 add     ax, [bx]
    F000:0016                 mov     ds, ax          ; DS:0AF9h
    F000:0018                 assume ds:nothing
    F000:0018                 mov     ax, 200h
    F000:001B                 mov     es, ax
    F000:001D                 assume es:nothing
    F000:001D                 mov     ax, 325h
    F000:0020                 sub     ax, 200h
    F000:0023                 jz      short loc_F005B
    F000:0025                 xor     dx, dx
    F000:0027                 cld
    F000:0028
    F000:0028 loc_F0028:                              ; CODE XREF: sub_F0000+59 j
    F000:0028                 cmp     ax, 1000h
    F000:002B                 ja      short loc_F003B
    F000:002D                 add     ax, ax
    F000:002F                 add     ax, ax
    F000:0031                 add     ax, ax
    F000:0033                 mov     cx, ax
    F000:0035                 mov     dx, 1
    F000:0038                 jmp     short loc_F003E
    F000:0038 ; ---------------------------------------------------------------------------
    F000:003A                 db  90h ; Ð
    F000:003B ; ---------------------------------------------------------------------------
    F000:003B
    F000:003B loc_F003B:                              ; CODE XREF: sub_F0000+2B j
    F000:003B                 mov     cx, 8000h
    F000:003E
    F000:003E loc_F003E:                              ; CODE XREF: sub_F0000+38 j
    F000:003E                 xor     si, si
    F000:0040                 mov     di, si
    F000:0042                 rep movsw
    F000:0044                 mov     bx, es
    F000:0046                 add     bx, 1000h
    F000:004A                 mov     es, bx
    F000:004C                 assume es:nothing
    F000:004C                 mov     bx, ds
    F000:004E                 add     bx, 1000h
    F000:0052                 mov     ds, bx
    F000:0054                 assume ds:nothing
    F000:0054                 sub     ax, 1000h
    F000:0057                 or      dx, dx
    F000:0059                 jz      short loc_F0028
    F000:005B
    F000:005B loc_F005B:                              ; CODE XREF: sub_F0000+23 j
    F000:005B                 cld
    F000:005C                 mov     ax, 0BA1h
    F000:005F                 mov     bx, 325h
    F000:0062                 mov     es, bx
    F000:0064                 assume es:nothing
    F000:0064                 sub     ax, bx
    F000:0066                 jz      short loc_F0099
    F000:0068                 xor     dx, dx
    F000:006A
    F000:006A loc_F006A:                              ; CODE XREF: sub_F0000+97 j
    F000:006A                 cmp     ax, 1000h
    F000:006D                 ja      short loc_F007D
    F000:006F                 add     ax, ax
    F000:0071                 add     ax, ax
    F000:0073                 add     ax, ax
    F000:0075                 mov     cx, ax
    F000:0077                 mov     dx, 1
    F000:007A                 jmp     short loc_F0080
    F000:007A ; ---------------------------------------------------------------------------
    F000:007C                 db  90h ; Ð
    F000:007D ; ---------------------------------------------------------------------------
    F000:007D
    F000:007D loc_F007D:                              ; CODE XREF: sub_F0000+6D j
    F000:007D                 mov     cx, 8000h
    F000:0080
    F000:0080 loc_F0080:                              ; CODE XREF: sub_F0000+7A j
    F000:0080                 mov     si, ax
    F000:0082                 xor     di, di
    F000:0084                 xor     ax, ax
    F000:0086                 rep stosw               ; Clear entire RAM
    F000:0088                 mov     ax, si
    F000:008A                 mov     bx, es
    F000:008C                 add     bx, 1000h
    F000:0090                 mov     es, bx
    F000:0092                 assume es:nothing
    F000:0092                 sub     ax, 1000h
    F000:0095                 or      dx, dx
    F000:0097                 jz      short loc_F006A
    F000:0099
    F000:0099 loc_F0099:                              ; CODE XREF: sub_F0000+66 j
    F000:0099                 mov     ax, 200h
    F000:009C                 mov     ds, ax
    F000:009E                 assume ds:nothing
    F000:009E                 mov     ss, ax
    F000:00A0                 assume ss:nothing
    F000:00A0                 mov     sp, 0DFFEh
    F000:00A3                 xor     ax, ax
    F000:00A5                 mov     ds, ax
    F000:00A7                 assume ds:nothing
    F000:00A7                 mov     ax, cs
    F000:00A9                 mov     bx, 0
    F000:00AC                 mov     word ptr [bx], 0D2h ; 'T'
    F000:00B0                 mov     [bx+2], ax
    F000:00B3                 mov     bx, 10h
    F000:00B6                 mov     cx, 1Ch
    F000:00B9
    F000:00B9 loc_F00B9:                              ; CODE XREF: sub_F0000+C3 j
    F000:00B9                 mov     word ptr [bx], 0D2h ; 'T'
    F000:00BD                 mov     [bx+2], ax
    F000:00C0                 add     bx, 4
    F000:00C3                 loop    loc_F00B9
    F000:00C5                 mov     ax, 200h
    F000:00C8                 mov     ds, ax
    F000:00CA                 assume ds:nothing
    F000:00CA                 mov     es, ax
    F000:00CC                 assume es:nothing
    F000:00CC                 call    sub_F02A1
    F000:00CC sub_F0000       endp
    F000:00CC
    F000:00CC ; ---------------------------------------------------------------------------
    F000:00CF                 db 0EBh ; û
    F000:00D0                 db  22h ; "
    F000:00D1                 db  90h ; Ð
    F000:00D2                 db 0CFh ; ¦
    F000:00D3                 db 0CFh ; ¦
    F000:00D4                 db  80h ; À
    F000:00D5                 db 0FCh ; ¹
    F000:00D6                 db  25h ; %
    F000:00D7                 db  75h ; u
    F000:00D8                 db  17h
    F000:00D9                 db  53h ; S
    F000:00DA                 db  50h ; P
    F000:00DB                 db    6
    F000:00DC                 db  33h ; 3
    F000:00DD                 db 0DBh ; -
    F000:00DE                 db  8Eh ; Î
    F000:00DF                 db 0C3h ; +
    F000:00E0                 db  8Ah ; Ê
    F000:00E1                 db 0D8h ; +
    F000:00E2                 db    3
    F000:00E3                 db 0DBh ; -
    F000:00E4                 db    3
    F000:00E5                 db 0DBh ; -
    F000:00E6                 db  26h ; &
    F000:00E7                 db  89h ; É
    F000:00E8                 db  17h
    F000:00E9                 db  26h ; &
    F000:00EA                 db  8Ch ; Ì
    F000:00EB                 db  5Fh ; _
    F000:00EC                 db    2
    F000:00ED                 db    7
    F000:00EE                 db  58h ; X
    F000:00EF                 db  5Bh ; [
    F000:00F0                 db 0CFh ; ¦
    F000:00F1                 db 0CCh ; ¦
    F000:00F2                 db 0CCh ; ¦
    F000:00F3                 db 0CCh ; ¦
    F000:00F4                 db 0CCh ; ¦
    F000:00F5                 db 0CCh ; ¦
    F000:00F6                 db 0CCh ; ¦
    F000:00F7                 db 0C7h ; ¦
    F000:00F8                 db    6
    F000:00F9                 db    0
    F000:00FA                 db    0
    F000:00FB                 db    0
    F000:00FC                 db    0
    F000:00FD                 db 0CBh ; T
    F000:00FE ; ---------------------------------------------------------------------------
    F000:00FE                 push    bp
    F000:00FF                 mov     bp, sp
    F000:0101                 xor     ax, ax
    F000:0103                 mov     al, [bp+4]
    F000:0106                 call    sub_F0117
    F000:0109                 pop     bp
    F000:010A                 retn
    F000:010B ; ---------------------------------------------------------------------------
    F000:010B                 push    bp
    F000:010C                 mov     bp, sp
    F000:010E                 mov     ah, 1
    F000:0110                 call    sub_F0117
    F000:0113                 xor     ah, ah
    F000:0115                 pop     bp
    F000:0116                 retn
    F000:0117
    F000:0117 ; =============== S U B R O U T I N E =======================================
    F000:0117
    F000:0117
    F000:0117 sub_F0117       proc near               ; CODE XREF: seg000:0106 p
    F000:0117                                         ; seg000:0110 p
    F000:0117                 push    es
    F000:0118                 xor     bx, bx
    F000:011A                 mov     es, bx
    F000:011C                 assume es:nothing
    F000:011C                 push    word ptr es:0Ah
    F000:0121                 mov     bx, 0Ah
    F000:0124                 push    bx
    F000:0125                 mov     bx, sp
    F000:0127                 call    dword ptr ss:[bx]
    F000:012A                 add     sp, 4
    F000:012D                 pop     es
    F000:012E                 retn
    F000:012E sub_F0117       endp
    F000:012E
    F000:012F ; ---------------------------------------------------------------------------
    F000:012F
    F000:012F entry_far:                              ; CODE XREF: seg000:FFF0 J
    F000:012F                 jmp     short entry_near
    F000:0131 ; ---------------------------------------------------------------------------
    F000:0131                 nop
    F000:0132                 mov     dx, 100h
    F000:0135                 mov     al, 61h ; 'a'
    F000:0137                 out     dx, al
    F000:0138                 nop
    F000:0139                 nop
    F000:013A                 nop
    F000:013B                 nop
    F000:013C                 nop
    F000:013D                 retn
    F000:013E ; ---------------------------------------------------------------------------
    F000:013E                 mov     dx, 100h
    F000:0141                 mov     al, 62h ; 'b'
    F000:0143                 out     dx, al
    F000:0144                 nop
    F000:0145                 nop
    F000:0146                 nop
    F000:0147                 nop
    F000:0148                 nop
    F000:0149                 retn
    F000:014A ; ---------------------------------------------------------------------------
    F000:014A                 mov     dx, 100h
    F000:014D                 mov     al, 65h ; 'e'
    F000:014F                 out     dx, al
    F000:0150                 nop
    F000:0151                 nop
    F000:0152                 nop
    F000:0153                 nop
    F000:0154                 nop
    F000:0155                 retn
    F000:0156 ; ---------------------------------------------------------------------------
    F000:0156                 mov     dx, 100h
    F000:0159                 mov     al, 66h ; 'f'
    F000:015B                 out     dx, al
    F000:015C                 nop
    F000:015D                 nop
    F000:015E                 nop
    F000:015F                 nop
    F000:0160                 nop
    F000:0161                 retn
    F000:0162 ; ---------------------------------------------------------------------------
    F000:0162                 mov     dx, 100h
    F000:0165                 mov     al, 67h ; 'g'
    F000:0167                 out     dx, al
    F000:0168                 nop
    F000:0169                 nop
    F000:016A                 nop
    F000:016B                 nop
    F000:016C                 nop
    F000:016D                 retn
    F000:016D ; ---------------------------------------------------------------------------
    F000:016E                 db    0
    F000:016F                 db    0
    F000:0170 ; ---------------------------------------------------------------------------
    F000:0170                 add     [bx+si-1], bh
    F000:0174                 mov     es, ax
    F000:0176                 assume es:nothing
    F000:0176                 mov     di, 0
    F000:0179                 mov     byte ptr es:[di], 0EAh ; 'ú'
    F000:017D                 mov     word ptr es:[di+1], 12Fh
    F000:0183                 mov     ax, cs
    F000:0185                 mov     es:[di+3], ax
    F000:0189                 mov     bx, 0
    F000:018C                 mov     cx, 0
    F000:018F
    F000:018F loc_F018F:                              ; CODE XREF: seg000:019A j
    F000:018F                 mov     ax, cs:[bx]
    F000:0192                 xor     cl, al
    F000:0194                 xor     ch, ah
    F000:0196                 inc     bx
    F000:0197                 inc     bx
    F000:0198                 or      bx, bx
    F000:019A                 jnz     short loc_F018F
    F000:019C                 mov     bx, 16Fh
    F000:019F                 and     bx, 0FFFEh
    F000:01A3                 mov     cs:[bx], cx
    F000:01A6                 nop
    F000:01A7                 int     3               ; Trap to Debugger
    F000:01A8
    F000:01A8 ; =============== S U B R O U T I N E =======================================
    F000:01A8
    F000:01A8
    F000:01A8 sub_F01A8       proc near               ; CODE XREF: sub_F01A8+1 j
    F000:01A8                                         ; sub_F11FA+25 p ...
    F000:01A8                 nop
    F000:01A9                 loop    sub_F01A8
    F000:01AB                 retn
    F000:01AB sub_F01A8       endp
    F000:01AB
    F000:01AC
    F000:01AC ; =============== S U B R O U T I N E =======================================
    F000:01AC
    F000:01AC ; Attributes: noreturn
    F000:01AC
    F000:01AC entry_near      proc near               ; CODE XREF: seg000:entry_far j
    F000:01AC                 mov     dx, 10h
    F000:01AF                 in      ax, dx          ; Interrupt controller, 8259A.
    F000:01B0                 and     ax, 2010h
    F000:01B3                 jz      short loc_F01DB
    F000:01B5                 mov     dx, 20h ; ' '
    F000:01B8                 mov     al, 80h ; 'À'
    F000:01BA                 out     dx, al          ; Interrupt controller, 8259A.
    F000:01BB
    F000:01BB loc_F01BB:                              ; CODE XREF: entry_near+2D j
    F000:01BB                 mov     dx, 10h         ; Read U4 U47
    F000:01BE                 in      ax, dx
    F000:01BF                 and     ax, 10h         ; Check for BTL signal
    F000:01C2                 jz      short loc_F01DB
    F000:01C4                 mov     dx, 20h ; ' '
    F000:01C7                 mov     ax, 84h ; 'Ä'
    F000:01CA                 out     dx, ax          ; Interrupt controller, 8259A.
    F000:01CB                 nop
    F000:01CC                 nop
    F000:01CD                 nop
    F000:01CE                 nop
    F000:01CF                 nop
    F000:01D0                 nop
    F000:01D1                 nop
    F000:01D2                 nop
    F000:01D3                 nop
    F000:01D4                 nop
    F000:01D5                 mov     ax, 80h ; 'À'
    F000:01D8                 out     dx, ax          ; Interrupt controller, 8259A.
    F000:01D9                 jmp     short loc_F01BB
    F000:01DB ; ---------------------------------------------------------------------------
    F000:01DB
    F000:01DB loc_F01DB:                              ; CODE XREF: entry_near+7 j
    F000:01DB                                         ; entry_near+16 j
    F000:01DB                 mov     dx, 52h ; 'R'
    F000:01DE                 mov     al, 0FFh
    F000:01E0                 out     dx, al
    F000:01E1                 mov     dx, 20h ; ' '
    F000:01E4                 mov     al, 4
    F000:01E6                 out     dx, al          ; Interrupt controller, 8259A.
    F000:01E7                 nop
    F000:01E8                 nop
    F000:01E9                 nop
    F000:01EA                 nop
    F000:01EB                 nop
    F000:01EC                 nop
    F000:01ED                 nop
    F000:01EE                 nop
    F000:01EF                 nop
    F000:01F0                 nop
    F000:01F1                 nop
    F000:01F2                 nop
    F000:01F3                 mov     al, 0
    F000:01F5                 out     dx, al          ; Interrupt controller, 8259A.
    F000:01F6                 mov     dx, 0FFFEh
    F000:01F9                 mov     al, 0
    F000:01FB                 out     dx, al
    F000:01FC                 nop
    F000:01FD                 nop
    F000:01FE                 nop
    F000:01FF                 nop
    F000:0200                 nop
    F000:0201                 mov     al, 7
    F000:0203                 out     dx, al
    F000:0204                 nop
    F000:0205                 nop
    F000:0206                 nop
    F000:0207                 nop
    F000:0208                 nop
    F000:0209                 mov     dx, 0FFFDh
    F000:020C                 mov     al, 0
    F000:020E                 out     dx, al
    F000:020F                 nop
    F000:0210                 nop
    F000:0211                 nop
    F000:0212                 nop
    F000:0213                 nop
    F000:0214                 mov     al, 0Fh
    F000:0216                 out     dx, al
    F000:0217                 nop
    F000:0218                 nop
    F000:0219                 nop
    F000:021A                 nop
    F000:021B                 nop
    F000:021C                 mov     dx, 0FFFCh
    F000:021F                 mov     al, 0F0h ; '¨'
    F000:0221                 out     dx, al
    F000:0222                 nop
    F000:0223                 nop
    F000:0224                 nop
    F000:0225                 nop
    F000:0226                 nop
    F000:0227                 mov     dx, 0FFFAh
    F000:022A                 mov     al, 0
    F000:022C                 out     dx, al
    F000:022D                 nop
    F000:022E                 nop
    F000:022F                 nop
    F000:0230                 nop
    F000:0231                 nop
    F000:0232                 mov     dx, 0FFF9h
    F000:0235                 mov     al, 10h
    F000:0237                 out     dx, al
    F000:0238                 nop
    F000:0239                 nop
    F000:023A                 nop
    F000:023B                 nop
    F000:023C                 nop
    F000:023D                 mov     dx, 0FFF8h
    F000:0240                 mov     al, 20h ; ' '
    F000:0242                 out     dx, al
    F000:0243                 nop
    F000:0244                 nop
    F000:0245                 nop
    F000:0246                 nop
    F000:0247                 nop
    F000:0248                 mov     dx, 0FFFBh
    F000:024B                 mov     al, 30h ; '0'
    F000:024D                 out     dx, al
    F000:024E                 nop
    F000:024F                 nop
    F000:0250                 nop
    F000:0251                 nop
    F000:0252                 nop
    F000:0253                 mov     dx, 0FFF0h
    F000:0256                 mov     al, 2
    F000:0258                 out     dx, al
    F000:0259                 nop
    F000:025A                 nop
    F000:025B                 nop
    F000:025C                 nop
    F000:025D                 nop
    F000:025E                 mov     dx, 0FFF4h
    F000:0261                 mov     al, 11h
    F000:0263                 out     dx, al
    F000:0264                 nop
    F000:0265                 nop
    F000:0266                 nop
    F000:0267                 nop
    F000:0268                 nop
    F000:0269                 mov     dx, 0FFF5h
    F000:026C                 mov     al, 0C8h ; 'L'
    F000:026E                 out     dx, al
    F000:026F                 nop
    F000:0270                 nop
    F000:0271                 nop
    F000:0272                 nop
    F000:0273                 nop
    F000:0274                 mov     dx, 0FFF6h
    F000:0277                 mov     al, 8
    F000:0279                 out     dx, al
    F000:027A                 nop
    F000:027B                 nop
    F000:027C                 nop
    F000:027D                 nop
    F000:027E                 nop
    F000:027F                 mov     dx, 0FFF2h
    F000:0282                 mov     al, 0
    F000:0284                 out     dx, al
    F000:0285                 nop
    F000:0286                 nop
    F000:0287                 nop
    F000:0288                 nop
    F000:0289                 nop
    F000:028A                 jmp     sub_F0000
    F000:028D ; ---------------------------------------------------------------------------
    F000:028D                 retn
    F000:028D entry_near      endp
    F000:028D
    F000:028E


Смущает инструкция по адресу F000:028A которая передает управление в начало сегмента.
Там же по идее должны вектора прерываний находиться?
Сами инструкции (в начале сегмента) тоже выглядят бессмысленными...
С другой стороны я их прослеживал - со временем они выходят на осмысленный код.
Собственно вопрос - это нормальный код или нет? Можно списать на проделки компилятора?

Добавлено
Процессор - NEC UPD70216H

Автор: shm 04.08.15, 22:17
Цитата SomeOtherOne @
Там же по идее должны вектора прерываний находиться?

Вектора прерываний находятся по адресу 0000:0000. Эта же инструкция передает адрес в начало сегмента (не нулевого).
Цитата SomeOtherOne @
Сами инструкции (в начале сегмента) тоже выглядят бессмысленными...

например?
Цитата SomeOtherOne @
Собственно вопрос - это нормальный код или нет?

А что такое "ненормальны код"? Код как код, с учетом того, что его выдал дизассемблер.

Автор: SomeOtherOne 05.08.15, 11:31
Цитата shm @

А что такое "ненормальны код"?

Ну вот например:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    F000:0000                 mov     ax, 1
    F000:0003                 mov     ax, 0AF9h
    F000:0006                 mov     ax, 0F000h
    F000:0009                 mov     ax, 200h
    F000:000C                 mov     ax, 0F000h
    F000:000F                 mov     ds, ax


AX пять раз загружается один раз используется.
DS тоже самое:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    F000:000C                 mov     ax, 0F000h
    F000:000F                 mov     ds, ax
    F000:0011                 mov     bx, 4          
    F000:0014                 add     ax, [bx]
    F000:0016                 mov     ds, ax


Вот это ветвление никогда не срабатывает:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    F000:001D                 mov     ax, 325h
    F000:0020                 sub     ax, 200h
    F000:0023                 jz      short loc_F005B


короче первые два десятка строк на код не похожи
я почему и сомневаюсь - может это таблица какаянить..


Цитата shm @
Вектора прерываний находятся по адресу 0000:0000. Эта же инструкция передает адрес в начало сегмента (не нулевого).

Да, действительно... получается что вектора в оперативку загружаются.

Может эмулятор какой посоветуете? Чтоб IDA-шный вывод туда загрузить и посмотреть как оно работает.

Автор: Славян 05.08.15, 15:06
Весьма странно видеть это:
Цитата SomeOtherOne @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    F000:003A                 db  90h ; Ð
ибо это же код команды nop. :-?

Автор: SomeOtherOne 06.08.15, 14:20
Попробую по другому спросить :)

Что нужно сделать чтобы запустить встроенный в IDA отладчик для этого кода?

в моем случае меню "Debugger" отсутствует, панели инструментов отладчика неактивны.
Пробовал загружать Notepad.exe - меню "Debugger" появляется.
Как подключить отладчик к моему коду - не могу сообразить... :huh:

Автор: SomeOtherOne 07.08.15, 13:02
Пришел к выводу что проблема не имеет простого решения.
Все дело в том что IDA PRO это супер крутейший интерактивнейший мега дизассемблер-турбоотладчик.
И чтобы использовать всю эту круть надо всего ничего - написать плагин-эмулятор железяки в которой ты ковыряешься. :crazy:
такие дела...

Ушел курить IDA SDK.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)