Есть несколько проблем.
Здесь
ipp:
pop dx
print dx
ret
удалить адрес возврата из стека с pop dx
. Как вы думаете, ret
вернется после того, как вы украдете его обратный адрес? Почему бы вам не вернуть адрес в стек?
Кроме того, с тем же pop dx
вы повреждаете регистрационное значение dx
, которое прерывается вашим ISR. Почему вы не сохраняете и не восстанавливаете dx
в ISR?
Еще один один ... Я не знаю, ваш ассемблер, но эта линия
lea dx, #1
выглядит странно. При вызове print dx
эту строку макроса, ИМО, должна превратиться в
lea dx, dx
и что является недопустимой инструкции x86. Совпадает ли ваш код вообще? Если да, то что делает ваш ассемблер с lea dx, dx
? Делает это mov dx, dx
или nop
или он удаляет/игнорирует его?
Кроме того, функция 9 из int 21h отображает строку ASCII с концевой строкой, которая находится в ds:dx
, и вы не создаете такую строку в коде.
Ваш код никогда не устанавливает ds
и использует только то, что ds
Значение находится в прерванной программе, что плохо. Вам нужно сохранить и восстановить ds
, если вы хотите его использовать. И если данные вашего ISR будут содержаться в сегменте кода ISR, вы хотите загрузить ds
со значением cs
.
И затем dx
имеет смещение iret
до print dx
. Вы уверены, что хотите напечатать , что значение ip
? Когда вы хотите узнать значение ip
и где?
И наконец, почему у вас есть ISR для всего этого?
Почему бы вам не сделать свою работу ipp
без ISR? И почему вы не используете отладчик?
Является ли команда 'push ax, dx' действительной? – Ruben
Да, функция «печать» работает нормально. –
Что означает «толкать топор, dx»? Я никогда не видел такой синтаксис раньше. – zxcdw