Основной задачей было уменьшение размера программы, т.к. использовали микроконтроллер с небольшим объемом памяти, а функциональность изделия должна быть большой. По этому появилась идея использовать анализатор кода, поиск в интернете ничего не дал, по этому пришлось делать самостоятельно.
Решил поделиться идеями, так как думаю что может кто-то напишет более приличную программу для анализа программы на ассемблере 8051.
В этой статье опишу основные этапы получившегося анализатора. Часть этих этапов можно использовать для анализа программ написанных на других языках.
Этап 1. Сначала необходимо преобразовать исходный текст программы к максимально простому виду. С кодом программы из которого удалили все лишнее удобнее работать.
приводим к виду
code_0001: mov A,020h
Для этого решил сделать дизасемблирование из HEX-файла. Так это показалось гораздо удобнее, чем обрабатывать исходник, к тому же у скомпилированного файла уже код распределен по памяти, что пригодиться в дальнейшим.
ВИРУС на Ассемблере | Как программно отключить монитор?
Этап 2. Создал таблицу, в которую занес строки исходной программы, тип команды, тип операндов, адрес в памяти и т.д.
Номер строки|Адрес перехода(если есть) | Название операции |Операнд 1| Операнд 2| Адрес перехода| Тип операнда 1 | Тип операнда 2|
2| |add|A|030h| |ACC|CONST|
3| |mov|021h|A| |DIR|ACC|
Чем больше заполненных столбцов с различными возможными вариантами, тем будет проще делать анализ.
Этап 3. Переходим непосредственно к анализу. Пока сделал анализ двух соседних команд, алгоритм такого анализа довольно простой, по определенным правилам проверяем команды.
1. Замена команд вызова процедур
можно заменить командой
это даст экономию 1-го байта.
2. Замена команд присвоения
можно заменить командой
можно заменить командой
3. Замена команд перемещения
можно заменить командой
И таких вариантов достаточно много, когда пишется программа она не всегда пишется с учетом экономии места, а так чтобы было в дальнейшем понятно.
Этап 4. Посчитать сколько обращений по каждому адресу перехода, задача найти единичные обращения. Также смотрим, какая команда стоит перед адресом перехода в программе. На основе этих данный добавляем в таблицу дополнительный данные касательно переходов.
code_0001: MOV A,020h
Значит возможно перенести часть программы начиная с адреса перехода «code_0001» ближе к команде обращения к этому адресу или вообще убрать команду перехода, а за место нее перенести часть программы.
Также есть нулевые обращения, это когда к определенному адресу можно попасть только через команду перехода, а ее нет в программе, например как в примере, перед командой с адресом «code_0001» стоит команда «RET».
Этап 5. Посчитать сколько раз используется каждая ячейка памяти данных (ОЗУ), и как используется (исходные данные для команды или изменение данных в ячейки).
Например может оказаться, что ячейку памяти только изменяют, при этом ее нигде не используют как исходные данные. Можно избавиться от команд которые изменяют такую ячейку.
ЯЗЫК АССЕМБЛЕРА за 3 МИНУТЫ
Этап 6. Компиляция исходного кода. После компиляции возможно проверить количество байт между командой перехода и адресом перехода, например для того чтобы сместить часть кода поближе к команде перехода, заменив ее с LJMP на SJMP.
При использование такого анализа получил результат, что 8-ми килобайтную программу удалось уменьшить на 300 байт.
Дальнейшие планы, сделать анализ кода на основе его функционирования, т.е. что делает определенная часть программы и как ее можно заменить.
Источник: habr.com
Практическое руководство. отладку встроенного кода ассемблера
Область применения:Visual Studio
Visual Studio для Mac
Visual Studio Code
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от действующих параметров или выпуска среды. Чтобы изменить параметры, в меню «Сервис» выберите команду «Импорт и экспорт параметров». Дополнительные сведения см. в разделе Сброс параметров.
В отладчике представлены два окна для отладки встроенного кода ассемблера — окно Дизассемблирование и окно Регистры.
Отладка встроенного кода ассемблера
- Используйте окно Дизассемблирование для просмотра инструкций ассемблера.
- Используйте окно Регистры для отображения содержимого регистров.
См. также
- Безопасность отладчика
- Отладка машинного кода
Источник: learn.microsoft.com
MS-DOS и TASM 2.0. Часть 4. Анализ кода.
Анализ программного кода «Hello World!» на ассемблере.MS-DOS и TASM 2.0
Проведем анализ программного кода нашей первой программы на ассемблере.
;Строка, после точки с запятой является комментарием
;и не обрабатывается ассемблером
;prg.asm — название файла.
. model tiny ;создаём программу типа СОМ
. code ;начало сегмента кода
org 100h ;начальное значение смещения программы в памяти — 100h
mov ah , 9 ;номер функции DOS — в АН
mov dx , offset message ;адрес строки — в DX
int 21h ;вызов т.н. «прерывания» — системной функции DOS
ret ;завершение СОМ-программы
message db «Hello, World!» , 0Dh , 0Ah , ‘$’ ;строка для вывода
end start ;конец программы.
Вид строки программного кода.
Программа на языке ассемблера состоит из строк, имеющих следующий вид:
метка команда(директива) операнды ;комментарий
Любое из этих полей необязательно.
Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера.
В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву).
В поле комментариев, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно — текст от символа «;»
до конца строки не анализируется ассемблером.
Метки и директивы.
- TINY определяет модель памяти файлов типа СОМ, в которой сегменты кода, данных и стека объединены.
- Директива .CODE обозначает начало сегмента кода. Для нашей модели памяти в этом сегменте будут находится также и данные.
- ORG 100h — смещение в памяти, куда проецируется программа типа СОМ. «H» — обозначает, что число в шестнадцатеричной системе счисления(в десятеричной системе — это 256). Первые 256 байт (100h) используются операционкой.
- start: — метка перед первой командой программы. Метка может иметь практически любое название (с определёнными исключениями — нельзя использовать имена, включённые в ассемблер). Например, можно «begin_1:», но нельзя «mov:
- В конце кода мы видим директиву end, после указанной директивы — нашу метку — start. Это обозначает одновременно и
окончание кода программы и то, что программа начнёт выполняться именно с места, указанного меткой (команда mov ah,9).
Данные.
В этом же сегменте кода, разместились и наши данные:
Источник: assembler-code.com