Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) - 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,0Ah
lea dx,arr
int 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,bx
mov byte ptr [si],'$'
mov ah,09h
,lea dx,arr+2
,int 21h
- Выход из программы:
mov ah,4Ch
,mov al,00h
,int 21h
- Конец программы:
end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д