Проверить программу на ассемблере

Основной задачей было уменьшение размера программы, т.к. использовали микроконтроллер с небольшим объемом памяти, а функциональность изделия должна быть большой. По этому появилась идея использовать анализатор кода, поиск в интернете ничего не дал, по этому пришлось делать самостоятельно.

Решил поделиться идеями, так как думаю что может кто-то напишет более приличную программу для анализа программы на ассемблере 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

Практическое руководство. отладку встроенного кода ассемблера

Область применения:yesVisual StudionoVisual Studio для Mac noVisual Studio Code

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от действующих параметров или выпуска среды. Чтобы изменить параметры, в меню «Сервис» выберите команду «Импорт и экспорт параметров». Дополнительные сведения см. в разделе Сброс параметров.

В отладчике представлены два окна для отладки встроенного кода ассемблера — окно Дизассемблирование и окно Регистры.

Отладка встроенного кода ассемблера

  1. Используйте окно Дизассемблирование для просмотра инструкций ассемблера.
  2. Используйте окно Регистры для отображения содержимого регистров.

См. также

  • Безопасность отладчика
  • Отладка машинного кода

Источник: 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru