Загрузка данных


.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