Пишется обработчик прерывания 09h. При нажатии на ctrl-alt-delete нужно, чтобы выводилось сообщение ctrlaltdelete. Так вот проблема в том что вместо этой строки выводится какой то бред. По моему проблема в смещении. Пробовал исправить но не получается. Вот исходник: Код (Text): .model tiny prg segment para public 'code' assume cs:prg,ss:prg,es:prg,ds:prg org 100h ctrl_key equ 04h alt_key equ 08h del_key equ 53h keyb_port equ 60h start: jmp setup int9_handler proc far sti pushf push es push ax push di L1: mov ax,40h mov es,ax mov di,17h mov ah,es:[di] L2: test ah,ctrl_key jz L5 test ah,alt_key jz L5 L3: in al,keyb_port cmp al,del_key jne L5 L4: and ah,not ctrl_key mov es:[di],ah push ax push di push es xor ax,ax mov ah,0Ch mov si,offset message mov bx,0B800h mov es,bx mov cx,13 ;количество символов в строке mov di,1987 ;позиция вывода cld scr: lodsb stosw loop scr pop es pop di pop ax L5: pop di pop ax pop es popf jmp cs:[old_interrupt9] old_interrupt9 dd ? message db "ctrlaltdelete$" int9_handler endp end_ISR label byte setup: mov ax,3509h int 21h mov word ptr old_interrupt9,bx mov word ptr old_interrupt9+2,es mov ax,2509h mov dx,offset int9_handler int 21h mov ax,3100h mov dx,offset end_ISR mov cl,4 shr dx,cl inc dx int 21h prg ends end start
slip11 Не настроен сегмент message в регистр ds для команды lodsb. Почему начальный адрес вывода - 1987 - нечетный? Чтобы перед stosw не менять местами AL и AH? Тогда последний символ не получает атрибут.
q_q Как настроить сегмент message в регистр ds? Писал такой код Код (Text): mov ax,seg message mov ds,ax выдает ошибку.
Все верно, видеопамять немного по-другому устроена -- каждая ячейка описана двумя байтами, первый -- код символа, второй -- цвет символа и цвет фона. Соответственно строку надо подготовить так: message db "c", 0x7, "t", 0x7, "r", 0x7, "l", 0x7 ... и т.д. А саму запись строки в видеопамять можно оформить проще: Код (Text): mov si,offset message mov bx,0B800h mov es,bx mov cx,13 ;количество символов в строке mov di,1987 ;позиция вывода cld rep movsb
А лучше так Код (Text): ds:si->strimg es:di->videoRAM ah=атрибут cx=длина строки print: lodsb stosw loop print Тогда строка будет состоять только их символов. Конечно, если не надо чтобу ы каждого символа был свой атрибут.