Материал: 1117

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Источник: https://studfile.net/preview/16407174/