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) используются для вычислений с многократной точностью
Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.
y=4x+2
y=y*x+x/2
y=(x+y)/(x-y)
x;=x/2+y-2*x)
x:=3y-(x-2*y)
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
