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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2011, 13:51   #1
NAS1977mu
Пользователь
 
Аватар для NAS1977mu
 
Регистрация: 28.12.2010
Сообщений: 13
Восклицание Удаление символов из строки

Господа! У меня просьба помочь с решением следующей проблемы. Требуется ввести с клавиатуры строку произвольной длинны и содержания, затем указать позицию в строке и удалить все пробелы слева от нее, при этом использовать обработку цепочек, результат вывести в строку на экране.
Оказанная помощь должна повышать рейтинг!!!
NAS1977mu вне форума Ответить с цитированием
Старый 06.01.2011, 23:39   #2
NAS1977mu
Пользователь
 
Аватар для NAS1977mu
 
Регистрация: 28.12.2010
Сообщений: 13
По умолчанию

Ответа на мой запрос не дождешься, но если кому поможет пользуйтесь Господа!!!
Пример. Написать программу, которая удаляет в данном тексте все лишние пробелы (без учета концевых пробелов).
Код:
        TITLE Задача 52_1.
        ;Написать программу, которая удаляет в данном тексте все лишние пробелы 
        ;(без учета концевых пробелов).
        ;Программа сделана как EXE-файл.
        ;-------------------------------
        EXTRN Clear:FAR,Write_Str:FAR,Cursor:FAR
        ;----- Сегмент стека
StackSg SEGMENT PARA STACK 'Stack'
DW      256  DUP(?)
StackSg ENDS
        ;----- Сегмент данных
DataSg  SEGMENT PARA PUBLIC
STR1    DB  "Задайте исходную строку: $"
STR2    DB  "Результирующая строка: $"
BUFFER  LABEL  BYTE          ;Список параметров:
MAXLEN  DB     250           ;  максимальная длина;
ACTLEN  DB     ?             ;  реальная длина;
NAMEFLD DB     251 DUP ("$") ;  введенные символы.
DataSg  ENDS
        ;----- Сегмент кода
CodeSg  SEGMENT  PARA  PUBLIC
        ASSUME CS: CodeSg, DS:DataSg, SS: StackSg
Begin   PROC  FAR
        ;Пролог EXE-файла.
        PUSH DS
        XOR AX,AX
        PUSH AX
        MOV AX,DataSg
        MOV DS,AX 
        MOV ES,AX   ;Инициализация регистра ES.
        ;Конец пролога.
        CALL Clear     ;Очистка экрана.
        MOV  DX,0000h
        CALL Cursor    ;Установка курсора.
        LEA  DX,STR1
        CALL Write_Str
        MOV  DX,0100h
        CALL Cursor    ;Установка курсора.
        ;--------------Ввод строки.
        MOV  AH,0AH    ;Запрос функции ввода.
        LEA  DX,BUFFER ;Загрузить адрес списка параметров.
        INT  21H       ;Вызвать DOS-прерывание.
        MOV  AX,0
        MOV  AL,ACTLEN
        MOV  SI,AX
        MOV  BYTE PTR NAMEFLD[SI],'$' ;Поместим признак конца строки.
        ;--------------Проверим, нет ли пробелов сначала строки.
        ;--------------Если есть, то удалим их.
        CALL Beg_Space
        ;Будем искать пару пробелов в строке.
        ;Когда найдем, то удалим второй из них 
        ;путем сдвижки строки на один символ влево
        ;на место второго из найденных пробелов.
        ;Процесс будем повторять до тех пор,
        ;пока в строке есть пара пробелов.
PROD:
        MOV  CX,0
        MOV  AX,2020h
        MOV  CL,ACTLEN ;Длина строки
        LEA  DI,NAMEFLD;Адрес начала строки
        REPNE SCASW    ;Ищем пару пробелов.
        JNZ  EXT       ;Нет двух рядом стоящих пробелов - выход.
        MOV  SI,DI
        DEC  SI   ;Откуда копировать.
        SUB  DI,2 ;Куда.
        REP MOVSB       ;Перемещение строки.
        JMP  PROD       ;Повторение операции

EXT:    ;-------------Вывод результата.
        MOV  DX,0500h
        CALL Cursor    ;Установка курсора.
        LEA  DX,STR2
        CALL Write_Str
        MOV  DX,0600h
        CALL Cursor    ;Установка курсора.
        LEA  DX,NAMEFLD
        CALL Write_Str
        MOV  AH,1      ;Задержка.
        INT  21H
        RET
Begin	ENDP
;---------------- Процедура удаления начальных пробелов.
Beg_Space  PROC
           PUSH CX
           PUSH AX
           PUSH BX
           XOR  CX,CX
           XOR  AX,AX
           XOR  BX,BX
           CLD
           MOV  AL,' '    ;Искомый символ.
           MOV  CL,ACTLEN ;Длина строки.
           MOV  BL,CL
           DEC  BL
           LEA  DI,NAMEFLD;Адрес строки.
           REPE SCASB     ;Поиск символа, отличного от пробела.
           CMP  CL,BL     ;Если нет пробелов вначале строки,
                          ;то CX будет на единицу меньше.
                          ;CX уменьшилось на 1?
           JE   EXIT      ;Да - вначале строки пробелы отсутствуют. 
           ;--------------Удалим лишние пробелы.
           DEC  DI
           MOV  SI,DI      ;Откуда.
           LEA  DI,NAMEFLD ;Куда.
           MOV  CL,ACTLEN  ;Количество повторений.
           REP MOVSB       ;Перемещение строки.
EXIT:
           POP  BX
           POP  AX
           POP  CX
           RET
Beg_Space  ENDP
CodeSg  ENDS
        END Begin
Оказанная помощь должна повышать рейтинг!!!
NAS1977mu вне форума Ответить с цитированием
Старый 09.01.2011, 13:05   #3
NAS1977mu
Пользователь
 
Аватар для NAS1977mu
 
Регистрация: 28.12.2010
Сообщений: 13
Смех Удаление симсолов из строки

Код:
;Текст программы выполняющей:
;Ввод  строки
;Ввод позиции строки, до которой следует удалить пробелы слева
;Вывод получившейся строки

dates SEGMENT	; Сегмент данных
message1	db	'Input text:',13,10,'$'
message2	db	'Input position:',13,10,'$'
message3	db	'Result:',13,10,'$'
err_msg		db	'Bad number entered',13,10,'$'
crlf		db	0Dh,0Ah,'$'

str_in		db	40 dup('$')
pos_del		db	2	;номер позиции, до которой удалять пробелы
str_out		db	40 dup('$')
str_pos		db	3	; максимальный размер буфера ввода
blength		db	?	; размер буфера после считывания
bcontents:			; содержимое буфера располагается за
					; концом файла
dates ENDS	

komod SEGMENT Stack	; Сегмент стека
DW 256 dup(?)		; под стек отводится 256 слов
komod ends

begin SEGMENT 		; Сегмент кода программы
assume cs:begin, ds:dates, ss:komod
start:
	mov	ax,dates
    mov	ds,ax
	mov es,ax
	
	;очистка экрана
	mov ax,3
	int 10h
	
	;ввод начальных данных
	mov	ah,9		; Функция 9 сервиса DOS:
	mov	dx,offset message1	; вывод строки с указанного
							; в ds:dx адреса до символа '$'	
	int	21h			; вывести приглашение к вводу  message1			
	mov	ah,0Ah
	mov	dx,offset str_in
	int	21h			;прочитать строку символов в буфер
	mov	ah,9
	mov	dx,offset crlf
	int	21h			; перевод строки
	
	mov	ah,9		; Функция 9 сервиса DOS:
	mov	dx,offset message2	; вывод строки с указанного
							; в ds:dx адреса до символа '$'
	int	21h			; вывести приглашение к вводу  message2
	mov	ah,0Ah	
	mov	dx,offset str_pos	
	int	21h			;прочитать строку символов в буфер
	mov	ah,9
	mov	dx,offset crlf
	int	21h			; перевод строки
	
	call wordindec	;вызов процедуры перевода введенной строки str_pos
					;в бинарный вид и проверка введенных данных
	mov pos_del,al	;присвоение переменной значения результата процедуры
	
	;создание строки результата		
	cld;				Установка флага направления в 0.		
	mov bl,0
	lea si,str_in	;загрузка поля str_in
	lea di,str_out	;загрузка поля str_out
	
	;загрузка в CL количества элементов поля str_in
	inc si
	mov cl,[si]
	inc si
	
	;если введено число больше чем количество элементов строки,
	;то уменьшаем его до количества элементов строки
	cmp cl,pos_del
	ja repsc
	mov pos_del,cl
	
	;цикл проверок и создания новой строки
repsc:
	cmp cl,0
	je exit			;переход на exit, если цепочка просмотрена полностью	
	inc bl			;текущая позиция
	dec cl			;осталось обработать элементов
	lodsb			;загрузка текущего элемента в АХ
	cmp bl,pos_del	;проверка текущей позиции
	jnb notpr		;если не ниже заданной, то наличие пробела не проверяется
	cmp ax,' '		;сравнение текущего элемента с пробелом
	jne notpr		;если пробел, 
	jmp repsc		;то перейти к обработке следующего элемента
notpr:
	stosb			;текущий элемент загрузить в переменную с результатом
					;и перейти к обработке следующего элемента
	jmp repsc	

exit:
	;вывод результата
	mov	ah,9		; Функция 9 сервиса DOS:
	mov	dx,offset message3	; вывод строки с указанного
							; в ds:dx адреса до символа '$'	
	int	21h			; вывести приглашение к вводу  message1
	mov	ah,9
	mov	dx,offset str_out
	int	21h			;вывести строку символов в буфер

	mov	ax,4C00h
	int	21h		; функция DOS "завершить программу"
	
wordindec proc		;процедура перевода введенной строки
					;в бинарный вид и проверка введенных данных
	xor	di,di		; DI = 0 - номер байта в буфере
	xor	ax,ax		; AX = 0 - текущее значение результата
	mov	cl,blength
	xor	ch,ch
	xor	bx,bx
	mov	si,cx		; SI - длина буфера
	mov	cl,10		; CL = 10, множитель для  MUL
asc2hex:			;перевод числа в ASCII-формате из буфера в бинарное число в AX
	mov	bl,byte ptr bcontents[di]
	sub	bl,'0'		; цифра=код цифры - код символа "0"
	jb	asc_error	; если код символа был меньше, чем код "0",
	cmp	bl,9		; или больше, чем "9",
	ja	asc_error	; выйти из программы с сообщением об ошибке,
	mul	cx			; иначе - умножить текущий результат на 10,
	add	ax,bx		;добавить к нему новцю цифру,
	inc	di			; увеличить счетчик
	cmp	di,si		; если счетчик+1 меньше числа символов,
	jb	asc2hex		;то продолжить (счетчик считается от нуля)
    mov dx,ax
	ret
asc_error:			;вывод сообщения об ошибке и
					;завершение программы
	mov ax,dates
	mov ds,ax
	mov	ah,9
	mov	dx,offset err_msg ;вывести сообщение об ошибке "Bad number entered"
	mov	ah,9
	int	21h		; функция DOS "вывод строки"
	mov	ax,4C00h
	int	21h		; функция DOS "завершить программу"
endp

begin ends

end	start

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
Оказанная помощь должна повышать рейтинг!!!

Последний раз редактировалось Serge_Bliznykov; 09.01.2011 в 15:41.
NAS1977mu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление из исходной строки заданной конфигурации символов Petruha-nsk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 22 11.10.2010 15:53
Удаление из строки всех не alpha символов skeletor PHP 3 12.07.2010 17:28
Удаление символов из строки Jasper92 Общие вопросы C/C++ 1 17.01.2010 20:41
Удаление символов из строки stscolt Помощь студентам 0 28.12.2009 12:34
Удаление символов MURAD Общие вопросы C/C++ 3 19.08.2007 01:25