TITLE Рубежный контроль - вариант 3 - подсчёт длины строки и количества пробелов в ней -  6 ошибок - решение
.model small, stdcall
.stack 128

ax_out PROTO


.data
Input BYTE "And little gnomes stay at their homes, eating, sleeping, drinking their wine",0

.code

main PROC
mov ax, @data
mov ds, ax
 
cld	 

mov si, OFFSET Input
 

cycle:			; Подсчёт длины строки
			;
inc cx			;
lodsb			;
 
jnz cycle		;

mov ax,cx
call ax_out		; Вывод длины

 
mov si, OFFSET Input	; подсчёт пробелов
add si, cx		;
mov bx, 0		;
			;
count_spaces:		;
	lodsb		;
	cmp al, 20h	;
	jne not_a_space	;
	inc bx		;
	not_a_space:	;
loop count_spaces	;

call newline


mov bx, ax 
call ax_out


int 21h

main ENDP



;------------------------------------
ax_out 	PROC		USES dx cx
; Выводит в текущую позицию содержимое AX
;------------------------------------
	
.data

	Temp WORD ?

.code
mov Temp, ax			


mov ah,02h			; Переместим код операции для прерывания только 1 раз

mov cx, 12d			; Значение 12
MainLoop:
	mov dx, Temp
	shr dx,cl
	and dl, 0Fh
	cmp dl, 10d			
	jge  ADD_37h			
	add dl, 30h			
	
	jmp PRINT_4
	
	ADD_37h:
		add dl, 37h
	
	PRINT_4:
		
		int 21h
	sub cx,3

loop MainLoop

mov dx, Temp			; Цикл прошёл 3 раза и вывел три символа,
				; теперь надо вывести последний

and dl, 0fh
cmp dl, 10d			
jge  ADD_37h_LAST			
add dl, 30h			
	
jmp PRINT_LAST
	
ADD_37h_LAST:
	add dl, 37h
	
		
PRINT_LAST:
		int 21h
	


mov ax, Temp
ret
ax_out ENDP

newline PROC USES ax dx

mov ah, 02h
mov dl, 0Ah
int 21h
mov dl, 0Dh
int 21h
ret
newline ENDP

END main