
Цель работы
Научиться анализировать ход выполнения программы на языке Ассемблера при помощи отладчика TurboDebugger.
Исходное задание
title lab1- директива TITLE. служит того, чтобы вверху каждой страницы листинга печатался заголовок программы.
page ,132- директива PAGE указывает количество строк, распечатываемых на одной странице, и максимальное количество символов на одной строке.
; ========================
my_stack segment stack 'stack'- организация сегмента для стековой памяти с именем
,«my_stack», с объединением с другими сегментами в процессе компоновки по типу STACK(сегмент во время выполнения команды будет частью стека). Элемент, заключенный в апострофы, используется для группирования относительных сегментов при компоновке.
db 64 dup('stack ')- определение 64 байт, содержащих ‘stack’.
my_stack ends- конец сегмента именем «my_stack».
; ========================
dseg segment-организация сегмента с именем «dseg».
source db 01h,0afh,0fh,08-резервирование области памяти (4 байта) под именем ‘source’ и запись в нее чисел 01h,0afh,0fh,08h.
dest db 4 dup(?)- резервирование области памяти (4 байта) под именем ‘dest’ без инициализации.
dseg ends- конец сегмента именем «dseg».
; ========================
cseg segment- организация сегмента с именем «сseg».
assume cs:cseg,ds:dseg,ss;my_stack-сообщает о содержании и назначении сегментных регистров:cs-для определения сегмента содержащего выполняемую программу,ds-для доступа к данным, ss-задает стековый сегмент.
entry proc far- точка входа процедуры «entry».
push ds-помещает в стек содержимое регистра ds.
xor ax,ax-реализует поразрядно операцию «исключающее или»,в итоге - обнуление регистра аx.
push ax-помещает в стек содержимое регистра ax.
mov ax,dseg- помещает содержимое dseg в регистр ax.
mov ds,ax- помещает содержимое регистра ax в регистр ds.
mov cx,4- помещает в регистр сx число 4.
mov bx,offset source ; or LEA bx,source-эквивалентные операции: поместить в регистр bx смещение переменной ‘source’.
mov di, offset dest ; or LEA di,dest- эквивалентные операции: поместить в регистр di смещение переменной ‘dest’.
again:
mov al,[bx]-помещает элемент таблицы source в младший байт регистра ax.
cmp al,0fh- сравнивает содержимое al c числом 0fh.
je e-если в результате операции cmp флаг сf=1 (сравниваемые числа оказались равны), то переходим к метке «е».
jb a-если в результате операции cmp флаг cf=1 (содержимое al оказалось меньше 0fh), то переходим к метке «a».
sub al,0fh- уменьшает содержимое al на 0fh.
jmp e- безусловный переход к метке «е».
a: add al,0fh- увеличивает содержимое al на 0fh.
e: mov [di],al-помещает содержимое al в таблицу dest.
inc bx-увеличивает значение регистра bx на 1.
inc di- увеличивает значение регистра di на 1.
loop again- уменьшает значение регистра cx на 1, и если его значение неравно 0 переходим к началу цикла (метка «again»).
Ret-возвращает управление вызывающей программе.
entry endp-точка выхода процедуры «entry».
cseg ends-конец сегмента именем «сseg».
end entry-конец исходного модуля.