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

Переставить в строке слова, поменяв местами первое слово с последним, второе с предпоследним

25.11.2019, 14:44. Показов 8053. Ответов 10
Метки asm, tasm (Все метки)

Студворк — интернет-сервис помощи студентам
По пути обучения встретился с данным заданием, не могу придумать принцип решения, может у кого возникнут идеи?

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

Переставить слова, поменяв местами первое слово с последним, второе с предпоследним
Прошу помощи с задачей. Эмулятор i8086 Задана строка из буквенных символов, разделенных на слова...

Переставить символы в строке, поменяв местами первый символ с последним, второй с предпоследним и т.д.
Ребят, нужна ваша помощь. Вот у меня задание Ввести с клавиатуры строку. Переставить в ней...

Переставить все слова в исходном тексте так, чтобы первое слово стало последним, второе-предпоследним и т.д.
переставить все слова в исходном тексте так, чтобы первое слово стало последним,...

Переставить первое слово с последним, второе с предпоследним
Ввести текст. Переставить местами слова в каждом предложении (первое с последним, второе с...

10
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,187
Записей в блоге: 5
25.11.2019, 15:10 2
Принцип, думаю, простой. Без реализации уже встречал его описание.

1. Реверс всей строки - поменять местами все символы.
2. Выделять в строке слова и выполнять реверс каждого слова.

Можно и сложнее:
1. Выделять в строке слова
2. Для каждого слова выполнять циклическое вращение подстроки (от начала слова до конца строки) на величину длины слова

Можете отработать алгоритм на любом языке программирования. Потом построчно переводить его на ассемблер - там будет почти "строка на языке" - "строка на ассемблере".

Объём кода великоват для выполнения его за вас.

Образцы выделения слов и пояснения
Описание алгоритма
(tasm StrLen) Количество слов, содержащих более 3-х символов

Программы на его основе (изменено лишь действие после выделения очередного слова:
(tasm StrLen) В строке в словах с четным номером изменить порядок букв на обратный
(tasm StrLen) Расположить слова в обратном порядке
(tasm StrLen) Найти и вывести все симметричные слова
(tasm StrLen) Обмен в исходном файле соседних слов местами
(tasm StrLen) Удалить слова с повторяющимися буквами
(tasm StrLen) Выяснить, есть ли во введённом тексте слова, начинающиеся с буквы "А", и сколько таких слов
(tasm StrLen) Определить сколько слов в тексте начинаются и оканчиваются одной и той же буквой
(tasm StrLen) Выяснить, есть ли во введённом тексте слова, оканчивающиеся на "f"
(tasm StrLen) Определить сколько слов содержат хотя бы одну букву "В"
(tasm StrLen) Вывести последнее слово строки
(fasm DOS StrLen) Нахождение короткого слова

Обменять слова с максимальным и минимальным количеством букв «а» (tasm обмен двух слов через буфер)

Добавлено через 6 минут
Циклическое вращение подстроки
Сортировка слов в строке по ASCII. Программа зацикливается
Дана последовательность от 1 до 30 слов. Вывести все слова в алфавитном порядке
1
0 / 0 / 0
Регистрация: 25.11.2019
Сообщений: 3
25.11.2019, 15:11  [ТС] 3
Благодарю, сейчас буду работать
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,187
Записей в блоге: 5
25.11.2019, 15:25 4
Я бы рекомендовал
1. Реверс всей строки - поменять местами все символы.
2. Выделять в строке слова и выполнять реверс каждого слова.

Это выглядит наиболее просто. Реверс подстроки можно реализовать процедурой.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,187
Записей в блоге: 5
27.11.2019, 19:44 5
Лучший ответ Сообщение было отмечено AlbertBor как решение

Решение

Реверс всей строки и последующий реверс каждого слова
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
.model small
 
.stack 200h
 
.data
        DelimChar       equ     ' '     ;символ, разделитель слов
        _STDOUT_        equ     1       ;описатель вывода на экран
        ;обрабатываемая строка
        String          db      'the ionization probe is not protected against electric shock hazard'
        Len             dw      $-String
        ;сообщения программы
        CrLf            db      0Dh, 0Ah, '$'
        msgSourceString db      'Instant:', 0Dh, 0Ah, '$'
        msgResultString db      'Result:', 0Dh, 0Ah, '$'
.code
 
Reverse proc
        push    si
        push    di
        jmp     @@next
        @@while:
                mov     al,     [si]
                mov     ah,     [di]
                mov     [di],   al
                mov     [si],   ah
                inc     si
                dec     di
        @@next:
                cmp     si,     di
        jb      @@while
        pop     di
        pop     si
        ret
Reverse endp
 
Show    proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     ah,     40h
        mov     bx,     _STDOUT_
        mov     cx,     [Len]
        lea     dx,     [String]
        int     21h
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show    endp
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;вывод исходных данных
        mov     ah,     09h
        lea     dx,     [msgSourceString]
        int     21h
        mov     ah,     40h
        mov     bx,     _STDOUT_
        mov     cx,     [Len]
        lea     dx,     [String]
        int     21h
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;обработка строки
 
        lea     si,     String
        mov     cx,     Len
        cld
        ;реверс всей строки
        mov     di,     si
        add     di,     cx
        dec     di
        call    Reverse
 
        @@Loop:
                ;пропускаем все разделители
                @@WhileDelimiter:
                        lodsb
                        cmp     al,     DelimChar
                loope   @@WhileDelimiter
                jcxz    @@Finish        ;если строка закончилась - выйти
                ;найдено новое слово
                mov     di,     si      ;(di-1) указатель на начало слова
                ;пропускаем все буквы слова до разделителя
                @@WhileWord:
                        lodsb
                        cmp     al,     DelimChar
                loopne  @@WhileWord
                cmp     cx,     1       ;учтём возможный выход из цикла по завершению строки
                adc     si,     0       ;когда на первый символ слова будет указывать (esi+1)
                ;теперь слово выделено
                ;(di-1) - начало слова
                ;(si-2) - конец слова
                sub     si,     2
                dec     di
                xchg    si,     di
                call    Reverse
                xchg    si,     di
                add     si,     2
 
                test    cx,     cx
        jnz     @@Loop
@@Finish:
        ;вывод результатов
        mov     ah,     09h
        lea     dx,     [msgResultString]
        int     21h
        mov     ah,     40h
        mov     bx,     _STDOUT_
        mov     cx,     [Len]
        lea     dx,     [String]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
1
0 / 0 / 0
Регистрация: 25.11.2019
Сообщений: 3
05.12.2019, 16:49  [ТС] 6
Что идёт не так в программе?
Требуется ввести с клавиатуры строку из слов с разделителями, программа должна поменять местами первое и последнее слово, второе с предпоследним и так далее до конца, после чего вывести начальный вариант и результат. Основываясь на методичках и статьях в интернете написал данный код, но вместо строки выводятся непонятные символы, по всей видимости из кеша

Вот код, прошу прощения, что без комментариев (позже могу скинуть скрины диаграммы, по которой писал сам код)

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
data segment 
 IN_STR db 80,?,82 dup(?) 
 OUT_STR db 80,?,82 dup(?) 
 
data ends 
code segment 
assume cs: code, ds: data 
start: 
 lea dx,IN_STR 
 mov ah,0ah 
 int 21h 
 xor ah,ah 
 mov dl,IN_STR+1 
 lea bx,IN_STR+2 
 add bl,dl 
 dec bx 
 lea si,OUT_STR+2 
 mov dl,0 
 mov cx,0 
 mov di," " 
 push di 
  
 H: 
  cmp dl,IN_STR+1 
  je P 
  jge ex 
  mov al,[bx] 
  cmp al," " 
  jne M 
 P: 
  pop cx 
  mov [Si],cl 
  inc si 
  cmp cx," " 
  je M 
  loop p 
  
 M: 
  push ax 
  inc dl 
  dec bx 
  loop H 
  
 ex: 
  lea dx,OUT_STR 
  mov ah,09h 
  int 21h 
  lea dx,IN_STR 
  mov ah,0ah 
  int 21h 
 
 
quit: 
mov ax, 4c00h 
int 21 
code ends 
end start
Добавлено через 14 минут
Недавно тут же помогли с кодом, но он оказался слишком замороченным и не подошёл, пришлось писать самому
Вот тот код, в нем, к тому же, не организован ввод строки с клавиатуры
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
.model small 
 
.stack 200h 
 
.data 
 DelimChar equ ' ' ;символ, разделитель слов 
 _STDOUT_ equ 1 ;описатель вывода на экран 
 ;обрабатываемая строка 
 String db 'loll goog bbooob suup mooling some paper to garbage' 
 Len dw $-String 
 ;сообщения программы 
 CrLf db 0Dh, 0Ah, '$' 
 msgSourceString db 'Instant:', 0Dh, 0Ah, '$' 
 msgResultString db 'Result:', 0Dh, 0Ah, '$' 
.code 
 
Reverse proc 
 push si 
 push di 
 jmp @@next 
 @@while: 
 mov al, [si] 
 mov ah, [di] 
 mov [di], al 
 mov [si], ah 
 inc si 
 dec di 
 @@next: 
 cmp si, di 
 jb @@while 
 pop di 
 pop si 
 ret 
Reverse endp 
 
Show proc 
 push ax 
 push bx 
 push cx 
 push dx 
 push si 
 push di 
 
 mov ah, 40h 
 mov bx, _STDOUT_ 
 mov cx, [Len] 
 lea dx, [String] 
 int 21h 
 mov ah, 09h 
 lea dx, CrLf 
 int 21h 
 
 pop di 
 pop si 
 pop dx 
 pop cx 
 pop bx 
 pop ax 
 ret 
Show endp 
 
main proc 
 mov ax, @data 
 mov ds, ax 
 
 ;вывод исходных данных 
 mov ah, 09h 
 lea dx, [msgSourceString] 
 int 21h 
 mov ah, 40h 
 mov bx, _STDOUT_ 
 mov cx, [Len] 
 lea dx, [String] 
 int 21h 
 mov ah, 09h 
 lea dx, CrLf 
 int 21h 
 ;обработка строки 
 
 lea si, String 
 mov cx, Len 
 cld 
 ;реверс всей строки 
 mov di, si 
 add di, cx 
 dec di 
 call Reverse 
 
 @@Loop: 
 ;пропускаем все разделители 
 @@WhileDelimiter: 
 lodsb 
 cmp al, DelimChar 
 loope @@WhileDelimiter 
 jcxz @@Finish ;если строка закончилась - выйти 
 ;найдено новое слово 
 mov di, si ;(di-1) указатель на начало слова 
 ;пропускаем все буквы слова до разделителя 
 @@WhileWord: 
 lodsb 
 cmp al, DelimChar 
 loopne @@WhileWordт 
 cmp cx, 1 ;учтём возможный выход из цикла по завершению строки 
 adc si, 0 ;когда на первый символ слова будет указывать (esi+1) 
 ;теперь слово выделено 
 ;(di-1) - начало слова 
 ;(si-2) - конец слова 
 sub si, 2 
 dec di 
 xchg si, di 
 call Reverse 
 xchg si, di 
 add si, 2 
 
 test cx, cx 
 jnz @@Loop 
@@Finish: 
 ;вывод результатов 
 
 mov ah, 09h 
 lea dx, [msgResultString] 
 int 21h 
 mov ah, 40h 
 mov bx, _STDOUT_ 
 mov cx, [Len] 
 lea dx, [String] 
 int 21h 
 mov ah, 09h 
 lea dx, [CrLf] 
 int 21h 
 
 ;завершение программы 
 mov ax, 4C00h 
 
main endp 
 
end main
0
Модератор
867 / 447 / 246
Регистрация: 10.11.2019
Сообщений: 913
06.12.2019, 11:31 7
Задача
Ввести строку
Поменять первое слово с последним, второе с предпоследним и т д

Алгоритм.
На первый взгляд кажется, что необходимо строку делить на слова,
менять слова местами и т д. На самом деле всё проще.
Пусть имеется строка
one two three
Отобразим строку зеркально
eerht owt eno
Теперь чтобы получить нужный результат надо все слова отразить зеркально:
three two one
Это можно сделать, занеся символы слова в стек, а затем вытолкнув из стека
на печать.

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
    .model small
    .code
start:  jmp beg
space   equ 32
 
crlf    db 13,10,"$"
prompt  db 13,10,">$"
 
maxlen  db 78 ; буфер входной строки 78 - макс длина строки
strlen  db 0  ; возвращаемая длина строки
strbuf  db 80 dup (0)
 
beg:    mov ax,cs ; важно - установка сегментных регистров
    mov ds,ax
    mov es,ax
    cld
    mov dx,offset prompt ; напечатать ">"
    call print
    mov dx,offset maxlen ; ввести строку
    mov ah,0Ah
    int 21h
 
    mov ch,0 ; если длина строки 0, ничего не делать
    mov cl,strlen
    jcxz dosexit
    mov dx,offset prompt
    call print
    mov si,offset strbuf ; установить si на конец строки
    add si,cx
    dec si
    mov strlen,space ; ставим пробел перед началом строки,
             ; чтобы алгоритм мог завершиться
    std ; si уменьшается в строковых операциях
next1:  cmp si,offset strbuf ; мы достигли начала строки ?
    jc  finish           ; да - финиш
    lodsb ; al=ds:[si], si=si-1
    cmp al,space ; если это пробел, то напечатать
    jz  m1
    call mirrorword ; иначе загнать слово в стек и напечатать
    jmp next1
m1:     call printchar
    jmp next1
 
finish: mov dx,offset crlf
    call print
dosexit: mov ax,4C00h ; выход в DOS
    int 21h
 
mirrorword:
    inc si ; повторно загрузить символ
    mov cx,0 ; счётчик символов в слове
next2:  lodsb  ; загрузить символ
    cmp al,space ; если это пробел, напечатать слово из стека
    jz m2
    mov ah,0 ; иначе занести символ в стек
    push ax
    inc cx  ; увеличить счётчик символов
    jmp next2
m2:     jcxz m4 ; если символов в стеке нет, то выход
m3: pop  ax ; напечатать символ из стека
    call printchar
    loop m3
m4: inc si ; повторно загрузить символ
    ret
 
print:  mov ah,9 ; печать строки текста
    int 21h
    ret
    
printchar:mov dl,al ; печать символа al
    mov ah,2
    int 21h
    ret
    
    end start
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,697
06.12.2019, 15:48 8
Цитата Сообщение от qbfan Посмотреть сообщение
На самом деле всё проще.
Ну Вы тут на упрощали.
Ещё проще:
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   tiny
.code
org 100h
szStr   equ 255
begin:  mov ah,9
    lea dx,dbStr
    int 21h
    mov ah,10
    lea dx,dbMax
    int 21h
    mov ah,9
    lea dx,dbRes
    int 21h
    xor bh,bh
    lea di,dbTxt
    mov cl,dbLen
    add di,cx
    mov byte ptr dbLen,' '
    dec di
    inc cx
    std
@@01:   mov al,' '
    mov si,di
    repne   scasb
    jnz @@00
    push    cx
    mov cx,si
    mov ah,40h
    mov bx,1
    sub cx,di
    mov dx,di
    inc dx
    int 21h
    pop cx
    jmp @@01
@@00:   ret
dbStr   db  10,13,'Enter String:$'
dbres   db  10,13,'Result:$'
dbMax   db  szStr
dbLen   db  ?
dbTxt   db  szStr dup(?)
    end begin
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,187
Записей в блоге: 5
06.12.2019, 18:11 9
Цитата Сообщение от AlbertBor Посмотреть сообщение
Требуется ввести с клавиатуры строку из слов с разделителями, программа должна поменять местами первое и последнее слово, второе с предпоследним и так далее до конца, после чего вывести начальный вариант и результат.
Если не решать задачу формирования итоговой строки, а сразу выводить по мере выделения слов, то можно сокращать и сокращать. Честно - не пойму, чем вариант с реверсом всей строки и последующими реверсами отдельных слов создаёт впечатление "слишком замороченного" (аргумент "к тому же, не организован ввод строки с клавиатуры" и видеть не желаю - нашлась, вот, проблема!).
Если вынести повторения в процедуры, убрать комментарии и пустые строки, метки не выделять отдельными строками, сэкономить на объявлении и инициализации сегмента данных, убрать именованные константы, воспользоваться трюками и сэкономить на одном вызове процедуры Show (экономия 1 строки) - так и мой код превращается в короткий образец:
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
.model tiny
.code
org     100h
main:   mov     ah,     09h
        lea     dx,     [msgPrompt]
        int     21h
        mov     ah,     0Ah
        lea     dx,     [kbBuffer]
        int     21h
        lea     si,     String
        xor     cx,     cx
        mov     cl,     [Len]
        lea     di,     [Result]
        rep     movsb
        cld
        lea     si,     [Result]
        xor     cx,     cx
        mov     cl,     [Len]
        mov     di,     si
        add     di,     cx
        dec     di
        call    Reverse
        @@WhileDelimiter:
                        lodsb
                        cmp     al,     ' '
                loope   @@WhileDelimiter
                jcxz    @@Finish        ;если строка закончилась - выйти
                mov     di,     si      ;(di-1) указатель на начало слова
                @@WhileWord:
                        lodsb
                        cmp     al,     ' '
                loopne  @@WhileWord
                cmp     cx,     1       ;учтём возможный выход из цикла по завершению строки
                adc     si,     0       ;когда на первый символ слова будет указывать (esi+1)
                sub     si,     2
                dec     di
                xchg    si,     di
                call    Reverse
                xchg    si,     di
                add     si,     2
                test    cx,     cx
        jnz     @@WhileDelimiter
@@Finish:       lea     dx,     [msgSourceString]
        lea     si,     [String]
        call    Show
        lea     dx,     [msgResultString]
        lea     si,     [Result]
Show:   mov     ah,     09h
        int     21h
        mov     ah,     40h
        mov     bx,     1
        xor     ch,     ch
        mov     cl,     [Len]
        mov     dx,     si
        int     21h
        ret
Reverse proc
        push    si
        push    di
        jmp     @@next
        @@while:
                mov     al,     [si]
                mov     ah,     [di]
                mov     [di],   al
                mov     [si],   ah
                inc     si
                dec     di
        @@next:
                cmp     si,     di
        jb      @@while
        pop     di
        pop     si
        ret
Reverse endp
        msgSourceString db      0Dh, 0Ah, 'Instant:', 0Dh, 0Ah, '$'
        msgResultString db      0Dh, 0Ah, 'Result:', 0Dh, 0Ah, '$'
        msgPrompt       db      'Enter a string:', 0Dh, 0Ah, '$'
        kbBuffer        db      255
        Len             db      0
        String          db      255 dup(?)
        Result          db      255 dup(?)
end     main
Добавлено через 1 час 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
66
67
68
69
70
71
72
73
74
75
76
.model tiny
.code
org     100h
main:   mov     ah, 09h
        lea     dx, [msgPrompt]
        int     21h
        mov     ah, 0Ah
        lea     dx, [kbBuffer]
        int     21h
        lea     si, String
        xor     cx, cx
        mov     cl, [Len]
        lea     di, [Result]
        rep     movsb
        cld
        lea     si, [Result]
        xor     cx, cx
        mov     cl, [Len]
        mov     di, si
        add     di, cx
        dec     di
        call    Reverse
@@WhileDelimiter: lodsb
        cmp     al, ' '
        loope   @@WhileDelimiter
        jcxz    @@Finish ;если строка закончилась - выйти
        mov     di, si   ;(di-1) указатель на начало слова
@@WhileWord: lodsb
        cmp     al, ' '
        loopne  @@WhileWord
        cmp     cx, 1    ;учтём возможный выход из цикла по завершению строки
        adc     si, 0    ;когда на первый символ слова будет указывать (esi+1)
        sub     si, 2
        dec     di
        xchg    si, di
        call    Reverse
        xchg    si, di
        add     si, 2
        test    cx, cx
        jnz     @@WhileDelimiter
@@Finish: lea     dx, [msgSourceString]
        lea     si, [String]
        call    Show
        lea     dx, [msgResultString]
        lea     si, [Result]
Show:   mov     ah, 09h
        int     21h
        mov     ah, 40h
        mov     bx, 1
        xor     ch, ch
        mov     cl, [Len]
        mov     dx, si
        int     21h
        ret
Reverse: push    si
        push    di
        jmp     @@next
@@while: mov     al, [si]
        mov     ah, [di]
        mov     [di], al
        mov     [si], ah
        inc     si
        dec     di
@@next: cmp     si, di
        jb      @@while
        pop     di
        pop     si
        ret
msgSourceString db      0Dh, 0Ah, 'Instant:', 0Dh, 0Ah, '$'
msgResultString db      0Dh, 0Ah, 'Result:', 0Dh, 0Ah, '$'
msgPrompt       db      'Enter a string:', 0Dh, 0Ah, '$'
kbBuffer        db      255
Len             db      0
String          db      255 dup(?)
Result          db      255 dup(?)
end     main
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,697
08.12.2019, 00:46 10
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
вариант с реверсом всей строки и последующими реверсами отдельных слов
Вам бы в политики пойти.
Ревесировать реверсированеое, а "навар" от двойного реверсирования в карман положить.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Если вынести повторения в процедуры
Assembler
1
2
3
mov     ah,9
lea     dx,dbStr
int     21h
занимает 8-мь байт - плюс один байт на RET + 3-и байта на вызов п/п-му.

Посчитайте целесооброзность использования п/п-м и прямого кода.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,187
Записей в блоге: 5
08.12.2019, 15:16 11
Всё это лирика.
Как понимаю, топикстартер не может понять алгоритм и, естественно, сдать лабу. Пытался что-то изобразить - но из-за отсутствия представления об алгоритме - ничего не получается - ведь опубликовав наработки, он так и не пояснил, как он решает.

AlbertBor, вы должны сделать декомпозицию задачи и решать её по частям. При этом, ускорение отладки будет за счёт отсутствия ввода строки - после получения рабочего кода добавите ввод.
В любом случае, нужно научиться выделять слова. Значит учитесь выделять и выводить эти слова в кавычках, чтобы видеть, что выделено слово без дополнительных пробелов.
А дальше - всё зависит от выбранного способа решения - алгоритма.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2019, 15:16
Помогаю со студенческими работами здесь

В строке поменять слова первое с последним,второе с предпоследним и т.д.
Как в строке поменять слова первое с последним,второе с предпоследним и тд.?

Что нужно поменять что бы программа меняла местами слова первое с последним второе с предпоследним и т.д?
program Project1; const D = ; var S, Sw : String; i, Len, Cnt, CntMid : Integer; ...

Сформировать строку, «склеив» первое слово с последним, второе с предпоследним и т.д.
Нужно ввести строки с помощью функций gets или fgets, разбить строку на слова и выбрать нужные...

Дана строка. Поменять Первое слово с последним, второе с предпоследним и т.д
Не понимаю как сделать вообше.


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

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

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