2.2.7. Проверка действия команд очистки экрана (выполнение необязательно). Редактирование программы l#pr1fio.asm (в сегменте кода добавить команды), т.е. после строки 28 (mov ds,ax) вставить следующие строки:
mov ax,0600h |
;\ |
| ah=06(прокрутка),al=00(весь экран) |
|
mov bh,07 ; \ |
|
| нормальный атрибут (черно-белый) |
|
mov cx,0000 ; |
очистка экрана | верхняя левая позиция |
||
mov dx,314fh |
; / |
| нижняя правая позиция |
|
int 10h |
;/ |
| передача управления в BIOS. |
|
Сохранение полученного файла под этим же именем: l#pr1fio.asm.
2.2.8. Ассемблирование, компоновка и выполнение полученной программы (l#pr1fio.asm). Убедиться, что перед выдачей сообщений экран очищается.
2.2.9.Проверка действия команд установки курсора. Редактирование программы l#pr1fio.asm (в сегменте кода добавить команды), т.е. перед командами вывода сообщения msg (строка 33 и далее) вставить следующие
строки: |
|
mov ah,02 ;\ |
| 02 = установка курсора |
mov bh,00 ; \ |
| экран 0 |
mov dh,01 ; управление курсором | строка 01 |
|
mov dl,00 ; / |
| столбец 00 |
int 10h ;/ |
| передача упр. в BIOS |
и после команд вывода сообщения msg вставить следующие строки:
mov ah,02 |
;\ |
| установка курсора |
mov bh,00 |
; \ |
| экран 0 |
mov dh,24 |
; управление курсором | строка 24 |
|
mov dl,00 |
; / |
| столбец 00 |
int 10h ;/ |
|
| передача упр. в BIOS |
2.2.10.Ассемблирование, компоновка и выполнение полученной программы (l#pr1fio.asm). Убедиться, что сообщение msg «Привет, уважаемый пользователь» выдается в первую строку экрана, а сообщение «Для выхода нажмите любую клавишу» выдается в 24-ю строку экрана.
2.2.11.Сегмент данных сформировать аналогично примерам 1.1 (файл lab1pr1.asm) – 1.8 (файл lab1pr8.asm), определив данные для заданной формулы. Например:
datasg segment para 'Data'
b1db 1 ; определение байта (директива db) b2db 2 ; определение байта (директива db)
w1 |
dw |
10 |
; определение слова (директива dw) |
|
w2 |
dw |
20 |
; определение слова (директива dw) |
|
d1dd |
100 ; определение двойного слова (директива dd) |
|||
d2dd |
200 ; определение двойного слова (директива dd) |
|||
s_1 |
db |
‘Привет’,’$’;определение константы (db) |
||
s_2 |
db |
‘ |
’ |
|
datasg ends
2.2.12. Отредактировать lab1pr1.asm таким образом, чтобы выдавалось сообщение «Привет», а затем две строки:
s_000 |
db |
‘Вывожу информацию, ’ |
s_0000 |
db |
‘пока не встретится символ ‘$’, и прекращаю вывод’, ‘$’ |
|
|
11 |
; символ $ в базовой версии DOS означает конец строки (закончить вывод).
Отредактировать lab1pr1.asm таким образом, чтобы выдавалось сообщение s_b0, а затем – val_b0, т.е. две строки, между которыми нет перевода строки:
s_b0 |
db |
‘b0= ’ |
val_b0 |
db |
‘10’, ‘$’ |
Аналогично, чтобы выдавалось сообщение s_w0, а затем – val_w0,
s_w0 |
db |
‘w0= ’,0ah, 0dh |
val_w0 |
db |
‘100’,0ah, 0dh, ‘$’ |
2.2.13. Добавить в сегмент кода команды вывода на экран значений символьных констант (val_b00, val_w00, val_d00 добавить в сегмент данных):
val_b00 |
db |
‘127’, 0ah, 0dh, ‘$’ |
val_w00 |
db |
‘65536’,0ah, 0dh, ‘$’ |
val_d00 |
db |
‘1048536’,0ah, 0dh, ‘$’ |
2.2.14.Добавить в сегмент кода команды вывода на экран значений символьных констант (val_b000, val_w000, val_d000 добавить в сегмент данных):
val_b000 db ‘1’, 0ah, 0dh, ‘$’ val_w000 db ‘10000’,0ah, 0dh, ‘$’ val_d000 db ‘100000’,0ah, 0dh, ‘$’
2.2.15.Добавить в сегмент кода команды преобразования и вывода на экран констант, определенных директивами db, dw, dd:
val_b0_d db 15 val_w0_d dw 345 val_d0_d dd 1234567
Преобразование выполнять, вызывая процедуру bin_ascii. С клавиатуры вводить только положительные числа.
2.2.16.Используя lab1pr6.asm, создать исходный текст программы l#1fio6.asm. Для этого отредактировать сегмент данных, вставить строки:
b1 |
db |
100 |
b2 |
db |
15 |
w1 |
dw |
300 |
w2 |
dw |
4 |
d1 |
dd |
100480 |
2.2.17. Используя примеры lab1pr6.asm, lab1pr7.asm и lab1pr8.asm,
запрограммировать вычисление по формуле y=d1-(b1+w1/b2)*w2, т.е. добавить в сегмент кода команды:
1)деления слова на байт (w1/b2): mov ax,w1
div b2 ; al := w1/b2
mov byte ptr rezult,al ;мл.байт переменной rezult := w1/b2
____________
Т.к. результат деления не для всех наборов данных вмещается в байт, то правильно делить следующим образом:
xor dx,dx ;\ xor bx,bx ; \
mov ax,w1; |w1/b2
12
mov bl,b2 ; / div bx ;/
mov word ptr rezult,ax
Нужно учитывать, что для деления чисел со знаком ни один из этих вариантов не годится (см. уч. пос. «Языки программирования», ч.3).
____________
2) сложения с полученным результатом (значения переменных для примера подобраны так, что результат деления (частное) вмещается в байт (т.е. оно не превышает число 127), а результат сложения вмещается в слово, т.е. не превышает число 65535):
Вариант реализации 1: |
|
||
|
xor ah,ah |
; зануляет регистр ah, но сохраняет регистр al |
|
|
add al,b1 |
|
|
|
adc ah,0 |
; ax := b1+w1/b2 |
|
|
mov word ptr rezult,ax ;мл.слово переменной rezult := b1+w1/b2 |
||
Вариант реализации 2: |
|
||
|
xor ax,ax |
; зануляет весь регистр ax (в т.ч. и регистр al) |
|
|
mov al, byte ptr rezult |
; al := w1/b2 |
|
|
add al,b1 |
|
|
|
adc ah,0 |
; ax := b1+w1/b2 |
|
|
mov word ptr rezult,ax |
;мл.слово переменной rezult := b1+w1/b2 |
|
|
В примере lab1pr6.asm это показано следующим образом: |
||
|
xor ax,ax |
;\ |
|
|
mov al,b1 |
; | b1+b2 |
|
|
add al,b2 |
; | |
|
|
adc ah,0 ; |
ax := b1+b2 |
|
|
mov word ptr rezult,ax ; rezult= ax := b1+b2 |
||
В варианте 1 отступили от приведенного в примере набора команд, чтобы сохранить регистр al.
3) умножения полученного результата на слово («слова на слово»):
; ax := b1+w1/b2
mul w2 ;(dx:ax) := ax*w2 = (b1+w1/b2)*w2
mov word ptr rezult,ax ;мл.слово произведения (rezult и rezult+1) mov word ptr rezult+2,dx ;ст.слово произвед. (rezult+2 и rezult+3)
4) вычисления разности двойного слова (d1) и полученного результата (он также размещается в двойном слове – в двух регистрах):
; (dx:ax) := ax*w2 = (b1+w1/b2)*w2 mov bx,word ptr d1
mov cx,word ptr d1+2
sub bx,ax ;мл.слово разн. := bx-ax:=
;мл.слово d1 - мл.слово (b1+w1/b2)*w2
sbb cx,dx |
;ст.слово разн. := bx-ax-cf:= |
;ст.слово d1 - ст.слово (b1+w1/b2)*w2 – cf
13
; Таким образом, y = (cx:bx) := d1-(b1+w1/b2)*w2
mov word ptr rezult,bx;мл. слово разности (rezult и rezult+1)
mov word ptr rezult+2,cx ;ст.слово разности (rezult+2 и rezult+3) ; rezult := d1-(b1+w1/b2)*w2
В примере lab1pr6.asm: mov ax,word ptr d1 mov dx,word ptr d1+2 sub ax,word ptr d2
sbb dx,word ptr d2+2;/ d1d2
mov word ptr rezult,ax ; мл. слово разности (в rezult и rezult+1) mov word ptr rezult+2,dx ; ст. слово разности (в rezult+2 и rezult+3)
5)вывода на экран вычисленного значения y. Для этого использовать процедуру bin_ascii (скопировать ее из примера lab1pr5.asm в текст программы l#1fio6.asm). Ассемблирование, компоновка, выполнение программы;
6)ввода с клавиатуры значений b1, b2, w1, w2 и d1 и преобразования их из символьного вида в двоичный. Преобразование выполнять, вызывая процедуры ascii_bin_b, ascii_bin_w и ascii_bin_d. (скопировать их из примеров lab1pr2.asm, lab1pr3.asm и lab1pr4.asm в текст программы l#1fio6.asm). Копировать после «маркирования фрагмента», Ctrl+Insert (в буфер обмена), Shift+Insert (из буфера обмена).
Примечание. Для ассемблирования программы необходимо файл с исходным текстом программы (то есть файл с расширением .asm) поместить в каталог с ассемблером (то есть с файлом tasm.exe), набрать в командной строке команду:
tasm.exe <имя файла>.asm /l
инажать клавишу Enter. В результате будет получен файл с расширением .obj (полное его имя: <имя файла>.obj). Затем с помощью программы tlink.exe необходимо получить загрузочный модуль. Для этого необходимо, чтобы в каталоге с ассемблером был файл tlink.exe и нужно в командной строке набрать команду:
tlink.exe <имя файла>.obj
Врезультате будет получен файл с расширением .exe (полное его имя: <имя файла>.exe). Чтобы запустить программу, следует навести курсор на полученный файл
инажать клавишу Enter.
2.3. Подготовка к выполнению индивидуального задания
(создание заготовки l_1_fio.asm)
До ввода команд ввести комментарий, который показывает очередность выполнения операций: выдача сообщений, ввод данных, преобразование из символьного вида в двоичный, вычисления, преобразование из двоичного вида в символьный и т.п. (прил. 1.2) и файлы lab1pr3.asm или lab1_sa_.asm (прил. 1.3).
14
3. ЗАДАНИЕ НА ПРОГРАММИРОВАНИЕ (ОБЩАЯ ЧАСТЬ)
3.1. Составить EXE-программу для МП Intel 8086 для вычисления по формуле, содержащей арифметические операции сложения, вычитания, умножения и деления. Формулы вычислений – индивидуальны; вариант (номер формулы) взять у преподавателя, а при самостоятельном изучении
– в прил. 1.1.
|
|
|
Таблица 3.1 |
Варианты используемых арифметических операций |
|||
|
|
|
|
Сложение |
b1+b2 |
w1+w2 |
d1+d2 |
|
b1+w1 |
b1+d1 |
w1+d1 |
Вычитание |
b1-b2 |
w1-w2 |
d1-d2 |
|
b1-w1 |
w1-b1 |
b1-d1 |
|
d1-b1 |
w1-d1 |
d1-w1 |
Умножение |
b1*b2 |
w1*w2 |
d1*d2 |
|
b1*w1 |
w1*b1 |
b1*d1 |
|
d1*b1 |
w1*d1 |
d1*w1 |
Деление |
b1/b2 |
w1/w2 |
d1/d2 |
|
b1/w1 |
w1/b1 |
b1/d1 |
|
d1/b1 |
w1/d1 |
d1/w1 |
3.2. Требования к программному средству, в т.ч. указание, для каких процессора и операционной системы оно разрабатывается, какие директивы и команды применяются и т.п., приведены в табл. 3.2.
Таблица 3.2
Полный текст задания к лабораторной работе №1
Ассемблер для микропроцессора – Intel 8086
Операционная система – MS-DOS [1, с.127-128]
Режим работы процессора – реальный [1, с.20-60]
Тип программы – EXE [2, с.37-39; 1, с.130-131; 3, с.57-58]
Назначение программы – вычисление по формуле (арифметические операции, т.е. команды двоичной арифметики)
Модель памяти – малая [1, с.112], т.е. один сегмент стека, один сегмент данных и один сегмент кода, что соответствует директиве определения модели памяти
.small [1, с.112; 4, с.45-46]
Модули – lab1_fio.asm (один сегмент стека, один сегмент данных и один сегмент кода). Файл lab1_fio.asm получается из файла lab1_sa_.asm (см. прил. 1.3; в нем предусматриваются: ввод байта и слова с клавиатуры, процедуры перевода из символьного вида в двоичное представление для байта, слова и двойного слова, процедура перевода из двоичного представления в символьный вид и вывод на экран)
Директивы:
определения сегментов стандартные (полные): segment, ends и assume [1,
с.110-112; 4, с.43, 47-51];
15