Замена прерываний

Тема в разделе "WASM.ASSEMBLER", создана пользователем tower120, 21 май 2007.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Затем перехвать вектор обработки недействительной операции в нём распознать
    что у нас соотвествует mov ds,cs и тогда код из #6 и
    одна загвоздка остаётся - чтобы перехвать вектор обработки недействительной операции как раз и нужно применить mov ds,cs :dntknw:((
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ustus
    А если со стеком бедэ?)
    А мы ее сэмулируем)) А идея ниче так ))
    Например, сделать MOV DS,CS как сочетание UD2 + 0xFF например )
     
  3. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Y_Mur Глядишь после N проходов рекурсии и станет таки CS=DS :derisive:
     
  4. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Так... едем дальше...
    Задача: Установить будильник на определённое время. Выйти из проги. Через определенное время должно что-то случиться :)
    Код:

    ;===загрузка и запуск програм7ы===
    DATA SEGMENT
    Message2 db 10,13,'Seting up alarm...',10,13,'Input seconds:','$'
    Message3 db 10,13,'Input minutes:','$'
    Message4 db 10,13,'Input hours:','$'

    Seconds DB 0
    Minutes DB 0
    Hours DB 0


    PARAMETERS DW 7 DUP(0) ;нулевой блок параметров
    KEEP_SS DW 0 ;переменная для SS
    KEEP_SP DW 0 ;переменная для SP

    BUF DB 255 DUP(0) ;переменная для хранения

    DATA ENDS

    STK SEGMENT STACK ;сегмент стека
    DB 128 DUP(?)
    STK ENDS

    CODE SEGMENT ;сегмент кода
    ASSUME DS:lol: ATA,CS:CODE,SS:STK; связуем регистры с сегментами

    INPUT PROC ;п_дпрограма вводу з клав?атури
    ;IN:
    ; CX - число символ?в для введення
    ; DX - адреса буфера для вводу (BUF)
    mov bx,dx
    mov [bx],cl
    mov ah,0ah
    int 21h

    xor ch,ch
    mov cl,[bx+1]
    add bx,cx
    add bx,2
    mov [bx],0
    RET
    INPUT ENDP


    ; ПЕРЕВОД СТРОКОВОГО ЧИСЛА В ЧИСЛОВОЙ ВИД
    ; Вход:
    ; DS:SI - адрес строки с числом. Конец числа отмечен кодом 00h
    ; Выход:
    ; CF - индикатор ошибок:
    ; 0 - ошибок нет;
    ; 1 - ошибка
    ; Если CF=0, то AX - число.
    str_10 proc
    push bx
    push cx
    push dx
    push di
    xor cx,cx
    i1: lodsb
    cmp al,0
    je i_exit
    cmp al,'0'
    jb err
    cmp al,'9'
    ja err
    sub al,'0'
    shl cx,1
    jc err
    mov bx,cx
    shl cx,1
    jc err
    shl cx,1
    jc err
    add cx,bx
    jc err
    cbw
    add cx,ax
    jc err
    i3: inc di
    jmp short i1
    i_exit: mov ax,cx
    clc
    i4: pop di
    pop dx
    pop cx
    pop bx
    ret
    err: stc
    jmp short i4
    str_10 endp

    Alarm Proc
    message10 db 'LOL','$'

    lea dx,Message10
    mov ah,09h
    int 21h
    iret
    Alarm ENDP


    START:
    MOV AX,DATA ;загружаем в DS начальный адрес DATA
    MOV DS,AX

    ;---получаем параметры для работы---------------------
    lea dx,Message1
    mov ah,09h
    int 21h

    lea dx,Message2
    mov ah,09h
    int 21h

    mov cx,4
    lea dx,buf
    call input
    lea si,buf
    add si,2
    call str_10
    mov Seconds,al

    lea dx,Message3
    mov ah,09h
    int 21h

    mov cx,4
    lea dx,buf
    call input
    lea si,buf
    add si,2
    call str_10
    mov Minutes,al

    lea dx,Message4
    mov ah,09h
    int 21h

    mov cx,4
    lea dx,buf
    call input
    lea si,buf
    add si,2
    call str_10
    mov Hours,al
    ;---замена прерывания---------------------------------
    push ds
    push cs
    pop ds

    mov ah,25h
    mov al,4ah
    lea dx,Alarm
    int 21h

    pop ds ;back to normal

    ; int 4ah

    ;---сбрасываем будильник------------------------------
    mov ah,07h
    int 1ah
    ;---устанавливаем будильник-------]--------------------
    mov ah,06h
    mov ch,hours
    mov cl,minutes
    mov dh,seconds
    int 1ah

    ; xor ax,ax
    ; int 16h;
    ;---возвращаемся в ДОС---------
    MOV AX,4C00H
    INT 21H
    CODE ENDS
    END START

    Результат: Отсутствует