Попадание точки в область ограниченную квадратом и вписанной в него окружностью в Tasm - Assembler
Формулировка задачи:
Доброго времени суток
Необходимо написать программу определяющую попадает ли точка в область ограниченную квадратом и вписанной в него окружностью в Tasm.
Изучать ассемблер начал недавно, всем кто откликнется буду признателен)
Решение задачи: «Попадание точки в область ограниченную квадратом и вписанной в него окружностью в Tasm»
textual
Листинг программы
org 100h mov ax, 3 ;координата х mov bx, 3 ;координата у mov cx, 5 ;половина стороны квадрата при х и у >0 mov dx, -5; половина стороны квадрата при х и у <0 cmp ax, dx ; если равно je m1 cmp ax, dx ; если меньше jl m1 cmp ax, dx ; если больше jg m3 cmp bx, dx ; если равно je m2 cmp bx, dx ; если меньше jl m2 cmp bx, dx ; если больше jg m5 ;========= блок принадлежности точки к окружности mov ax, 3 ;координата х mul ax mov bx, 3 ;координата у mul bx add bx, ax mov ax,5 ; радиус окружности cmp bx,ax je m1 cmp bx,ax jl m1 cmp bx,ax jg m6 ;========== m1: mov ax, 0 jmp exe m2: mov bx, 0 jmp exe m3: cmp ax, cx je m1 cmp ax, cx jl m4 cmp ax, cx jg m1 m5: cmp bx, cx je m2 cmp bx, cx jl m4 cmp bx, cx jg m2 m4: mov ax, 1 mov bx, 1 cmp ax, bx je m6 cmp ax, bx jl m1 cmp ax, bx jg m1 m6: mov ax,1 mov bx,1 cmp ax,bx je m7 cmp ax,bx jl m1 cmp ax,bx jg m1 m7: mov ax, 1 jmp exe exe: push -1 ;Сохраним признак конца числа mov cx,10 ;Делим на 10 l: mov dx,0 ;Очистим регистр dx (xor dx,dx - оптимальнее) div cx ;Делим push dx ;Сохраним цифру cmp ax,0 ;Остался 0? (оптимальнее or ax,ax) jne l ;нет -> продолжим mov ah,2h l2: pop dx ;Восстановим цифру cmp dx,-1 ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex} je ex add dl,'0' ;Преобразуем число в цифру int 21h ;Выведем цифру на экран jmp l2 ;И продолжим ex: mov ax,4c00h;Выход ; int 21h mov ah,1 ;задержка int 21h ;на экране
Объяснение кода листинга программы
Код написан на ассемблере для операционной системы DOS. Он проверяет, принадлежит ли точка в двумерном пространстве координат (x, y) квадрату со стороной 5 и вписанной в него окружности радиусом 5. Список действий:
- Органы управления переменной
ax
иbx
используются для хранения и обработки координат x и y соответственно. - Переменная
cx
используется для хранения половины стороны квадрата. Если оба x и y положительны, то половина стороны квадрата равна 5, если оба отрицательны -5, если x положительный или ноль -3, если x отрицательный -7. - Переменная
dx
используется для хранения другой половины стороны квадрата. - Код проверяет, принадлежит ли точка квадрату, сравнивая
ax
иdx
. Если они равны, то точка принадлежит квадрату, и выполняется переход к меткеm2
. Еслиax
меньшеdx
, то переход к меткеm1
. Еслиax
большеdx
, то переход к меткеm3
. - Затем код проверяет, принадлежит ли точка окружности, сравнивая
bx
иax
. Если они равны, то точка принадлежит окружности, и выполняется переход к меткеm6
. Еслиbx
меньшеax
, то переход к меткеm1
. Еслиbx
большеax
, то переход к меткеm2
. - Если точка принадлежит и квадрату, и окружности, то выполняется переход к метке
m7
. - Код выводит цифру 1, задерживает выполнение на 1 секунду и выводит символ новой строки. Стоит отметить, что этот код не оптимизирован и может быть улучшен. Например, можно использовать более эффективные алгоритмы для проверки принадлежности точки к окружности и квадрату. Также в коде нет обработки ошибок, поэтому он может работать некорректно при некорректных входных данных.