Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler методичка.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
180 Кб
Скачать
☆

X,y,z,u,V,w:integer;

Begin

Writeln(‘ Writeln y,z,u,v,w’);

Readln (y,z,u,v,w); { это комментарий}

Asm { Здесь начинается ассемблерный код}

mov ax,v { ax:=v}

mul u { ax:=ax*u}

mov bx,ax (bx:=ax)

mov ax,z (ax:=z)

sub ax,bx (ax:=ax-bx)

cwd {подготовка к делению}

Idiv w (ax:=ax div w)

add ax,y (ax:=ax+y)

mov x,ax (x:=ax)

End; { Здесь заканчиваетсяассемблерный код}

Writeln (‘x= ‘,x);

Readln;

End.

"Узелки" на память

Данные, участвующие в операциях, должны быть одной длины (байт-байт, слово-слово, двойное слово - двойное слово).

Команда умножения изменяет содержимое регистра dx (edx) даже если сомножители дают произведение, которое помещается в ах (еах).

Команда деления требует дополнительной подготовки, т.е. увеличения длины делимого(длина делимого должна быть в 2 раза больше длины дели­теля). Для расширения делимого в ah, dx, eaх (для байта, слова и двойного слова соответственно) записывается знаковый разряд.

Рекомендуем просмотреть выполнение программы с помо­щью от­ладчика!

Таблица 2 Двоичная арифметика(дополнительные команды)

Заметим, что команды inc(dec) используются вместо add(sub), если нельзя менять флаг переноса; команды adc(sbb) используются для вычислений с многократной точностью

Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.

  1. y=4x+2

  2. y=y*x+x/2

  3. y=(x+y)/(x-y)

  4. x;=x/2+y-2*x)

  5. x:=3y-(x-2*y)

  6. x:=x/y-(y-2*x)/2

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

2. Организация разветвлений.

Для организации разветвлений используются команды ус­ловных и безусловных переходов. Команды условного перехо­да имеют ограниченную область доступа -128..127 байт, т. е. разность между адресом очередной команды и адресом пере­хода должна быть в этом диапазоне.

Если необходимо перейти к команде вне области действия команды перехода, команда условного перехода комбинирует­ся с командой безусловного перехода.

ПРИМЕР: Реализовать на ассемблере оператор

------------------------

if ( х < 3 ) then x:=x+1;

x:=x-1;

-------------------------

Решение 1

-------------------------

mov ax,x ;ax:=x

cmp ax,3 ; сравнить x и 3

jge @metka ;перейти на строчку metka если x>=3

inc ax ; ax::=ax+1

@metka: dec ax ; ax::=ax-1

-------------------------

Здесь metka - метка строки вне области действия оператора if.

Заметим, что команды inc(dec) используются вместо add(sub).

ПРИМЕР: Реализовать на ассемблере оператор

if ( х < 3 ) goto mrtka

Предложенное выше решение НЕ ВЕРНО, транслятор сообщит об ошибке, если metka вне области действия оператора if.

Решение 2

-------------------------

mov ах,х ; х=>ах

сmр ах, 3 ; сравнить x и 3

jge @continue ; if (x>=3) goto continue

jmp near ptr @metka ; if (x<3) goto m

@continue:..

-------------------------

Решение ВЕРНО. Здесь используется команда безусловного перехода с префиксом near ptr. Префикс определяет область действия команды безусловного перехода и принимает зна­чения:

short область действия-128..127 байт

near ptr область действия -32768..32767 байт

far ptr область действия распространяется на другие модули программы.

При использовании команд перехода необходимо правиль­но выбирать требуемые команды с учетом работы со знаковы­ми и беззнаковыми данными.

Таблица 3 Основные команды условного перехода .

Знаковые данные

Беззнаковые данные

Не зависят от типа

jl (jnge) - меньше

jb (jnal) - ниже

je (jz) - paвно

jg (jnle) - больше

ja (jnbe) - выше

jne (jnz) - нe равно

jle (jng) - нe больше

jbe (jna) - нe выше

jo - переполнение

jge (jnl) - нe меньше

jae (jnb) - нe ниже

jno - нет переполнения

js отрицательное

jc - перенос

jns не отрицательное

jnc - нет переноса

Примеры команд с использованием команд перехода.

ПРИМЕР 1: Вычислить z=max(x,y) с учетом знака чисел х, у

------------------------

var

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]