Это повторяемый комментарий seg000:0105 int 21h ; DOS - PRINT STRING seg000:0105 ; DS:DX -> string terminated by "$" seg000:0107 retn seg000:0107 ; ────────────────────────────────────────────────────────────────────────── seg000:0108 aHello db 'Hello,',0 ; DATA XREF: seg000:0102↑o seg000:0108 ; Это повторяемый комментарий с) результат – повторяемый комментарий создан – теперь он будет отображаться возле всех элементов, ссылающихся на метку aHello (обратите внимание на текст, выделенный в листинге жирным шрифтом)
??? #Верстальщику – change table аргумент пояснения ea линейный адрес головы элемента любого вида или бестипового байта comment строка повторяемого комментария
=return пояснения
==1 операция выполнена успешно return
==0 ошибка
Родственные функции: MakeComm, ExrLinA, ExtLinB
Интерактивный аналог: “Edit\Comments\Enter repeatable comment”; <; void ExtLinA(long ea,long n,char line)
Функция создает строку (или несколько строк) комментариев, отображаемых перед элементом (бестиповым байтом), расположенном по переданному функции линейному адресу ea.
Комментарий располагается сначала строки и не предваряется символом «точка с запятой», поэтому, его необходимо указать самостоятельно.
Аргумент n задает номер строки комментария и может принимать значения от 0 до
500 включительно. IDA отображает комментарии начиная с нулевой до первой пустой строки. Т. е. если созадть нулевую, первую и третью строки комментария, IDA отобразит лишь первые две из них.
Строка комментария может содержать как символы латиницы, так и символы кириллицы, однако, нормальное отображение кириллицы возможно только в той ипостаси
IDA, в которой они были созданы.
Для удаления всех строк комментария достаточно присвоить нулевой строке пустое значение – остальные строки хотя физически и останутся в базе, на экране отображаться не будут..
144
Замечание: отсутствие автоматического предварения комментария символом
«точка с запятой», позволяет, используя данную функцию, помещать в
ассемблерный листинг директивы и инструкции, заданные пользователем.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 int 21h ; а) исходные данные – требуется разместить комментарий перед инструкцией INT
21h
ExtLinA(SegByName(“seg000”)+0x105,0,”; Строка 1”);
ExtLinA(SegByName(“seg000”)+0x105,1,”; Строка 2”); b) вызов функции ExtLinA для создания двух строк комментария seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 ; Строка 1 seg000:0105 ; Строка 2 seg000:0105 int 21h ; c) результат
??? #Верстальщику – change table аргумент пояснения ea линейный адрес головы элемента (бестипового байта) перед которым должен быть размещен комментарий n номер строки комментария от 0 до 500 включительно. line строка комментария
Родственные функции: MakeComm, MakeRptCmt, ExtLinB, DelExtLnA
Интерактивный аналог: “Edit\Comments\Edit extra anterior lines”; void ExtLinB(long ea,long n,char line)
Функция создает строку (или несколько строк) комментариев, отображаемых после элемента (бестипового байта), расположенного по переданному функции линейному адресу ea.
Комментарий располагается сначала строки и не предваряется символом «точка с запятой», поэтому, его необходимо указать самостоятельно.
Аргумент n задает номер строки комментария и может принимать значения от 0 до
500 включительно. IDA отображает комментарии начиная с нулевой до первой пустой строки. Т. е. если созадть нулевую, первую и третью строки комментария, IDA отобразит лишь первые две из них.
Строка комментария может содержать как символы латиницы, так и символы кириллицы, однако, нормальное отображение кириллицы возможно только в той ипостаси
IDA, в которой они были созданы.
Для удаления всех строк комментария достаточно присвоить нулевой строке пустое значение – остальные строки хотя физически и останутся в базе, на экране отображаться не будут.
145
Замечание: отсутствие автоматического предварения комментария символом
«точка с запятой», позволяет, используя данную функцию, помещать в
ассемблерный листинг директивы и инструкции, заданные пользователем.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 int 21h ; а) исходные данные – требуется разместить комментарий после инструкции MOV
DX, offset aHello
ExtLinB(SegByName(“seg000”)+0x102,0,”; Строка 1”);
ExtLinB(SegByName(“seg000”)+0x102,1,”; Строка 2”); b) вызов функции ExtLinB для создания двух строк комментария seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0102 ; Строка 1 seg000:0102 ; Строка 2 seg000:0105 int 21h ; c) результат
??? #Верстальщику – change table аргумент пояснения ea линейный адрес головы элемента (бестипового байта) перед которым должен быть размещен комментарий n номер строки комментария от 0 до 500 включительно. line строка комментария
Родственные функции: MakeComm, MakeRptCmt, ExtLinA, DelExtLnB
Интерактивный аналог: “Edit\Comments\Edit extra posterior lines”; void DelExtLnA(long ea,long n)
Функция удаляет строку n много строчечного комментария, ранее помещенного перед элементом (бестиповым байтом), расположенным по линейному адресу ea. При этом, все строки с номерами, превосходящими n (если они существуют) отображаться не будут, но физически по-прежнему будут присутствовать в базе.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 ; Строка 1 seg000:0105 ; Строка 2 seg000:0105 ; Строка 3 seg000:0105 int 21h ; a) исходные данные – требуется удалить вторую (считая от одного) строку много строчечного комментария
DelExtLnA(SegByName(“seg000”)+0x105,1); b) вызов функции DelExtLnA
146
seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 ; Строка 1 seg000:0105 int 21h ; c) результат - все строки, с номерами больше двух (считая от одного) не отображаются на экране
ExtLinA(SegByName(“seg000”)+0x105,1,”; 2”); d) вызов функции ExtLinA для восстановления второй строки двух строк комментария seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 ; Строка 1 seg000:0105 ; 2 seg000:0105 ; Строка 3 seg000:0105 int 21h ; e) результат – все строки вновь отображаются на экране
??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента (бестипового байта) n удалямая строка комментария (от 0 до 500 включительно)
Родственные функции: DelExtLnB
Интерактивный аналог: “Edit\Comments\Edit extra anterior lines”; void DelExtLnB(long ea,long n)
Функция удаляет строку n много строчечного комментария, ранее помещенного после элемента (бестипового байта), расположенного по линейному адресу ea. При этом, все строки с номерами, превосходящими n (если они существуют) отображаться не будут, но физически по-прежнему будут присутствовать в базе.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0102 ; Строка 1 seg000:0102 ; Строка 2 seg000:0102 ; Строка 3 seg000:0105 int 21h ; a) исходные данные – требуется удалить вторую (считая от одного) строку много строчечного комментария
DelExtLnB(SegByName(“seg000”)+0x102,1); b) вызов функции DelExtLnA seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0102 ; Строка 1 seg000:0105 int 21h ; c) результат - все строки, с номерами больше двух (считая от одного) не отображаются на экране
147
ExtLinB(SegByName(“seg000”)+0x102,1,”; 2”); d) вызов функции ExtLinB для восстановления второй строки двух строк комментария seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0102 ; Строка 1 seg000:0102 ; 2 seg000:0102 ; Строка 3 seg000:0105 int 21h ; e) результат – все строки вновь отображаются на экране
??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента (бестипового байта) n удалямая строка комментария (от 0 до 500 включительно)
Родственные функции: DelExtLnB
Интерактивный аналог: “Edit\Comments\Edit extra posterior lines”;
void MakeVar(long ea)
Функция помечает элемент символом «звездочка», помещая его в начало строки.
Повторный вызов функции не снимает пометку, и автору книги вообще не известно ни одного программного способа, позволяющего, эту пометку убрать. Интерактивно она снимается вызовом пункта «Mark item as variable» меню “Edit\Other”, который действует как триггер.
Пример использования: seg000:0000 aHelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah a) исходные данные – требуется установить пометку
MakeVar(SegByName(“seg000”)); b) вызов функции MakeVar для пометки seg000:0000*aHelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah с) результат – пометка установлена
??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента (бестипового байта)
Родственные функции: нет
Интерактивный аналог: “Edit\Other \Mark item as variable” char Name(long ea)
Функция возвращает имя метки или функции, расположенной по линейному адресу
ea, если с данным линейный адресом не связано ни одно имя, функция возвращает пустую
148
строку, сигнализируя об ошибке.
Функция выполняет проверку на наличие недопустимых символов в имени метки
(функции) и при наличии таковых, заменяет их символом, заданным в поле “SubstChar” конфигурационного файла . По умолчанию недопустимые символы заменяются знаком «прочерка». Перечень допустимых символов в именах метках определяется значением поля “NameChars” конфигурационного файла cfg> (см. таблицу 17)
Замечание: при отображении имен меток (функций) в окне дизассемблера, IDA
Pro всегда заменяет запрещенные символы знаком «прочерка». Т.е. функция
Name возвращает имена в том виде, в каком они отображаются на экране. Для
получения подлинного имени метки (функции) следует воспользоваться
функцией GetTrueName платформа перечень символов, допустимых в именах меток (функций)
"$?@"
12
“_0123456789"
PC
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
"$_@?!"
13
"0123456789<>"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
Java
"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
14
"абвгдежзийклмнопрстуфхцчшщъыьэюя";
"$_0123456789"
TMS320C6
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"_0123456789."
PowerPC
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz”
Таблица 18 перечень символов, допустимых в именах меток
Пример использования: seg000:0000 aHelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah a) исходные данные – требуется получить имя метки
Message(“>%s\n”, Name(SegByName(“seg000”))); b) вызов функции Name для получения имени метки
> aHelloIdaPro c) результат – имя метки получено
??? #Верстальщику – change table аргумент пояснения ea линейный адрес
=return пояснения return
!=”” имя метки, в том виде, в котором оно отображено на экране
12
Служебные символы ассемблера
13
Символы, определенные только для специальных режимов Java-ассемблера
14
Национальные (российские символы)
149
==”” ошибка
Родственные функции: MakeName, GetTrueName
Интерактивный аналог:
имя метки (функции) отображается справа от адреса char GetTrueName(long ea)
Функция возвращает полное имя метки (функции), расположенной линейному адресу
ea, не проверяя его на наличие недопустимых символов и не производя их автоматической замены (см. описание функции Name)
Пример использования: seg000:0000 _HelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah a) исходные данные – требуется получить подлинное имя меткм
Message(“>%s\n”, GetTrueName(SegByName(“seg000”))); b) вызов функции GetTrueName для получения имени метки
>%HelloIdaPro c) результат – подлинное имя метки получено (сравните его с отображаемым на экране)
??? #Верстальщику – change table аргумент пояснения ea линейный адрес
=return пояснения
!=”” подлинное имя метки (функции) return
==”” ошибка
Родственные функции: MakeName, Name
Интерактивный аналог:
нет char Comment(long ea)
Функция возвращает строку постоянного комментария, расположенного по линейному адресу
ea. Если с
данным адресом не связан никакой комментарий, функция возвращает пустую строку, сигнализируя об ошибке.
Пример использования: seg000:0000 mov ah, 9 ; Функция 0x9 – печать строки a) исходные данные – требуется получить постоянный комментарий
Message(“>%s\n”,Comment(SegByName(“seg000”))); b) вызов функции Comment для получения постоянного комментария
> Функция 0x9 – печать строки c) результат
??? #Верстальщику – change table аргумент пояснения
150
ea линейный адрес
=return пояснения
!=”” строка постоянного комментария return
==”” ошибка
Родственные функции: MakeComment
Интерактивный аналог: постоянный комментарий отображается справа от
элемента char RptCmt(long ea)
Функция возвращает строку повторяемого комментария, расположенного по линейному адресу ea. Если с данным адресом не связан никакой комментарий, функция возвращает пустую строку, сигнализируя об ошибке.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello ; Это повторяемый комментарий seg000:0105 int 21h ; DOS - PRINT STRING seg000:0105 ; DS:DX -> string terminated by "$" seg000:0107 retn seg000:0107 ; ────────────────────────────────────────────────────────────────────────── seg000:0108 aHello db 'Hello,',0 ; DATA XREF: seg000:0102↑o seg000:0108 ; Это повторяемый комментарий a) исходные данные – требуется получить строку повторяемого комментария
Message(“>%s\n”,RptCmt(SegByName(“seg000”)+0x108))); b) вызов функции RptCmt для получения повторяемого комментария
> Это повторяемый комментарий c) результат – строка повторяемого комментария
Внимание: функция RptCmt ожидает именно адрес повторяемого комментария, а не адрес элементов, ссылающихся на элемент, связанный с повторяемым комментарием.
Т.е. в приведенном выше примере вызов
RptCmt(SegByName(“seg000”)+0x102)) вернул бы пустую строку.
??? #Верстальщику – change table аргумент пояснения ea линейный адрес
=return пояснения
!=”” строка повторяемого комментария return
==”” ошибка
Родственные функции: MakeRptCmt
Интерактивный аналог: повторяемый комментарий отображается справа от
элемента, и всех ссылок на данный элемент char LineA(long ea,long num)
Функция возвращает строку num многострочечного комментария, помещенного перед элементом, расположенным по линейному адресу ea.
151
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0105 ; Строка 1 seg000:0105 ; Строка 2 seg000:0105 int 21h ; a) исходные данные – требуется получить первую строку многострочечного комментария
Message(“>%s\n”,LineA(SegByName(“seg000”)+0x105,0))); b) вызов функции LineA для получения первой строки многострочечного комментария.
> ; Строка 1 с) результат
??? #Верстальщику – change table аргумент пояснения ea линейный адрес n номер строки комментария от 0 до 500 включительно.
=return пояснения
!=”” строка повторяемого комментария return
==”” ошибка
Родственные функции: LineB
Интерактивный аналог: многострочечный комментарий отображается перед
комментируемым элементном char LineB(long ea,long num)
Функция возвращает строку num многострочечного комментария, помещенного за элементом, расположенным по линейному адресу ea.
Пример использования: seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello seg000:0102 ; Строка 1 seg000:0102 ; Строка 2 seg000:0105 int 21h ; a) исходные данные – требуется получить первую строку многострочечного комментария
Message(“>%s\n”,LineB(SegByName(“seg000”)+0x102,0))); b) вызов функции LineB для получения первой строки многострочечного комментария.
> ; Строка 1 с) результат
??? #Верстальщику – change table
152
аргумент пояснения ea линейный адрес n номер строки комментария от 0 до 500 включительно.
=return пояснения
!=”” строка повторяемого комментария return
==”” ошибка
Родственные функции: LineA
Интерактивный аналог: многострочечный комментарий отображается перед
комментируемым элементном long LocByName(char name)
Функция возвращает линейный адрес метки (имени функции) с именем name. Если ни одной метки (функции) с указанными именем не существует, функция возвращает значение BADADDR, сигнализируя об ошибке.
Функция чувствительна к регистру символов и различает имена, набранные строчечными и прописными буквами.
Внимание: функции требуется передавать подлинные имена меток, а не имена,
отображаемые на экране, прошедшие через фильтр замены недопустимых
символов (см. описание функции GetTrueName)
Пример использования: seg000:0000 aHelloIdaPro db 'Hello, IDA Pro! ',0Dh,0Ah a) исходные данные – требуется получить адрес метки “aHelloIdaPro”
Message(“>%s\n”,atoa(LocByName(“aHelloIdaPro”))); b) вызов функции LocByName для получения адреса метки
>seg000:0000 c) результат – адрес метки “aHelloIdaPro”
??? #Верстальщику – change table аргумент пояснения name имя метки (функции) с учетом регистра
=return пояснения
!=BADADDR линейный адрес метки (функции) return
==BADADDR ошибка
Родственные функции: нет
Интерактивный аналог: “View\Names”
??? all – дальше начинается не переработанный вариант
ФУНКЦИИ
153
#Definition Как только подпрограммы стали неотъемлемой конструкцией любого языка, возникли проблемы с их классификацией.
Начала всему положил BASIC, в котором
операторы сплошь и рядом спутаны с переменными, функции с операторами, а подпрограммы представляют наименее развитую конструкцию языка.
Затем было предложено называть подпрограмму, не возвращающую результатов своей работы