Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model large
- .code
- code segment
- assume cs:code, ds:code, es:code, ss:code
- org 100h
- .386
- start:
- ;Перейти на начало
- jmp beg ;безусловный переход
- print_symbol:
- ;Распечатать символ
- push ax
- push dx
- mov ah, 02h ;вывод на дисплей
- mov dl, dh ;dl - символ выводимый
- cmp dl, 0 ;cравнивает с нулём
- je t2 ;условный переход, если ZF=1; переход если нули или равно
- int 21h
- t2:
- pop dx
- int 21h
- pop ax
- ret ; читает последнюю запись из стека, адрес строчки типа
- print_number:
- ;Распечатать число, base = 10
- push ax
- push bx
- push cx
- push dx
- mov ax, dx
- mov bx, 10
- mov cx, 0
- getdigits:
- mov dx, 0
- div bx
- inc cx
- add dx
- push dx
- cmp ax, 0
- jnz getdigits
- mov ah, 02h
- printdigits:
- pop dx
- int 21h
- loop printdigits
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- debug:
- ;Сохранить регистры, запретить прерывания
- cli ;Clear Interrupt-Enable Flag IF
- push bp
- mov bp, sp
- push ax
- push bx
- push cx
- push dx
- push si
- ;вывод ax
- mov ah,09h
- lea dx,message
- int 21h
- mov dx, [bp-2]
- call print_number
- mov dx, etr
- call print_symbol
- ;Ожидать нажатие клавиши
- xor ax, ax
- int 16h
- ;Звуковой сигнал
- mov ah, 02h
- mov dl, 07h ; ASCII код сигнала BELL
- int 21h ; Динамик гудит
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- pop bp
- sti
- iret
- ;Отлаживаемая программа
- thread:
- mov ax, 1
- mov cx, 10
- t1:
- add ax, ax
- loop t1
- ret
- beg:
- ;Сохранить старый обработчик
- mov ax, 3501h ; 01h - ввод с клавиатуры
- int 21h
- mov old, bx
- mov old+2, es
- ;Установить новый обработчик
- push cs ;сегмент кода(страница памяти) исполняемая в данный момент программы
- pop ds
- mov dx, offset debug ;адрес порта ввода вывода
- mov ax, 2501h
- int 21h ;стандартное прерывание DOS зависящее от значения ah
- ;Сохранить парамеры для возврата
- pushf
- push offset exit
- ;Установит TF флаг, он разрешает пошаговую отладку, еогда после каждой
- ; инструкции происходит прерывание программы и вызов специального обработчика
- pushf
- pop ax
- or ax, 0100h ;TF флаг устанавливается
- push ax
- push cs ;селектор сегмента кода
- push offset thread ;перекидывает адрес на эту строчку
- iret ;извлекает из стэка новые значения ip(thread) потом cs после
- ;чего извлекаются значения регистров флагов которые мы в ax записали
- exit:
- popf ; восстанавливает значения регистра флагов
- ;Установить старый обработчик
- lea dx, old
- mov ax, 2501h
- int 21h
- ;Выход после нажатия клавиши
- mov ax, 4c00h
- int 21h
- int 20h
- old dw 0h, 0h ;dw - 2 байта под переменную
- etr dw 0Ah, 0Dh ;тоже переменная в которую запоминаем
- message db 'AX: $'
- code ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement