2012-05-27 2 views
-1

Мне нужно распечатать содержимое регистра IP. (А86).Отображение содержимого регистра IP

У меня есть обработчик прерывания:

int11: 
call ipp 
iret 

И процедура IPP:

ipp: 
pop dx 
print dx 
ret 

и функция печати:

print macro 
push ax,dx 
lea dx, #1 
mov ah,9 
int 021 
pop dx,ax 

Но он печатает много странных символов :)

Ple асе, скажи мне, что случилось.

P.S. Мои знания в ассемблере очень плохи.

+0

Является ли команда 'push ax, dx' действительной? – Ruben

+0

Да, функция «печать» работает нормально. –

+0

Что означает «толкать топор, dx»? Я никогда не видел такой синтаксис раньше. – zxcdw

ответ

2

Вам необходимо преобразовать двоичное значение в текст. Должна быть строка с «$» - завершена. А затем загрузите адрес этой строки в dx.

Также вы должны убедиться, что ds имеет правильное значение.

Посмотрите: http://www.delorie.com/djgpp/doc/rbinter/id/73/25.html

+0

Можете ли вы сказать мне, как преобразовать двоичное значение в текст, пожалуйста? Я не понимаю ... Извините за мои глупые вопросы. –

+0

Посмотрите на http://forum.codecall.net/topic/65302-assembly-string-integer-algorithms-win32-nasm/ – Ruben

0

Есть несколько проблем.

Здесь

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? И почему вы не используете отладчик?

Смежные вопросы