Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 293
от 20.11.2005, 20:12

Администратор:Калашников О.А.
В рассылке:Подписчиков: 259, Экспертов: 22
В номере:Вопросов: 1, Ответов: 5


Вопрос № 29619: Добрый день эксперты. Вот я пишу тут дизассемблер для *.сом файлов. Дошёл до команд jz,jc,jg и так далее (команды условного перехода). Код я магу разпознать, но как записать мне в мой файл. Пытаюсь вот так: jz cs:[05h] jc или cs:[104h] и т.д. Но когд...

Вопрос № 29.619
Добрый день эксперты. Вот я пишу тут дизассемблер для *.сом файлов. Дошёл до команд jz,jc,jg и так далее (команды условного перехода). Код я магу разпознать, но как записать мне в мой файл. Пытаюсь вот так: jz cs:[05h] jc или cs:[104h] и т.д. Но когда я компилирую полученный файл то выдает ошибку: error A2045: Must be associated with code. Как мне написать ето смещение? Спасибо за ответ.
Отправлен: 15.11.2005, 20:01
Вопрос задал: Olmi5404 (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Olmi5404!
делать тебе, во первых, нечего.
во вторых, пиши метки.

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 15.11.2005, 20:14

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Olmi5404!
Как правильно заметил Евгений Иванов, пиши метки
Веди таблицу адресов, на которые идут ссылки, и формируй команды типа
je L_0104, JMP L_1234 (В имени метки используй адрес). Ну и вставляй в нужном месте L_0104:, L_1234:
Придется делать два прохода: за первый проход формируешь таблицу меток,
за второй - формируешь весь текст.

---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 9-ый класс)
Отправлен: 15.11.2005, 22:00

Отвечает: Undertaker
Здравствуйте, Olmi5404!
Исходники дизассемблеров (в том числе и на ASM):
http://www.exmortis.narod.ru/src_disassem.html
---------
The Power is Back
Ответ отправил: Undertaker (статус: 5-ый класс)
Отправлен: 16.11.2005, 01:11

Отвечает: Ayl
Здравствуйте, Olmi5404!

И правильно ругается, потому как такую адресацию нельзя делать. Во-первых, что такое cs:[05h]? Ты хочешь передать управление на адрес, который записан в ячейке памяти в сегменте CS со смещением 5? Такой команды нет. Скорее всего, адрес назначения должен быть CS:0005. Но короткий переход всегда работает только с текущим значением CS. То есть его указание - лишнее! И квадратные скобки лишнии!
Но плохо то, что даже команду jz 0005 ассемблер не поймет! Ему нужна метка! Либо адресация от текущего указателя команд ($).
Вариантов обхода этого - несколько.
Первый - в той точке, на которую хочешь передать управление, ставишь метку, а в команде в качестве адреса указываешь эту метку.
Второй - используешь адресацию через указатель команд:
jz $-3
Используется $-3, т.к. $ - смещение текущей команды в сегменте, а в операнд для коротких переходов отсчитывается от начала следующей команды (ее смещение - на 2 больше).
Третий - записываешь не мнемонику, а собственно код, а в комментарии - команду. Например, jz 05h
db 74h, 05h ; jz 05h


---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 16.11.2005, 14:27

Отвечает: Юра Устинов
Здравствуйте, Olmi5404!
По моему вы можете указывать на какое число байт прыгает переход по сегменту, к сожалению не помню как это указывается.
К тому же почему бы вам не использовать метки?:)
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 5-ый класс)
Отправлен: 16.11.2005, 18:01


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное