p386
model flat, stdcall
includelib "imp32i.lib"
procdesc _getch
procdesc _putch :dword
procdesc printf :dword, :vararg
procdesc _exit :dword
dataseg
Prompt db "Введите число: ", 0
ResSum db "Сумма цифр 3-значного числа = %u", 10, 0
ResProd db "Произведение цифр 4-значного числа = %u", 10, 0
ResError db "Введено не 3-х и не 4-значное число. ", 10, 0
Format db "%u", 10, 0
codeseg
startupcode
RepLoop:
call printf, Prompt
call ReadUInt
cmp eax, 100
jb LT3GT4
cmp eax, 10000
jae LT3GT4
xor ebx, ebx
mov esi, 10
cmp eax, 1000
jae FourDigit
ThreeDigit:
test eax, eax
jz @F
xor edx, edx
div esi
add ebx, edx
jmp ThreeDigit
@@:
call printf, ResSum, ebx
jmp RepLoop
FourDigit:
inc ebx
@@:
test eax, eax
jz @F
xor edx, edx
div esi
push eax
mov eax, edx
mul ebx
mov ebx, eax
pop eax
jmp @B
@@:
call printf, ResProd, ebx
jmp RepLoop
LT3GT4:
call printf, ResError
jmp RepLoop
proc ReadUInt uses ebx ecx edx edi
local Len :dword
xor ebx, ebx
mov [Len], ebx
ReadUIntRep:
call _getch
cmp al, 1Bh
jne @F
call _exit, 0
@@:
cmp al, 8
jne @F
test [Len], 03Fh
jz ReadUIntRep
dec [Len]
call _putch, 8
call _putch, 32
call _putch, 8
mov eax, ebx
xor edx, edx
mov ebx, 10
div ebx
mov ebx, eax
jmp ReadUIntRep
@@:
cmp al, 0Dh
jne @F
test [Len], 03Fh
jz ReadUIntRep
jmp ReadUIntQuit
@@:
mov ecx, eax
sub al, 30h
jb ReadUIntRep
cmp al, 9
ja ReadUIntRep
mov edi, ebx
movzx eax, al
mov edx, 10
xchg eax, ebx
mul edx
jnc @F
ReadUIntOverflow:
mov ebx, edi
jmp ReadUIntRep
@@:
add ebx, eax
jc ReadUIntOverflow
cmp [Len], 50
jae ReadUIntRep
inc [Len]
call _putch, ecx
jmp ReadUIntRep
ReadUIntQuit:
call _putch, 10
mov eax, ebx
ret
endp

P.S. Завершение работы программы происходит по нажатию клавиши ESC.