Uspio sam rijesiti svoj problem bez 'debug' tool-a. Izgleda da 'debug' uopste ne mijenja moduse kad naidje na prefixe vec i dalje ostaje u 16-bitnom modusu. U nedelju sam skinuo
biew tool za disassembliranje COM formata i sve je uredno disassemblovao - tamo gdje je bio prefix saltao je na 32-bita, a standardno je disassemblirao COM-fajl u 16-bitnom modusu. Dok nisam disassemblirao sa njim masinski kod, mislio sam da je problem u generisanom kodu.
Usput sam shvatio i vaznost jednog drugog prefixa, 0x67, koji koristite ili pojedinacno ili u kombinaciji sa 0x66. 0x66 je tzv.
operand-size override attribute, kojim saopstavte procesoru da, ako je standardna velicina operanda 16 bita, da salta na 32 bita i obrnuto, kao sto sam vec spomenuo. Prefix 0x67 je tzv.
effective-address override attribute, kojim saopstavate procesoru da za racunanje efektivne adrese koristi 32 bita.
Citava ova frka sa prefixima je zbog toga sto 16-bitne i 32-bitne instrukcije imaju isti opcode; zamislite da imate jednu JMP instrukciju iza koje odmah slijedi tzv. displacement, tj. za koliko byte-ova EIP (instruction pointer) mora da se pomjeri gore ili dole, znaci taj displacement je kodiran u instrukciji. Problem je sto procesor ne zna sam od sebe koliko byte-ova koji slijede iza opcode-a, predstavljaju taj displacement. Posto svaki code-segment ima u svom descriptoru zapisanu tu standardnu velicinu, procesor koristi tu informaciju da odredi koliko byte-ova displacement-a slijede iza opcode-a. Ako je standardna vrijednost code-segmenta (kao npr. kod real-mode, u kojem i radi COM) 16 bitova, a ja zelim da procesor procita 4 byte-a za displacement, moram da stavim
operand-size override prefix, 0x66, ispred opcode-a.
Prefix 0x67 radi na slican nacin: ako npr. imam jednu instrukciju koja donese adresu iz jednog registra, a radim u standardnom 16-bitnom modusu, a hocu da procesor uzme 32 bita za adresu, onda stavim ispred opcode-a instrukcije prefix 0x67, i time kazem da procesor promijeni modus adresiranja sa standardnog na alternativni. Ovakav problem ne postoji sa 8-bitnim operandima i adresama jer takve 8-bit instrukcije imaju vlastiti opcode.
Pozdrav!