TITLE Рубежный контроль - вариант 11 - Сумма кодов всех символов с нечётными кодами - 7 ошибок
; Запускать: cB.exe | more, правильное значение суммы для указанной строки 0EA4

.model small, stdcall
.stack 128
ax_out PROTO
.data
Input BYTE "You wear guilt",0Ah,0Dh,"Like shackles on your feet",0Ah,0Dh,"Like a halo in reverse",0Ah,0Dh,"$",0
.code

main PROC
mov ax, @data
mov ds, ax
 
cld	 

mov ah, 09h
mov dx, OFFSET Input
int 21h

mov si, [dx] 
mov cx, -1
and bx, bx 		;bx=0
and ah, ah		;ah=0

cycle:			; Подсчёт длины строки
inc cx			;
lodsb			;
cmp al, 00h		;
jne cycle		;

mov si, OFFSET Input

summ:			; Суммирование чётных значений
			;
lodsb			;
		
	call ax_out		; Вывод значений AX и BX
	push ax			;
	mov bx, ax		;
	call ax_out		;
	pop ax			;
	call newline		;
test al,01h		;
jz NoSum		;
add ax, bx		;

NoSum:			;
loop summ		;

mov ax, bx
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