Сложение чисел в неупакованном двоично-десятичном коде.
Компилятор TASM (tasm32).
ideal
p386
model flat, stdcall
procdesc GetStdHandle winapi :dword
procdesc WriteConsoleA winapi :dword, :dword, :dword, :dword, :dword
procdesc lstrlenA winapi: dword
procdesc ExitProcess winapi :dword
procdesc _putch winapi :dword
extrn _getch: near
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
segment data
Prompt1 db 'Введите 1-е число: ',0
Prompt2 db 13,10,'Введите 2-е число: ',0
ExitPrompt db 13,10,10,'Для завершения работы нажмите любую клавишу... ',0
Result db 13,10,'Сумма: '
Buff db 4 dup (?), 0
hStdIn dd ?
hStdOut dd ?
VarA dd ?
VarB dd ?
VarR dd ?
ends
segment code
N84677659:
call GetStdHandle,STD_INPUT_HANDLE
mov [hStdIn],eax
call GetStdHandle,STD_OUTPUT_HANDLE
mov [hStdOut],eax
call Print,offset Prompt1
call Input
mov [VarA],edx
call Print,offset Prompt2
call Input
mov [VarB],edx
lea esi,[VarA]
lea ebx,[VarB]
lea edi,[VarR]
mov ecx,4
clc
SumLoop:
lodsb
adc al,[ebx]
aaa
stosb
inc ebx
loop SumLoop
std
mov eax,[VarR]
or eax,30303030h
lea edi,[Buff + 3]
mov ecx,4
StorLoop:
stosb
shr eax,8
loop StorLoop
cld
call Print,offset Result
call Print,offset ExitPrompt
call _getch
call ExitProcess,0
proc Print stdcall,Str:dword
call lstrlenA,[Str]
call WriteConsoleA,[hStdOut],[Str],eax,0,0
ret
endp
proc ReadChar uses ecx edx
RepRC:
call _getch
cmp al,0Dh
je short ExitRC
cmp al,30h
jb RepRC
cmp al,39h
ja RepRC
ExitRC:
ret
endp
proc Input
mov ecx,4
xor edx,edx
InpLoop:
call ReadChar
test al,0F0h
jne short Digit
jcxz ExitInp
jmp InpLoop
Digit:
jcxz InpLoop
push ecx
push edx
call _putch,eax
pop eax
pop edx
pop ecx
shl edx,8
mov dl,al
and dl,0Fh
dec ecx
jmp InpLoop
ExitInp:
ret
endp
ends
end N84677659
P.S. Суммирование чисел выделено жирным шрифтом.
Программа блокирует нажатие любых клавиш, кроме цифровых и Enter.
Не реагирует на нажатие Enter, пока не будет введено 4 цифры.
Ввод более 4-х цифр блокируется.
Буду трижды благодарен...