Лабораторная работа по ассемблеру разветвляющаяся программа

        Цель работы

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

Лабораторное задание

Разработать программу вычисления функции, определяемой с помощью следующего условного оператора:
IF лв THEN y:= f1(a,b,c,d,e) ELSE y:= f2(a,b,c,d,e), где
         лв  - логическое выражение (a<b)and(d<=e)
    а)  y=a+b/c-d*e                      
    б) y=a*b+c/d-e         



Листинг
asm2.cpp

#include "conio.h"
#include "stdio.h"
void main()
{
short e,a,b,y;
char c,d;

_asm {
      
       //(a<b)and(d<=e)

       push eax   

       mov a,1  
       mov b,16
       mov c,4
       mov d,2
       mov e,1

       mov ax,a
       cmp ax,b     // сравниваем значения регистра ax и переменной b
       jnl func_2   // если условие (a<b) не выполняется, то перейти к метке func_2
      
       mov al,d
       mov ah,0
       cmp ax,e     // сравниваем значения регистра ax и переменной e
       jnle func_2  // если условие (d<=e) не выполняется, то перейти к метке func_2
      
       /*Функция 1(y=a+b/c-d*e)*/
       mov ax, b
       idiv c
       add ax,a
       mov y,ax
       mov al,d
       mov ah,0
       imul e
       sub   y,ax
       /*Функция 1*/
      
       jmp end_f;   // Переходим к метке end_f
      
func_2:
       /*Функция 2 (y=a*b+c/d-e) */
       mov ax,a
       imul b
       mov y,ax
       mov al,c
       mov ah,0
       idiv d
       sub ax,e
       add y,ax
       /*Функция 2*/

end_f:
       pop eax
      }
printf("f=%d\n",y);

_getch();

}
Результат работы программы
Пояснительный текст к программе
PUSH и POP
Команда PUSH размещает значение в стеке, т.е. помещает значение в ячейку памяти, на которую указывает регистр ESP, после этого значение регистра ESP увеличивается на 4. Команда Pop извлекает значение из стека, т.е. извлекает значение из ячейки памяти, на которую указывает регистр ESP, после этого уменьшает значение регистра ESP на 4. Значение, помещенное в стек последним, извлекается первым. При помещении значения в стек, указатель стека уменьшается, а при извлечении - увеличивается.
MOV
Эта команда используется для копирования (не обращайте внимания на имя команды) значения из одного места в другое. Это 'место' может быть регистр, ячейка памяти или непосредственное значение (только как исходное значение). Синтаксис команды: mov приемник, источник
      Самый простой способ изменить последовательность выполнения команд
заключается в использовании команды jmp — так называемой команды безусловного
перехода. Она перезаписывает указатель команд (регистр IP или
CS), что заставляет процессор «переключиться» на выполнение команды по
указанному адресу. Формат команды таков:
JMP [тип_перехода] операнд
Команда JMP — аналог конструкции GOTO, которая используется в высокоуровневых
языках программирования. Название команды объясняет ее
действие, а именно «jump», «переход». Команде нужно передать один обязательный
операнд — адрес в памяти, с которого процессор должен продолжить
выполнение программы. Операнд может быть указан явно (непосредственное
значение адреса) или быть регистром общего назначения, в который загружен
требуемый адрес.

Другой способ изменения последовательности выполнения команд заключается
в использовании команды условного перехода.
В языке ассемблера имеется множество команд условного перехода. Имена этих команд различаются в зависимости от условия перехода. Условие состоит из значений одного или нескольких
флагов в регистре признаков. Работают эти команды одинаково: если условие
истинно, выполняется переход на указанную метку, если нет, то процессор
продолжит выполнять программу со следующей команды.
Общий формат команд условного перехода следующий:

Jx метка_назначения
Рассмотрим наиболее часто встречающиеся команды:
jz is_true  // переходит к i s _ t r u e , если флаг ZF = 1
jc is_true  // переходит к i s _ t r u e , если флаг CF = 1
j s is_true // переходит к i s _ t r u e , если флаг SF = 1
jo is_true // переходит к i s _ t r u e , если флаг OF = 1

Комментариев нет:

Отправить комментарий