Анимация
JavaScript
|
Главная Библионтека автоматически переносятся на следующую, но слева от них указывается не адрес данного элемента массива, а адрес головы массива! Замечание: для изменения размеров массива (усечения или расширения) достаточно передать функции адрес его начала и новую длину. ??? #Верстальщику - change table
Родственные функции: нет Интерактивный аналог: "~Edit\Array"; <*> success MakeAlign(long ea,long count,long align) Функция помещает в ассемблерный файл директиву выравнивания align и исключает из дизассемблируемого листинга байты, используемые для выравнивания. Замечание: микропроцессоры серии Intel 80x86 используют выравнивание используется для ускорения доступа к данным и инструкциям (подробнее об этом можно технической документации фирмы Intel), но существуют процессоры, которые требуют обязательного выравнивания и при обращении к не выровненным данным (инструкциям) генерируют исключение. Аргумент ea задает линейный адрес первого байта, использующегося для выравнивания. Если по этому адресу расположен хвост элемента данных, голова или хвост элемента кода, функция возвратит ошибку. Аргумент count задает количество байт, использующихся для выравнивания. Значение count должно быть больше нуля и меньше кратности выравнивания, т.е. 2align > count > 0, в противном случае функция возвратит ошибку. Аргумент align задает кратность выравнивания и представляет собой показатель степени с основанием два. Т.е. если align равен четырем, то кратность выравнивания -шестнадцати, т.к. 24=16. Если align равен нулю, функция определяет необходимую степень выравнивания автоматичен, используя наибольшее возможное значение. Для изменения величины выравнивания достаточно передать функции MakeAlign линейный адрес уже существующей директивы Align и новые значения count и align.
b) вызываем функцию MakeAlign для помещения по адресу seg000:0001 директивы align 4. Для выравнивания используются три байта - seg0001, seg0002 и seg0003. seg000:0000 db 48h ; H seg000:0001 align 4 seg000:0004 db 6Fh ; o c) результат - успешное создание директивы выравнивания ??? #верстальщику - change table
Родственные функции: нет Интерактивный аналог: "~Edit\Structs\Other\ Create alignment directive";<L> long MakeCode (long ea) Функция создает по указанному адресу элемент кода, выполняя дизассемблирование первой машинной инструкции. Если это возможно, автоматически дизассемблируется и другие инструкции. Это происходит в следующих случаях: a) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты; b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование. Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки. Подробнее об этом можно прочитать в главах «Перекресые ссылки» и «Глобальные настойки» соотвественно. Замечание: IDA эмулирует выполнение кода на виртуальном процессоре, с целью отслеживания изменения регистра указателя команд, и дизассемблирует все инструкции, на которые он указывает или может указывать при определенных обстоятельствах. Благодаря этому дизассемблируется все вызываемые функции, условные переходы и все косвенные ссылки, которые IDA в состоянии распознать (например, если это не запрещено настойками, она может автоматически преобразовывать 32-разрядные непосредственные операнды по модулю больше 0x10000 в смещения на код - см. главу «Глобальные настойки»). При успешном завершении функция возвращает длину первой дизассемблированной инструкции, выраженную в байтах, в противном случае возвращается ноль, сигнализируя об ошибке. Переча линейного адреса головы уже существующего элемента кода, привет к повторному анализу инструкции; будут заново созданы перекрестные ссылки, авто генерируемые метки и т.д., а функция возвратит длину инструкции, расположенной по линейному адресу ea. Пример использования:
a) исходные данные Message(">%X\n",MakeCode(SegByName("seg000")+0x100)); b) вызываем функцию MakeCode для дизассемблирования кода seg000:0100 seg000:0103 seg000:0103 ; seg000:0105 seg000:0106 seg000:0107 seg000:0108 seg000:0109 seg000:010A seg000:010B seg000:010C seg000:010D seg000:010E seg000:010F seg000:0110 seg000:0111 seg000:0112 seg000:0113 seg000:0114 seg000:0115 >3 с) результат
функция дизассемблировала две инструкции и остановилась, 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |