TITLE Рубежный контроль - вариант 8 - Среднее арифметическое AsCII кодов в строке - 6 ошибок
.model small, stdcall
.stack 128

ax_out PROTO


.data
Input BYTE "abcdef",0
ErrorMsg BYTE "String is too long",0Ah, 0Dh,"$"
.code

main PROC
mov ax, @data
mov ds, ax

cld	 

mov si, OFFSET Input
 
xor bx, bx		;bx=0
xor ah, ah		;ah=0

cycle:			; Подсчёт длины строки и суммы
inc cx			;
lodsb ah 		;
add bx, ax		;
jc TooLongString	;
			;
jnz cycle		;

mov ax, cx
call ax_out

mov ax, bx
div cx			

call ax_out		; Вывод AX
jmp exit

TooLongString:
mov ah, 09h
mov dx, OFFSET ErrorMsg
int 21h

exit:
 
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


END main