I флаг прерывания if
T флаг перехвата TF
S флаг знака SF
Z флаг нуля ZF
A флаг дополнительного переноса AF
P флаг четности PF
C флаг переноса CF
Рис.5 Регистр флагов.
Есть одна неприятность у этих регистров, с ними нельзя работать непосредственно и кроме того они влияют на ход операций.
В правой нижней части располагается окно стека (Рис.6).
Рис. 6 Окно стека.
Окно стека поделено на две части. Слева - адрес, справа - значения, хранящиеся в соответствующих ячейках стека.
Для выполнения загруженных программ в меню Run существуют несколько пунктов. Перечислим наиболее важные.
Первый пункт - Run F9. Эффект такой же, если бы вы в командной строке DOS ввели debugger.com.
Trace into F7. Эта команда трассировки позволяет выполнять программу в пошаговом режиме. Это означает, что процессор, выполнив очередную команду программы, возвращается в Turbo Debugger, что позволяет пользователю следить за выполнением программы и даже вмешиваться в ход ее выполнения, например, изменяя значения регистров или данных.
Trace over F8. Эта команда трассировки аналогична предыдущей. Разница между ними заключается в следующем: если выполнить команду CALL addr с помощью Trace into, то Turbo Debugger перейдет по адресу addr. Если же выполнить ту же самую команду с помощью Trace over, то подпрограмма выполнится как одна команда до соответствующей команды возврата из подпрограммы RET и Turbo Debugger перейдет к следующей за CALL команде.
Листинг программы:
title LabRab1 ;директива для печати заголовка программы на каждой странице
;листинга
page ,132 ;директива управления форматом печати (132 символов в строке,66
; строк на странице;по умолчанию)
; ========================
my_stack segment stack 'stack' ;сегмент стека my_stack
db 64 dup('stack ') ;определение размера стека,стек размером 384 байт (6
;символов;по 1 байту каждый,64 повторений, 6*64)
my_stack ends ;закрываем описание сегмента стека
; ========================
dseg segment ;сегмент данных dseg
source db 01h,0afh,0fh,08h ;определяем массив source из 4-х байт с
; указанием значений; в 16 с/c
dseg ends ;закрываем описание сегмента данных
; ========================
cseg segment ;сегмент кода cseg
assume cs:cseg,ds:dseg,ss:my_stack ;ассоциация сегментов и сегментных
; регистров
entry proc far ;начало процедуры с именем entry, процедура дальняя (far)
push ds ;поместить в стек номер блока адреса возврата
Xor ax,ax ;обнуление регистра ax, логическая операция
;xor(искл.ИЛИ)
push ax ;поместить в стек смещение адреса возврата
mov ax,dseg
mov ds,ax ;загрузка через регистр ax указателя сегмента данных dseg в
;регистр ds
mov cx,4 ;в регистр-счетчик cx посылаем значение 4 (это кол-во
;итераций в цикле,т.к.таблица-массив содержит 4 байта);
mov bx,offset source ; or LEA bx,source ;адрес смещения переменной source
;загружается в регистр bx;
mov di, offset dest ; or LEA di,dest ;адрес смещения переменной dest
;загружается в регистр di;
again: ;метка
mov al,[bx] ;пересылаем в младшие 8 бит регистра ax (регистр al)
;значение байта,
;находящегося по адресу [bx]
cmp al,0fh ;сравнение содержимого регистра al со значением 0f
;(происходит вычитание 0f;из содержимого регистра al,
;операнды при этом не меняются)
je e ;команда условного перехода,перейти к метке e, если байт = 0f
;(по результату;предыдущей команды)
jb a ;команда условного перехода,перейти к метке a, если байт < 0f
sub al,0fh ;вычесть из содержимого регистра al значение 0f
jmp e ;команда передачи управления на метку e
a: add al,0fh ;добавить значение 0f к содержимому регистра al
e: mov [di],al ;переслать содержимое регистра al по адресу [di]
inc bx ;увеличить содержимое регистра bx на 1
inc di ;увеличить содержимое регистра di на 1
loop again ;повторить цикл, начиная с метки again
ret ;возврат из процедуры
entry endp ;закрываем описание процедуры entry
cseg ends ;закрываем описание сегмента кода cseg
end entry ;закрываем описание программы