Лабораторная работа 3 Цель работы
Скачать 32.59 Kb.
|
Петров Ф.А. ИКПИ-72 Ввод и вывод на ассемблере (лабораторная работа №3) Цель работы: Реализовать целочисленные вычисления, сделанные в лабораторной работе №1 или №2(по указанию преподавателя), полностью используя язык Ассемблера для организации корректного ввода-вывода информации:
символов;
значений;
Вариант №20: (b+a)/(a-1), a>b 23, a=b b*b/8, a Листинг программы Unsigned word ASM: assume cs:code, ds:data code segment begin: jmp main ;Начальные параметры для работы InNumber chislo dw 0 mult10 dw 1 main proc near mov ax, data mov ds,Ax ;Вводим данные ;===================================== ;Вводим первое число mov ah, 09h lea dx, msg1 int 21h mov ah, 0ah lea dx,param int 21h ;Передаём параметры для InNumber lea si,field -1 mov bh,0 mov bl, actlen ;Переводим введённое число в обычное call InNumber mov ax,chislo mov a1,ax ;Теперь в a1 введённое число ;===================================== ;===================================== ;Вводим второе число ;Подчистим параметры после первого ввода: mov chislo,0 mov mult10,1 ;Переводим каретку на новую строку: mov ah, 09h lea dx,new_line int 21h mov ah, 09h lea dx, msg2 int 21h ;Осуществляем ввод: mov ah, 0ah lea dx,param int 21h ;Обработаем поступившее число: ;Передаём параметры: lea si,field - 1 mov bh,0 mov bl, actlen ;Вызываем функцию обработки: call InNumber ;Выпишем результат: mov ax,chislo mov a2,ax ;Теперь в a2 второе число ;===================================== ;Теперь используем программу второй лабораторной: ;Обработка данных: ;===================================== mov BX, a1 mov CX, a2 cmp BX, CX JG More JL Less JE Equal ;__________________________________________ ;В случае, если a>b, то (b+a)/(a-1) More: mov ax, a2 cwd add ax, a1 cwd mov bx, a1 sub bl, 1 idiv bx cwd mov word ptr chislo, ax mov word ptr chislo+2, dx jmp output ;__________________________________________ ;__________________________________________ Less: ;В случае если a < b, то b*b/8 mov ax, a2 cwd mov bx, a2 imul bx mov bx, 8 idiv bx cwd mov word ptr chislo, ax mov word ptr chislo+2, dx jmp output ;__________________________________________ ;__________________________________________ ;В случае если a == b, то 23 Equal: mov ax, 23 mov dx, 0 mov word ptr chislo, ax mov word ptr chislo+2, dx ;__________________________________________ ;===================================== ;Вывод данных: ;===================================== output: mov chislo, ax ;Вызываем функцию преобразования числа в ASCII call FromNumber ;Переводи каретку на новую строку: mov ah, 09h lea dx,new_line int 21h ;Выводим сообщение и сам ответ: mov ah, 09h lea dx, msg int 21h mov ah, 09h lea dx,otvet int 21h ;завершаем работу программы mov ah, 0ah lea dx,param int 21h mov ax,4c00h int 21h ret main endp ;===================================== ;============================================= ;Функция преобразует ASCII число в десятичное ;============================================= InNumber proc ;Запишем множитель mov cx,10 ;Организуем цикл b20: mov al,[si+bx] ;выписываем ASCII-код очередной цифры and ax, 000fh ;Оставляем само число от ASCII кода mul mult10 ;Домножаем его add chislo, ax mov ax,mult10; mul cx mov mult10,ax dec bx jnz b20 ret InNumber endp ;============================================= ;============================================= ;Преобразует десятичное число в ASCII число ;============================================= FromNumber proc mov cx,0010; lea si, otvet + 5 mov ax,chislo ;Нужно обработать ситуацию, когда число отрицательное: mov bx, ax and bx, 8000h ;Оставляем только знаковый бит 80000h=1000000000000000B cmp bx, 8000h ;Определяем, есть ли еденичка (-) или нет (+) jb plus ;Еденички нет - число положительное ;Если мы здесь, значит число отрицательное =( mov bx, ax mov ax, 65535 sub ax, bx add ax, 1 ;Теперь в AX хранится модуль числа mov bx, 1 ;Ставим флаг, что есть минус plus: ;Теперь в AX модуль числа. Переводим его в ASCII строку: c20: cmp ax,0010 jb c30 xor dx,dx div cx or dl,30h mov [si],dl dec si jmp c20 c30: or al,30h mov [si],al ;Проверим нужно ли поставить знак "-" cmp bx, 1 je addminus ;Знак минус ставить нужно ret addminus: dec si mov al, zminus mov [si], al ret FromNumber endp ;============================================= code ends data segment new_line db 0dh,0ah,'$' msg db 'Result: $' msg1 db 'Input a: $' msg2 db 'Input b: $' otvet db ' $' zminus db '-' a1 dw ? a2 dw ? param label byte maxlen db 20 actlen db ? field db 20 dup(' ') data ends stk segment db 256 dup (?) stk ends end begin Таблица результатов
Вывод Тот факт, что результаты программы на ассемблере совпадают с результатами ручных вычислений, свидетельствует о том, что программа составлена правильно. |