0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
1
TASM

Обменять местами содержимое двух символьных массивов

28.11.2019, 17:31. Показов 3632. Ответов 32
Метки нет (Все метки)

Помогите пожалуйста,нужно создать 2 символьных массива(размером по 30 символов).Осуществить обмен данными этих массивов. Обеспечить вывод исходных и результирующих на экран массивов.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2019, 17:31
Ответы с готовыми решениями:

Обменять местами содержимое ячеек памяти со смещениями 0002h и 0004h
Очень прошу помочь написать программы: 1) Обменять местами содержимое ячеек памяти со смещениями...

Содержимое двух массивов переставить по правилу
Ребят помогите написать программу на Ассемблере через Turbo Pascal. Смотрите задание, препод сказал...

В цикле сложить содержимое двух массивов и передать в третий
Люди, срочно нужна прога для экзамена!!!! Помогите, пожалуйста))) Определить три буфера по 10...

Обменять содержимое сегментных регистров DS и ES
Вот задачка: Обменять содержимое сегментных регистров DS и ES. У меня получилось вот так: MOV...

32
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 19:32 2
Попробуйте начать - я помогу.
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 19:50  [ТС] 3
Вот вывод массивов на экран,не знаю как дальше,как поменять данные этих массивов

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.MODEL SMALL
.STACK 256
.DATA
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' ;объявляем текстовую
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' ;объявляем текстовую
.CODE
;---------------------вывод исходных массивов----------------------------
 
Start:
 
MOV AX, @DATA
MOV DS, AX
XOR AX, AX
LEA DX, Mas1 ;вывести переменную
MOV AH, 09h ;Mas1
INT 21h ;на экран
 
LEA DX, Mas2 ;вывести переменную
MOV AH, 09h ;Mas2
INT 21h ;на экран
MOV AX, 4C00h ;завершить
INT 21h ;программу
  END Start
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 19:54 4
Вы - молодец.

А что такое "поменять данные массивов"?
Это переместить содержимое Mas1 в массив Mas2 и наоборот?
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 20:01  [ТС] 5
да!
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 20:28 6
Понятно.

Вот вы же изучали какой-нибудь язык высокого уровня. Например, C/C++.
Там подобная задачка решалась бы через временную переменную
C
1
2
3
4
5
6
7
8
for(i=0; i<strlen(Mas1); i++)
{
  temp1=Mas1[i];
  temp2=Mas2[i];
 
  Mas1[i]=temp2;
  Mas2[i]=temp1;
}
Так?

В ассемблере так же.
Цикл for - инструкция loop, вместо i - регистр cx.
Assembler
1
2
3
4
mov cx, MasLen ; MasLen - длина каждого из массивов Mas1 и Mas2
for:
...............
loop for
А вот доступ к элементам массива - через указатели регистров si и di. Т.е. в si и di - адреса ячеек памяти - это именно адреса, а не индексы массива. Запись на ассемблере похожа, но физический смысл абсолютно разный.
Настроим регистр si на массив Mas1 - т.е. поместим в регистр si адрес массива Vas1 в памяти.
lea si, [Mas1] или mov si, offset Mas1 - инструкции разные, но физический смысл один - в регистр si поместить адрес.
Теперь инструкция mov al, [si+14] поместит в регистр al значение байта по адресу (si+14).
Аналогично настроим di на массив Mas2.
Для перехода к следующему адресу элемента массива увеличим si и di на величину размера элемента - в данном случае на 1.
Итак, тело цикла будет
Assembler
1
2
3
4
5
6
7
8
mov al, [si] ; temp1=Mas1[i]
mov ah, [di] ; temp2=Mas2[i]
 
mov [si], ah ; Mas1[i]=temp2
mov [di], al ; Mas2[i]=temp1
 
add si, 1 ; можно inc si
add di, 1 ; можно inc di
Это вроде бы объяснил.
Добавлю, как узнать размер массива. Это делают разными способами, например
Assembler
1
2
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' ;объявляем текстовую
MasLen equ $-Mas1-1
где символ $ означает текущий адрес. Разность текущего адреса и адреса Mas1 даёт длину массива Mas1, но в массиве есть символ, который не является элементом массива - это символ '$' в конце строки. Поэтому определяя длину массива дополнительно вычитаю 1.
Часто делают ошибку при определении длины массива
Assembler
1
2
3
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' ;объявляем текстовую
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' ;объявляем текстовую
MasLen equ $-Mas1-1  ; НЕТ ЭТО ДЛИНА ДВУХ МАССИВОВ Mas1 и Mas2
Вроде бы объяснил. Попробуйте собрать программу.
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 20:51  [ТС] 7
Очень подробно объяснили,но правильно ли я вас поняла, будет вот так?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.MODEL SMALL
.STACK 256
.DATA
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' ;объявляем текстовую
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' ;объявляем текстовую
MasLen equ $-Mas1-1  ;НЕТ ЭТО ДЛИНА ДВУХ МАССИВОВ Mas1 и Mas2
.CODE
;---------------------вывод исходных массивов----------------------------
Start:
MOV AX, @DATA
MOV DS, AX
XOR AX, AX
LEA DX, Mas1 ;вывести переменную
MOV AH, 09h ;Mas1
INT 21h ;на экран
 
LEA DX, Mas2 ;вывести переменную
MOV AH, 09h ;Mas2
INT 21h ;на экран
MOV AX, 4C00h ;завершить
INT 21h ;программу
 
mov cx, MasLen ; MasLen - длина каждого из массивов Mas1 и Mas2
for:
mov al, [si] ; temp1=Mas1[i]
mov ah, [di] ; temp2=Mas2[i]
 
mov [si], ah ; Mas1[i]=temp2
mov [di], al ; Mas2[i]=temp1
 
add si, 1 ; можно inc si
add di, 1 ; можно inc di
loop for
  END Start
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 21:01 8
Да, почти.

Давайте, глядя на код проговорим выполняемые действия.
1. строки 10-11 инициализация ds, чтобы можно было обращаться к массивам и к остальным переменным в сегменте данных
2. строка 12 - какой-то мусор остался от предыдущих попыток
3. строки 13-15 вывод на экран массива Mas1
4. строки 17-19 вывод на экран массива Mas2
5. строки 20-21 завершение программы
6. строки 23-33 обработка массивов

Вы не замечаете странности?
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 21:04  [ТС] 9
Завершение программы не там
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 21:06 10
Типо да.

А ещё - перечитайте то, что я набрал про определение длины массива. Весь абзац с двумя фрагментами кода.
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 21:07  [ТС] 11
Исправила,нужно же еще добавить после обработки массивов,их вывод,да? Я не поняла для чего нужно определить дину массива,где это нам пригодится
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 21:16 12
Вы же собрались обменять все элементы массивов. Обмен производится по одному символу. Сколько раз нужно выполнить такие обмены?

Добавлено через 2 минуты
Про вывод массивов после обработки - да, нужно.

Ведь любая программа состоит из трёх шагов
1. ввод исходных данных (или их визуализация, если они задаются в самой программе)
2. обработка
3. вывод результата
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 21:23  [ТС] 13
Про длину поняла!А как вывести массивы после их обработки,не подскажите?
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 21:35 14
А при выводе на экран в чём принципиальная разница у массивов до обработки и после?
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 21:42  [ТС] 15
Нужно вывести эти два массива до обработки и после(уже с обмененными данными).В коде это будет прописываться так же,как и вывод до обработки?
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 21:49 16
Вы 20 минут ждали ответа? Я бы уже попробовал и проверил!
Да.

Потом показывайте ваш код. Подозреваю, что вы не всё внимательно читали и из-за этого программа не изменит содержимое массива.
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 21:58  [ТС] 17
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.MODEL SMALL
.STACK 256
.DATA
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' 
MasLen equ $-Mas1-1 
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' 
MasLen equ $-Mas2-1
 
.CODE
Start:
MOV AX, @DATA
MOV DS, AX
;---------------------вывод исходных массивов----------------------------
LEA DX, Mas1 ;вывести переменную
MOV AH, 09h ;Mas1
INT 21h ;на экран
 
LEA DX, Mas2 ;вывести переменную
MOV AH, 09h ;Mas2
INT 21h ;на экран
;---------------------тело цикла-----------------------------------------
mov cx, MasLen ; MasLen - длина каждого из массивов Mas1 и Mas2
for:
mov al, [si] ; temp1=Mas1[i]
mov ah, [di] ; temp2=Mas2[i]
 
mov [si], ah ; Mas1[i]=temp2
mov [di], al ; Mas2[i]=temp1
 
add si, 1 ; можно inc si
add di, 1 ; можно inc di
loop for
;---------------------вывод обработанных массивов------------------------
 
 
;----------------Завершение программы------------------------------------
MOV AX, 4C00h ;завершить
INT 21h ;программу
  END Start
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 22:13 18
Надо же!
Не думал, что компилятор такое считает корректным - дважды определить константу MasLen!..

Тогда сам поясню. Вернее спрошу - зачем объявлять и тут же пересчитывать значение константы MasLen?

И ещё. Давайте проговорим программу:
1. строки 11-20 - инициализация и вывод исходный данных
2. строки 21-32 - обработка (не тело цикла - оно (тело) внутри цикла)
3. строки 33-35 - вывод результата (обработанных массивов)
4. строки 36-38 - завершение программы

Обработка.
что делает инструкция в строке 24, а что должна делать?
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 22:23  [ТС] 19
В начале оставляем так:
Assembler
1
2
3
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' 
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' 
MasLen equ $-Mas1-1
строки 33-35 - вывод результата (обработанных массивов) мы прописываем тоже самое что и в исходных массивах?
Assembler
1
2
3
4
5
6
7
LEA DX, Mas1 ;вывести переменную
MOV AH, 09h ;Mas1
INT 21h ;на экран
 
LEA DX, Mas2 ;вывести переменную
MOV AH, 09h ;Mas2
INT 21h ;на экран
Я проверяла,ничего не выводит
0
Модератор
Эксперт по электронике
7696 / 3851 / 1492
Регистрация: 01.02.2015
Сообщений: 11,897
Записей в блоге: 2
28.11.2019, 22:36 20
По длине массива Mas1 - вы опять повторяете ошибку, на которую я указал сразу при объяснении как получить размер.
Смотрите, в строке MasLen equ $-Mas1-1 символ $ это макроподстановка текущего адреса.
Давайте прочувствуем сразу в числах.
Пусть длины массивов Mas1 и Mas2 одинаковы и равны 10 байт. Пусть массив Mas1 располагается с адреса 0.
Итак, получим распределение памяти
0-9 Mas1
10-19 Mas2

И вот после Mas2 встречается символ текущего адреса $ в выражении для вычисления константы
Assembler
Mas1 DB '0123456789' 
Mas2 DB '0123456789' 
MasLen equ $-Mas1
Так при обработке препроцессором компилятора будет получено выражение
MasLen = (текущий адрес) - (адрес начала массива Mas1) = 20 - 0 = 20
Но ведь массив Mas1 имеет длину всего 10 байт!
Значит нужно как-то исправлять. Например, разместив вычисление MasLen сразу после объявления массива Mas1.

Понятно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2019, 22:36

Обменять значения элементов массивов. С++ с ассемблерной вставкой
Обменять значения элементов массивов char x и *y; при выборке значения из массива *y используйте...

Обменять значения элементов массивов с помощью ассемблерной вставки
Доброго времени суток. имеется задача необходимо: Обменять значения элементов массивов char x и...

Обменять местами слова с максимальной и минимальной длинами
Подскажите пожалуйста, где ошибки в коде, начал с асмом разбираться и завис.. Задание таково - в...

Для всех слов в строке, заканчивающихся на "ing" заменить окончания на "ed"
Задание состоит в следующем: Для всех слов в строке, заканчивающихся на &quot;ing&quot; заменить окончания...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.