|
Ассемблер в примерах - Замена последовательности одинаковых символов одним
- Вопрос:
- Ввести строку символов. Заменить одинаковые символы, стоящие рядом (сколько бы их не было) на один такой символ.
- Ответ:
-
Введенная строка проверяется с помощью индексных регистров SI и DI.
Первый указывает на проверяемый символ, второй на последний удовлетворяющий условию.
;
model tiny
.186
.code
org 100h
;переходим в текстовый режим
begin: mov ax,3
int 10h
;выводим приглашение к вводу
mov ah,09h
mov dx,offset dbEnter
int 21h
;вводим строку
mov ah,0ah
mov dx,offset dbStringMax
int 21h
;настраиваем индексные регистры
mov si,offset dbString
mov di,si
lodsb
;определяем длину введенной строки
mov cl,dbStringSize
xor ch,ch
;считываем очередной символ
isLoop: lodsb
cmp al,[di]
jz noSave
;записываем не оинаковый символ
inc di
mov [di],al
noSave:
loop isLoop
;записываем маркер конца строки
mov al,'$'
stosb
;записываем пробелы
mov al,20h
mov dbStringMax,al
mov dbStringSize,al
;выводим результат
mov ah,09;
mov dx,offset dbResult
int 21h
;ожидаем любую клавишу
xor ax,ax
int 16h
;выход в дос
ret
dbResult db 10,13,'Result:'
dbStringMax db 200
dbStringSize db ?
dbString db 200 dup(?)
dbEnter db 10,13,'Enter string:$'
end begin
еще один вариант.
Отличие то, что символы выводятся на экран сразу, и предыдущий символ хранится в DH
; Делаем COM-файл:
; tasm name.asm
; tlink name /t
.model tiny
.data
sInput db 'Enter string: $'
sResult db 0dh, 0ah, 'Result string: $'
sPress db 0dh, 0ah, 'Press any key$'
buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah)
max db 128 ; максимальная длина строки
len db 0 ; реальная длина введенной строки
string db 128 dup (?) ; сама строка
.code
.startup
lea dx, sInput
mov ah, 9
int 21h ; приглашение на экран
lea dx, buf
mov ah, 0ah
int 21h ; вводим строку
lea dx, sResult
mov ah, 9
int 21h ; Result string
lea si, string ; адрес строки
mov dh, 0 ; предыдущий символ
MLoop:
lodsb ; очередной
cmp al, 0dh ; введенная строка заканчивается кодом 0dh
je exit
cmp al, dh ; совпадает с предыдущим?
je MLoop
mov dh, al ; сохраним
int 29h ; и выведем
jmp MLoop
exit:
lea dx, sPress
mov ah, 9
int 21h ; press any key
mov ah, 0 ; ждем нажатие клавиши, чтобы не ушло сразу
int 16h
mov ax, 4c00h
int 21h
end
| |