Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) - Assembler
Формулировка задачи:
Помогите решить задачу Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) i8086
Решение задачи: «Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой)»
textual
Листинг программы
.model small
.data
arr db 16,0,17 dup('$')
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov ah,0Ah
lea dx,arr
int 21h
lea si,arr+2
xor bx,bx
xor ch,ch
mov cl,byte ptr [arr+1]
search:
lodsb
inc bx
cmp al,' '
je found
cmp al,','
je found
cmp al,'.'
je found
loop search
found:
lea si,arr+2+bx
xor ch,ch
mov cl,byte ptr [arr+1]
sub cx,bx
del:
push si
mov al,byte ptr [si]
sub si,bx
mov byte ptr [si],al
pop si
inc si
loop del
sub si,bx
mov byte ptr [si],'$'
mov ah,02h
mov dl,0Ah
int 21h
mov ah,02h
mov dl,0Dh
int 21h
mov ah,09h
lea dx,arr+2
int 21h
mov ah,4Ch
mov al,00h
int 21h
end start
Объяснение кода листинга программы
- Объявление модели программы:
.model small - Объявление переменной
arrи инициализация:arr db 16,0,17 dup('$') - Объявление стека:
.stack 100h - Начало кода:
start: - Перенос указателя данных в регистр
ax:mov ax,@data - Установка сегмента данных равным
ax:mov ds,ax - Ввод строки с клавиатуры, сохранение в
arr:mov ah,0Ahlea dx,arrint 21h
- Установка указателя
siравнымarr + 2:lea si,arr+2 - Установка регистров
bxиchв 0:xor bx,bxиxor ch,ch - Загрузка длины строки в регистр
cl:mov cl,byte ptr [arr+1] - Поиск разделителя слова (пробела, запятой, точки) в строке:
- Загрузка байта из
siвal:lodsb - Увеличение
bxна 1:inc bx - Сравнение
alс пробелом, запятой и точкой, и переход к меткеfound, если найден разделитель:cmp al,' ',cmp al,',',cmp al,'.',je found
- Повторение поиска разделителя:
loop search
- Загрузка байта из
- Метка
found: нахождение разделителя, подготовка к удалению первого слова- Установка
siравнымarr + 2 + bx:lea si,arr+2+bx - Сброс
ch, загрузка длины строки вclи вычитаниеbxизcx:xor ch,ch,mov cl,byte ptr [arr+1],sub cx,bx
- Установка
- Удаление первого слова:
- Сохранение адреса
siв стеке:push si - Загрузка байта из
[si]вal, смещение указателя, замещение символа в строке с относительным адресом[si - bx]:mov al,byte ptr [si],sub si,bx,mov byte ptr [si],al - Восстановление адреса
siиз стека, инкрементsi, повторение до завершения строки:pop si,inc si,loop del
- Сохранение адреса
- Вычитание
bxизsi, замещение последнего символа строки$и вывод результата:sub si,bxmov byte ptr [si],'$'mov ah,09h,lea dx,arr+2,int 21h
- Выход из программы:
mov ah,4Ch,mov al,00h,int 21h
- Конец программы:
end start