Консультация № 183385
28.05.2011, 16:31
55.00 руб.
0 17 1
Здравствуйте! Прошу помощи в следующем вопросе:
требуется составить программу, которая удаляет пробелы справа. Ассемблер-TASM. EXE. Надеюсь, что Вы мне поможете.

Обсуждение

Неизвестный
28.05.2011, 18:46
общий
Можно догадываться, справа от чего. Но лучше напишите
Неизвестный
28.05.2011, 20:31
общий
ну , например, дана какая-нибудь строка. нужно в этой строке удалить все пробелы справа
Неизвестный
28.05.2011, 20:42
общий
Ну! А я что спрашиваю? Справа от чего? От всей строки? От каждого слова?
Неизвестный
28.05.2011, 22:59
общий
справа от конца строки
Неизвестный
29.05.2011, 15:48
общий
ну что там, продвигается?
Неизвестный
29.05.2011, 16:59
общий
Да задача простая - нужно только знать:
1) строку вводить с клавиатуры или задавать в программе?
2) формат строки: есть два - один заканчивается нулем (формат ASCIIZ, используется в С) и формат строки Паскаля (в начале байт длины)
3) надо вывести? Тогда как показать, что пробелов больше нет?
Неизвестный
29.05.2011, 18:11
общий
1) вводить с клавиатуры
2) второй вариант
3) должна выводиться введенная строка только без пробелов
Неизвестный
29.05.2011, 21:16
общий
сегодня будет готова?
Неизвестный
29.05.2011, 21:43
общий
Вот код программы. Все так?
В приложении код в архиве

Код:
.model small
.data
s db 79, 79 dup (0)

input_msg db 'Input string and press ENTER',13,10,'$'
exit_msg db 13,10,'Press any key ...$'
.code
start:
mov ax, @data
mov ds, ax
mov ax, 3
int 10h

; ‚¢®¤ áâப¨
lea dx, input_msg
mov ah, 9
int 21h

lea dx, s
mov ah, 0Ah
int 21h
lea si, s
mov cl, [si+1] ; число введенных
mov [si], cl ; запишем как новый байт длины
cld
add si, 2 ; указывает на введенные символы + 1
push ds
pop es
mov di, si
dec di
@@_correct_string:
REP movsb


CALL Str_out

mov al, 13
int 29h ; прерывание делает одно: выводит AL на текстовый экран
mov al, 10
int 29h ; две команды = переход на новую строку


lea si, s
mov cx, [si]
xor ch, ch
mov dl, cl
; inc si
add si, cx ; ¢ ª®­¥æ áâப¨
std
jcxz @@3
@@2:
lodsb
cmp al, ' '
jne @@3
dec dl
LOOP @@2
@@3:
lea si, s
mov [si], dl


CALL Str_out

lea dx, exit_msg
mov ah, 9
int 21h

xor ax, ax
int 16h

mov ax, 4C00h
int 21h

; вывод подпрограммой
Str_out proc
mov al, '>'
int 29h
lea si, s
mov cl, [si]
xor ch, ch
inc si ; пропускаем байт длины
cld
@@str:
lodsb
int 29h
LOOP @@str

mov al, '<'
int 29h
ret
Str_out endp

end start

Прикрепленные файлы:
ead7a23858e99babd78142a940126fd6.7z
Неизвестный
29.05.2011, 22:08
общий
выводит туже самою строку. при компоновки какая то проблема
Прикрепленные файлы:
e841504d92841680cb5e62e4ac927cdd.JPG
Неизвестный
29.05.2011, 22:27
общий
Посмотрите тут. Действительно, не тот файл переслал .. и написал
Перед
Код:
.code

нужн вставить:
Код:
.stack 100h
Прикрепленные файлы:
aaf570de85f3ba5d65d6d076b5dc48e1.7z
Неизвестный
29.05.2011, 22:41
общий
не удаляет пробелы! так же все выводит
Прикрепленные файлы:
e70d4e6caba1f0f0cd16f9e4c70a9032.JPG
Неизвестный
29.05.2011, 23:06
общий
Так Вы ж сами написали, что УДАЛЯТЬ НУЖНО ТОЛЬКО НА конце строки!!!
Я так и сделал! (см. Ваше сообщение №4!)
Если нужно удалить ВСЕ пробелы, то это тоже можно...
Неизвестный
29.05.2011, 23:10
общий
не на конце строки! а удалить все пробелы, начиная с конца
Неизвестный
30.05.2011, 00:53
общий
в общем, попробую сдать такую, а там посмотрим
Неизвестный
30.05.2011, 11:25
общий
Да, именно сейчас -не продыхнуть, а к вечеру переделаю. Тогда и тот покажите
Я специально не стал размещать в ответе - были сомнения
давно
Старший Модератор
31795
6196
01.06.2011, 19:34
общий
это ответ
Здравствуйте, Тюрин Сергей Григорьевич!

Смотрите приложение.
[code h=200]model small
.code
szMax equ 255
;начало настраиваем сегментыные регистры
begin: mov ax,@data
mov ds,ax
;выводим сообщение
mov ah,9
lea dx,dbEnter
int 21h
;вводим строку
mov ah,0Ah
lea dx,dbMax
int 21h
;настраиваем на цикл регистры
mov cl,dbSize;длина введенной строки
xor ch,ch;сбросим старщий байт
lea si,dbStr;начало строки
mov dx,si;дублируем начало строки
add si,cx;указатеь в конец строки
mov byte ptr[si],'$';признак конец строки
@@01: mov al,[si];читаем символ
cmp al,' ';пробел?
jnz @@03;нет переходим
push si;запоминаем указатель на строку
@@02: mov al,[si+1];считываем следующий символ
mov [si],al;записываем вместо пробела
inc si;переходим на следующий символ
cmp al,'$'проверяем признак конца строки
jnz @@02;нет переходим
pop si;востанавливаем указатель на строку
@@03: dec si;следующий проверяемый символ
cmp si,dx;проверяем начало строки
jae @@01;нет переходим
;выводим сообщение и строку
mov ah,9
lea dx,dbResult
int 21h
mov ah,9
lea dx,dbStr
int 21h
;ждем любую клавишу и выходим
xor ax,ax
int 16h
mov ax,4c00h
int 21h
.data
dbEnter db 10,13,'Enter string:$'
dbResult db 10,13,'Result:$'
dbMax db szMax
dbSize db ?
dbStr db szMax dup(?)
.stack 200h
end begin[/code]
вопросы по программе задавайте минифорум
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа