Консультация № 136933
15.05.2008, 13:53
0.00 руб.
0 1 1
Здравствуйте! Не совсем уверен туда ли я написал, если не туда скажите куда можно обратиться. Вопрос в следуещем:
на асмовской вставке(в паскале) нужно ввести два числа, причем чтоб учитывался только знак или число(никаких других символов), потом сложить эти два числа и вывести рез-тат на экран уже в виде цифр(а не символов), пользоваться нужно 03h функцией 21го прерывания(ввод без эхо). Если можете помогите пожалуйста.
Заранее благодарен.

Обсуждение

давно
Старший Модератор
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.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа