С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 2
Регистрация: 20.10.2016
Сообщений: 130
1

Поменять в матрице четные столбцы с нечетными используя цепочечные команды

06.05.2018, 17:48. Показов 1906. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: Поменять в матрице четные столбцы с нечетными используя цепочечные команды.

Уже реализовал данную задаче без цепочечных команд, основа алгоритма такая:
Код
mov ax, [si] 
mov bx, [si+2] 
mov [si], bx 
mov [si+2], ax
+2 как каждый элемент матрицы - это слово.

Но я не могу решить эту же задачу используя цепочечные команды.
Как используя lods брать следующий элемент и как поменять его с текущим? Как бы вы решили данную задачу?

Добавлено через 5 часов 34 минуты
Планирую сделать так:
Создаю дополнительный массив. В цикле с помощью lods получаю элементы массива, первый элемент записываю в регистр bx, как только получаю второй элемент записываю его на первую позицию дополнительного массива, а на вторую позицию записываю элемент из регистра bx.
Но такая реализация меня не устраивает, хотелось бы обойтись без дополнительного массива.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2018, 17:48
Ответы с готовыми решениями:

Поменять местами два числа из разных сегментов данных используя цепочечные команды
Здравствуйте! Помогите пожалуйста с цепочечными командами. Была лаба и дали задание сделать тоже...

Поменять четные строки с нечетными в квадратной матрице
Имеется квадратная матрица n×n. Поменять четные строки с нечестными. Понятным языком, пожалуйста!)...

Поменять местами четные слова с нечетными, используя функцию strtok
Здравствуйте! Помогите, пожалуйста, написать программу, которая меняет местами четные слова с...

Цепочечные команды: поменять местами крайние символы
Ниже представлена мой фрагмент программы для замены местами крайние символы, нужна помощь в...

3
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
06.05.2018, 18:40 2
Лучший ответ Сообщение было отмечено EDWIN503 как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
model   tiny
.code
org 100h
start:  lea si,mas
    lea di,mas
    mov cx,5
@@01:   
    mov di,si
    lodsw
    xchg    ax,[si]
    stosw
    add si,2
    loop    @@01
    ret
mas dw  1,2,3,4,5,6,7,8,9,0
    end start
На миниатюре все видно
Миниатюры
Поменять в матрице четные столбцы с нечетными используя цепочечные команды  
2
2 / 2 / 2
Регистрация: 20.10.2016
Сообщений: 130
07.05.2018, 07:57  [ТС] 3
Constantin Cat, Возник небольшой вопрос по поводу алгоритма работы.
Как я понял
Assembler
1
[si]
В этой части кода
Assembler
1
2
3
4
 mov di,si
    lodsw
    xchg    ax,[si]
    stosw
Возвращает нулевой (первый) элемент матрицы, но и в ax мы загружаем нулевой (первый) элемент. Получается что на первой итерации цикла элемент меняется сам с собой?

Добавлено через 12 минут
Так же есть еще одна проблема.

Мне нужно обработать случай в котором на вход поступает матрица с нечетные количеством столбцов. В такой ситуации последний элемент последнего столбца будет меняться с первым элементом первого столбца, а это не лучшее решение. Я примерно понимаю как исправить данную проблему, нужно сравнивать cx с 2, потому что на предпоследнем столбце cx как раз и будет равно 2, после нужно добавить к si 4 байта, чтобы перепрыгнуть на следующую строку пропуская последний столбец. Но как заставить lodsw пропустить один элемент я не знаю
0
3408 / 1827 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
07.05.2018, 09:01 4
Цитата Сообщение от EDWIN503 Посмотреть сообщение
Получается что на первой итерации цикла элемент меняется сам с собой?
Вы миниатюру смотрели? Там до и после работы кода, смотрите на адрес 0х0115.

Цитата Сообщение от EDWIN503 Посмотреть сообщение
Но я не могу решить эту же задачу используя цепочечные команды.
Вот и изучите, только не цепочечные, а строковые.
1)
Строковые операции
Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS Со смещением в SI, а строка-приемник - соответственно в ESI (или ES:EDI).
2)
Копирует один байт (LODSB), слово (LODSW) или двойное слово (LODSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в регистр AL, АХ или ЕАХ соответственно.
. . .
После выполнения команды регистр ESI (или SI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), когда флаг DF = 0, и уменьшается, когда DF = 1.
3)
Копирует регистр AL (STOSB), AX (STOSW) или ЕАХ (STOSD) в память по адресу ES:EDI (или ESI, в зависимости от разрядности адреса).
. . .
После выполнения команды регистр EDI (или DI) увеличивается на 1, 2 или 4 (если копируется байт, слово или двойное слово), когда флаг DF = О, и уменьшается, когда DF = 1.
1
07.05.2018, 09:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2018, 09:01
Помогаю со студенческими работами здесь

Вставить в строку символы, обязательно используя цепочечные команды
Доброго времени суток! Как можно вставить в строку символы, обязательно используя цепочечные...

Используя цепочечные команды, выполнить сохранение содержимого регистра AX в область по адресу PRLINE +5
Имеются следующие определения: DATASG SEGMENT PARA CONAME DB ‘SPACE EXPLORERS INC.’ PRLINE DB...

Удалить четные столбцы в динамической матрице
Дана матрица целых чисел N*M. Удалить четные столбцы массива. Динамический массив использывать...

Как удалить чётные столбцы в матрице
Помогите пожалуйста написать программу в VBA которая удаляет чётные столбцы в матрице А(8,5)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru