Удалить из строки первое слово (слова разделяются пробелами, запятыми, точкой) - 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

Объяснение кода листинга программы

  1. Объявление модели программы: .model small
  2. Объявление переменной arr и инициализация: arr db 16,0,17 dup('$')
  3. Объявление стека: .stack 100h
  4. Начало кода: start:
  5. Перенос указателя данных в регистр ax: mov ax,@data
  6. Установка сегмента данных равным ax: mov ds,ax
  7. Ввод строки с клавиатуры, сохранение в arr:
    • mov ah,0Ah
    • lea dx,arr
    • int 21h
  8. Установка указателя si равным arr + 2: lea si,arr+2
  9. Установка регистров bx и ch в 0: xor bx,bx и xor ch,ch
  10. Загрузка длины строки в регистр cl: mov cl,byte ptr [arr+1]
  11. Поиск разделителя слова (пробела, запятой, точки) в строке:
    • Загрузка байта из si в al: lodsb
    • Увеличение bx на 1: inc bx
    • Сравнение al с пробелом, запятой и точкой, и переход к метке found, если найден разделитель:
      • cmp al,' ', cmp al,',', cmp al,'.', je found
    • Повторение поиска разделителя: loop search
  12. Метка 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
  13. Удаление первого слова:
    • Сохранение адреса 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
  14. Вычитание bx из si, замещение последнего символа строки $ и вывод результата:
    • sub si,bx
    • mov byte ptr [si],'$'
    • mov ah,09h, lea dx,arr+2, int 21h
  15. Выход из программы:
    • mov ah,4Ch, mov al,00h, int 21h
  16. Конец программы: end start

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы