Из прерывания задвинуть в стек значение (до прерывания)

Тема в разделе "WASM.BEGINNERS", создана пользователем Tronix, 30 ноя 2019.

  1. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    16-битный процессор не умеет команду ENTER. Зато умеет invalid opcode int 06h. Задача - сэмулировать команду ENTER через обработчик прерывания int 06h.

    Код (ASM):
    1.         _rfl    equ 018h
    2.         _rcs    equ 016h
    3.         _rip    equ 014h
    4.         _ax     equ 012h
    5.         _cx     equ 010h
    6.         _dx     equ 0Eh
    7.         _bx     equ  0Ch
    8. ;        _sp     equ  0Ch
    9.         _bp     equ  0Ah
    10.         _si     equ  08h
    11.         _di     equ  06h
    12.         _es     equ  04h
    13.         _ds     equ  02h
    14.         _ss     equ  00h
    15.  
    16. new_06h:
    17.         ;pusha
    18.     push ax
    19.     push cx
    20.     push dx
    21.     push bx
    22.     push bp
    23.     push si
    24.     push di
    25.  
    26.         push    es
    27.         push    ds                      ;Save ALL registers.
    28.         push    ss                      ;Its not really nesecary to save SS ;)
    29.         mov     bp,sp                   ;but this engine was built for expansion
    30.  
    31.         push    cs
    32.         pop     ds
    33. GetOpCode:
    34.         lds     si,dword ptr [bp+_rip]  ;Get the seg:off of the next opcode
    35. dec si ; !!! WARNING here !!!
    36.         cld                             ;clear direction
    37.  
    38.   lodsw
    39.     cmp al,0c8h            ; ENTER opcode?
    40.     jne Bad_opcode
    41.  
    42.     lodsw ; imm16
    43. ____ВОТ ТУТ____ НАДО КАК-ТО вставить push bp
    44. mov bp,sp
    45. sub bp,ax
    46.  
    47. Bad_opcode:
    48.         pop     ss
    49.         pop     ds
    50.         pop     es                      ;Restore the flags
    51. ;        popa
    52.     pop di
    53.     pop si
    54.     pop bp
    55.     pop bx
    56.     pop dx
    57.     pop cx
    58.     pop ax
    59.         iret                            ;Run the next opcode.
    60.  
    Помогите плиз, что-то не соображу, толи весь стек надо подвинуть, толи как то можно хитрее.
     
    Последнее редактирование: 30 ноя 2019
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Tronix,

    > lodsw

    Ты не определил операцию с регистром, он будет +-1 изменён в зависимости от состояния F.DF на момент прерывания, те от фазы луны.

    > ____ВОТ ТУТ____ НАДО КАК-ТО вставить push bp

    Нужно посмотреть псевдокод обработки инструкции в доках вендора.
     
  3. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Точно, ну CLD там вначале воткну, это понятно, да.
    А про вендора - не понял. Нужно сэмулировать ENTER команду, появившуюся в 80186+. Упрощено, на 8086 процессоре, сэмулировать 286-команду ENTER, при этом учесть, что 8086 умеет генерить invalid opcode. Если еще более точно - то процессор 1810ВМ86М, пытаюсь написать простенький эмулятор 186+ команд на нем.

    UPD: Подправил исходник с учетом CLD...
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Tronix,

    В доках IA описывается алгоритм работ каждой инструкции, enter инструкция сложная(те множество микро-операций).

    ISR обработка всегда проста, так как нет какой то изоляции по контексту. У тебя режим такой, что стек не изолируется как в протектед мод. Посчитай смещение, те смещение из за сохранения регистров и ef/cs/ip, затем выполняй запись в стек соответственно алгоритму enter. Есчо нужно запись произвести безопасно, иначе может быть fault из прерывания при обращении к памяти, которая не доступна.
    --- Сообщение объединено, 30 ноя 2019 ---
    Я имел ввиду именно это.

    [​IMG]
     
    Последнее редактирование: 30 ноя 2019
  5. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Да нет, там процессор реально 8086, какие там fault. Вся память доступна, все как на ладоне.
    Не могу понять куда мне записать значение. По идее - в [bp+_rfl], но тем самым я затру флаги. Значит нужно все-таки в прерывании двигать стек?
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Tronix,

    [sp][+n_regs*16 + sizeof(IFRAME)]