Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д