Консультация № 150307
12.11.2008, 12:26
0.00 руб.
0 2 2
здравствуйте эксперты,помогите пожалуйста

Из строки с позиции i удалить n символов

Обсуждение

давно
Старший Модератор
31795
6196
12.11.2008, 12:52
общий
это ответ
Здравствуйте, Ska89!

Программа в приложении. Признаком окончания строки служит символ '$'.
Вопросы задавайте в мини-форум.
Удачи!

Приложение:
model tiny
.code
org 100h
i equ 10
n equ 5
begin:
;переходим в текстовый режим
mov ax,03
int 10h
;выводим контрольную строку
mov ah,9
mov dx,offset dbStringOut
int 21h
;настраиваем индексные регистры
mov di,offset dbString+ i
mov si,di
add si,n
cld
;цикл удаления символа
LoopDelete:
lodsb
stosb
cmp al,'$'
jnz LoopDelete
;вывод контрольной строки
mov dx,offset dbStringOut
mov al,9
int 21h
;ожидаем любую клавишу
xor ax,ax
int 16h
ret
;команда перевода строки
dbStringOut db 13,10
;контрольная строка
dbString db 'qwertyuiopasdfghjklzxcvbnm0123456789$'
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
13.11.2008, 12:33
общий
это ответ
Здравствуйте, Ska89!
Приложение использует строковые операции.
Устанавливаем индексные регистры di на позицию с которой будут удалятся символы, а si на позицию до куда должны удалится символы. В регистр cx заносим количество символов которые должны остаться в конце строки после удаления. И применяем строковую операция копирования. Концевой символ в полученной строке будет символ '$', за ним останется «мусор», так как применяется буфер исходной строки.
Пояснения в приложении.
Удачи

Приложение:
code segment
assume cs:code,ds:code
org 100h
begin:
mov ah,09h ;вывод исходной строки
mov dx,offset stroka
mov di,dx ;di и si на начало строки
mov si,dx
int 21h

xor ax,ax
mov al,i
add di,ax ;di на начальную позицию удаления

add si,ax
mov al,n
add si,ax ;si на позицию продолжения строки

mov ah,i
add ah,n
mov al,str_len
sub al,ah
cbw
mov cx,ax ;cx кол-во байтов от продолжения строки до
;конца строки
rep movsb ;строковая операция копирования байтов

mov ah,09h ;вывод строки после удаления
int 21h

ret
;--------Данные-----
;исходная строка
stroka db 'wkdksnt3849kdsl11234-0983jd++wkd4',0ah,0dh,'$'
str_len =$-stroka ;кол-во символов
i db 13 ;начальная позиция (начинается с 0)
n db 10 ;кол-во удаляемых символов
code ends
end begin
Форма ответа