Автоматическое тестирование процедур на языке ассемблера

Бесплатный доступ

В статье описывается система, предназначенная для автоматического тестирования программ на языке Ассемблера, выполняемых студентами первого курса факультета Вычислительной математики и кибернетики МГУ им. М.В. Ломоносова в рамках практикума на ЭВМ. Рассматриваются особенности тестирования ассемблерных процедур: передача параметров процедуре, выполнение процедуры и получение результата. Система разрабатывается на факультете ВМК с 2020 года.

Язык ассемблера, процедуры, функции, тестирующие системы, программирование, информатика

Короткий адрес: https://sciup.org/170193162

IDR: 170193162

Текст научной статьи Автоматическое тестирование процедур на языке ассемблера

Язык программирования Ассемблер изучается студентами первого курса факультета ВМК МГУ во втором семестре. В качестве компьютерной версии языка взята 32-битная версия MASM 6.14. Задания по практикуму берутся, в основном из книг [2] и [3], в которых собрано много задач на темы, охватывающие все основные конструкции языка Ассемблер. Большое внимание уделяется написанию ассемблерных процедур. Возникает задача проверки корректного составления процедур, т.е. соответствия их заданным требованиям. Описываемая в статье система автоматического тестирования программ (далее – САТП) позволяет проверять правильность составления и выполнения ассемблерных процедур в автоматическом режиме.

Постановка задачи .

Каждая процедура должна удовлетворять стандартным соглашениям о связях [1]. Эти соглашения включают в себя следующие пункты.

  • 1)    Фактические параметры должны передаваться процедуре через стек.

  • 2)    Все используемые процедурой регистры процессора должны сохраняться: если какой-либо регистр используется в теле процедуры, то его значение должно быть занесено в стек в начале выполнения процедуры и извлечено из стека по окончании выполнения процедуры.

  • 3)    Внутри процедуры недопустимы никакие внешние объекты (переменные, константы или метки).

  • 4)    По окончании выполнения процедуры стек должен очищаться от фактических параметров.

  • 5)    Если процедура по условию задачи должна вырабатывать некоторое значение (т.е. если она является аналогом функции в языках высокого уровня), то результат должен возвращаться через регистры al (байт), ax (слово) и eax (двойное слово).

Примечание. В некоторых случаях допускается передача фактических параметров не через стек, а через регистры процессора. Это отдельно оговаривается для каждой конкретной задачи.

Задания в [1] и [2] формулируются следующим образом.

  • 1.    Требуется составить процедуру на языке Ассемблера, удовлетворяющую заданным свойствам.

  • 2.    Требуется написать полную программу на языке Ассемблера, внутри которой описать процедуру с заданными свойствами.

САТП позволяет тестировать как отдельную процедуру, так и полную программу с содержащейся внутри неё процедурой. В первом случае к процедуре добавляется специальный блок данных и команд, дополняющий ее до полной программы, которая затем тестируется. Этот блок содержит описания необходимых переменных, команды ввода исходных дан- ных, команды передачи фактических параметров процедуре, ее вызова и вывода результатов ее работы. Во втором случае отдельно тестируется полная программа и входящая в нее процедура, которая выделяется из программы и дополняется до полной программы как в предыдущем случае.

Проверка требований, предъявляемых к процедуре .

Проверка правильности передачи фактических параметров процедуре и проверка результата затруднений не вызывает. Для этого достаточно выполнить команды Push <фактические параметры> перед вызовом процедуры и сравнить выдаваемый процедурой результат с правильным.

Проверку сохранения регистров процессора в теле процедуры САТП производит следующим образом. Перед командой вызова процедуры в тестируемую программу вставляются команды занесения в регистры процессора случайных значений. По окончании работы процедуры проверяются значения всех регистров процессора и, в случае несовпадения с заданными ранее значениями, выдается сообщение об ошибке.

Для проверки отсутствия внешних объектов (переменных, констант и меток) выполняются следующие действия. Ко всем именам в блоке, дополняющем процедуру до полной программы, добавляются случайные символы - разные для каждого тестирования. Тем самым, если какой-либо внешний объект присутствует в теле процедуры, то неизбежно возникает ошибка на этапе компиляции (неописанное имя).

Для проверки очистки стека от фактических параметров значение вершины стека (содержимое регистра esp) запоминается перед занесением в него фактических параметров процедуры и ее вызовом. По окончании выполнения процедуры проверяется, что значение esp не изменилось.

Актуальность автоматического тестирования процедур.

Если неверная передача фактических параметров процедуре и неправильное ее исполнение легко выявляются при тестировании вручную, то остальные требования выявить труднее. Ошибки, связанные с отсутствием сохранения регистров и очистки стека от фактических параметров не фиксируются ни на этапе компиляции, ни на этапе исполнения ассемблерной программы (в отличие, например, от синтаксических ошибок или ошибок периода выполнения). При ручном тестировании процедуры такие ошибки трудно заметить (особенно, если процедура содержит много команд). Однако в реальных программах подобные ошибки в процедурах часто приводят к трудно выявляемым ошибкам на этапе исполнения программ – случайным образом меняется содержимое некоторого регистра процессора, переполняется стек и проч. Поэтому важно приучить студента к корректному написанию программ, что как раз и достигается при автоматическом тестировании с помощью CAТП.

Пример тестирования процедуры .

В качестве примера рассмотрим задачу 11.8 из [2]. Требуется описать процедуру Setabs, которой передается адрес некоторого знакового байта памяти, и которая заменяет его значение на абсолютную величину.

Возможный вид процедуры Setabs: Setabs proc push ebp mov ebp,esp push ebx mov ebx, [ebp+8] ; требуемый адрес - в [ebp+8], так как по адресу [ebp] находится само значение регистра ebp после выполнения команды mov ebp,esp, а в [ebp+4] находится адрес возврата из процедуры.

cmp [ebx], byte ptr 0

jge m5

neg byte ptr[ebx]

m5: pop ebx pop ebp ret 4      ; очистка стека от фактиче ского параметра

Setabs    endp

САТП добавляет к процедуре блок данных и команд, дополняющих его до полной программы.

До тела процедуры добавляются следующие команды.

.data ; описание необходимых переменных.

X! db ? ; при формировании программы все символы ‘!’ заменяются на пару случайных цифровых символов (одну и ту же во всей программе).

Q! dd ?

.code

Сюда вставляется тестируемая процедура.

После тела процедуры добавляются следующие команды.

Start:

Inint X! ;ввод исходных данных k!=! ; константа, используемая для присвоения случайных значений регистрам.

for R, k!=k!+1

mov R,k!

endm mov Q!,esp ; запоминается вершина стека.

push offset X!

call ; слово заменяется на фактическое имя процедуры.

outint X! ; вывод результата cmp Q!,esp ; проверяется, что регистр esp не изменился, т.е. что фактические параметры удалены из стека je <1> ; все метки заменяются специальными именами: L0, L1 и т.д.

outchar 6 ; в случае изменения значения регистра esp выводится код 6; его появление в строке результата означает неверное значение этого регистра.

exit <1>:

k!=k!-7

for R, k!=k!+1

cmp R,k!

jne <0> ; проверяется, что регистры не изменились после выполнения процедуры endm exit

<0>:outchar 5 ; код 5 выводится в случае, если значение какого-либо регистра не было сохранено в процедуре (изменилось по окончании ее работы).

Exit end Start

Сформированная программа может выглядеть так:

.data

X23 db ?

Q23 dd ?

.code

Setabs proc push ebp mov ebp,esp push ebx mov ebx, [ebp+8]

cmp [ebx], byte ptr 0

jge m5

neg byte ptr[ebx]

m5: pop ebx pop ebp ret 4

Setabs endp

Start:

inint X23

k23=23

for R, k23=k23+1

mov R,k23

endm mov Q23,esp push offset X23

call Setabs outint X23

cmp Q23,esp je L1

outchar 6

exit

L1:

k23=k23-7

for R, k23=k23+1

cmp R,k23

jne L0

endm exit

L0:outchar 5

exit end Start

Эта программа компилируется и выполняется на заранее подготовленных наборах исходных данных. Выдаваемые результаты сравниваются с правильными.

Заключение и выводы .

Описанная САТП используется для автоматической проверки студенческих программ с 2020 г. Она показала свою эффективность по сравнению с тестированием программ вручную. Раньше студенты приносили на проверку программы, содержащие большое количество ошибок – как синтаксических, так и логических. Преподавателю приходилось визуально проверять тексты программ и вводить с клавиатуры компьютера большие объемы исходных данных для тестирования программ. Теперь же САТП выполняет всю эту рабо- проверку, в основном, уже готовые программы. К настоящему времени составлены тесты примерно к 400 задачам из [1] и [2].

САТП написана в среде DELPHI. Объем архивированного файла вместе с транслятором MASM 6.14 – около 10 MB.

Основные результаты опубликованы в [4] и [5].

ту автоматически, и студенты приносят на

Статья научная