Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2023, 01:13   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию рев строки tasm

помогите исправить код чтоб он правильно работал я делал реверс слов строки. но что то не так

Код:
.MODEL SMALL
.STACK 100H
.DATA
    msg DB "Enter a string: $"
    output DB 0AH, "Reversed string: $"
    buffer_size EQU 200 ; размер буфера
    buffer DB buffer_size, ?, buffer_size DUP ('$') ; буфер для хранения строки
.CODE
    MOV AX, @DATA
    MOV DS, AX
    LEA DX, msg
    MOV AH, 9
    INT 21H ; выводим приглашение на ввод строки
    MOV AH, 0AH
    LEA DX, buffer
    INT 21H ; считываем строку в буфер
    XOR BX, BX ; BX - индекс начала слова
    MOV CX, buffer[1] ; CX - длина строки
    DEC CX ; уменьшаем на 1, так как первый байт - длина буфера
    XOR SI, SI ; SI - индекс текущего символа
next_char:
    CMP SI, CX ; если достигли конца строки
    JGE output_result
    MOV AL, buffer[SI + 3] ; берём очередной символ строки из буфера
    CMP AL, ' ' ; если символ - пробел
    JE space_found
    INC SI
    JMP next_char
space_found:
    PUSH CX ; сохраняем текущую длину слова на стеке
    MOV CX, SI ; CX - длина слова
    SUB CX, BX ; вычисляем длину слова
    DEC SI ; SI - индекс последнего символа слова
    ADD SI, 3 ; добавляем 3, так как первые 3 байта - длина буфера и два символа CR,LF
    MOV DI, SI ; DI - индекс места, куда будем записывать реверсированное слово
reverse_word:
    MOV AL, buffer[BX + 3] ; берём символ слова из буфера
    MOV buffer[DI], AL ; записываем символ в реверсированное слово
    INC BX
    DEC DI
    CMP BX, SI ; если прошли все символы слова
    JLE reverse_word
    MOV AL, ' ' ; записываем пробел в реверсированную строку
    MOV buffer[DI], AL
    POP CX ; восстанавливаем длину слова
    MOV BX, SI ; обновляем индекс начала слова
    INC SI ; переходим к следующему символу
    JMP next_char
output_result:
    LEA DX, output
    MOV AH, 9
    INT 21H ; выводим сообщение о реверсированной строке
    LEA DX, buffer
    MOV AH, 9
    INT 21H ; выводим реверсированную строку
    MOV AH, 4CH
    INT 21H ; завершаем программу
END
ChestIotVaga вне форума Ответить с цитированием
Старый 22.03.2023, 01:49   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тут я ошибки исправил и программа работает. Но на будущее - в полном комплекте TASM5 есть программа отладчик. Она позволит пройти программу шаг за шагом и найти ошибки в логике ее работы.
Выглядит она вот так (см. скриншот)
Код:
.MODEL SMALL
.STACK 100H
.DATA
    msg DB "Enter a string: $"
    output DB 0AH, "Reversed string: $"
    buffer_size EQU 200 ; размер буфера
    buffer DB buffer_size, ?, buffer_size DUP ('$') ; буфер для хранения строки
.CODE
START:		; Забыли добавить метку начала программы
    MOV AX, @DATA
    MOV DS, AX
    LEA DX, msg
    MOV AH, 9
    INT 21H ; выводим приглашение на ввод строки
    MOV AH, 0AH
    LEA DX, buffer
    INT 21H ; считываем строку в буфер
    XOR CX, CX
    XOR BX, BX ; BX - индекс начала слова
    MOV CL, buffer[1] ; CX - длина строки
    DEC CX ; уменьшаем на 1, так как первый байт - длина буфера
    XOR SI, SI ; SI - индекс текущего символа

next_char:
    CMP SI, CX ; если достигли конца строки
    JGE output_result
;    MOV AL, buffer[SI + 3] ; берём очередной символ строки из буфера
    MOV AL, buffer[SI + 2] ; берём очередной символ строки из буфера
    CMP AL, ' ' ; если символ - пробел
;    JE space_found
    JNE skip_char
;    INC SI
;    JMP next_char

space_found:
    PUSH CX ; сохраняем текущую длину буфера в стеке, но это можно не сохранять. Она итак доступна через buffer[1]
    MOV CX, SI ; CX - длина слова
    SUB CX, BX ; вычисляем длину слова
    MOV DI, SI ; DI - индекс места, куда будем записывать реверсированное слово
    DEC DI ; SI - индекс последнего символа слова
;    ADD SI, 3 ; добавляем 3, так как первые 3 байта - длина буфера и два символа CR,LF
;    MOV DI, SI ; DI - индекс места, куда будем записывать реверсированное слово

reverse_word:
;    MOV AL, buffer[BX + 3] ; берём символ слова из буфера
    MOV AL, buffer[BX + 2] ; берём символ слова из буфера
    MOV AH, buffer[DI + 2]
    MOV buffer[DI + 2], AL ; записываем символ в реверсированное слово
    MOV buffer[BX + 2], AH
    INC BX
    DEC DI
    CMP BX, DI ; если прошли все символы слова
    JL reverse_word
;   MOV AL, ' ' ; записываем пробел в реверсированную строку
;   MOV buffer[DI], AL
    POP CX ; восстанавливаем длину слова

skip_space:	; Цикл пропуска пробелов (если между словами больше одного)
    CMP SI, CX
    JGE	output_result
    MOV AL, buffer[SI + 2]
    CMP AL, ' '
    JNZ skiped_spaces
    INC SI
    JMP skip_space

skiped_spaces:
    MOV BX, SI ; обновляем индекс начала слова
    JMP next_char

skip_char:
    INC SI ; переходим к следующему символу
    JMP next_char

output_result:
    LEA DX, output
    MOV AH, 9
    INT 21H ; выводим сообщение о реверсированной строке
    LEA DX, buffer[2]
    MOV AH, 9
    INT 21H ; выводим реверсированную строку
    MOV AH, 4CH
    INT 21H ; завершаем программу
END START
Изображения
Тип файла: png Screenshot_20230322_014658.png (43.1 Кб, 9 просмотров)
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
TASM дело тонкое!:) (Где в TASM IDE?) 3.14oner Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 15.11.2011 16:20
TASM for DOS Lazio Фриланс 2 11.03.2011 14:28
Ввод символьной строки,вывод содержимого соответствующего регистра(TASM) adgam Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 17.03.2010 08:48
Assembler TASM/ Разработать прогу:разбивающую каждое слово текстовой строки на две части levis07 Фриланс 5 20.11.2009 10:34