ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Лабораторная работа №2. 1.1. Программирование арифметических выражений.Лабораторная работа №1. ОБЗОР ПРИЕМОВ ПРОГРАММИРОВАНИЯ НА АССЕМБЛЕРЕ 1.1. Программирование арифметических выражений. Программа на языке Ассемблер состоит из операторов (команд). Каждый оператор занимает одну строку. Общий вид оператора: <оператор> <операнд1>,<операнд2> Некоторые операторы могут содержать только один из операндов. Пример наиболее часто встречающейся команды: Mov ax,x Команда копирует содержимое переменной (операнда) x в регистр процессора ax. Соответствует команде в языке Паскаль: Ax:=x; Операторы языка Ассемблер не допускают использования двух переменных в качестве операндов для команды, т. е. команда mov x,y { в Паскале x:=y} где x и y – переменные, недопустима. Следует писать: Mov ax,x Mov y,ax В данном курсе рассмотрена арифметика для целых двоичных чисел. В табл. 1 представлены основные команды для выполнения арифметических операции, а в табл. 2 — дополни тельные. Таблица 1 Двоичная арифметика.
Обозначения, используемые в таблице: on 1, on 2, on — операнды, т.е. содержимое, стоящее по первому (оп 1), второму (оп 2) адресам или единственный операнд (on); al, ah, ax, dx, eax, edx — регистры, причем eax, edx допустимы только для процессоров 80386 и выше. Как видно из табл. 1, в командах умножения и деления задается один операнд, второй сомножитель или делимое в фиксированных регистрах. Команда умножения возвращает результат в два раза длиннее сомножителей, команда деления требует, чтобы делимое было в два раза длиннее делителя. Результатом выполнения команды деления являются частное (регистр, записанный первым в таблице) и остаток (регистр, записанный вторым). Если перед кодом стоит буква i (imul, idiv, i-integer -целый), операции выполняются с учетом знаков исходных данных, в противном случае — беззнаковые операции. ПРИМЕР: Вычислить значение выражения x=y+(z-u*v)/w, если исходные данные занимают одно слово. Program asm_prg; Var 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. x;=x/2+y-2*x) 2. x:=y-(x-2*y) 3. x:=x/y-(y-2*x)/2
Лабораторная работа №2. Не нашли, что искали? Воспользуйтесь поиском:
|