Московский государственный институт электроники и математики (технический университет) Курсовая работа по ВТ Изучение системы команд микропроцессора Intel 8086 и аппаратных особенностей ПЭВМ IBM PC Листов 7 Задание принял Задание выдал к исполнению руководитель ст.гр.А-41 ДДДДДДДДДДДД Дюжев А.А. ДДДДДДДДДДДДД Кулаков В.Г. Москва 1994 г.
- 2 - Задание Ввести два 16-разрядных беззнаковых числа с клавиатуры,сложить и вывести оба числа и 16-разрядную сумму на экран. Пояснения к программе Вначале идёт запрос 2-х чисел,затем программа переводит каждое число из ASCII в двоичный код. Процедура преобразования заключается в следующем: 1.Начинают с самого правого байта числа в ASCII-формате и обрабатывают справа налево. 2.Удаляют тройки из левых шестнадцатиричных цифр каждого ASCII-байта. 3.Умножают ASCII-цифры на 1,10,100 (01Н, 0АН, 64Н ) и т.д. и складывают результаты. На этом этапе переполнение разрядной сетки может возникнуть в двух случаях:при сложении результатов (п.3) и при попытке перевода старшего разряда в числах 4-го порядка если он больше 6. Оба эти случая учтены (выдаётся сообщение о переполнении). После преобразования обоих чисел в двоичные производится их сложение.Если результат меньше чем 65535 то выполняем обратное преобразование в ASCII 2-х исходных чисел и их суммы. Выводим оба числа и сумму на экран в виде сложения "столбиком".
- 3 - Текст программы _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
- 4 - 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
- 5 - 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 в двоичное------
- 6 - 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 ;
- 7 - SYMBL endp SCREEN proc ; П-П для вывода ; сообщений mov ah,09h ; int 21h ; ret ; SCREEN endp ;----------------------------------------------------------------------------- _TEXT ends end begin