Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
7 / 7 / 4
Регистрация: 30.11.2015
Сообщений: 107
1

Циклический сдвиг элементов массива

15.05.2016, 22:29. Показов 6548. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан массив размера N и число k (0 <k <5, k <N). Осуществить циклический сдвиг элементов массива влево и вправо на k позиций. Помогите, если не сложно, не могу разобрать как сделать. Для TASM
Нашел в книге, как инициализировать массив, но почему-то кривовато работает...
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
MODEL tiny
.code
org 100h
 
.code
main:
    mov ds,ax
    xor ax,ax   ;обнуление ax
    mov cx,10   ;значение счетчика цикла в cx
    mov si,1    ;индекс начального элемента в cx
go:             ;цикл инициализации
    mov bh,i    ;i в bh
    mov mas[si],bh  ;запись в массив i
    inc i       ;инкремент i
    inc si      ;продвижение к следующему
                ;элементу массива
    loop    go  ;повторить цикл
;вывод на экран получившегося массива
    mov cx,10
    mov si,0
    mov ah,09h
    lea dx,mes
    int 21h
show:
    mov ah,02h  ;функция вывода значения
                ;из al на экран
    mov dl,mas[si]
    add dl,30h  ;преобразование числа в символ
    int 21h
    inc si
    loop    show
exit:
    mov ax,4c00h    ;стандартный выход
    int 21h
mes db  0ah,0dh,'Массив- ','$'
mas db  10 dup (?) ;исходный массив
i   db  0
end main        ;конец программы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2016, 22:29
Ответы с готовыми решениями:

Циклический сдвиг элементов массива
Ребят помогите кто чем сможет , нужна любая информация (примеры , подсказки ,литература) . Помогите...

Циклический сдвиг элементов массива
Данный массив размера N и число к (0 &lt; к &lt; 5, к &lt; &quot;N).&quot; Осуществить циклический сдвиг элементов...

Циклический сдвиг элементов массива
Нужна помощь! Задача легкая могу реализовать на паскале или С++, но нужно на ассемблере Данный...

Циклический сдвиг массива
Помогите сделать циклический сдвиг массива вправо.Там вроде сдвигает , но появляются ненужные ...

11
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
16.05.2016, 00:05 2
Цитата Сообщение от Dialkord228 Посмотреть сообщение
кривовато работает...
мутновато описано...
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
16.05.2016, 09:30 3
Лучший ответ Сообщение было отмечено Dialkord228 как решение

Решение

Цитата Сообщение от Dialkord228 Посмотреть сообщение
не могу разобрать как сделать.
Запоминаешь первый элемент, а остальные сдвигаешь влево/вправо.
После сдвига, вставляешь первый элемент на место последнего. И так, "k" раз..
Вот тебе код, разбирайся:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
org 100h
jmp start
 
mes0    db   13,10,'Type array:  $'
mes1    db   13,10,' Direction:  $'
mes2    db   13,10,'    Offset:  $'
mes3    db   13,10,'--------------------------'
        db   13,10,'    Result:  $'
 
array   db   9 dup(0)
direc   db   0
offs    db   0
 
;---------------------------; заполняем массив
start:  mov   dx,mes0       ;
        call  message       ;
        mov   cx,9          ;
        mov   di,array      ;
        mov   ah,1          ;
save1:  int   21h           ;
        stosb               ;
        loop  save1         ;
 
;---------------------------; читаем направление сдвига
        mov   dx,mes1       ;
        call  message       ;
save2:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'R'        ; R
        je    @@1           ;
        cmp   al,'L'        ; L
        jne   save2         ;
@@1:    int   29h           ;
        mov   [direc],al    ;
 
;---------------------------; на сколько позиций сдвигать
        mov   dx,mes2       ;
        call  message       ;
save3:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'1'        ; min.1
        jb    save3         ;
        cmp   al,'8'        ; max.8
        ja    save3         ;
        int   29h           ;
        and   al,0Fh        ;
        mov   [offs],al     ;
 
;---------------------------; основная процедура сдвига
        cld                 ; прямой шаг
        shl   ax,16         ; очищаем АХ
        shr   bh,8          ; очищаем BH
        mov   bl,[offs]     ; счётчик внешнего цикла
        mov   si,array      ; указатели на массив
        mov   di,si         ; ^
        cmp   [direc],'L'   ; если нужно влево,
        je    begin         ;      ..то оставляем прямой шаг
        std                 ; иначе: реверс
        add   si,8          ;      ..и указатели в конец
        mov   di,si         ;
 
begin:  push  di si         ; запомним позицию
        mov   cx,8          ; счётчик внутреннего цикла
        lodsb               ; запоминаем в AH первый элемент
        shl   ax,8          ; приёмник отстал на 1
write:  lodsb               ; читаем сл.элемент
        stosb               ;       ..и записываем его в приёмник
        loop  write         ; мотаем 8 раз..
        shr   ax,8          ; берём первый элемент в AL
        stosb               ;       ..и ставим его последним
        pop   si di         ; восстановим указатели
        dec   bx            ;       ..и мотаем внешн.цикл
        jnz   begin         ;
 
;---------------------------; выводим массив на экран
        cld                 ;
        mov   dx,mes3       ;
        call  message       ;
        mov   cx,9          ; всего 9 элементов
        mov   si,array      ;
print:  lodsb               ;
        int   29h           ; вывести символ на консоль
        loop  print         ;
 
exit:   xor   ax,ax         ;
        int   16h           ;
        ret                 ;
 
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
message:
   mov   ah,9
   int   21h
ret
Миниатюры
Циклический сдвиг элементов массива  
2
0 / 0 / 2
Регистрация: 17.08.2017
Сообщений: 118
28.09.2017, 00:50 4
R71MT, добрый день, а ваш код в DosBox'е работает?
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
28.09.2017, 05:29 5
DavidJarr, привет! В дос-боксе не пробовал, но помоему он не дружит с прерыванием INT-29h
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
28.09.2017, 09:08 6
Цитата Сообщение от R71MT Посмотреть сообщение
помоему он не дружит с прерыванием INT-29h
DOSBox? Дружит...
0
0 / 0 / 2
Регистрация: 17.08.2017
Сообщений: 118
28.09.2017, 16:20 7
Jin X, т.е. этот код работает в досбоксе?
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
28.09.2017, 16:55 8
DavidJarr, да. Не проще ли самому попробовать, чем спрашивать?
0
0 / 0 / 2
Регистрация: 17.08.2017
Сообщений: 118
28.09.2017, 17:01 9
Jin X, проще конечно же, просто в исходном виде он не работает, и мне интересно, что поменять, чтобы он заработал?
0
0 / 0 / 2
Регистрация: 17.08.2017
Сообщений: 118
28.09.2017, 17:45 10
R71MT, а вы не знаете, что нужно поправить, вот примерно такой код
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
.MODEL SMALL        
.STACK 256      
.DATA               
                            
mes0    db   13,10,'Type array:  $'
mes1    db   13,10,' Direction:  $'
mes2    db   13,10,'    Offset:  $'
mes3    db   13,10,'--------------------------'
        db   13,10,'    Result:  $'
 
array   db   9 dup(0)
direc   db   0
offs    db   0
        
.CODE                       
;---------------------------; заполняем массив
start:  mov   dx,mes0       ;
        call  message       ;
        mov   cx,9          ;
        mov   di,array      ;
        mov   ah,1          ;
save1:  int   21h           ;
        stosb               ;
        loop  save1         ;
 
;---------------------------; читаем направление сдвига
        mov   dx,mes1       ;
        call  message       ;
save2:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'R'        ; R
        je    @@1           ;
        cmp   al,'L'        ; L
        jne   save2         ;
@@1:    int   29h           ;
        mov   [direc],al    ;
 
;---------------------------; на сколько позиций сдвигать
        mov   dx,mes2       ;
        call  message       ;
save3:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'1'        ; min.1
        jb    save3         ;
        cmp   al,'8'        ; max.8
        ja    save3         ;
        int   29h           ;
        and   al,0Fh        ;
        mov   [offs],al     ;
 
;---------------------------; основная процедура сдвига
        cld                 ; прямой шаг
        shl   ax,16         ; очищаем АХ
        shr   bh,8          ; очищаем BH
        mov   bl,[offs]     ; счётчик внешнего цикла
        mov   si,array      ; указатели на массив
        mov   di,si         ; ^
        cmp   [direc],'L'   ; если нужно влево,
        je    begin         ;      ..то оставляем прямой шаг
        std                 ; иначе: реверс
        add   si,8          ;      ..и указатели в конец
        mov   di,si         ;
 
begin:  push  di si         ; запомним позицию
        mov   cx,8          ; счётчик внутреннего цикла
        lodsb               ; запоминаем в AH первый элемент
        shl   ax,8          ; приёмник отстал на 1
write:  lodsb               ; читаем сл.элемент
        stosb               ;       ..и записываем его в приёмник
        loop  write         ; мотаем 8 раз..
        shr   ax,8          ; берём первый элемент в AL
        stosb               ;       ..и ставим его последним
        pop   si di         ; восстановим указатели
        dec   bx            ;       ..и мотаем внешн.цикл
        jnz   begin         ;
 
;---------------------------; выводим массив на экран
        cld                 ;
        mov   dx,mes3       ;
        call  message       ;
        mov   cx,9          ; всего 9 элементов
        mov   si,array      ;
print:  lodsb               ;
        int   29h           ; вывести символ на консоль
        loop  print         ;
 
exit:   xor   ax,ax         ;
        int   16h           ;
        ret                 ;
 
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
message:
   mov   ah,9
   int   21h
ret

Вот такие ошибки в коде:
Миниатюры
Циклический сдвиг элементов массива  
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
28.09.2017, 18:29 11
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
.MODEL SMALL
.286
.STACK 256
.DATA
                            
mes0    db   13,10,'Type array:  $'
mes1    db   13,10,' Direction:  $'
mes2    db   13,10,'    Offset:  $'
mes3    db   13,10,'--------------------------'
        db   13,10,'    Result:  $'
 
array   db   9 dup(0)
direc   db   0
offs    db   0
        
.CODE                       
;---------------------------; заполняем массив
start:                      ;
        mov   ax,@data      ;
        mov   ds,ax         ;
        mov   es,ax         ;
        cld                 ;
                            ;
        lea   dx,mes0       ;
        call  message       ;
        mov   cx,9          ;
        lea   di,array      ;
        mov   ah,1          ;
save1:  int   21h           ;
        stosb               ;
        loop  save1         ;
 
;---------------------------; читаем направление сдвига
        lea   dx,mes1       ;
        call  message       ;
save2:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'R'        ; R
        je    @@1           ;
        cmp   al,'L'        ; L
        jne   save2         ;
@@1:    int   29h           ;
        mov   [direc],al    ;
 
;---------------------------; на сколько позиций сдвигать
        lea   dx,mes2       ;
        call  message       ;
save3:  xor   ax,ax         ;
        int   16h           ;
        cmp   al,'1'        ; min.1
        jb    save3         ;
        cmp   al,'8'        ; max.8
        ja    save3         ;
        int   29h           ;
        and   al,0Fh        ;
        mov   [offs],al     ;
 
;---------------------------; основная процедура сдвига
        cld                 ; прямой шаг
        shl   ax,16         ; очищаем АХ
        shr   bh,8          ; очищаем BH
        mov   bl,[offs]     ; счётчик внешнего цикла
        lea   si,array      ; указатели на массив
        mov   di,si         ; ^
        cmp   [direc],'L'   ; если нужно влево,
        je    begin         ;      ..то оставляем прямой шаг
        std                 ; иначе: реверс
        add   si,8          ;      ..и указатели в конец
        mov   di,si         ;
 
begin:  push  di si         ; запомним позицию
        mov   cx,8          ; счётчик внутреннего цикла
        lodsb               ; запоминаем в AH первый элемент
        shl   ax,8          ; приёмник отстал на 1
write:  lodsb               ; читаем сл.элемент
        stosb               ;       ..и записываем его в приёмник
        loop  write         ; мотаем 8 раз..
        shr   ax,8          ; берём первый элемент в AL
        stosb               ;       ..и ставим его последним
        pop   si di         ; восстановим указатели
        dec   bx            ;       ..и мотаем внешн.цикл
        jnz   begin         ;
 
;---------------------------; выводим массив на экран
        cld                 ;
        lea   dx,mes3       ;
        call  message       ;
        mov   cx,9          ; всего 9 элементов
        lea   si,array      ;
print:  lodsb               ;
        int   29h           ; вывести символ на консоль
        loop  print         ;
 
exit:   xor   ax,ax         ;
        int   16h           ;
        ret                 ;
 
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
message:
   mov   ah,9
   int   21h
ret
 
end start
2
0 / 0 / 2
Регистрация: 17.08.2017
Сообщений: 118
28.09.2017, 19:51 12
Jin X, спасибо, помогло, работает)
0
28.09.2017, 19:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2017, 19:51
Помогаю со студенческими работами здесь

Циклический сдвиг массива
Написать подпрограмму, циклически сдвигающую массив на 4 бит влево. Адрес массива задан парой...

Циклический сдвиг массива на N позиций вперёд
Ребят,помогите пожалуйста,недавно начал изучать assembler и возникла проблема:помогите создать...

Выполнить циклический сдвиг массива на К чисел влево
Добрый день форумчане. Такое во дело, дали условие : выполнить циклический сдвиг массива на к чисел...

ассемблерная вставка в Delphi Циклический сдвиг элементов в массиве.
задание: написать ассемблерную вставку для Delphi программы циклический сдвиг элементов в массиве.


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

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