Вопрос № 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:
Придется делать два прохода: за первый проход формируешь таблицу меток,
за второй - формируешь весь текст.
Отвечает: 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