ТОР 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.
Результаты работы программы («скриншот»)
Не нашли, что искали? Воспользуйтесь поиском:
|