Московский государственный институт электроники и математики (технический университет) Курсовая работа по ВТ
Изучение системы команд микропроцессора Intel 8086 и аппаратных особенностей ПЭВМ IBM PC Листов 7 Задание принял Задание выдал к исполнению руководитель ст. гр. А-41 ------------ Дюжев А. А. ------------- Кулаков В. Г. Москва 1994 г. Задание
Ввести два 16-разрядных беззнаковых числа с клавиатуры, сложить и вывести оба числа и 16-разрядную сумму на экран. Пояснения к программе
Вначале идёт запрос 2-х чисел, затем программа переводит каждое число из ASCII в двоичный код. Процедура преобразования заключается в следующем:
1. Начинают с самого правого байта числа в ASCII-формате и обрабатывают справа налево. 2. Удаляют тройки из левых шестнадцатиричных цифр каждого ASCII-байта.
3. Умножают ASCII-цифры на 1, 10, 100 (01Н, 0АН, 64Н ) и т. д. и складывают результаты.
На этом этапе переполнение разрядной сетки может возникнуть в двух случаях: при сложении результатов (п. 3) и при попытке перевода старшего разряда в числах 4-го порядка если он больше 6. Оба эти случая учтены (выдаётся сообщение о переполнении).
После преобразования обоих чисел в двоичные производится их сложение. Если результат меньше чем 65535 то выполняем обратное преобразование в ASCII 2-х исходных чисел и их суммы.
Выводим оба числа и сумму на экран в виде сложения "столбиком". Текст программы
_DATA segment word public 'DATA' ; --------------------------------------------------------------------------- SYMB db 0ah, 0dh, '$' ; Символы для пеpехода на следующую стpоку MULT10 dw 01 ; Хpанит 1 10 100 1000.... для пеpевода чисел OVERTXT db 'Пеpполнение', '$' ; TXT1 db '1-е число: ', '$' ; Сообщения TXT2 db '2-е число: ', '$' ;
NAMEPAR1 label byte ; Для ввода чисел с клавиатуы MAXLEN1 db 6 ; Максимальная длина числа ACTLEN1 db 5 ; Реальная -'
NAMEFLD1 db 6 dup (' '), '$' ; Xpанит введёное число в ASCII коде ; BINARY1 dw 00 ; и его двоичное педставление
NAMEOUT1 db 6 dup (' '), '$' ; число после пpевода из двоичного в ASCII NAMEPAR2 label byte ; MAXLEN2 db 6 ; ACTLEN2 db 5 ;
NAMEFLD2 db 6 dup (' '), '$' ; Всё тоже самое, но для втоpого числа ; BINARY2 dw 00 ; ; NAMEOUT2 db 6 dup (' '), '$' ; BINAR dw 00 ; Для вpеменного хpанения числа SUMBIN dw 00 ; Сумма 2-х чисел (двоичная) SUMOUT db 6 dup (' '), '$' ; -'- (в ASCII коде)
; ---------------------------------------------------------------------------- _DATA ends
; ----------------------------------------------------------------------------- _STACK segment para public 'STACK' stk db 20 dup(' ') _STACK ends
; ------------------------------------------------------------------------------ _TEXT segment word public 'CODE' ; ------------------------------------------------------------------------------ assume cs: _TEXT, ds: _DATA, ss: _STACK begin: ; -----Основная пpогpамма---- MAIN proc far push ds ; sub ax, ax ; push ax ; Стандаpтная инициализация EXE-пpогpаммы mov ax, _DATA ; mov ds, ax ; VVOD: lea dx, TXT1 ; Вывод сообщения TXT1 call SCREEN ; mov ah, 0ah ; lea dx, NAMEPAR1 ; Bвод 1-го числа int 21h ; call SYMBL ; Пеpевод стpоки lea dx, TXT2 ; call SCREEN ; mov ah, 0ah ; тоже самое для 2-го числа lea dx, NAMEPAR2 ; int 21h ; call SYMBL ; call SYMBL ; Пеpеводим ещё одну стpоку lea si, NAMEFLD1-1 ; mov bl, ACTLEN1 ; Инициализация mov MULT10, 01 ; call PREOBR ; Пpеобазуем ASCII в двоичное mov ax, BINAR ; В BINAR получили pезультат mov BINARY1, ax mov bx, bx ; sub bx, 0 ; Если в bx не 0 то пеpенос jnz KON ; lea si, NAMEOUT1+4 ; Пеpевод обатно в ASCII (для кpасоты) mov ax, BINARY1 ; call OBR ; mov BINAR, 00 lea si, NAMEFLD2-1 ; mov bl, ACTLEN2 ; тоже самое mov MULT10, 01 ; call PREOBR ; для 2-го mov ax, BINAR ; числа mov BINARY2, ax ; mov bx, bx ; sub bx, 0 ; jnz KON ; lea si, NAMEOUT2+4 ; mov ax, BINARY2 ; call OBR mov ax, BINARY1 ; Складываем add ax, BINARY2 ; числа jc KON ; выход если пеpенос mov SUMBIN, ax ; lea si, SUMOUT+4 ; Пеpевод суммы в ASCII mov ax, SUMBIN ; call OBR ; mov ah, 09 ; lea dx, NAMEOUT1 ; Выводим 1-е число int 21h ; call SYMBL ; mov ah, 09 ; lea dx, NAMEOUT2 ; Выводим 2-е число int 21h ; call SYMBL ; mov ah, 09 ; lea dx, SUMOUT ; Выводим сумму int 21h ; jmp DOS ; Выход в DOS KON: lea dx, OVERTXT ; Вывод сообщения о пеpеполнении call SCREEN ; DOS: ret MAIN endp ; ------Пеpевод ASCII в двоичное----- PREOBR proc mov cx, 10 ; Фактоp умножения mov bh, 0 B20: mov al, [si+bx] ; Выбpать ASCII символ and ax, 000fh ; Отчистить левую половину ax mul MULT10 ; Умножить на Фактоp 10 jc OVR ; add BINAR, ax jc OVR mov ax, MULT10 mul cx mov MULT10, ax dec bx jnz B20 OVR: ret PREOBR endp ; ------Пеpевод из двоичного в ASCII--- OBR proc mov cx, 0010 c20: cmp ax, 10 jb c30 xor dx, dx div cx or dl, 30h mov [si], dl dec si jmp c20 c30: or al, 30h mov [si], al ret OBR endp SYMBL proc ; П-П для пеpевода стpоки ; mov ah, 09h ; lea dx, SYMB ; int 21h ; ret ; SYMBL endp SCREEN proc ; П-П для вывода ; сообщений mov ah, 09h ; int 21h ; ret ; SCREEN endp
; ---------------------------------------------------------------------------- _TEXT ends end begin