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

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

28.11.2019, 17:31. Показов 3760. Ответов 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
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 22:45  [ТС] 21
Получается нужно вот так?
Assembler
1
2
3
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' 
MasLen equ $-Mas1-1 ;длина массива
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$'
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
28.11.2019, 22:54 22
Да. Так.
Разобрались в причинах?

Теперь собирайте итоговый код, проверяйте работоспособность. Если что-то не так - публикуйте код и вопрос.

Я понимаю. Что уже отдал бы вам готовый код и расстались. Но мне жалко - вы пытаетесь учиться, готовым кодом собью настрой.

Добавлено через 1 минуту
Сейчас вы должны получить на экране 4 массива - 2 до и 2 после обработки.
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 23:01  [ТС] 23
Да,в этом разобралась. Но я наверное опять что то делаю не так
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
40
41
42
.MODEL SMALL
.STACK 256
.DATA
Mas1 DB 'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' 
MasLen equ $-Mas1-1 ;длина массива
Mas2 DB 'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' 
.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
;---------------------вывод обработанных массивов------------------------
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
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
28.11.2019, 23:12 24
Ну, да - что-то не так. Для начала плохо читаете.

Итак, вы подготовили и сделали 2 части из 3 (вывод исходных, вывод результатов). Почти сделали обработку, но обработка с ошибкой, потому что затирает исходные массивы. Таким образом ошибка локализована - она в "обработке".

Давайте думать. Массив затирается. Почему? Очень может быть, что запись в массивы происходит не в массивы, а в случайные адреса. Как версию - можно принять к проверке.
Как происходит запись в массивы
Assembler
25
26
mov [si], ah ; Mas1[i]=temp2
mov [di], al ; Mas2[i]=temp1
А почему такая уверенность, что запись в массивы? Почему считается, что si указывает на адреса в корректных пределах массива Mas1? И такой же вопрос про di.

И ещё раз перечитайте мои пояснения в сообщении #6
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 23:29  [ТС] 25
Спасибо вам большое за помощь,но я не знаю как это сделать.Пробовала по разному,не получается.
0
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
28.11.2019, 23:53 26
Давайте ещё раз попробуем.
Ответьте на вопрос: с чего бы такая уверенность в коде программы, что mov [si], ah записывает именно в Mas1, а не в Mas2?
А вдруг это не так?
А вам нужно именно так - si указывает (содержит адреса) на элементы массива Mas1. Что-то добавить в код?

Добавлено через 49 секунд
Ответ точно есть в #6

Добавлено через 14 минут
masha_123, уже поздно. Продолжите завтра на свежую голову? Или этот "китайский" к утру нужно выучить?
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
28.11.2019, 23:58  [ТС] 27
Нужно завтра сдавать.
0
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
29.11.2019, 00:16 28
Чтобы регистр si указывал на массив Mas1 (содержал адреса элементов массива Mas1) нужно в si поместить этот адрес первого элемента массива Mas1.
Правильно?
Давайте поместим
Assembler
1
lea si, [Mas1]
Аналогично и для di и Mas2.

Где это добавить в коде? А где это нужно - перед началом цикла. Ведь если внутри цикла, то si так и будет постоянно указывать на первый элемент массива, а нужно, чтобы si указывал по очереди на каждый элемент.

Пробуйте.

Добавлено через 9 минут
Что-то долго вы 2 строки в рабочий код добавляете...

Добавлено через 1 минуту
Не спать! Не спать! Косить! Косить!
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
29.11.2019, 00:17  [ТС] 29
Да,все получилось А можно ли как то подписать каждый массив?
Mas1:......
Mas2:......
Да,уже засыпаю немного)
0
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
29.11.2019, 00:36 30
Да, можно, только вывод увеличится.
Assembler
1
2
3
4
5
6
7
8
9
10
11
Title1 db 'Mas1: ', '$'
Title2 db 'Mas2', '$'
Mas1 ...........
.........
mov ah, 09h
lea dx, [Title1]
int 21h
mov ah, 09h
lea dx, [Mas1]
int 21h
......
Вы уже изучали процедуры? Вызов процедур call ShowMassiv?
Это чтобы однотипный длинный код поместить в процедуру и из программы дважды вызвать его.

Добавлено через 12 минут
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
.MODEL SMALL
.STACK 256
.DATA
        Title1  db      'Mas1: ', '$'
        Title2  db      'Mas2: ', '$'
        Mas1    DB      'Mas1', '  ','qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$'
        MasLen  equ     $-Mas1-1
        Mas2    DB      'Mas2', '  ','mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$'
 
.CODE
 
ShowMassiv      proc
 
        lea     dx,     [Title1]
        mov     ah,     09h
        int     21h
        LEA     DX,     Mas1    ;вывести переменную
        MOV     AH,     09h     ;Mas1
        INT     21h             ;на экран
 
        lea     dx,     [Title2]
        mov     ah,     09h
        int     21h
        LEA     DX,     Mas2    ;вывести переменную
        MOV     AH,     09h     ;Mas2
        INT     21h             ;на экран
 
        ret
ShowMassiv      endp
 
 
Start:
        MOV     AX,     @DATA
        MOV     DS,     AX
;---------------------вывод исходных массивов----------------------------
        call    ShowMassiv
;---------------------обработка-----------------------------------------
        lea     si,     [Mas1]
        lea     di,     [Mas2]
        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
;---------------------вывод обработанных массивов------------------------
        call    ShowMassiv
;----------------Завершение программы------------------------------------
        MOV     AX,     4C00h   ;завершить
        INT     21h             ;программу
END     Start
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
29.11.2019, 00:36  [ТС] 31
Что не так? Зациклился вывод
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
.MODEL SMALL
.STACK 256
.DATA
Title1 db 'Mas1: ', '$'
Title2 db 'Mas2', '$'
Mas1 DB 'qwertyuiopasdfghjklzxcvbnmqwer', 13, 10, '$' 
MasLen equ $-Mas1-1 ;длина массива
Mas2 DB 'mnbvcxzlkjhgfdsapoiuytrewqmnbv', 13, 10, '$' 
.CODE
proc tm
mov ah, 09h
lea dx, [Title1]
int 21h
mov ah, 09h
lea dx, [Mas1]
int 21h
endp
proc tm1
mov ah, 09h
lea dx, [Title2]
int 21h
mov ah, 09h
lea dx, [Mas2]
int 21h
endp
Start:
MOV AX, @DATA
MOV DS, AX
;---------------------вывод исходных массивов----------------------------
 
LEA DX, Mas1 ;вывести переменную
MOV AH, 09h ;Mas1
INT 21h ;на экран
call tm
LEA DX, Mas2 ;вывести переменную
MOV AH, 09h ;Mas2
INT 21h ;на экран
call tm1
;---------------------обработка массивов----------------------------------
mov cx, MasLen ; MasLen - длина каждого из массивов Mas1 и Mas2
lea si, [Mas1]
lea di, [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
;---------------------вывод обработанных массивов------------------------
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
Модератор
Эксперт по электронике
7758 / 3908 / 1503
Регистрация: 01.02.2015
Сообщений: 12,061
Записей в блоге: 2
29.11.2019, 00:38 32
Или же вместо вызова процедуры скопировать вывод на экран.

Добавлено через 40 секунд
У вас нет завершения процедуры - ret
0
0 / 0 / 1
Регистрация: 28.11.2019
Сообщений: 17
29.11.2019, 00:51  [ТС] 33
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Все получилось,спасибо большое,очень помогли!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2019, 00:51

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru