Для TASM. Пограмма типа COM. Системные требования: процессор не ниже 286, ОС семейства ДОС. Работает с целыми знаковыми числами размерностью слово
| Код | .MODEL TINY .CODE .286 ORG 100H MAIN PROC NEAR
;********************************* Ввод данных ********************************
LEA DX, A_PRMPT ;Приглашение для ввода CALL INPUT ;Ввод MOV A, AX ;Результат ввода в a
LEA DX, B_PRMPT ;Приглашение для ввода CALL INPUT ;Ввод MOV B, AX ;Результат ввода в b
;************************************ Ядро ************************************
;AX содержит b CMP AX, A ;Сравнить b и a JG MENSHE ;Перейти если a<b JL BOLSHE ;Перейти если a>b
ROVNO: MOV AX, -445 ;Выполняется если a=b, Y в AX JMP EXIT
MENSHE: ADD AX, 5 ;Выполняется если a<b, Y в AX IDIV A JMP EXIT
BOLSHE: MOV AX, A ;Выполняется если a>b, Y в AX IMUL AX, 2 IDIV B INC AX
;******************************* Вывод результата *****************************
EXIT: MOV WORD PTR Y_STR+6, 0A0DH ;Добавить в строку для вывода символы MOV Y_STR+8, '$' ; перевода каретки и конца вывода
LEA DI, Y_STR+5 ;Адрес строки для вывода PUSH AX CMP AX, 0 ;Число меньше 0? JNL OUT0 NEG AX ; если да, то поменять знак OUT0: MOV BX, 10 OUT1: XOR DX, DX DIV BX ;Разделить на 10 OR DL, 00110000B ;Преобразовать двоичный остаток в цифру MOV [DI], DL ;Добавить в строку для вывода CMP AX, 0 ;Частное отделения равно 0? JE OUT2 ; если да, то выход DEC DI ;Следующий символ JMP OUT1 ;Повторить
OUT2: POP AX CMP AX, 0 ;Число было меньше 0? JNL OUT3 ; если да, то поставить знак минус DEC DI MOV BYTE PTR [DI], '-'
OUT3: MOV AH, 9 ;Приглашение для вывода Y LEA DX, Y_PRMPT INT 21H MOV DX, DI ;Вывод Y INT 21H MOV AH, 7 ;Пауза INT 21H RET ;Возвратить управление ДОС
MAIN ENDP
;*********************** Подпрограмма ввода ASCII-чисел ***********************
INPUT PROC NEAR MOV AH, 9 ;Приглашение для ввода INT 21H MOV AH, 0AH ;Ввод строки LEA DX, P_LIST INT 21H MOV MFACT, 1 ;Элемент данных, хранит степень 10 MOV MVALUE, 0 ;Элемент данных, хранит результат LEA DI, KB_DATA ;Адрес строки для чтения MOV CL, ACT_LEN ;Длина строки ADD DI, CX INP1: DEC DI ;Следующая цифра XOR AX, AX MOV AL, [DI] ;Загрузить цифру в аккумулятор CMP AL, '-' ;Это минус? JNE INP2 NEG MVALUE ; если да, то поменять знак JMP INP3 ; результата и выйти INP2: AND AL, 00001111B ;Преобразовать цифру в двоичное число MUL MFACT ;Умножить на 10 в степени n ADD MVALUE, AX ;Добавить к результату MOV AX, 10 ;Следующая степень 10 MUL MFACT MOV MFACT, AX LOOP INP1 ;Повторить INP3: MOV AX, MVALUE ;В AX результат RET ;Возвратить управление программе INPUT ENDP
;*********************************** Данные ***********************************
A_PRMPT DB 'a = $' ;Приглашения для ввода и вывода B_PRMPT DB 0DH, 0AH, 'b = $' Y_PRMPT DB 0DH, 0AH, 'Y = $'
P_LIST LABEL BYTE ;Область данных для ввода с клавиатуры MAX_LEN DB 7 ACT_LEN DB ? KB_DATA DB 7 DUP (?)
MFACT DW ? ;Необходима подпрограмме преобр. чисел MVALUE DW ? ;Необходима подпрограмме преобр. чисел
A DW ? ;Значение a B DW ? ;Значение b Y_STR DB 9 DUP (?) ;Значение Y в формате ASCII-числа
END MAIN
|
|