Файл: К разработка программы на Ассемблере.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 02.05.2024

Просмотров: 9

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Контрольная работа




КР2. Разработка программы на Ассемблере. Вариант 10. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами. Программа выводит эти же числа на экран в порядке возрастания величины числа, причем в «троичной» системе счисления.





Выполнил: Абдушукуров Гафур

; По запросу программы пользователь вводит с
; клавиатуры целое положительное десятичное число N.
; По следующему запросу он вводит с клавиатуры N целых трехзначных
; положительных десятичных чисел, разделенных пробелами.
; Программа выводит наибольшее число из введенных,
; представленное в десятичной и шестнадцатеричной системах счисления.

; Подключение библиотеки подпрограмм
include 'emu8086.inc'

ORG 100h

start: jmp beg
number dw 0
maxim dw 0
array dw 10 dup (0)
hexbuf dw '0000h',0
symb db '0123456789ABCDEF'

; вывод AX в 16ричном виде
print_hex:add si,4
hex0
: dec si
mov dx,0
mov di,16
div di ; DL = младшая 16ричная цифра
lea bx,symb ; BX = таблица символов
push ax
mov al,dl ; преобразование цифры в символ
xlat
mov [si],al ; запись символа в строку
pop ax
cmp ax,0 ; конец преобразования ?
jnz hex0 ; нет - продолжение цикла
call print_string ; печать строки результата
ret

; get char from keyboard
; into AL:
getchar:MOV AH, 00h
INT 16h
; and print it:
MOV AH, 0Eh
INT 10h
ret


; Этот символ - цифра ? Да Нет
isdigit:cmp al,'0'
jc id1
cmp al,'9'+1
jnc id1
clc
ret
id1: stc
ret

getval3:mov cx,3 ; ввод 3значного десятичного числа AX (с лидирующими 0)
mov ax,0
v1: push ax
call getchar
call isdigit
jc fmterr
sub al,'0'
mov bl,al ; bl=цифра
mov bh,0
pop ax ; ax=ax*10+bx
mov si,10
mul si
add ax,bx
loop v1
ret

; ошибка - введена не цифра
fmterr
: call pthis
db 13,10,'You must enter 3 digits',0
int 20h

; ошибка - N должно быть от 001 до 010
e2: call pthis
db 13,10,'You must enter a value from 001 to 010',0
int 20h

; основная программа
beg:

call pthis
DB 'Enter 3 digits for N: ', 0
CALL getval3 ; ввести N
cmp ax,0 ; проверить N на допустимость
jz e2
cmp ax,11
jnc e2
mov number,ax ; number=N
call pthis
db 13,10,'Enter array of N 3digits',13,10,0
mov cx,number
lea di
,array ; ввести массив чисел
main0: push cx
call getval3
stosw
call pthis ; печать пробела между числами
db 32,0
pop cx
loop main0

lea si,array ; maxim=первое число массива
mov ax,[si]
mov maxim,ax
mov cx,number ; цикл поиска maxim
main1: lodsw ; вводим число из массива
cmp ax,maxim ; если оно >=maxim, то запоминаем
jc skip
mov maxim,ax
skip: loop main1

mov ax,maxim ; вывод maxim на печать
CALL pthis
DB 13, 10, 'Maximal value: ', 0
CALL print_num