.model small
.stack 100h
.data
Msg1 db 'Введите строку: $'
Str1 db 255, ?, 255 dup(?), 0dh, '$' ; буфер для ввода
ResultMsg db 'Длина последнего слова: $'
.code
Start:
mov ax, @data
mov ds, ax
mov es, ax
; вывод подсказки
mov ah, 09h
lea dx, Msg1
int 21h
; ввод строки
mov ah, 0ah
lea dx, Str1
int 21h
; инициализация
lea si, Str1+2 ; SI указывает на начало строки
mov cx, Str1+1 ; CX = длина строки
mov bx, 0 ; BX = длина текущего слова
mov dx, 0 ; DX = длина последнего слова
cld ; направление вперед
FindLastWord:
cmp cx, 0
je Done ; если строка закончилась, переходим к выводу
lodsb ; загружаем символ в AL, SI++
cmp al, ' ' ; пробел?
je SpaceFound
cmp al, 0dh ; конец строки?
je DoneWord
inc bx ; увеличиваем длину текущего слова
loop FindLastWord
jmp DoneWord
SpaceFound:
cmp bx, 0
je NextChar ; если были подряд пробелы, просто пропускаем
mov dx, bx ; запоминаем длину последнего слова
mov bx, 0 ; сбрасываем счетчик текущего слова
NextChar:
loop FindLastWord
jmp DoneWord
DoneWord:
cmp bx, 0
je Output ; если текущее слово пустое, используем DX
mov dx, bx ; иначе последнее слово в BX -> DX
Output:
; вывод результата
mov ax, dx
add ax, '0'
mov dl, al
mov ah, 02h
int 21h
; завершение программы
mov ax, 4C00h
int 21h
end Start