16-битный процессор не умеет команду ENTER. Зато умеет invalid opcode int 06h. Задача - сэмулировать команду ENTER через обработчик прерывания int 06h. Код (ASM): _rfl equ 018h _rcs equ 016h _rip equ 014h _ax equ 012h _cx equ 010h _dx equ 0Eh _bx equ 0Ch ; _sp equ 0Ch _bp equ 0Ah _si equ 08h _di equ 06h _es equ 04h _ds equ 02h _ss equ 00h new_06h: ;pusha push ax push cx push dx push bx push bp push si push di push es push ds ;Save ALL registers. push ss ;Its not really nesecary to save SS ;) mov bp,sp ;but this engine was built for expansion push cs pop ds GetOpCode: lds si,dword ptr [bp+_rip] ;Get the seg:off of the next opcode dec si ; !!! WARNING here !!! cld ;clear direction lodsw cmp al,0c8h ; ENTER opcode? jne Bad_opcode lodsw ; imm16 ____ВОТ ТУТ____ НАДО КАК-ТО вставить push bp mov bp,sp sub bp,ax Bad_opcode: pop ss pop ds pop es ;Restore the flags ; popa pop di pop si pop bp pop bx pop dx pop cx pop ax iret ;Run the next opcode. Помогите плиз, что-то не соображу, толи весь стек надо подвинуть, толи как то можно хитрее.
Tronix, > lodsw Ты не определил операцию с регистром, он будет +-1 изменён в зависимости от состояния F.DF на момент прерывания, те от фазы луны. > ____ВОТ ТУТ____ НАДО КАК-ТО вставить push bp Нужно посмотреть псевдокод обработки инструкции в доках вендора.
Точно, ну CLD там вначале воткну, это понятно, да. А про вендора - не понял. Нужно сэмулировать ENTER команду, появившуюся в 80186+. Упрощено, на 8086 процессоре, сэмулировать 286-команду ENTER, при этом учесть, что 8086 умеет генерить invalid opcode. Если еще более точно - то процессор 1810ВМ86М, пытаюсь написать простенький эмулятор 186+ команд на нем. UPD: Подправил исходник с учетом CLD...
Tronix, В доках IA описывается алгоритм работ каждой инструкции, enter инструкция сложная(те множество микро-операций). ISR обработка всегда проста, так как нет какой то изоляции по контексту. У тебя режим такой, что стек не изолируется как в протектед мод. Посчитай смещение, те смещение из за сохранения регистров и ef/cs/ip, затем выполняй запись в стек соответственно алгоритму enter. Есчо нужно запись произвести безопасно, иначе может быть fault из прерывания при обращении к памяти, которая не доступна. --- Сообщение объединено, 30 ноя 2019 --- Я имел ввиду именно это.
Да нет, там процессор реально 8086, какие там fault. Вся память доступна, все как на ладоне. Не могу понять куда мне записать значение. По идее - в [bp+_rfl], но тем самым я затру флаги. Значит нужно все-таки в прерывании двигать стек?