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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2016, 18:48   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Удалить лишние пробелы

Нужно было написать программу уплотнения текста, то-есть заменит несколько пробелов на 1, код я нашел на другом форуме, но после выполнения программы дос бокс зависает, подскажите почему? И как сделать что бы уплотненная строка выводилась не в одну строчку со старой, а с новой строки.
И очень буду благодарен за комментарии к коду, так как для себя хочу в ассемблере разобраться, но пока что почти полный профан и не могу разобраться в коде, заранее большое спасибо
Код:
ASSUMe CS:CODE,DS:CODE,ES:CODE
CODE segment
org 100h
start:
mov di,offset startstring
mov cx,0
foreverloop:
mov ah,10h
int 16h
mov dl,al
mov ah,2
int 21h
mov [di],dl
inc di
cmp dl,'.'
je outlrfwrwr
inc cx
jmp foreverloop
outlrfwrwr:
 
mov si,offset startstring
mov di,offset endstring
loopwerwtwty:
mov ax,[si]
cmp ax,2020h
je nosigse
mov [di],al
inc di
nosigse:inc si
loop loopwerwtwty
 
inc di
push ax
mov al,10
mov [di],al
mov al,13
mov [di],al
mov al,'$'
mov [di],al
pop ax
mov ah,9
mov dx,offset endstring
int 21h
mov ah,10h
int 16h
int 20h
startstring db 30000 dup (?)
endstring db 30000 dup (?)
CODE ends
end start
Безымянный.jpg
Max00766 вне форума Ответить с цитированием
Старый 17.05.2016, 19:20   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Max00766 Посмотреть сообщение
после выполнения программы дос бокс зависает, подскажите почему?
Большие буфера (красивы только у женщин).
Уменьши их до 80..

Код:
startstring db 80 dup (?)
endstring db 80 dup (?)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 17.05.2016, 19:30   #3
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Большие буфера (красивы только у женщин).
Уменьши их до 80..

Код:
startstring db 80 dup (?)
endstring db 80 dup (?)
Все равно виснет, уже даже 50 уменьшил, но без результата.
Max00766 вне форума Ответить с цитированием
Старый 17.05.2016, 20:13   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
;== FASM code =======================
org 100h
jmp start

mess0    db   13,10,' String:  $'
mess1    db   13,10,' Result:  $'
buff:                            ; структура буфера для fn(0Ah)
max      db   80                 ; макс. размер
size     db   0                  ; кол-во введённых символов
string   db   80 dup(0)          ; сам буфер для строки

start:
       mov   dx,mess0            ;
       call  message             ;
       mov   ah,0Ah              ; ввод строки в буфер
       mov   dx,buff             ;
       int   21h                 ;

       xor   cx,cx               ;
       mov   cl,[size]           ; длина строки
       mov   si,string           ; SI/DI - адрес строки
       mov   di,si               ;
       xor   ax,ax               ;
cycle: lodsb                     ; считать символ в AL
       cmp   al,' '              ; пробел?
       jne   miss                ; нет - пропускаем
       cmp   ax,'  '             ; да - тест с предыдущим
       je    next                ; 2 пробела - пропускаем
miss:  stosb                     ; перезапись символа
next:  xchg  ah,al               ; запомним текущий символ
       loop  cycle               ; мотаем СХ-раз..
       mov   al,'$'              ;
       stosb                     ; вставляем маркер конца стоки

       mov   dx,mess1            ;
       call  message             ;
       mov   dx,string           ; выводим изменённую строку
       call  message             ;

exit:  xor   ax,ax               ; выход..
       int   16h                 ;
       int   20h                 ;

;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
;------------------------------------------------------------------------
message:                      ;
      mov   ah,9              ; вывод строки на экран
      int   21h               ;
ret                           ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 17.05.2016, 20:40   #5
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Код:
;== FASM code =======================
org 100h
jmp start

mess0    db   13,10,' String:  $'
mess1    db   13,10,' Result:  $'
buff:                            ; структура буфера для fn(0Ah)
max      db   80                 ; макс. размер
size     db   0                  ; кол-во введённых символов
string   db   80 dup(0)          ; сам буфер для строки

start:
       mov   dx,mess0            ;
       call  message             ;
       mov   ah,0Ah              ; ввод строки в буфер
       mov   dx,buff             ;
       int   21h                 ;

       xor   cx,cx               ;
       mov   cl,[size]           ; длина строки
       mov   si,string           ; SI/DI - адрес строки
       mov   di,si               ;
       xor   ax,ax               ;
cycle: lodsb                     ; считать символ в AL
       cmp   al,' '              ; пробел?
       jne   miss                ; нет - пропускаем
       cmp   ax,'  '             ; да - тест с предыдущим
       je    next                ; 2 пробела - пропускаем
miss:  stosb                     ; перезапись символа
next:  xchg  ah,al               ; запомним текущий символ
       loop  cycle               ; мотаем СХ-раз..
       mov   al,'$'              ;
       stosb                     ; вставляем маркер конца стоки

       mov   dx,mess1            ;
       call  message             ;
       mov   dx,string           ; выводим изменённую строку
       call  message             ;

exit:  xor   ax,ax               ; выход..
       int   16h                 ;
       int   20h                 ;

;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
;------------------------------------------------------------------------
message:                      ;
      mov   ah,9              ; вывод строки на экран
      int   21h               ;
ret                           ;
Большое спасибо
Max00766 вне форума Ответить с цитированием
Старый 17.05.2016, 20:48   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Max00766, помимо заголовков, fasm отличается от остальных
отсутствием директив "offset" и "ptr". Вот примеры:

Код:
string   db  'Hello World! $'
array    dw   0123h

; на fasm'e ------------------
   mov  ah,9
   mov  dx,string
   int  21h
   mov  ax,word[array]

; на tasm/masm'e -------------
   mov  ah,9
   mov  dx,offset string
   int  21h
   mov  ax,word ptr[array]
..а для спасибо есть весы под аватаркой
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 17.05.2016 в 20:50.
R71MT вне форума Ответить с цитированием
Старый 17.05.2016, 21:20   #7
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Max00766, помимо заголовков, fasm отличается от остальных
отсутствием директив "offset" и "ptr". Вот примеры:

Код:
string   db  'Hello World! $'
array    dw   0123h

; на fasm'e ------------------
   mov  ah,9
   mov  dx,string
   int  21h
   mov  ax,word[array]

; на tasm/masm'e -------------
   mov  ah,9
   mov  dx,offset string
   int  21h
   mov  ax,word ptr[array]
..а для спасибо есть весы под аватаркой
За весы спасибо что подсказали, а про отличия тасма фасма уже знаю, уже немного лед тронулся)
Max00766 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить все лишние пробелы С++ wolchara Помощь студентам 2 11.01.2015 12:23
Как удалить лишние пробелы из строки? MyLastHit Общие вопросы Delphi 26 11.08.2010 21:44
удалить в строке лишние пробелы euhenia Помощь студентам 4 02.12.2009 21:55
Удалить лишние пробелы [C++] StudeHt Помощь студентам 2 20.05.2009 23:12
Удалить лишние пробелы Иван 883 Паскаль, Turbo Pascal, PascalABC.NET 5 06.04.2009 22:45