Привет всем!)
Если кто знает, в чём тут особенность -- объясните мне, пожалуйста.
Я открыл дизассемблированный бинарный код нескольких модулей. Во всех модулях есть странная комбинация ассемблерных команд, по пересылке значения из ячейки памяти в регистр ЕАХ и обратно из регистра ЕАХ в ячейку памяти.
Ниже пример такого дизассемблированного бинарного кода.
Код:
PROCEDURE $$
00000000H: 55 push ebp
00000001H: 8B EC mov ebp, esp
00000003H: 57 push edi
00000004H: 56 push esi
00000005H: 66|A1 00 00 00 64 mov ax, [1677721600] (* 1 *)
0000000BH: 66|A3 00 00 00 64 mov [1677721600], ax (* вот это зачем? *)
00000011H: 66|A1 00 00 00 64 mov ax, [1677721600] (* повтор 1 *)
00000017H: 66|A3 00 00 00 64 mov [1677721600], ax (* повтор 1 непонятно зачем *)
0000001DH: 50 push eax
0000001EH: 66|A1 0D 00 00 64 mov ax, [1677721613]
00000024H: 50 push eax
00000025H: 68 00 00 00 64 push 1677721600
0000002AH: 68 00 00 00 64 push 1677721600
0000002FH: FF 15 00 00 00 64 call [1677721600]
00000035H: 66|A1 00 00 00 64 mov ax, [1677721600]
0000003BH: 66|A3 20 00 00 64 mov [1677721632], ax
00000041H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот это зачем??? *)
00000047H: 66|A3 19 00 00 64 mov [1677721625], ax
0000004DH: 50 push eax
0000004EH: 66|A1 3D 00 00 64 mov ax, [1677721661]
00000054H: 50 push eax
00000055H: 68 00 00 00 64 push 1677721600
0000005AH: 68 00 00 00 64 push 1677721600
0000005FH: FF 15 00 00 00 64 call [1677721600]
00000065H: C6 05 00 00 00 64 00 mov [1677721600], 0
0000006CH: 66|A1 00 00 00 64 mov ax, [1677721600] (* так регистр не обнуляется! ax -- младшая половина обнулена, а что со старшей? *)
00000072H: 66|A3 50 00 00 64 mov [1677721680], ax
00000078H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот это опять зачем?? *)
0000007EH: 66|A3 49 00 00 64 mov [1677721673], ax
00000084H: 50 push eax
00000085H: 66|A1 74 00 00 64 mov ax, [1677721716]
0000008BH: 50 push eax
0000008CH: 68 26 00 00 64 push 1677721638
00000091H: 68 00 00 00 64 push 1677721600
00000096H: FF 15 31 00 00 64 call [1677721649]
0000009CH: 66|A1 00 00 00 64 mov ax, [1677721600]
000000A2H: 66|A3 87 00 00 64 mov [1677721735], ax
000000A8H: 66|A1 00 00 00 64 mov ax, [1677721600] (* вот этот повтор опять зачем? *)
000000AEH: 66|A3 80 00 00 64 mov [1677721728], ax
000000B4H: 50 push eax
000000B5H: 66|A1 A4 00 00 64 mov ax, [1677721764]
000000BBH: 50 push eax
000000BCH: 68 56 00 00 64 push 1677721686
000000C1H: 68 00 00 00 64 push 1677721600
000000C6H: FF 15 61 00 00 64 call [1677721697]
000000CCH: C6 05 00 00 00 64 00 mov [1677721600], 0
000000D3H: 5E pop esi
000000D4H: 5F pop edi
000000D5H: 8B E5 mov esp, ebp
000000D7H: 5D pop ebp
000000D8H: C3 ret
Кроме того, что отмечено в коде, поправьте, если я не прав: в Паскаль-стиле вызывающая сторона очищает стек,
восстанавливает регистры (или я ошибаюсь?)