Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема: знакомство с системой программирования Турбо-ассемблер.

Поиск

Создать с помощью отладчика два файла с расширением.asm по заданным текстам программ: а) вывод строки на экран «Hello World!»; б) вывод на экран вопроса: Какое сейчас время суток? (What now time of days?) Ответ может быть либо утро (MORNING/М) либо вечер (EVENING/Е). Если дан ответ утро (M), то необходимо выдать сообщение «Доброе утро» (Good morning!), иначе «Добрый вечер» (Good evening!). Транслировать эти программы. Собрать и отладить. Научиться из отладчика: загружать программы, ассемблировать, исполнять по шагам и до точки останова.

Методические указания.

Текст программы a:

masm

model small

.stack 100h

.data

message db "Hello World!!!",'$'

.code

begin:

xor ax,ax; Обнуление регистра Ах

mov ax,@data;Установка в ds адреса сегмента

mov ds,ax;данных

mov ah,09h;Функция Dos вывода сообщения

mov dx,offset message;запись смещения message в dx

int 21h;Функция Dos вывода сообщения на экран

mov ax,4c00h;Функция DOS- выход из программы

int 21h;Вызов DOS. Останов программы.

end begin

Текст программы б:

masm

model small

.stack 100h

.data

Question db ' What now time of days? (M/Е)',13,10,'$'; Какое сейчас время суток?

MesMorning db 13,10,' An answer is chosen "Morning". Good morning !',13,10,'$'

MesEvening db 13,10,' An answer is chosen "Evening". Good evening !',13,10,'$'

.code

start:

mov ax,@data;Установка в ds адреса сегмента

mov ds,ax;данных

mov ah,09h;Функция Dos вывода сообщения

mov dx,offset Question

int 21h;на экран

RepeatEnter:

xor ah,ah;Очистка регистра Ah

mov ah,1;Функция Dos ввода символа с

int 21h;клавиатуры

cmp al,'M';M?

jz MPres;если Al равно 'M' - переход на метку MPres

cmp al,'N';N?

jne RepeatEnter;если Al неравно 'N'(и не 'М') - переход на метку RepeatEnter

mov dx,offset MesEvening;запись смещения MesNaigt в dx

jmp ShowMes;безусловный переход на метку ShowMes

MPres:

mov dx,offset MesMorning;запись смещения MesMorning в dx

ShowMes:

mov ah,09h;Функция Dos вывода сообщения на

int 21h;экран

mov ax,4C00h;Функция DOS- выход из программы

int 21h;Вызов DOS. Останов программы.

end start;Конец программы

 

Транслирование и сборка.

 

Из созданных текстовых файлов с расширением.asm были созданы.obj файлы с помощью утилиты tasm.exe – tasm.exe /z /zi /la. После была использована программа tlink.exe – tlink.exe /v /x. В результате описанных выше действий были созданы два исполняемых файла.

 

Используемые команды

Пересылка данных

mov <операнд_назначения>, <операнд_источник>; Поддерживаются начиная с процессора 8086.

Команда mov (перемещать) не перемещает, а копирует значение из источника в приёмник. Особенности применения этой команды:

XOR логическое исключающее ИЛИ

0 XOR 0 = 0

0 XOR 1 = 1

1 XOR 0 = 1

1 XOR 1 = 0

таким образом, если команда применяется для одого и того же регистра, то получается обнуление этого регистра.

3) Команды передачи управления

сmp <приёмник><источник>; Сравнивает приёмник и источник и устанавливает значение флагов (CF OF, SF, ZF, AF, PF).

jz и jne набор команд выполняющих переход, если удовлетворяется соответствующее условие, которым в каждом случае реально является состояние тех или иных флагов.

Jz использует значение флага ZF, который устанавливается в 1, если в результате выполнения команды сmp приёмник был равен источнику.

Jne использует значение флага ZF, который устанавливается в 0, если в результате выполнения команды сmp приёмник не был равен источнику.

Jmp – передаёт упраление в другую точку программы, не сохраняя какой-либо информации для возврата. Операндом может быть непосредственный адрес для перехода, а также регистр или переменная, содержащая адрес.

Лабораторная работа №2.

Тема: Работа с арифметическими командами.

Методические указания к выполнению.

Команды сложения

ADD приемник, источник - сложить два операнда.

приемник = приемник +источник

При сложении используется флаг CF.

Для получения точного результата используется команда ADC, которая учитывает флаг переноса.

ADC приемник, источник – сложить с переносом.

результат следующий

приемник= приемник + источник + значение CF

При выполнении команды сложения устанавливаются следующие флаги:

1) CF=1, если результат не помещается в приемнике, т.е. произойдет перенос.

2) PF=1; если результат имеет четное число битов с 1.

3) AF=1, если результат сложения десятичных чисел требует коррекции.

4) ZF=1, если результат =0.

5) SF= 1, если результат отрицателен.

6) OF=1, если при сложении 2-х чисел одного знака результат превышает диапазон допустимых значений в обратном коде, а сам приемником меняет знак. SF и OF имеют смысл при сложении чисел со знаком, AF – для десятичных чисел.

Коррекция результата

Для того чтобы поучить правильный результат (т.е. выполнить перенос из одного разряда в другой, 56+25= 81, один десяток надо перенести в старший разряд) необходимо его скорректировать. Это делается с помощью следующих команд.

AAA – скорректировать результат сложения для представления в кодах ASCII.

DAA – скорректировать сложение для представления в десятичном формате.

Формат:

AAA

DAA

Команды вычитания.

Как таковой команды вычитания в МП не существует, это команда сложения двух чисел, одно их которых в дополнительном коде.

SUB – вычесть

SBB – вычесть с заемом.

Формат команды следующий:

SUB приемник, источник

приемник= приемник- источник

SBB приемник, источник

приемник = приемник - источник- заем (флаг CF)

Нельзя вычитать содержимое одной ячейки из другой.

Устанавливаются флаги:

1- CF=1, если требуется заем.

2- PF=1, если результат имеет четное число битов со значением 1

3- AF=1, если результат вычитания десятичных чисел требует коррекции.

4- ZF=1, результат =0

5- SF=1, результат отрицательный

6- OF= 1, если при вычитании чисел, имеющих разные знаки, результат превышает диапазон значений приемника в обратном коде.

Коррекция результат вычитания 2-х десятичных чисел, как и сложения выполняется командами

AAS и DAS.

AAS – преобразует содержимое регистра AL в правильную неупакованную десятичную цифру.

DEC приемник

Это команда уменьшения приемника (регистра общего назначения или ячейки памяти) на 1.

 

Команды умножения.

Для умножения чисел без знака предназначена команда

MUL источник

Для умножения чисел со знаком предназначена команда

IMUL источник

где источник – регистр общего назначения или ячейка памяти размером в байт или слово. В качестве второго операнда команды MUL и IMUL используют содержимое регистра AL (при операциях над байтами) или регистра AX (при операциях над словами). Произведение имеет двойной размер и возвращается следующим образом:

Умножение байтов и возвращает 16-битовое произведение в регистрах AH (старший байт) и AL (младший байт).

Умножение слов и возвращает 32-битовое произведение в регистрах DX(старшее слово) и AX (младшее слово)

По завершении исполнения этих команд флаги переноса CF и переполнения OF показывают, какая часть произведения существенна для операций.

После исполнения команды MUL флаги CF и OF равны 0, если старшая половина произведения равна 0; в противном случае оба этих флага равны 1. После исполнения команды IMUL флаги CF и OF равны 0, если старшая половина произведения представляет собой лишь расширение знака младшей половины. В противном случае они равны 1.

 

Команда деления

Команда DIV выполняет деление чисел без знака

DIV источник

Команда IDIV выполняет деление чисел со знаком

IDIV источник

где источник – делитель размером в байт или слово, находящееся в регистре общего назначения или ячейки памяти. Делимое должно иметь двойной размер; оно извлекается из регистров AH и AL (при делении на 8-битовое число) и DX и AX (при делении на 16-битвое число). Результаты возвращаются следующим образом:

Если операнд-источник представляет собой байт, то частное возвращается в регистре AL, а остаток в регистре AH.

Если операнд-источник представляет собой слово, то частное возвращается в регистре AX, а остаток – в регистре DX.

Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре - приемнике (AL или AX), то МП сообщает об этот как “Прерывание типа 0” (деление на 0).

Переполнение результата деления возникает в следующих случаях:

1. Делитель равен 0

2. При делении байтов без знака делимое без знака делимое пол меньшей мере в 256 раз превышает делитель.

3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.

4. При делении байтов со знаком частное лежит вне диапазона от –128 до 127.

5. При делении слов со знаком частное лежит вне диапазона от –32768 до 32767

Пример:

DIV BX; AX/BX

DIV MEM_BYTE; AX/MEM_byte

IDIV DL; AL/DL

Команды DIV и IDIV не позволяют прямо разделить на непосредственное значение; его надо предварительно загрузить в регистр или ячейку памяти.

Команды преобразования

Если операнды, участвующие в арифметических операциях, разные, то в этом случае используются вспомогательные команды.

Существуют два вида команд преобразования типа.

2. Команды без операндов – эти команды работаю с фиксированными регистрами.:

cbw - команда преобразования байта (в регистре al) в слово (в регистрах ax) путем распространения значения старшего бита ax на все биты регистра ah.

cwd – команда преобразования слова (в регистре dx:ax) путем распространения значения старшего бита ax на все биты регистра dx

cwde – команда преобразования слова (в регистре ax) в двойное слово (в регистре eax) путем распространения значения старшего бита ax на все биты старшей половины регистра eax.

cdq команда преобразования двойного слова (в регистре eax) в учетверенное слово (в регистрах edx:eax) путем распространения значения старшего бита eax на все биты регистра edx.

Команды сдвига

Общий формат этих команд (КОП – код операции)

КОП операнд, счетчик_сдвигов

Команды этой группы обеспечивают манипуляции над отдельными битами операндов. Все команды сдвига помещают биты в поле операнда влево или вправо, в зависимости кода операции.

Все команды сдвига делятся на команды:

Линейный сдвиг

Осуществляется сдвиг по следующей схеме:

– очередной «сдвигаемый» бит устанавливается во флаг cf

– бит, вводимый в операнд с другого конца, имеет значение 0

– при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется.

 

Команды линейного делятся на:

–команды логического сдвига

–команды арифметического сдвига.

 

К командам логического сдвига относятся

shl операнд, счетчик_сдвигов – логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули

shr операнд, счетчик_сдвигов – логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчика_сдвигов. Слева (в позицию старшего бита) вписываются нули

Например:

shl ah,4

 

Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым образом работают со знаковым разрядом операнда

sal операнд, счетчик_сдвигов – арифметический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда sal не сохраняет знака, но устанавливает флаг cf в случае смены знака очередным выдвигаемым битом.

 

Пример 1: (8*9+3)*5=375(10)=177(16)

Masm

model small

.stack 100h

.data

A DW 5

B DW 3

C DW 8

D DW 9

.code

start:

mov AX,@data

mov DS,AX

mov AX,C

mov BX,D

mul BX

add AX,B

mov BX,A

mul BX

mov AX,4C00h

int 21h

end start

 

Пример 2: 6*С+(В-С+1)/2

masm

model small

.stack 100h

.data

B DW 8; резервирование памяти для данных размером 2 байт;

C DW 3; резервирование памяти для данных размером 2 байт;

D Db 2; резервирование памяти для данных размером 1 байт;

.code

start:

mov AX,@data

mov DS,AX

mov AX,6

mov BX,C

mul BX

mov Dx,AX

mov Ax,B

mov Bx,C

sub Ax,Bx

 

jl m1; отрицательный ли результат? Если да, то переход на метку m1. Если

;результат положительный, то продолжаем выполнять следующую команду.

add ax,1

xor bx,bx

mov bl,d

div bl

add ax,dx

jmp m2

m1:; результат оказывается отрицательным!

neg ax

mov bx,1

sub ax,bx

xor bx,bx

mov bl,d

div bl

neg ax

add Ax,Dx

 

m2:

mov AX,4C00h

int 21h

end start

 

Лабораторная работа №4.



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 389; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.124.204 (0.009 с.)