Вот готовый рабочий код программы:
Программа просит ввести строку. Строка - слова разделённые 1 или несколькими пробелами, удалить лишние пробелы (вначале строки, в конце строки, 1 пробел между словами)
Результат вывести на экран и записать в файл (файл создаётся в процессе). Запись в файл организовать в процедуре.
Код:

.MODEL small ;отводим под стек и под данные по 64Кб
.STACK 100h ;отмечаем начало сегмента стека
.386
.DATA ;отмечаем начало сегмента данных
NL db 0Ah, 0Dh, '$'
Buf DB 255, 0, 256 DUP (0) ;
hFile db 300 dup(?)
Filename db 'file.txt',0
.CODE ;отмечаем начало сегмента кодов
main PROC
mov ax,@data ;копируем адрес
mov ds,ax ;сегмента данных
mov dx, offset Buf
mov ah, 0Ah
int 21h ;запрашиваем строку
mov dx, offset NL
mov ah, 9h
int 21h ;переводим строку на экране, выводя CRLF
xor cx, cx
mov cl, [Buf+1]
test cl, cl
jz Exit ;проверяем длину строки - если пустая, то выходим
add bx, offset Buf+1
add bl, cl
mov si, bx
last:
mov dl,[si]
cmp dl,' '
jne tmp
dec si
dec cx
jmp last
tmp: mov si, offset Buf+2
first: mov dl,[si]
cmp dl,' '
jne Cycle
inc si
dec cx
jmp first
Cycle: lea di, hFile
mov bx,0
Cycle1: mov dl, [si] ;берём очередной байт
cmp dl, ' ' ;сравниваем с пробелом
jne Print
cmp dx,' ' ;а если пробел - то предыдущий был пробел или нет?
je NextChar ;если два пробела подряд - не печатаем
Print:
mov [di], dl
inc di
mov ah,02h ;выбор функции 2
int 21h ;вызов DOS
inc bx
NextChar:
mov dh,dl ;сохранить текущий символ для теста на следующем витке
inc si ;перейти к следующему символу
loop Cycle1
push bx
mov ah, 3Ch ;если же добрались до конца - будем сохранять.
mov dx, offset Filename
xor cx, cx
int 21h ;создаём файл
pop si
push offset hFile
call vivod
mov ah, 3eh
int 21h ;закрываем файл
Exit:
mov ax, 4c00h
int 21h ;выходим из программы
main ENDP
vivod proc
mov bx, ax
mov ah, 40h
mov cx, si
mov bp, sp
add bp, 2
mov dx, [bp]
int 21h
ret
vivod endp
END main
Может кому пригодится ))