Вопрос № 183172: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1) требуется разработать подпрограмму проверки условия, аргументы подпрограмме передать заданным способом 2) разработать подпрограммы ввод и вывода 16-ти разрядного ч...
Вопрос № 183172:
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1) требуется разработать подпрограмму проверки условия, аргументы подпрограмме передать заданным способом 2) разработать подпрограммы ввод и вывода 16-ти разрядного числа в десятичной системе счисления (диапазон 0....65535), 3) разработать EXE- программу, выполняющую ввод чисел, проверку условия и вывод результата, использующую созданные подпрограммы. Подпрограммы и основная программа должны находиться в разных файлах. АСС-
TASM
Задание - Ввод х, Вывод (х больше 0)= (Да/Нет), передача параметров через стек. . Есть "болванка" по данному заданию, но нет уверенности в ее правильности и комментариях. Если возможно ее исправить, пожалуйста сделайте это...
С благодарностью за поддержку и помощь , чайник АСС
Отправлен: 14.05.2011, 22:56
Вопрос задал: Сanijke
Всего ответов: 1 Страница вопроса »
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Сanijke! Вот Вам подправленные тексты программы. Вводим знаковое число, проверяем на знак, выводим результирующую строку Если что не понятно, спрашивайте в мини-форуме
Код :
EXTRN BARD: near, INPUTNUMB: near
code segment
assume cs: code, ds:data,SS:KOMOD
start:
MOV AX, data
MOV DS, AX ; запись ax в ds
CALL INPUTNUMB ; вызов подпрограммы INPUTNUMB
mov x, AX
PUSH x ; вданном случае, лучше параметром передать не адрес X, а саму переменную X
CALL BARD ; вызов подпрограммы BARD
MOV AX, 4c00h ; завершение программы с кодом 0
INT 21h ; вызов прерывания
code ends
data segment public
x dw ? ; резервирование памяти под двубайтное число х
data ends
komod segment stack
dw 128 dup (?)
komod ends
end Start
Код :
public Bard, INPUTNUMB
code segment
assume cs: code, ds:data
BARD proc near ; объявление подпрограммы BARD
PUSH BP ;
MOV BP,SP ;
MOV DX, offset MSG_Y; адрес строки YES!!!
MOV ax,[BP+4] ; лучше передавать сразу число
test ax, ax ; установим флажки, в зависимости от ах
jg met3 ; если больше, переход на met3
MOV DX, offset MSG_N; адрес строки NO!!!!
met3: MOV ah, 9 ; функция вывода на экран
; строки, адрес которой в ds:dx
int 21h ; вызов прерывания
pop bp ; восстановление BP
RET 2 ; возврат с убиранием из стека параметра
BARD endp
INPUTNUMB PROC near ; объявление подпрограммы
; INPUTNUMB
mov AH, 0Ah ; запрос функции ввода с клавиатуры
mov DX, offset buf ; вывод буфера
INT 21h ; вызов прерывания 21
MOV DI, DX ;
INC DI ; увеличение di на 1
MOV CL, [DI] ; длина введенной строки
xor CH, CH ; в cx
xor AX, AX ; ax - наше число
jcxz met1 ; если cx = 0, переход на met1
xor BX, BX ; bx - очередной десятичный разряд
MOV BP, 10 ; будем умножать на 10
mov si, 1 ; si = 1 - число > 0
cmp byte ptr [di+1], '-' ; введен ли знак минус?
jne met2 ; нет - вводим положительное число
inc di ; для отрицательного - обойдем минус
dec cx ; уменьшим и счетчик
neg si ; si = -1 - признак отрицательного числа
jcxz met1 ; проверим еще раз на 0 (был введен только один минус)
met2:
MUL BP ; умножение ax на bp
INC DI ; увеличение di на 1
MOV BL, [DI] ; очередная цифра в bl
SUB BL, 30h ; вычитание 30h из bl, результат в bl
ADD AX, BX ; сложение ax и bx, результат в ax
LOOP met2 ; по всем цифрам числа
met1:
mul si ; учтем знак
RET
INPUTNUMB endp
code ends
data segment public ; у сегментов должно быть одинаковое описание
buf db 7,8 dup (?)
MSG_Y db 0dh,0ah,'YES!!!$'
MSG_N db 0dh,0ah,'NO!!!!$'
data ends
end
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 15.05.2011, 02:42
Номер ответа: 267158 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 267158
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.