давно
Старший Модератор
31795
6196
15.05.2008, 15:38
общий
это ответ
Здравствуйте, Coperfild!
Смотрите приложение.
ps:функция 03Н прерывания 21Н(Дополнительный ввод)
<font color=blue><a href=http://www.ctyme.com/intr/rb-2555.htm>Int 21/AH=03h</a>
DOS 1+ - READ CHARACTER FROM STDAUX
AH = 03h
Return:AL = character read
Notes: Keyboard checked for ^C / ^Break, and INT 23 executed if detected. STDAUX is usually the first serial port</font>
Переводя на русский, чтение символа из первого последовательного порта(СОМ1).
Удачи!
Приложение:
begin
asm
{запоминаем и устанавливаем новый сегмент стека}
push ds
push cs
pop ds
{вводим первое число и запоминаем его в стеке}
call @@000
push si
{вводим второе число и востанавливаем первое}
call @@000
pop ax
{складываем оба числа}
add ax,si
{выводим результат}
call @@006
jmp @@999
{под программа ввода числа}
@@000:{выводим сообщение}
mov ah,9
mov dx,offset @@998
int 21h
{в этих регистрах будет хранится число и знак}
xor si,si
xor di,di
@@001:{вводим символ без эхо}
mov ah,08
int 21h
{если нажата клавиша ENTER, то ввод числа закончен}
cmp al,13
jz @@004
{нажата клавиша минус}
cmp al,‘-‘
jz @@003
{проверяем диапозон цифровых клавиш}
cmp al,‘0‘
jb @@001
cmp al,‘9‘
ja @@001
{это цифра}
push ax {запоминаем символ}
and ax,0fh{переводим в цифру}
xchg ax,si {обмениваем регистры}
mov bx,10 {будем умножать на 10}
xor dx,dx
mul bx {умножаем}
add si,ax {суммируем последнюю цифру и ранее введенное число}
pop ax {востанавливаем символ}
@@002:{выводим символ}
int 29h
jmp @@001
@@003:{нажат минус}
or si,si {проверяем введенное число}
jnz @@001
mov di,ax {запоминаем минус и выводим его}
jmp @@002
@@004:{проверяем знак минус}
or di,di
jz @@005
not si {переводим его в доп.код}
inc si
@@005:{выход из подпрограммы}
ret
@@006:{запоминаем выводимое число}
push ax
{выводим сообщение о результате}
mov ah,9
mov dx,offset @@997
int 21h
{востанавливаем выводимое число}
pop ax
{проверяем знак}
or ax,ax
jns @@007
push ax
{был минус выводим его}
mov al,‘-‘
int 29h
pop ax
{переводим в абсолютное значение}
dec ax
not ax
@@007:{будем делить на 10 и считать цифры}
mov di,10
xor cx,cx
@@008:{делим}
xor dx,dx
div di
push dx{запоминаем в стеке и считаем их количество}
inc cx
or ax,ax{продолжаем пока число не равно нулю}
jnz @@008
@@009:{востанавливаем из стека цифру, переводим в символ и выводим его}
pop ax
or al,30h
int 29h
loop @@009
ret
{выводимые сообщение}
@@997: db 13,10,‘Result:$‘
@@998: db 13,10,‘Enterg Number:$‘
@@999:{востанавливаем сегмент данных}
pop ds
{ожидаем любую клавишу}
xor ax,ax
int 16h
end;
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.