Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Организация циклов в процессорах х86




 

Задание: Пользуясь ассемблерными вставками в Pascal написать программу вычисления произведения левых разностей элементов одномерного массива , замены четных элементов массива на полученное произведение и подсчета произведенных замен.

 

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

 

Program PRIM;

label m, m1, m2, m3, m4;

var A: array [1..100] of integer; {обрабатываемый массив}

N, T: integer; {размер массива и вспомогательная переменная}

begin

write('N?:'); read(N); {вводим размер масссива}

writeln('Array?:'); {выводим приглашение к вводу массива}

asm

 

{цикл ввода массива}

mov cx, N {кладем в cx количество повторений цикла}

lea si, A {заносим в si смещение до начала массива}

m: push cx {сохраняем в стеке значения cx и si на время выполнения процедуры read}

push si

end;

read(T); {вызываем процедуру ввода числа в переменную T}

asm

pop si {восстанавливаем из стека значения si и cx}

pop cx

mov ax, T {введенное число из T через ax помещаем в элемент массива, адресуемый si }

mov [si], ax

add si, 2 {формируем в si смещение до следующего элемента массива}

loop m {уменьшаем счетчик повторений цикла и, если он не равен 0, уходим на метку m}

 

{цикл подсчета произведения левых разностей элементов массива}

mov cx, N {формируем в cx количество повторений цикла}

dec cx

lea si, A+2 {заносим в si смещение до второго элемента массива}

mov ax, 1 {заносим в ax начальное значение произведения}

m1: mov bx, [si] {помещаем в bx значение очередного элемента массива}

sub bx, -2[si] {вычитаем из него значение предыдущего элемента}

imul bx {домножаем накопленное произведение на полученную левую разность}

add si, 2 {формируем в si смещение до следующего элемента массива}

loop m1 {уменьшаем счетчик повторений цикла и, если он не равен 0, уходим на метку m1}

 

{выводим полученное произведение левых разностей}

mov T, ax {помещаем произведение в переменную T}

end;

writeln('Production: ', T); {выводим число из переменной T}

asm

mov ax, T {восстанавливаем произведение в ax}

 

{цикл замены четных элементов массива на произведение}

xor bx, bx {обнуляем счетчик произведенных замен}

mov cx, N {кладем в cx количество повторений цикла}

lea si, A {заносим в si смещение до начала массива}

m3: test word ptr [si], 1 {проверяем элемент массива на четность}

jnz m2 {если он нечетный - уходим на метку m2}

mov [si], ax {иначе - заменяем на произведение}

inc bx {увеличиваем счетчик замен}

m2: add si, 2 {формируем в si смещение до следующего элемента массива}

loop m3 {уменьшаем счетчик повторений цикла и, если он не равен 0, уходим на метку m3}

 

{выводим количество замен и получившийся массив}

mov T, bx {помещаем значение счетчика замен в переменную T}

end;

writeln('Replaces quantity: ', T); {выводим число из переменной T}

writeln('Result array:');

asm

{цикл вывода массива}

mov cx, N {кладем в cx количество повторений цикла}

lea si, A {заносим в si смещение до начала массива}

m4: mov ax, [si] {помещаем значение очередного элемента массива в переменную T}

mov T, ax

push si {сохраняем в стеке значения si и cx на время выполнения процедуры write}

push cx

end;

write(T:6); {выводим число из переменной T}

asm

pop cx {восстанавливаем из стека значения cx и si }

pop si

add si, 2 {формируем в si смещение до следующего элемента массива}

loop m4 {уменьшаем счетчик повторений цикла и, если он не равен 0, уходим на метку m4}

end;

writeln

end.

 

Результаты работы программы («скриншот»)

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных