В продолжение темы http://wasm.ru/forum/viewtopic.php?id=36674 Дизассемблирую 16-разрядную программу под MS-DOS. Программа невелика, весь код — в одном сегменте. IDA пользуюсь впервые, поэтому возникло несколько вопросов: 1. Довольно часто встречается последовательность: Код (Text): push cs ... pop ds mov dx, imm16 Затем следует вызов одной из функций Int 21h, которой в DSX следует передавать адрес массива. Например, буфера, из которого пишет в файл. В данном сегменте по адресу cs:imm16, действительно, находится такой массив. При нажатии Enter на этом imm16, переходит к массиву. Но по Ctrl-X этот массив не видит. Иногда push и pop разнесены на десяток строк, тогда может писать "ds:undefined". То же самое бывает и с SI и DI. (Правда, есть случаи, когда ES и DS не совпадают с CS.) Вопрос: как заменить эти imm16 на имена массивов? Наподобие "offset buffer1". Так, чтобы их было видно через "Jump-Cross reference". 2. Аналогично с функциями обработки прерываний: Код (Text): push cs pop ds mov dx, imm16 mov ah, 25h mov al, 9 int 21h В данном примере cs:imm16 — обработчик прерываний клавиатуры, устанавливаемый вместо системного. Эту функцию дизассемблер не распознал, показал как данные. Я преобразовал её в код, вставил название через "Edit-Functions-Make function". Её обозвало "far". Правильно ли это? Как сделать так, чтобы быстро искало ссылающиеся на неё imm16? 3. При загрузке стояло "преобразовать 90h после джампов в nop". Преобразовало не все. Стоит ли это сделать вручную? Как?
cmpayc как я понимаю imm16 это автоматически сгенеренные константы так что нужно просто указать курсором на операнд и сказать иде что это смещение - в версии иды 2.8 для этого горячая клавиша латинская буква o
Верно. Оказалось нужно "Edit-Operand types-Offset by current segment" Ctrl-O. Спасибо! Там сработало оно же.