2.2. Начиная с адреса cs:0100 набрать текст тест 2.
ТЕСТ 2.
LES BX, [202] ; загрузка регистров ES:BX
LEA DX, [200] ; загрузка исполнительного адреса
LDS BX, [200] ; загрузка регистров DS:BX
JMP 100
В ячейках окна 1 записать коды
<DS:0200> = 01
<DS:0202> = DS
<DS:0204> = 03
ТЕСТ 2 начиная с адреса CS: 100, контролировать содержимое регистров DX, DX, DS, ES.
Ответ:
LES BX, 202
Загрузка регистра BX из адреса 202 (младший) и ES из адреса 204 (старший)
BX = DS, ES = 0003
LEA DX, [200]
LDS BX, [200]
Загрузка регистра BX из адреса 200 (младший) и DS из адреса 202 (старший)
BX = 0001, DS = DS
JMP 100
Перемещение к команде по адресу 100
2.3. Загрузка стека
Начиная с адреса 100 набрать текст
ТЕСТ 3.
PUSH BX
PUSH CX
POP DX
POP AX
JMP 100
Установить AX=1, BX=2, CX=3, DX=4, SP=10, SS=DS. Установите окно 2 памяти так, чтобы можно было наблюдать работу со стеком.
Выполнить тест в пошаговом режиме, контролировать содержимое регистров BX, DX, SP и содержимое ячеек в окне 1.
Ответ:
PUSH BX
Помещение в стек. Значение SP уменьшается на 2 (становится равным E). В память по адресу из сегмента SS и смещением 0E помещается значение регистра BX.
PUSH CX
Помещение в стек. Значение SP уменьшается на 2 (становится равным 0C). В память по адресу из сегмента SS и смещением 0C помещается значение регистра CX.
POP DX
Извлечение из стека. В DX помещается значение, что хранится по адресу сегмента SS со смещением SP (SP = 0C). Значение SP увеличивается на 2. (становится равным 0E)
POP AX
Извлечение из стека. В AX помещается значение, что хранится по адресу сегмента SS со смещением SP (SP = 0E). Значение SP увеличивается на 2. (становится равным 10)
JMP 100
Перемещение к команде по адресу 100.
2.4. Логические операции.
Набрать ТЕСТ 4 с адреса CS:0100
Тест 4.
AND BX, AX ; логическое умножение
OR DX, AX ; логическое сложение
NOT CX ; логическое отрицание
TEST AX, 01 ; проверка битов
JMP 100
Установить:
CX=0F0F
BX=FFFF
AX=0002
DX=0004
Выполнить ТЕСТ 4 в пошаговом режиме, контролировать регистры BX, DX, CX, состояния флагов операции.
Ответ: AND BX, AX
Помещает в BX результат логического побитового умножения значения регистров BX и AX (0002). Флаги операции ZF, PF обнуляются.
OR DX, AX
Помещает в DX результат логического побитового умножения значения регистров DX и AX (0006). Флаги операции ZF обнуляются. Флаг PF становится равным 1, так как результат содержит честное число единиц в двоичной записи.
NOT CX
Помещает в CX результат логического побитового отрицания значения CX (F0F0). Флаги операции ZF обнуляются. Флаг PF становится равным 1, так как результат содержит четное число единиц в двоичной записи.
TEST AX, 01
TEST действует как AND – устанавливает флаги, но не изменяет биты. Происходит проверка: содержит ли AX нечётный бит, если «Да», то флаг ZF установится в 1, иначе – «Нет».
JMP 100
Перемещение к команде по адресу 100.
2.5. Арифметические операции.
Начиная с адреса CS:0100 набрать тест 5
ТЕСТ 5.
ADD AX, 3
SUB AX, 2
INC DX
DEC CX
CMP CX, 3
JMP 100
Установить AX=0; DX=5; CX=4.
Выполнить в пошаговом режиме, контролировать регистры AX, DX, CX и состояния флагов.
Ответ:
ADD AX, 3
Увеличивает значение AX на 3. AX = 0003
SUB AX, 2
Уменьшает значение AX на 2. AX = 0001
INC DX
Увеличивает значения DX на 1. DX = 0006
DEC CX
Уменьшает значения СX на 1. CX= 0003
CMP CX, 3
Сравнение значения CX с 3. При равенстве в ZF присваивается 1, в противном случае 0.
JMP 100
Перемещение к команде по адресу 100.
2.6. Команды передачи управления.
Набрать ТЕСТ 6 начиная с адреса CS:0100
ТЕСТ 6.
CALL 120
ADD AX, 2
JMP 100
С адреса CS:120 набрать
ADD AX, 1
RET
Установить AX=0, выполнить тест в пошаговом режиме.
CALL 120
Вызывает команду по адресу 120, далее происходит выполнение команды ADD AX, 1 по этому адресу.
ADD AX, 1
Увеличивает значение AX на 1. AX = 0001
RET
Возврат к точке вызова CAL 120 (адрес CS:100)
ADD AX, 2
Увеличивает значение AX на 2. AX = 0003
JMP 100
Перемещение к команде по адресу 100
2.7. Операторы цикла.
Набрать ТЕСТ 7 начиная с адреса CS:0100
ТЕСТ 7.
ADD AX, 1
LOOP 100
MOV CX, 10
JMP 100
Установить CX=5, AX=0, выполнить в пошаговом режиме.
Ответ:
Так как программа выполняет некоторое количество циклов, то она сперва будет добавлять в регистр AX по 1, а CX будет уменьшать на 1. Это произойдёт 5 раз, потому что на 5-й шаг CX обнулится, а AX в этот момент будет равен 5. Затем CX будет присвоено значение 10. В конце произойдёт перемещение к команде по адресу 100.
2.8. Операторы передачи управления по условию.
Набрать ТЕСТ 8 начиная с адреса CS:0100
ТЕСТ 8.
CMP AX, BX
JE 120
Набрать начиная с адреса CS:120
INC AX
INC BX
JMP 100
Установить BX=5, AX=5, выполнить в пошаговом режиме.
Ответ:
CMP AX, BX
Сравнение AX и BX. Так как оба равны, то в ZF будет записана 1.
JE 120
Команда условного перехода. Произойдёт переход к команде по адресу 120, так как ZF = 1.
INC AX
Увеличение на 1 значения AX. AX = 0006
INC BX
Увеличение на 1 значения BX. BX = 0006
JMP 100
Перемещение к команде по адресу 100.
2.9. Команды управления процессором.
Набрать ТЕСТ 9 начиная с адреса CS:0100
ТЕСТ 9.
CLC
CMC
NOP
CLC
STC
CLI
STI
JMP 100
Выполнить в пошаговом режиме.
Закончить работу с отладчиком командой QUIT.
Ответ:
CLC
Обнуление CF. CF = 0.
CMC
Инвертирование CF. CF = 1.
NOP
Команда ничего не делает.
CLC
Обнуление CF. CF = 0.
STC
Присвоение CF значение 1. CF = 1.
CLI
Обнуление IF. IF = 0.
STI
Присвоение IF значение 1.
JMP 100
Перемещение к команде по адресу 100.
Зачётное задание.
Записать в AX номер дня недели, на который приходится день года записанный в регистре BX, считая что 1 января - понедельник.
mov ax, bx ; Копируем значение из BX в AX
dec ax ; Уменьшаем значение в AX на 1
mov cl, 4 ; Записываем в CL число 4
div cl ; Делим AX на CL
add ax, 5 ; Добавляем к AX число 5
mov ax, bx – копируем значение из регистра BX в регистр AX. Мы хотим начать работу с значением, указанным в BX, поэтому мы копируем его в AX.
dec ax – уменьшает значение в регистре AX на 1. Уменьшаем значение, так как хотим считать нумерацию дней года с 1, а не с 0.
mov cl, 4 – записываем число 4 в регистр CL. Мы будем использовать это число для деления на него регистра AX. 4 – потому в месяце 4 недели.
div cl – делит значение в регистре AX на значение в регистре CL. Результат деления записывается в регистр AX, а остаток от деления - в регистр AH. Так мы получим номер дня недели.
add ax, 5 – добавляем 5, так как хотим, чтобы 1 января (первый день года) считался понедельником, то есть первым днем недели. Поскольку деление на 4 даст нам номер недели (то есть результат деления), то мы можем просто добавить 5, чтобы получить номер дня недели, на который приходится день года, указанный в BX.