.model small
.stack 100h
.data
Msg1 db 'Input string: $'
Msg2 db 13,10,'Length of last word: $'
Str1 db 255, ?, 255 dup(?)
.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 ; начало строки
mov cx, [Str1+1] ; длина строки
xor dx, dx ; длина последнего слова
xor bx, bx ; длина текущего слова
cld ; направление вперед
FindLastWord:
cmp cx, 0
je Finish
; ищем пробел или конец строки с помощью REPNE SCASB
mov al, ' '
repne scasb ; ищем пробел начиная с SI
jne WordEnd ; если пробела нет — конец строки
sub si,1 ; вернём SI на символ пробела
mov bx, si ; BX = текущая позиция
; вычисляем длину слова
; dx = длина последнего слова
; (можно вычислить как расстояние между пробелами)
; для простоты просто считаем вручную:
inc dx
loop FindLastWord
jmp FindLastWord
WordEnd:
; если конец строки
cmp bx,0
je PrintResult
mov dx, bx
PrintResult:
; вывод результата (только 1-2 цифры)
mov ax, dx
mov bl,10
div bl
mov bh, ah
mov bl, al
cmp bl,0
je OneDigit
add bl,'0'
mov dl,bl
mov ah,02h
int 21h
OneDigit:
add bh,'0'
mov dl,bh
mov ah,02h
int 21h
mov ax,4C00h
int 21h
end Start